

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 프라이빗 Docker 레지스트리에 있는 이미지에 액세스할 수 있도록 훈련 작업을 조정하세요.
<a name="docker-containers-adapt-your-own-private-registry"></a>

Amazon Elastic Container Registry(Amazon ECR) 대신 프라이빗 [Docker 레지스트리](https://docs.docker.com/registry/)를 사용하여 SageMaker AI 훈련용 이미지를 호스팅할 수 있습니다. 다음 지침은 Docker 레지스트리를 생성하고, 가상 프라이빗 클라우드(VPC) 및 훈련 작업을 구성하고, 이미지를 저장하고, SageMaker AI에게 프라이빗 Docker 레지스트리의 훈련 이미지에 대한 액세스 권한을 부여하는 방법을 보여줍니다. 또한 이 지침은 SageMaker 훈련 작업에 인증이 필요한 Docker 레지스트리를 사용하는 방법을 보여줍니다.

## 프라이빗 Docker 레지스트리에 이미지를 생성 및 저장
<a name="docker-containers-adapt-your-own-private-registry-prerequisites"></a>

프라이빗 Docker 레지스트리를 생성하여 이미지를 저장합니다. 레지스트리는 다음과 같아야 합니다.
+ [Docker 레지스트리 HTTP API](https://docs.docker.com/registry/spec/api/) 프로토콜을 사용합니다
+ `CreateTrainingJob` API의 [VpcConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#API_CreateTrainingJob_RequestSyntax) 파라미터에 지정된 동일한 VPC에서 액세스할 수 있습니다. 훈련 작업을 생성할 때 `VpcConfig`를 입력합니다.
+ 알려진 퍼블릭 인증 기관의 [TLS 인증서](https://aws.amazon.com/what-is/ssl-certificate/)로 보호됩니다.

Docker 레지스트리 생성에 대한 자세한 내용은 [레지스트리 서버 배포](https://docs.docker.com/registry/deploying/)를 참조하세요.

## VPC 및 SageMaker 훈련 작업 구성
<a name="docker-containers-adapt-your-own-private-registry-configure"></a>

SageMaker AI는 VPC 내의 네트워크 연결을 사용하여 Docker 레지스트리의 이미지에 액세스합니다. Docker 레지스트리의 이미지를 훈련에 사용하려면 계정의 Amazon VPC에서 레지스트리에 액세스할 수 있어야 합니다. 자세한 내용은 [훈련을 위해 인증이 필요한 Docker 레지스트리 사용](docker-containers-adapt-your-own-private-registry-authentication.md) 섹션을 참조하세요.

또한 Docker 레지스트리에서 액세스할 수 있는 동일한 VPC에 연결하도록 훈련 작업을 구성해야 합니다. 자세한 내용은 [Amazon VPC 액세스를 위한 훈련 작업 구성](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html#train-vpc-configure)을 참조하세요.

## 프라이빗 Docker 레지스트리의 이미지를 사용하여 훈련 작업 생성
<a name="docker-containers-adapt-your-own-private-registry-create"></a>

프라이빗 Docker 레지스트리의 이미지를 훈련에 사용하려면 다음 안내서를 사용하여 이미지를 구성하고 훈련 작업을 구성 및 생성하세요. 다음 코드 예제에서는 AWS SDK for Python (Boto3) 클라이언트를 사용합니다.

1. 훈련 이미지 구성 객체를 생성하고 다음과 같이 `TrainingRepositoryAccessMode` 필드에 `Vpc`를 입력합니다.

   ```
   training_image_config = {
       'TrainingRepositoryAccessMode': 'Vpc'
   }
   ```
**참고**  
프라이빗 Docker 레지스트리에 인증이 필요한 경우 훈련 이미지 구성 객체에 `TrainingRepositoryAuthConfig` 객체를 추가해야 합니다. 또한 `TrainingRepositoryAuthConfig` 객체의 `TrainingRepositoryCredentialsProviderArn` 필드를 사용하여 SageMaker AI에 대한 액세스 자격 증명을 제공하는 AWS Lambda 함수의 Amazon 리소스 이름(ARN)을 지정해야 합니다. 자세한 내용은 아래의 예제 코드 구조를 참조하세요.  

   ```
   training_image_config = {
      'TrainingRepositoryAccessMode': 'Vpc',
      'TrainingRepositoryAuthConfig': {
           'TrainingRepositoryCredentialsProviderArn': '{{arn:aws:lambda:Region:Acct:function:FunctionName}}'
      }
   }
   ```

   인증을 제공하는 Lambda 함수를 생성하는 방법에 대한 자세한 내용은 [훈련을 위해 인증이 필요한 Docker 레지스트리 사용](docker-containers-adapt-your-own-private-registry-authentication.md) 섹션을 참조하세요.

1. Boto3 클라이언트를 사용하여 훈련 작업을 생성하고 올바른 구성을 [create\_training\_job](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) API에 전달하세요. 다음 지침은 구성 요소를 구성하고 훈련 작업을 생성하는 방법을 보여줍니다.

   1. `create_training_job`에 전달할 `AlgorithmSpecification` 객체를 생성합니다. 다음 코드 예제와 같이 이전 단계에서 생성한 훈련 이미지 구성 객체를 사용합니다.

      ```
      algorithm_specification = {
         'TrainingImage': '{{myteam.myorg.com/docker-local/my-training-image:<IMAGE-TAG>}}',
         'TrainingImageConfig': training_image_config,
         'TrainingInputMode': '{{File}}'
      }
      ```
**참고**  
업데이트된 버전 이미지 대신 정정된 이미지를 사용하려면 이름이나 태그 대신 이미지의 [다이제스트](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)를 참조하세요.

   1. 다음 코드 예제와 같이 `create_training_job`에 전달하려는 훈련 작업과 역할의 이름을 지정합니다.

      ```
      training_job_name = '{{private-registry-job}}'
      execution_role_arn = '{{arn:aws:iam::123456789012:role/SageMakerExecutionRole}}'
      ```

   1. 훈련 작업의 VPC 구성을 위한 보안 그룹 및 서브넷을 지정합니다. 다음 코드 예제와 같이 프라이빗 Docker 레지스트리는 지정한 보안 그룹으로부터의 인바운드 트래픽을 허용해야 합니다.

      ```
      vpc_config = {
          'SecurityGroupIds': ['{{sg-0123456789abcdef0}}'],
          'Subnets': ['{{subnet-0123456789abcdef0}}','{{subnet-0123456789abcdef1}}']
      }
      ```
**참고**  
서브넷이 프라이빗 Docker 레지스트리와 동일한 VPC에 있지 않은 경우 두 VPC 간에 네트워킹 연결을 설정해야 합니다. 자세한 내용은 [VPC 피어링](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-peering.html)을 이용한 VPC 연결을 참조하세요.

   1. 다음 코드 예제와 같이 훈련에 사용할 기계 학습 컴퓨팅 인스턴스 및 스토리지 볼륨을 포함한 리소스 구성을 지정합니다.

      ```
      resource_config = {
          'InstanceType': '{{ml.m4.xlarge}}',
          'InstanceCount': {{1}},
          'VolumeSizeInGB': {{10}},
      }
      ```

   1. 다음 코드 예제와 같이 입력 및 출력 데이터 구성, 훈련 데이터 세트를 저장하는 위치, 모델 아티팩트를 저장할 위치를 지정합니다.

      ```
      input_data_config = [
          {
              "ChannelName": "training",
              "DataSource":
              {
                  "S3DataSource":
                  {
                      "S3DataDistributionType": "{{FullyReplicated}}",
                      "S3DataType": "{{S3Prefix}}",
                      "S3Uri": "{{s3://your-training-data-bucket/training-data-folder}}"
                  }
              }
          }
      ]
      
      output_data_config = {
          'S3OutputPath': '{{s3://your-output-data-bucket/model-folder}}'
      }
      ```

   1. 다음 코드 예제와 같이 모델 훈련 작업을 실행할 수 있는 최대 시간(초)을 지정합니다.

      ```
      stopping_condition = {
          'MaxRuntimeInSeconds': {{1800}}
      }
      ```

   1. 마지막으로 다음 코드 예제와 같이 이전 단계에서 지정한 파라미터를 사용하여 훈련 작업을 생성합니다.

      ```
      import boto3
      sm = boto3.client('sagemaker')
      try:
          resp = sm.create_training_job(
              TrainingJobName=training_job_name,
              AlgorithmSpecification=algorithm_specification,
              RoleArn=execution_role_arn,
              InputDataConfig=input_data_config,
              OutputDataConfig=output_data_config,
              ResourceConfig=resource_config,
              VpcConfig=vpc_config,
              StoppingCondition=stopping_condition
          )
      except Exception as e:
          print(f'error calling CreateTrainingJob operation: {e}')
      else:
          print(resp)
      ```