제퍼넷 로고

Amazon SageMaker를 사용하여 초 고해상도 의료 이미지를위한 확장 가능한 기계 학습 파이프 라인 구축

시간

신경망은 물체 감지, 이미지 유사성 및 분류와 같은 복잡한 컴퓨터 비전 작업을 해결하는 데 효과적인 것으로 입증되었습니다. 저비용 GPU의 발전으로 신경망을 구축하고 배포하는 데 드는 계산 비용이 크게 감소했습니다. 그러나 대부분의 기술은 비주얼 미디어에서 흔히 볼 수있는 픽셀 해상도를 처리하도록 설계되었습니다. 예를 들어 일반적인 해상도 크기는 YOLOv544의 경우 416 및 3 픽셀, SSD의 경우 300 및 512 픽셀, VGG의 경우 224 픽셀입니다. 위성 또는 디지털 병리학 이미지와 같은 기가 픽셀 이미지 (10 ^ 9 + 픽셀)로 구성된 데이터 세트에 대해 분류기를 훈련하는 것은 계산적으로 어렵습니다. 이러한 이미지는 각 GPU가 사용 가능한 메모리에 의해 제한되기 때문에 신경망에 직접 입력 할 수 없습니다. 이를 위해서는 원본 이미지를 더 작은 청크로 처리 할 수 ​​있도록 타일링과 같은 특정 전처리 기술이 필요합니다. 또한 이러한 이미지의 크기가 크기 때문에 전체 교육 시간이 길어 분산 교육과 같은 적절한 확장 기술을 사용하지 않고 며칠 또는 몇 주가 소요되는 경우가 많습니다.

이 게시물에서는 세 가지 목표를 달성하기 위해 확장 성이 뛰어난 기계 학습 (ML) 파이프 라인을 구축하는 방법을 설명합니다.

데이터 세트

이 게시물에서 우리는 데이터 세트 다음에서 얻은 전체 슬라이드 디지털 병리 이미지로 구성 암 게놈 아틀라스 (TCGA)를 사용하여 LUAD (선암), LUSC (편평 세포 암종) 또는 정상 폐 조직으로 정확하고 자동으로 분류합니다. 데이터 세트는 NIH 및 NCI에서 공용으로 사용할 수 있습니다.

원시 고해상도 이미지는 SVS 체재. SVS 파일은 Aperio 현미경 이미지를 보관하고 분석하는 데 사용됩니다. 이 게시물에 사용 된 기술과 도구를 위성 이미지를 포함한 모든 초 고해상도 이미지 데이터 세트에 적용 할 수 있습니다.

다음은 조직 슬라이드의 샘플 이미지입니다. 이 단일 이미지는 750 억 픽셀 이상을 포함하며 XNUMXMB 이상의 메모리를 차지합니다. 이 이미지는 원래 형태로 신경망에 직접 공급할 수 없으므로 이미지를 여러 개의 작은 이미지로 타일링해야합니다.

다음은 이전 조직 슬라이드 이미지를 전처리 한 후 생성 된 타일 이미지 샘플입니다. 이 RGB 3 채널 이미지는 512x512 크기이며 신경망에 대한 입력으로 직접 사용할 수 있습니다. 이러한 바둑판 식 이미지 각각에는 상위 슬라이드와 동일한 레이블이 지정됩니다. 또한 배경이 50 % 이상인 바둑판 식 이미지는 삭제됩니다.

아키텍처 개요

다음 그림은 원본 원시 이미지에서 추론에 이르기까지 전체적인 엔드 투 엔드 아키텍처를 보여줍니다. 먼저 SageMaker Processing을 사용하여 이미지를 학습 및 테스트 분할로 타일링, 확대 / 축소 및 정렬 한 다음 분산 SageMaker 학습에 필요한 수의 샤드로 패키징합니다. 둘째, SageMaker 교육 작업은 다음에서 Docker 컨테이너를로드합니다. Amazon Elastic Container Registry (Amazon ECR). 이 작업은 파이프 모드를 사용하여 준비된 이미지 조각에서 데이터를 읽고, 모델을 훈련시키고, 최종 모델 아티팩트를 아마존 단순 스토리지 서비스 (Amazon S3). 마지막으로, 적절한 Docker 컨테이너 (Amazon ECR에서)와 모델 (Amazon S3에서)을로드하는 훈련 된 모델을 실시간 추론 엔드 포인트에 배포하여 짧은 지연 시간으로 추론 요청을 처리합니다.

SageMaker 처리를 사용한 데이터 사전 처리

SVS 슬라이드 이미지는 세 단계로 사전 처리됩니다.

  • 이미지 타일링 – 이미지는 겹치지 않는 512x512 픽셀 창으로 타일링되고 50 % 이상의 배경을 포함하는 타일은 폐기됩니다. 타일은 JPEG 이미지로 저장됩니다.
  • 이미지를 TFRecord로 변환 – SageMaker Pipe 모드를 사용하여 훈련 시간을 단축하므로 데이터를 프로토 버퍼 형식으로 사용할 수 있어야합니다. TFRecord는 TensorFlow로 모델 학습에 사용되는 인기있는 프로토 버퍼 형식입니다. 다음 섹션에서 SageMaker 파이프 모드 및 프로토 버퍼 형식에 대해 자세히 설명합니다.
  • TFRecord 정렬 – XNUMX 원 분류기 (LUAD / LUSC / Normal)에 대한 테스트, 훈련 및 검증 코호트로 데이터 세트를 정렬합니다. TCGA 데이터 세트에는 단일 환자에 해당하는 여러 슬라이드 이미지가있을 수 있습니다. 데이터 유출을 방지하기 위해 동일한 환자에 해당하는 슬라이드에서 생성 된 모든 타일이 동일한 분할을 차지하는지 확인해야합니다. 테스트 세트의 경우 배포에 사용되는 방식으로 모델을 평가할 수 있도록 해당 슬라이드의 모든 타일을 포함하는 슬라이드 별 TFRecord를 만듭니다.

다음은 전처리 코드입니다.

def generate_tf_records(base_folder, input_files, output_file, n_image, slide=None): record_file = output_file count = n_image with tf.io.TFRecordWriter(record_file) as writer: while count: filename, label = random.choice(input_files) temp_img = plt.imread(os.path.join(base_folder, filename)) if temp_img.shape != (512, 512, 3): continue count -= 1 image_string = np.float32(temp_img).tobytes() slide_string = slide.encode('utf-8') if slide else None tf_example = image_example(image_string, label, slide_string) writer.write(tf_example.SerializeToString())

이전 사전 처리 단계에 SageMaker 처리를 사용하여 SageMaker를 사용하여 데이터 사전 처리 또는 사후 처리, 기능 엔지니어링, 데이터 유효성 검사 및 모델 평가 워크로드를 실행할 수 있습니다. 처리 작업은 Amazon S3의 데이터를 입력으로 받아들이고 처리 된 출력 데이터를 다시 Amazon S3에 저장합니다.

SageMaker Processing 사용의 이점은 여러 컴퓨팅 인스턴스에 입력을 쉽게 배포 할 수 있다는 것입니다. 간단히 설정할 수 있습니다. s3_data_distribution_type=ShardedByS3Key 모든 처리 컨테이너간에 데이터를 균등하게 나누는 매개 변수.

중요한 것은 처리 인스턴스 수가 Horovod를 사용한 분산 학습에 사용할 GPU 수 (즉, 16)와 일치한다는 것입니다. Horovod 교육을 도입하면 그 이유가 더 명확 해집니다.

처리 스크립트는 GitHub의.

processor = Processor(image_uri=image_name, role=get_execution_role(), instance_count=16, # run the job on 16 instances base_job_name='processing-base', # should be unique name instance_type='ml.m5.4xlarge', volume_size_in_gb=1000) processor.run(inputs=[ProcessingInput( source=f's3://<bucket_name>/tcga-svs', # s3 input prefix s3_data_type='S3Prefix', s3_input_mode='File', s3_data_distribution_type='ShardedByS3Key', # Split the data across instances destination='/opt/ml/processing/input')], # local path on the container outputs=[ProcessingOutput( source='/opt/ml/processing/output', # local output path on the container destination=f's3://<bucket_name>/tcga-svs-tfrecords/' # output s3 location )], arguments=['10000'], # number of tiled images per TF record for training dataset wait=True, logs=True)

SageMaker 교육을 사용한 분산 모델 교육

개념화에서 프로덕션으로 ML 모델을 가져 오는 것은 일반적으로 복잡하고 시간이 많이 걸립니다. 우리는 모델을 훈련시키기 위해 많은 양의 데이터를 관리하고 훈련을위한 최상의 알고리즘을 선택하고 훈련하는 동안 컴퓨팅 용량을 관리 한 다음 모델을 프로덕션 환경에 배포해야합니다. SageMaker는 훨씬 쉽게 ML 모델 구축 및 배포. 모델을 페타 바이트 규모로 훈련하고 프로덕션에 배포하기 위해 기본 인프라를 관리합니다.

전체 슬라이드 이미지를 사전 처리 한 후에도 수백 기가 바이트의 데이터가 있습니다. 단일 인스턴스 (GPU 또는 CPU)에 대한 학습은 완료하는 데 며칠 또는 몇 주가 걸립니다. 속도를 높이려면 모델 학습 워크로드를 여러 인스턴스에 분산해야합니다. 이 게시물에서는 분산 교육 프레임 워크 인 Horovod와 SageMaker Pipe 모드를 사용하는 데이터 병렬 처리를 기반으로하는 분산 딥 러닝에 중점을 둡니다.

Horovod : 크로스 플랫폼 분산 교육 프레임 워크

많은 양의 데이터로 모델을 학습 할 때 데이터는 단일 인스턴스 또는 여러 인스턴스의 여러 CPU 또는 GPU에 분산되어야합니다. 딥 러닝 프레임 워크는 분산 훈련을 지원하는 자체 방법을 제공합니다. 호로 보드 분산 딥 러닝을 위해 널리 사용되는 프레임 워크에 구애받지 않는 툴킷입니다. 빠른 분산 학습을 위해 allreduce 알고리즘을 사용하고 (파라미터 서버 접근 방식과 비교) 분산 학습을 더 빠르게 만들기위한 여러 최적화 방법을 포함합니다. SageMaker에서 Horovod를 사용한 분산 교육의 더 많은 예는 다음을 참조하십시오. Amazon SageMaker Pipe 모드에서 Horovod를 사용한 다중 GPU 및 분산 교육Amazon SageMaker에서 Apache MXNet 및 Horovod를 사용하여 교육 시간 단축.

SageMaker 파이프 모드

파일 모드 또는 파이프 모드에서 SageMaker에 입력을 제공 할 수 있습니다. 파일 모드에서는 입력 파일이 훈련 인스턴스에 복사됩니다. 와 파이프 모드, 데이터 세트가 학습 인스턴스로 직접 스트리밍됩니다. 즉, 학습 작업이 더 빨리 시작되고 컴퓨팅 및 다운로드가 병렬로 수행 될 수 있으며 필요한 디스크 공간이 줄어 듭니다. 따라서 대규모 데이터 세트에는 파이프 모드를 권장합니다.

SageMaker 파이프 모드에서는 데이터가 프로토콜 버퍼 형식이어야합니다. 프로토콜 버퍼 구조화 된 데이터를 직렬화하기위한 언어 중립적, 플랫폼 중립적, 확장 가능한 메커니즘입니다. TF 레코드 TensorFlow로 모델 학습에 사용되는 인기있는 프로토 버퍼 형식입니다. TFRecord는 다양한 방식으로 TensorFlow와 함께 사용하도록 최적화되어 있습니다. 첫째, 여러 데이터 세트를 쉽게 결합하고 라이브러리에서 제공하는 데이터 가져 오기 및 전처리 기능과 원활하게 통합 할 수 있습니다. 둘째, 이러한 유형의 데이터를 매우 효율적이고 (코딩 관점에서) 편리하게 가져올 수있는 방식으로 시퀀스 데이터 (예 : 시계열 또는 단어 인코딩)를 저장할 수 있습니다.

다음 다이어그램은 파이프 모드를 사용한 데이터 액세스를 보여줍니다.

SageMaker Pipe 모드를 사용한 데이터 샤딩

SageMaker Pipe 모드 및 Horovod로 작업 할 때 몇 가지 고려 사항을 염두에 두어야합니다.

  • 각 파이프를 통해 스트리밍되는 데이터는 다른 파이프와 상호 배타적입니다. 파이프의 수는 생성해야하는 데이터 샤드의 수를 나타냅니다.
  • Horovod는 각 컴퓨팅 인스턴스에 대한 교육 스크립트를 래핑합니다. 즉, 각 컴퓨팅 인스턴스의 데이터는 다른 샤드에서 가져와야합니다.
  • SageMaker Training 매개 변수 사용 S3DataDistributionType 로 설정 ShardedByS3Key, 하나 이상의 인스턴스와 파이프를 공유 할 수 있습니다. 데이터는 인스턴스간에 라운드 로빈 방식으로 스트리밍됩니다.

이를 더 잘 설명하기 위해 ml.p3.8xlarge 유형의 두 인스턴스 (A 및 B)를 사용한다고 가정 해 보겠습니다. 각 ml.p3.8xlarge 인스턴스에는 1 개의 GPU가 있습니다. 2 개의 파이프 (P3, P4, PXNUMX 및 PXNUMX)를 만들고 S3DataDistributionType = 'ShardedByS3Key’. 다음 표에 표시된 것처럼 각 파이프는 라운드 로빈 방식으로 두 인스턴스간에 데이터를 균등하게 분산합니다. 이것이 Horovod로 파이프를 설정하는 데 필요한 핵심 개념입니다. Horovod는 각 GPU에 대한 훈련 스크립트를 래핑하기 때문에 훈련 인스턴스 당 GPU 수만큼 파이프를 생성해야합니다.


다음 코드는 각 파이프에 대해 Amazon S3의 데이터를 분할합니다. 각 샤드는 Amazon S3에서 별도의 접두사를 가져야합니다.

# Definite distributed training hyperparameters
train_instance_type='ml.p3.8xlarge'
train_instance_count = 4
gpus_per_host = 4
num_of_shards = gpus_per_host * train_instance_count distributions = {'mpi': { 'enabled': True, 'processes_per_host': gpus_per_host }
}

# Sharding
client = boto3.client('s3')
result = client.list_objects(Bucket=s3://<bucket_name>, Prefix='tcga-svs-tfrecords/train/', Delimiter='/') j = -1
for i in range(num_of_shards): copy_source = { 'Bucket': s3://<bucket_name>, 'Key': result['Contents'][i]['Key'] } print(result['Contents'][i]['Key']) if i % gpus_per_host == 0: j += 1 dest = 'tcga-svs-tfrecords/train_sharded/' + str(j) +'/' + result['Contents'][i]['Key'].split('/')[2] print(dest) s3.meta.client.copy(copy_source, s3://<bucket_name>, dest) # Define inputs to SageMaker estimator
svs_tf_sharded = f's3://<bucket_name>/tcga-svs-tfrecords'
shuffle_config = sagemaker.session.ShuffleConfig(234)
train_s3_uri_prefix = svs_tf_sharded
remote_inputs = {} for idx in range(gpus_per_host): train_s3_uri = f'{train_s3_uri_prefix}/train_sharded/{idx}/' train_s3_input = s3_input(train_s3_uri, distribution ='ShardedByS3Key', shuffle_config=shuffle_config) remote_inputs[f'train_{idx}'] = train_s3_input remote_inputs['valid_{}'.format(idx)] = '{}/valid'.format(svs_tf_sharded)
remote_inputs['test'] = '{}/test'.format(svs_tf_sharded)
remote_inputs

SageMaker 추정기를 사용하여 ml.p3.8xlarge 인스턴스 16 개에 대한 교육을 시작합니다. 각 인스턴스에는 XNUMX 개의 GPU가 있습니다. 따라서 총 XNUMX 개의 GPU가 있습니다. 다음 코드를 참조하십시오.

local_hyperparameters = {'epochs': 5, 'batch-size' : 16, 'num-train':160000, 'num-val':8192, 'num-test':8192} estimator_dist = TensorFlow(base_job_name='svs-horovod-cloud-pipe', entry_point='src/train.py', role=role, framework_version='2.1.0', py_version='py3', distribution=distributions, volume_size=1024, hyperparameters=local_hyperparameters, output_path=f's3://<bucket_name>/output/', instance_count=4, instance_type=train_instance_type, input_mode='Pipe') estimator_dist.fit(remote_inputs, wait=True)

학습 스크립트의 다음 코드 스 니펫은 분산 학습을 위해 TensorFlow로 Horovod를 오케스트레이션하는 방법을 보여줍니다.

mpi = False
if 'sagemaker_mpi_enabled' in args.fw_params: if args.fw_params['sagemaker_mpi_enabled']: import horovod.keras as hvd mpi = True # Horovod: initialize Horovod. hvd.init() # Pin GPU to be used to process local rank (one GPU per process) gpus = tf.config.experimental.list_physical_devices('GPU') tf.config.experimental.set_visible_devices(gpus[hvd.local_rank()], 'GPU')
else: hvd = None callbacks = []
if mpi: callbacks.append(hvd.callbacks.BroadcastGlobalVariablesCallback(0)) callbacks.append(hvd.callbacks.MetricAverageCallback()) if hvd.rank() == 0: callbacks.append(ModelCheckpoint(args.output_dir + '/checkpoint-{epoch}.ckpt', save_weights_only=True, verbose=2))
else: callbacks.append(ModelCheckpoint(args.output_dir + '/checkpoint-{epoch}.ckpt', save_weights_only=True, verbose=2)) train_dataset = train_input_fn(hvd, mpi)
valid_dataset = valid_input_fn(hvd, mpi)
test_dataset = test_input_fn()
model = model_def(args.learning_rate, mpi, hvd)
logging.info("Starting training")
size = 1
if mpi: size = hvd.size() model.fit(train_dataset, steps_per_epoch=((args.num_train // args.batch_size) // size), epochs=args.epochs, validation_data=valid_dataset, validation_steps=((args.num_val // args.batch_size) // size), callbacks=callbacks, verbose=2)

Pipe 모드는 데이터를 각 인스턴스로 스트리밍하기 때문에 훈련 스크립트는 훈련 중에 데이터 크기를 계산할 수 없습니다 (계산에 필요한 단계당_에포크). 따라서 매개 변수는 TensorFlow 추정기에 하이퍼 매개 변수로 수동으로 제공됩니다. 또한 GPU간에 균등하게 나눌 수 있도록 데이터 포인트의 수를 지정해야합니다. 불균등 분할은 각 GPU가 훈련 프로세스를 완료하는 데 걸리는 시간이 더 이상 동일하지 않기 때문에 Horovod 교착 상태로 이어질 수 있습니다. 데이터 포인트가 균등하게 나뉘도록하기 위해 사전 처리를 위해 훈련 용 GPU 수와 동일한 수의 인스턴스를 사용합니다. 이 예에서이 숫자는 16입니다.

추론 및 배포

SageMaker를 사용하여 모델을 교육 한 후 새 이미지에 대한 추론을 위해 배포합니다. 한 번에 하나의 예측을 가져 오도록 영구 엔드 포인트를 설정하려면 SageMaker 호스팅 서비스를 사용하십시오. 전체 데이터 세트에 대한 예측을 얻으려면 SageMaker 일괄 변환을 사용하십시오.

이 게시물에서는 훈련 된 모델을 SageMaker 엔드 포인트로 배포합니다. 다음 코드는 모델을 m4 인스턴스에 배포하고 TFRecords에서 타일 이미지 데이터를 읽고 슬라이드 수준 예측을 생성합니다.

# Generate predictor object from trained model
predictor = estimator_dist.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge') # Tile-level prediction
raw_image_dataset = tf.data.TFRecordDataset(f'images/{local_file}') # read a TFrecord
parsed_image_dataset = raw_image_dataset.map(dataset_parser) # Parse TFrecord to JPEGs pred_scores_list = []
for i, element in enumerate(parsed_image_dataset): image = element[0].numpy() label = element[1].numpy() slide = element[2].numpy().decode() if i == 0: print(f"Making tile-level predictions for slide: {slide}...") print(f"Querying endpoint for a prediction for tile {i+1}...") pred_scores = predictor.predict(np.expand_dims(image, axis=0))['predictions'][0] pred_class = np.argmax(pred_scores) if i > 0 and i % 10 == 0: plt.figure() plt.title(f'Tile {i} prediction: {pred_class}') plt.imshow(image / 255) pred_scores_list.append(pred_scores)
print("Done.") # Slide-level prediction (average score over all tiles)
mean_pred_scores = np.mean(np.vstack(pred_scores_list), axis=0)
mean_pred_class = np.argmax(mean_pred_scores)
print(f"Slide-level prediction for {slide}:", mean_pred_class)

모델은 개별 타일 이미지에 대해 학습됩니다. 추론 중 SageMaker 엔드 포인트는 각 타일에 대한 분류 점수를 제공합니다. 이러한 점수는 모든 타일에 걸쳐 평균화되어 슬라이드 수준 점수 및 예측을 생성합니다. 다음 다이어그램은이 워크 플로를 보여줍니다.

다수결 계획도 적절할 것입니다.

대규모 새 슬라이드 이미지 배치에 대한 추론을 수행하려면 여러 인스턴스의 Amazon S3 데이터 세트에 대한 오프라인 예측을위한 배치 변환 작업을 실행할 수 있습니다. 처리 된 TFRecord가 Amazon S3에서 검색되면 이전 단계를 복제하여 각각의 새 이미지에 대한 슬라이드 수준 분류를 생성 할 수 있습니다.

결론

이 게시물에서는 SageMaker 처리, SageMaker 파이프 모드 및 Horovod를 사용하는 초 고해상도 이미지를위한 확장 가능한 기계 학습 파이프 라인을 소개했습니다. 파이프 라인은 기가 픽셀 규모에 접근하는 이미지로 구성된 데이터 세트에 대한 분류기의 대규모 학습 과정을 단순화합니다. SageMaker 및 Horovod를 사용하여 여러 컴퓨팅 인스턴스에 입력을 분산하여 교육 시간을 단축함으로써 프로세스를 간소화했습니다. 또한 슬라이드 수준 추론을 생성하기 위해 타일 수준 예측을 집계하는 간단하지만 효과적인 전략을 제공했습니다.

SageMaker에 대한 자세한 내용은 Amazon SageMaker를 사용하여 기계 학습 모델을 구축, 교육 및 배포. Pipe 모드와 Horovod가 함께 적용되는 SageMaker에서 실행하는 전체 예제는 다음을 참조하십시오. GitHub 레포.

참고자료

  1. Nicolas Coudray, Paolo Santiago Ocampo, Theodore Sakellaropoulos, Navneet Narula, Matija Snuderl, David Fenyö, Andre L. Moreira, Narges Razavian, Aristotelis Tsirigos. “딥 러닝을 이용한 비소 세포 폐암 조직 병리학 영상의 분류 및 돌연변이 예측”. Nature Medicine, 2018; DOI : 10.1038 / s41591-018-0177-5
  2. https://github.com/ncoudray/DeepPATH/tree/master/DeepPATH_code
  3. https://www.cancer.gov/about-nci/organization/ccg/research/structural-genomics/tcga

저자에 관하여

카란 신드 와니 Amazon Machine Learning Solutions의 데이터 과학자로서 딥 러닝 모델을 구축하고 배포합니다. 그는 컴퓨터 비전 분야를 전문으로합니다. 여가 시간에는 하이킹을 즐깁니다.

비나이 하누 마이 아 Amazon ML Solutions Lab의 딥 러닝 아키텍트는 고객이 AI 및 ML 솔루션을 구축하여 비즈니스 과제를 가속화하도록 지원합니다. 그 전에는 AWS DeepLens 및 Amazon Personalize 출시에 기여했습니다. 여가 시간에는 가족과 함께 시간을 보내고 열렬한 암벽 등반가입니다.

라이언 브랜드 Amazon Machine Learning Solutions Lab의 데이터 과학자입니다. 그는 기계 학습을 의료 및 생명 과학 분야의 문제에 적용한 경험이 있으며 여가 시간에는 역사와 공상 과학을 읽는 것을 즐깁니다.

아라이 타츠야 박사 Amazon Machine Learning Solutions Lab 팀의 딥 러닝 데이터 과학자가 된 생물 의학 엔지니어입니다. 그는 AI의 진정한 민주화를 믿으며 AI의 힘이 컴퓨터 과학 자나 수학자에게만 국한되어서는 안된다고 믿습니다.

코인 스마트. 유로파 최고의 비트 코인-보르 스
출처 : https://aws.amazon.com/blogs/machine-learning/building-a-scalable-machine-learning-pipeline-for-ultra-high-resolution-medical-images-using-amazon-sagemaker/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?