GPU 리소스를 사용하는 컨테이너 인스턴스 배포

Azure Container Instances에서 컴퓨팅 작업이 많은 특정한 워크로드를 실행하려면 GPU 리소스를 사용하여 컨테이너 그룹을 배포합니다. 그룹의 컨테이너 인스턴스는 CUDA 및 딥 러닝 애플리케이션과 같은 컨테이너 워크로드를 실행하는 동안 하나 이상의 NVIDIA Tesla GPU에 액세스할 수 있습니다.

이 문서에서는 컨테이너 그룹을 배포할 때 YAML 파일 또는 Resource Manager 템플릿을 사용하여 GPU 리소스를 추가하는 방법을 보여 줍니다. Azure Portal을 사용하여 컨테이너 인스턴스를 배포할 때 GPU 리소스를 지정할 수도 있습니다.

Important

K80 및 P100 GPU SKU는 2023년 8월 31일까지 사용 중지됩니다. 이는 사용된 기본 VM의 사용 중지로 인해 발생합니다. NC 시리즈NCv2 시리즈 V100 SKU를 사용할 수 있지만 대신 Azure Kubernetes Service를 사용하는 것이 좋습니다. GPU 리소스는 완전히 지원되지 않으며 프로덕션 워크로드에 사용하면 안 됩니다. 현재 AKS로 마이그레이션하려면 다음 리소스를 사용합니다. AKS로 마이그레이션하는 방법

Important

이 기능은 현재 미리 보기로 제공되며 일부 제한 사항이 적용됩니다. 추가 사용 약관에 동의하는 조건으로 미리 보기를 사용할 수 있습니다. 이 기능의 몇 가지 측면은 일반 공급(GA) 전에 변경될 수 있습니다.

필수 조건

참고 항목

일부 현재 제한 사항 때문에 승인되지 않는 제한 증가 요청이 있을 수 있습니다.

  • 프로덕션 컨테이너 배포에 이 SKU를 사용하려면 Azure 지원 요청을 만들어 제한을 늘리세요.

미리 보기 제한 사항

미리 보기에서는 컨테이너 그룹에 GPU 리소스를 사용할 때 다음과 같은 제한 사항이 적용됩니다.

사용 가능 지역

지역 OS 사용 가능한 GPU SKU
미국 동부, 서유럽, 미국 서부 2, 동남 아시아, 인도 중부 Linux V100

앞으로 더 많은 Azure 지역에 대한 지원이 추가될 것입니다.

지원되는 OS 유형: Linux만

추가 제한 사항: 컨테이너 그룹을 가상 네트워크에 배포하는 경우에는 GPU 리소스를 사용할 수 없습니다.

GPU 리소스 정보

수 및 SKU

컨테이너 인스턴스에서 GPU를 사용하려면 다음 정보를 사용하여 GPU 리소스를 지정해야 합니다.

  • - GPU 수: 1, 2 또는 4.

  • SKU - GPU SKU: V100 각 SKU는 다음 Azure GPU 지원 VM 제품군 중 하나의 NVIDIA Tesla GPU에 매핑됩니다.

    SKU VM 제품군
    V100 NCv3

SKU당 최대 리소스

OS GPU SKU GPU 수 최대 CPU 최대 메모리(GB) 스토리지(GB)
Linux V100 1 6 112 50
Linux V100 2 12 224 50
Linux V100 4 24 448 50

GPU 리소스를 배포할 때 다음 표에 표시된 최댓값 이내에서 워크로드에 적절한 CPU 및 메모리 리소스를 설정해야 합니다. 이러한 값은 현재 GPU 리소스가 없는 컨테이너 그룹에서 사용할 수 있는 CPU 및 메모리 리소스보다 더 큽니다.

Important

GPU 리소스의 기본 구독 제한(할당량)은 SKU에 따라 다릅니다. V100 SKU에 대한 기본 CPU 제한이 처음에는 0으로 설정됩니다. 사용 가능한 지역에서 증가를 요청하려면 Azure 지원 요청을 제출하세요.

알아야 할 사항

  • 배포 시간 - GPU 리소스가 있는 컨테이너 그룹을 만드는 데 최대 8-10분이 걸립니다. Azure에 GPU VM을 프로비전하고 구성하는 시간이 추가로 소요되기 때문입니다.

  • 가격 책정 - GPU 리소스가 없는 컨테이너 그룹과 마찬가지로, Azure는 GPU 리소스가 있는 컨테이너 그룹의 기간 동안 사용된 리소스 비용을 청구합니다. 이 기간은 컨테이너의 첫 번째 이미지를 끌어온 시점부터 컨테이너 그룹이 종료되는 시점 사이의 시간으로 계산됩니다. 컨테이너 그룹을 배포하는 시간은 포함되지 않습니다.

    가격 세부 정보를 참조하세요.

  • CUDA 드라이버 - GPU 리소스가 있는 컨테이너 인스턴스는 NVIDIA CUDA 드라이버 및 컨테이너 런타임이 미리 프로비전되므로, CUDA 워크로드용으로 개발된 컨테이너 이미지를 사용할 수 있습니다.

    이 단계에서는 CUDA 11을 지원합니다. 예를 들어, Dockerfile에 대해 다음과 같은 기본 이미지를 사용할 수 있습니다.

    참고 항목

    Docker Hub에서 공용 컨테이너 이미지를 사용할 때 안정성을 향상하려면, 프라이빗 Azure 컨테이너 레지스트리에서 이미지를 가져와 관리하고, 비공개로 관리되는 기본 이미지를 사용하도록 Dockerfile을 업데이트합니다. 공용 이미지 사용에 대해 자세히 알아봅니다.

YAML 예제

GPU 리소스를 추가하는 한 가지 방법은 YAML 파일을 사용하여 컨테이너 그룹을 배포하는 것입니다. 다음 YAML을 gpu-deploy-aci.yaml이라는 새 파일에 복사하고 파일을 저장합니다. 이 YAML은 V100 GPU가 있는 컨테이너 인스턴스를 지정하는 gpucontainergroup이라는 컨테이너 그룹을 만듭니다. 이 인스턴스는 샘플 CUDA 벡터 추가 애플리케이션을 실행합니다. 리소스 요청은 워크로드를 실행하기에 충분합니다.

참고 항목

다음 예제에서는 공용 컨테이너 이미지를 사용합니다. 안정성을 향상하려면 프라이빗 Azure Container Registry에서 이미지를 가져와 관리하고, 비공개로 관리되는 기본 이미지를 사용하도록 YAML을 업데이트합니다. 공용 이미지 사용에 대해 자세히 알아봅니다.

additional_properties: {}
apiVersion: '2021-09-01'
name: gpucontainergroup
properties:
  containers:
  - name: gpucontainer
    properties:
      image: k8s-gcrio.azureedge.net/cuda-vector-add:v0.1
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
          gpu:
            count: 1
            sku: V100
  osType: Linux
  restartPolicy: OnFailure

--file 매개 변수로 YAML 파일 이름을 지정한 az container create 명령을 사용하여 컨테이너 그룹을 배포합니다. GPU 리소스를 지원하는 eastus처럼 리소스 그룹의 이름과 컨테이너 그룹의 위치를 제공해야 합니다.

az container create --resource-group myResourceGroup --file gpu-deploy-aci.yaml --location eastus

배포를 완료하려면 몇 분이 걸립니다. 배포가 완료되면 컨테이너가 시작되어 CUDA 벡터 추가 작업을 실행합니다. 로그 출력을 보려면 az container logs 명령을 실행합니다.

az container logs --resource-group myResourceGroup --name gpucontainergroup --container-name gpucontainer

출력

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Resource Manager 템플릿 예제

GPU 리소스가 있는 컨테이너 그룹을 배포하는 또 다른 방법은 Resource Manager 템플릿을 사용하는 것입니다. 먼저 gpudeploy.json 파일을 만든 후, 다음 JSON을 이 파일에 복사합니다. 이 예제에서는 MNIST 데이터 세트를 대상으로 TensorFlow 교육 작업을 실행하는 V100 GPU가 있는 컨테이너 인스턴스를 배포합니다. 리소스 요청은 워크로드를 실행하기에 충분합니다.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "containerGroupName": {
        "type": "string",
        "defaultValue": "gpucontainergrouprm",
        "metadata": {
          "description": "Container Group name."
        }
      }
    },
    "variables": {
      "containername": "gpucontainer",
      "containerimage": "mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu"
    },
    "resources": [
      {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2021-09-01",
        "location": "[resourceGroup().location]",
        "properties": {
            "containers": [
            {
              "name": "[variables('containername')]",
              "properties": {
                "image": "[variables('containerimage')]",
                "resources": {
                  "requests": {
                    "cpu": 4.0,
                    "memoryInGb": 12.0,
                    "gpu": {
                        "count": 1,
                        "sku": "V100"
                  }
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "restartPolicy": "OnFailure"
        }
      }
    ]
}

az deployment group create 명령을 사용하여 템플릿을 배포합니다. eastus처럼 GPU 리소스를 지원하는 Azure 지역에서 만든 리소스 그룹의 이름을 제공해야 합니다.

az deployment group create --resource-group myResourceGroup --template-file gpudeploy.json

배포를 완료하려면 몇 분이 걸립니다. 배포가 완료되면 컨테이너가 시작되어 TensorFlow 작업을 실행합니다. 로그 출력을 보려면 az container logs 명령을 실행합니다.

az container logs --resource-group myResourceGroup --name gpucontainergrouprm --container-name gpucontainer

출력

2018-10-25 18:31:10.155010: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-10-25 18:31:10.305937: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Tesla V100 major: 3 minor: 7 memoryClockRate(GHz): 0.8235
pciBusID: ccb6:00:00.0
totalMemory: 11.92GiB freeMemory: 11.85GiB
2018-10-25 18:31:10.305981: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla V100, pci bus id: ccb6:00:00.0, compute capability: 3.7)
2018-10-25 18:31:14.941723: I tensorflow/stream_executor/dso_loader.cc:139] successfully opened CUDA library libcupti.so.8.0 locally
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting /tmp/tensorflow/input_data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting /tmp/tensorflow/input_data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting /tmp/tensorflow/input_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting /tmp/tensorflow/input_data/t10k-labels-idx1-ubyte.gz
Accuracy at step 0: 0.097
Accuracy at step 10: 0.6993
Accuracy at step 20: 0.8208
Accuracy at step 30: 0.8594
...
Accuracy at step 990: 0.969
Adding run metadata for 999

리소스 정리

GPU 리소스를 사용하면 많은 비용이 발생할 수 있으므로 컨테이너가 예기치 않게 오래 실행되지 않도록 주의해야 합니다. Azure Portal에서 컨테이너를 모니터링하거나 az container show 명령으로 컨테이너 그룹의 상태를 확인할 수 있습니다. 예시:

az container show --resource-group myResourceGroup --name gpucontainergroup --output table

작성한 컨테이너를 사용하는 작업이 완료되었으면 다음 명령을 사용하여 컨테이너를 삭제합니다.

az container delete --resource-group myResourceGroup --name gpucontainergroup -y
az container delete --resource-group myResourceGroup --name gpucontainergrouprm -y

다음 단계