다음을 통해 공유


Azure Machine Learning SDK(v1)를 사용하여 대규모로 TensorFlow 모델 학습

적용 대상: Python SDK azureml v1

이 문서에서는 Azure Machine Learning을 사용하여 대규모로 TensorFlow 학습 스크립트를 실행하는 방법에 대해 알아봅니다.

이 예제에서는 DNN(심층 신경망)을 사용하여 필기 숫자를 분류하기 위해 TensorFlow 모델을 학습하고 등록합니다.

처음부터 TensorFlow 모델을 개발하든, 기존 모델을 클라우드로 가져오든 관계없이 Azure Machine Learning을 사용해 오픈 소스 학습 작업을 스케일 아웃하여 프로덕션 등급 모델을 빌드, 배포, 버전 관리, 모니터링할 수 있습니다.

필수 조건

다음 환경 중 하나에서 이 코드를 실행합니다.

이 문서의 코드를 실행하여 GPU 클러스터를 만들려면 먼저 작업 영역에 대한 할당량 증가를 요청해야 합니다.

실험 설정

이 섹션에서는 필요한 Python 패키지를 로드하고, 작업 영역을 초기화하며, 컴퓨팅 대상을 만들고, 학습 환경을 정의하여 학습 실험을 설정합니다.

패키지 가져오기

먼저, 필요한 Python 라이브러리를 가져옵니다.

import os
import urllib
import shutil
import azureml

from azureml.core import Experiment
from azureml.core import Workspace, Run
from azureml.core import Environment

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

작업 영역 초기화

Azure Machine Learning 작업 영역은 서비스의 최상위 리소스입니다. 사용자가 만드는 모든 아티팩트를 사용할 수 있는 중앙 집중식 환경을 제공합니다. Python SDK에서 workspace 개체를 만들어 작업 영역 아티팩트에 액세스할 수 있습니다.

사전 요구 사항 섹션에서 만든 config.json 파일에서 작업 영역 개체를 만듭니다.

ws = Workspace.from_config()

파일 데이터 세트 만들기

FileDataset 개체는 작업 영역 데이터 저장소 또는 공용 URL에서 하나 이상의 파일을 참조합니다. 파일은 모든 형식일 수 있으며, 클래스는 컴퓨팅에 파일을 다운로드하거나 탑재하는 기능을 제공합니다. FileDataset를 생성하여 데이터 원본 위치에 대한 참조를 만듭니다. 데이터 세트에 변환을 적용한 경우 데이터 세트에도 저장됩니다. 데이터는 기존 위치에 그대로 남아 있으므로 추가 스토리지 비용이 발생하지 않습니다. Dataset 패키지에 대한 자세한 내용은 등록 데이터 세트를 만드는 방법 문서를 참조하세요.

from azureml.core.dataset import Dataset

web_paths = [
            'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
            ]
dataset = Dataset.File.from_files(path = web_paths)

register() 메서드를 사용하여 작업 영역에 데이터 세트를 등록합니다. 이렇게 하면 데이터 세트를 다른 사용자와 공유하고, 다양한 실험에서 재사용하고, 학습 스크립트에서 이름으로 참조할 수 있습니다.

dataset = dataset.register(workspace=ws,
                           name='mnist-dataset',
                           description='training and test dataset',
                           create_new_version=True)

# list the files referenced by dataset
dataset.to_path()

컴퓨팅 대상 만들기

TensorFlow 작업을 실행할 컴퓨팅 대상을 만듭니다. 이 예제에서는 GPU 지원 Azure Machine Learning 컴퓨팅 클러스터를 만듭니다.

Important

GPU 클러스터를 만들려면 먼저 작업 영역에 대한 할당량 증가를 요청해야 합니다.

cluster_name = "gpu-cluster"

try:
    compute_target = ComputeTarget(workspace=ws, name=cluster_name)
    print('Found existing compute target')
except ComputeTargetException:
    print('Creating a new compute target...')
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6', 
                                                           max_nodes=4)

    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

컴퓨팅 대상에 대한 자세한 내용은 컴퓨팅 대상이란? 문서를 참조하세요.

환경 정의

학습 스크립트의 종속성을 캡슐화하는 Azure Machine Learning 환경을 정의하려면 사용자 지정 환경을 정의하거나 Azure Machine Learning 큐레이팅된 환경을 사용할 수 있습니다.

큐레이팅된 환경 사용

사용자 고유의 환경을 정의하지 않으려는 경우 Azure Machine Learning에서 미리 빌드된 큐레이팅된 환경을 제공합니다. Azure Machine Learning에는 여러 버전의 TensorFlow에 해당하는 TensorFlow에 대한 몇 가지 CPU 및 GPU 큐레이팅된 환경이 있습니다. @latest 지시문을 사용하여 이 환경의 최신 버전을 사용할 수 있습니다. 자세한 내용은 Azure Machine Learning 큐레이팅된 환경을 참조하세요.

큐레이팅된 환경을 사용하려는 경우 코드는 다음 예제와 유사합니다.

curated_env_name = 'AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu'
tf_env = Environment.get(workspace=ws, name=curated_env_name)

큐레이팅된 환경에 포함된 패키지를 보려면 conda 종속성을 디스크에 쓸 수 있습니다.


tf_env.save_to_directory(path=curated_env_name)

학습 스크립트에 필요한 모든 종속성이 큐레이팅된 환경에 포함되어 있는지 확인합니다. 그렇지 않은 경우 누락된 종속성을 포함하도록 환경을 수정해야 합니다. 환경이 수정되면 ‘AzureML’ 접두사가 큐레이팅된 환경용으로 예약되어 있으므로 새 이름을 지정해야 합니다. conda 종속성 YAML 파일을 수정한 경우 다음과 같이 새 이름을 사용하여 새 환경을 만들 수 있습니다.


tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')

대신 큐레이팅된 환경 개체를 직접 수정한 경우 새 이름을 사용하여 해당 환경을 복제할 수 있습니다.


tf_env = tf_env.clone(new_name='my-AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu')

사용자 지정 환경 만들기

학습 스크립트의 종속성을 캡슐화하는 Azure Machine Learning 환경을 직접 만들 수도 있습니다.

먼저 YAML 파일에 conda 종속성을 정의합니다. 다음 예제에서 파일 이름은 conda_dependencies.yml입니다.

channels:
- conda-forge
dependencies:
- python=3.7
- pip:
  - azureml-defaults
  - tensorflow-gpu==2.2.0

이 conda 환경 사양에서 Azure Machine Learning 환경을 만듭니다. 환경은 런타임에 Docker 컨테이너로 패키지화됩니다.

기본 이미지가 지정되지 않은 경우에는 Azure Machine Learning은 기본적으로 CPU 이미지 azureml.core.environment.DEFAULT_CPU_IMAGE를 기본 이미지로 사용합니다. 다음 예제에서는 GPU 클러스터에서 학습을 실행하므로 필요한 GPU 드라이버 및 종속성이 있는 GPU 기본 이미지를 지정해야 합니다. Azure Machine Learning은 사용할 수 있는 MCR(Microsoft Container Registry)에 게시된 기본 이미지 세트를 유지 관리합니다. 자세한 내용은 Azure/AzureML-Containers GitHub 리포지토리를 참조하세요.

tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')

# Specify a GPU base image
tf_env.docker.enabled = True
tf_env.docker.base_image = 'mcr.microsoft.com/azureml/openmpi3.1.2-cuda10.1-cudnn7-ubuntu18.04'

필요에 따라 사용자 지정 Docker 이미지 또는 Docker 파일에서 모든 종속성을 직접 캡처하고 여기서 환경을 만들 수 있습니다. 자세한 내용은 사용자 지정 이미지를 사용하여 학습을 참조하세요.

환경을 만들고 사용하는 방법에 대한 자세한 내용은 Azure Machine Learning에서 소프트웨어 환경 만들기 및 사용을 참조하세요.

학습 실행 구성 및 제출

ScriptRunConfig 만들기

ScriptRunConfig 개체를 만들어 학습 스크립트, 사용할 환경 및 실행할 컴퓨팅 대상 등 학습 작업의 구성 세부 정보를 지정합니다. arguments 매개 변수에 지정되면 학습 스크립트에 대한 모든 인수가 명령줄을 통해 전달됩니다.

from azureml.core import ScriptRunConfig

args = ['--data-folder', dataset.as_mount(),
        '--batch-size', 64,
        '--first-layer-neurons', 256,
        '--second-layer-neurons', 128,
        '--learning-rate', 0.01]

src = ScriptRunConfig(source_directory=script_folder,
                      script='tf_mnist.py',
                      arguments=args,
                      compute_target=compute_target,
                      environment=tf_env)

Warning

Azure Machine Learning는 전체 원본 디렉터리를 복사하여 학습 스크립트를 실행합니다. 업로드를 원하지 않는 중요한 데이터가 있다면 .ignore 파일을 사용하거나 데이터를 원본 디렉터리에 포함하지 마세요. 대신 Azure Machine Learning 데이터 세트를 사용하여 데이터에 액세스합니다.

ScriptRunConfig를 사용하여 작업을 구성하는 방법에 대한 자세한 내용은 학습 실행 구성 및 제출을 참조하세요.

Warning

이전에 TensorFlow 예측 도구를 사용하여 TensorFlow 학습 작업을 구성한 경우, 이 예측 도구는 1.19.0 SDK 릴리스부터 더 이상 사용되지 않습니다. Azure Machine Learning SDK >= 1.15.0 이상을 사용하는 경우 ScriptRunConfig는 딥 러닝 프레임워크를 사용하는 작업을 포함하여 학습 작업을 구성하는 데 권장되는 방법입니다. 마이그레이션에 대한 일반적인 질문은 예측 도구에서 ScriptRunConfig로 마이그레이션 가이드를 참조하세요.

실행 제출

Run 개체는 작업이 실행되는 동안 그리고 작업이 완료된 후 실행 기록에 대한 인터페이스를 제공합니다.

run = Experiment(workspace=ws, name='Tutorial-TF-Mnist').submit(src)
run.wait_for_completion(show_output=True)

Run을 실행하는 중에 수행되는 작업

Run이 실행되면 다음 단계를 거칩니다.

  • 준비: 정의된 환경에 따라 Docker 이미지가 생성됩니다. 이미지는 작업 영역의 컨테이너 레지스트리에 업로드되고 나중에 실행될 수 있도록 캐시됩니다. 또한 로그는 실행 기록으로 스트리밍되며 진행 상황을 모니터링할 수 있도록 표시됩니다. 큐레이팅된 환경이 대신 지정되면 해당 큐레이팅된 환경을 지원하는 캐시된 이미지가 사용됩니다.

  • 스케일링: Batch AI 클러스터에서 Run을 실행하는 데 현재 사용할 수 있는 노드보다 더 많은 노드가 필요한 경우 클러스터에서 스케일 업을 시도합니다.

  • 실행: 스크립트 폴더의 모든 스크립트가 컴퓨팅 대상으로 업로드되고, 데이터 저장소가 탑재되거나 복사되며, script가 실행됩니다. stdout 및 ./logs 폴더의 출력은 실행 기록으로 스트리밍되며 Run을 모니터링하는 데 사용될 수 있습니다.

  • 후 처리: Run의 ./outputs 폴더가 실행 기록에 복사됩니다.

모델 등록 또는 다운로드

모델이 학습되었으면 해당 모델을 작업 영역에 등록할 수 있습니다. 모델 등록을 사용하면 모델을 작업 영역에 저장하고 버전을 지정하여 모델 관리 및 배포를 간소화할 수 있습니다.

선택 사항: 매개 변수 model_framework, model_framework_version, resource_configuration을 지정하면 코드가 없는 모델 배포를 사용할 수 있게 됩니다. 이렇게 하면 모델을 등록된 모델에서 웹 서비스로 직접 배포할 수 있으며 ResourceConfiguration 개체는 웹 서비스의 컴퓨팅 리소스를 정의합니다.

from azureml.core import Model
from azureml.core.resource_configuration import ResourceConfiguration

model = run.register_model(model_name='tf-mnist', 
                           model_path='outputs/model',
                           model_framework=Model.Framework.TENSORFLOW,
                           model_framework_version='2.0',
                           resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5))

Run 개체를 사용하여 모델의 로컬 복사본을 다운로드할 수도 있습니다. 학습 스크립트 tf_mnist.py에서 TensorFlow 저장기 개체는 모델을 로컬 폴더(컴퓨팅 대상의 로컬 폴더)에 유지합니다. Run 개체를 사용하여 복사본을 다운로드할 수 있습니다.

# Create a model folder in the current directory
os.makedirs('./model', exist_ok=True)
run.download_files(prefix='outputs/model', output_directory='./model', append_prefix=False)

분산 학습

Azure Machine Learning은 학습 워크로드를 스케일링할 수 있도록 다중 노드 분산 TensorFlow 작업도 지원합니다. 분산 TensorFlow 작업을 쉽게 실행할 수 있으며, Azure Machine Learning에서 오케스트레이션을 관리합니다.

Azure Machine Learning에서는 Horovod 및 TensorFlow의 기본 제공 분산 학습 API를 사용하여 분산 TensorFlow 작업을 실행할 수 있습니다.

분산 학습에 대한 자세한 내용은 분산 GPU 학습 가이드를 참조하세요.

TensorFlow 모델 배포

배포 방법에는 모델 등록에 대한 섹션이 포함되어 있지만 이미 등록된 모델이 있으므로 배포에 대한 컴퓨팅 대상 만들기로 직접 건너뛸 수 있습니다.

(미리 보기) 코드가 없는 모델 배포

Important

이 기능은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기 버전은 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다.

자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

기존 배포 경로 대신 TensorFlow에 코드가 없는 배포 기능(미리 보기)을 사용할 수도 있습니다. model_framework, model_framework_versionresource_configuration 매개 변수를 사용하여 위와 같이 모델을 등록하면 deploy() 정적 함수를 사용하여 모델을 배포할 수 있습니다.

service = Model.deploy(ws, "tensorflow-web-service", [model])

전체 사용 방법에서는 Azure Machine Learning에서 배포를 자세히 다룹니다.

다음 단계

이 문서에서 TensorFlow 모델을 학습하고 등록했으며 배포 옵션에 대해 알아봤습니다. Azure Machine Learning에 대한 자세한 내용은 다음 문서를 참조하세요.