합성곱 신경망(CNN) 은 주로 컴퓨터 비전 작업에 사용되는 최첨단 신경망 아키텍처입니다. CNN은 이미지 인식, 객체 위치 파악, 변화 감지와 같은 여러 다양한 작업에 적용될 수 있습니다. 최근에 당사의 파트너인 Data Insights 는 한 주요 자동차 회사로부터 까다로운 요청을 받았습니다. 바로 주어진 이미지에서 자동차 모델을 식별할 수 있는 컴퓨터 비전 애플리케이션을 개발해 달라는 것이었습니다. 서로 다른 자동차 모델이 매우 비슷하게 보일 수 있고, 주변 환경과 촬영 각도에 따라 어떤 자동차든 매우 다르게 보일 수 있다는 점을 고려하면, 이러한 작업은 얼마 전까지만 해도 거의 불가능했습니다.
하지만 2012년경부터 시작된 ‘딥 러닝 혁명’ 덕분에 이러한 문제를 해결할 수 있게 되었습니다. 자동차의 개념에 대해 설명을 듣는 대신, 컴퓨터가 사진을 반복적으로 연구하고 스스로 그러한 개념을 학습할 수 있게 되었습니다. 지난 몇 년 동안 추가적인 인공 신경망 혁신을 통해 인간 수준의 정확도로 이미지 분류 작업을 수행할 수 있는 AI가 탄생했습니다. 이러한 발전을 바탕으로 딥 CNN을 학습시켜 모델별로 자동차를 분류할 수 있었습니다. 이 신경망은 196개의 서로 다른 모델로 구성된 16,000장 이상의 자동차 사진을 포함하는 Stanford Cars 데이터세트로 학습 되었습니다. 시간이 지남에 따라 신경망이 자동차의 개념과 서로 다른 모델을 구별하는 방법을 학습하면서 예측 정확도가 향상되기 시작하는 것을 볼 수 있었습니다.
파트너와 함께 데이터 전처리에는 Apache Spark™와 Koalas 를, 모델 학습에는 Tensorflow 와 함께Keras 를, 모델 및 결과 추적에는MLflow 를, REST 서비스 배포에는 Azure ML 을 사용해 엔드투엔드 machine learning 파이프라인을 구축합니다. Azure Databricks 내의 이 설정은 네트워크를 빠르고 효율적으로 훈련시키는 데 최적화되어 있으며, 다양한 CNN 구성을 훨씬 더 빠르게 시도하는 데도 도움이 됩니다. 몇 번의 시도만으로도 CNN의 정확도는 약 85%에 도달했습니다.
이 글에서는 신경망을 프로덕션 환경에 배포하는 데 사용되 는 몇 가지 주요 기술을 간략하게 설명합니다. 직접 신경망을 실행해 보고 싶으시다면, 세심한 단계별 가이드가 포함된 전체 노트북을 아래에서 찾으실 수 있습니다.
이 데모는 공개적으로 사용 가능한 Stanford Cars 데이터 세트를 사용합니다. 이 데이터 세트는 가장 포괄적인 공개 데이터 세트 중 하나이지만 약간 오래되어 2012년 이후의 자동차 모델은 찾을 수 없습니다(하지만 일단 학습되면 전이 학습을 통해 새 데이터 세트로 쉽게 대체할 수 있습니다). 데이터는 워크스페이스에 탑재할 수 있는 ADLS Gen2 스토리지 계정을 통해 제공됩니다.
데이터 전처리 첫 번째 단계로, 이미지를 hdf5 파일(하나는 학습용, 하나는 테스트용)로 압축합니다. 그러면 신경망에서 이를 읽어들일 수 있습니다. 여기서 제공되는 노트북의 일부로 ADLS Gen2 스토리지가 제공되며, hdf5 파일이 이 스토리지에 포함되어 있으므로 원하신다면 이 단계를 완전히 생략하셔도 됩니다.
수집된 데이터의 양과 다양성은 딥 러닝 모델로 얻을 수 있는 결과에 큰 영향을 미칩니다. 데이터 증강은 실제로 새로운 데이터를 수집할 필요 없이 학습 결과를 크게 향상시킬 수 있는 전략입니다. 대규모 신경망 훈련에 흔히 사용되는 자르기, 패딩, 수평 뒤집기 같은 다양한 기법을 통해 훈련 및 테스트용 이미지 수를 늘려 데이터 세트를 인위적으로 확대할 수 있습니다.
대규모 학습 데이터 코퍼스에 증강을 적용하는 것은 비용이 많이 들 수 있으며, 특히 다른 접근 방식의 결과를 비교할 때는 더욱 그렇습니다. Koalas 를 사용하면 데이터 과학에 익숙한 Pandas API를 사용하여 Python에서 이미지 증강을 위한 기존 프레임워크를 쉽게 시도하고 여러 노드가 있는 클러스터에서 프로세스를 확장할 수 있습니다.
CNN을 분해하면 여러 다른 '블록'으로 구성되는데, 각 블록은 일부 입력 데이터에 적용될 운영 그룹을 나타냅니다. 이러한 블록은 크게 다음과 같이 분류할 수 있습니다.
CNN은 입력 이미지를 간결한 숫자 그룹으로 축소하는 Identity 블록과 Convolution 블록(또는 ConvBlock)의 연속입니다. 결과로 나온 이 숫자들 각각은 (올바르게 학습된 경우) 궁극적으로 이미지 분류에 유용한 정보를 알려줍니다. Residual CNN 은 각 블록에 추가 단계를 더합니다. 블록을 구성하는 운영이 적용되기 전에 데이터는 임시 변수로 저장된 다음, 이 임시 데이터가 출력 데이터에 추가됩니다. 일반적으로 이 추가 단계는 각 블록에 적용됩니다. 예를 들어, 아래 그림은 손으로 쓴 숫자를 감지하기 위한 간소화된 CNN을 보여줍니다.
신경망을 구현하는 방법에는 여러 가지가 있습니다. 더 직관적인 방법 중 하나는 Keras를 사용하는 것입니다. Keras는 신경망을 구성하는 개별 단계를 실행하기 위한 간단한 프런트엔드 라이브러리를 제공합니다. Keras는 Tensorflow 백엔드 또는 Theano 백엔드와 함께 작동하도록 구성할 수 있습니다. 여기서는 Tensorflow 백엔드를 사용합니다. Keras 네트워크는 아래에서 볼 수 있듯이 여러 계층으로 나뉩니다. 우리 네트워크를 위해 계층의 고객 구현도 정의하고 있습니다.
학습 가능한 가중치가 있는 사용자 지정 운영의 경우, Keras를 사용하면 자신만의 계층을 구현할 수 있습니다. 방대한 양의 이미지 데이터를 처리할 때 메모리 문제가 발생할 수 있습니다. 처음에 RGB 이미지는 정수 데이터(0-255)를 포함합니다. 역전파 중 최적화의 일부로 경사 하강법을 실행할 때, 정수 경사(gradient)로는 네트워크 가중치를 올바르게 조정하기에 정확도가 충분하지 않다는 것을 알게 될 것입니다. 따라서 부동 소수점 정밀도로 변경해야 합니다. 여기서 문제가 발생할 수 있습니다. 이미지를 224x224x3으로 축소하더라도 만 개의 학습 이미지를 사용하면 10억 개가 넘는 부동 소수점 항목을 처리해야 합니다. 전체 데이터 세트를 부동 소수점 정밀도로 변환하는 대신, 필요할 때만 한 번에 하나의 이미지씩 입력 데이터의 스케일을 조정하는 'Scale Layer'를 사용하는 것이 더 좋은 방법입니다. 이는 모델의 배치 Normalization 이후에 적용해야 합니다. 이 Scale Layer의 매개변수 또한 학습을 통해 학습될 수 있는 매개변수입니다.
스코어링 중에도 이 사용자 지정 레이어를 사용하려면 클래스를 모델과 함께 패키지해야 합니다. MLflow를 사용하면 이름(문자열)을 Keras 모델과 관련된 사용자 지정 클래스나 함수에 매핑하는 Keras custom_objects 사전을 사용하여 이를 달성할 수 있습니다. MLflow는 CloudPickle을 사용하여 이러한 사용자 지정 레이어를 저장하고 mlflow.keras.load_model() 로 모델을 로드할 때 자동으로 복원합니다. 및 mlflow.pyfunc.load_model().
머신러닝 개발은 소프트웨어 개발 외에도 추가적인 복잡성을 수반합니다. 수많은 도구와 프레임워크가 있어 실험을 추적하고, 결과를 재현하며, 머신 러닝 모델을 배포하기가 어렵습니다. Azure Machine Learning과 함께 MLflow를 사용하여 엔드투엔드 기계 학습 수명 주기를 가속화하고 관리함으로써 Azure Databricks를 사용하는 기계 학습 애플리케이션을 안정적으로 빌드, 공유 및 배포할 수 있습니다.
결과를 자동으로 추적하려면 기존 또는 새 Azure ML 작업 영역을 Azure Databricks 작업 영역에 연결할 수 있습니다. 또한 MLflow는 Keras 모델(mlflow.keras.autolog())에 대한 자동 로깅을 지원하므로, 거의 힘들이지 않고 사용할 수 있습니다.
MLflow의 기본 내장 모델 지속성 유틸리티는 Keras와 같은 다양한 인기 ML 라이브러리의 모델을 패키징하는 데 편리하지만 모든 사용 사례를 다루지는 않습니다. 예를 들어, MLflow의 기본 내장 플레이버에서 명시적으로 지원하지 않는 ML 라이브러리의 모델을 사용하고 싶을 수 있습니다. 또는 사용자 지정 추론 코드와 데이터를 패키징하여 MLflow 모델을 만들 수도 있습니다. 다행히 MLflow는 이러한 작업을 수행하는 데 사용할 수 있는 두 가지 솔루션, 즉 사용자 지정 Python 모델 과 사용자 지정 플레이버를 제공합니다.
이 시나리오에서는 REST API 클라이언트의 요청 처리를 지원하는 모델 추론 엔진을 사용해야 합니다. 이를 위해 내부에 Base64로 인코딩된 이미지가 있는 JSON Dataframe 개체를 허용하도록 이전에 빌드한 Keras 모델을 기반으로 하는 사용자 지정 모델을 사용하고 있습니다.
다 음 단계에서 이 py_model을 사용하여 MLflow의 Azure ML 통합 을 통해 Azure Container Instances 서버에 배포할 수 있습니다.
이제 훈련된 머신 러닝 모델이 있으며 클라우드 내 MLflow를 사용하여 워크스페이스에 모델을 등록했습니다. 마지막 단계로 모델을 Azure Container Instances에 웹 서비스로 배포하려고 합니다.
웹 서비스는 이미지이며, 이 경우 Docker 이미지입니다. 이는 스코어링 로직과 모델 자체를 캡슐화합니다. 이 경우 REST 클라이언트의 이미지를 스코어링 로직이 처리하는 방식과 응답이 구성되는 방식을 제어할 수 있는 사용자 지정 MLflow 모델 표현을 사용하고 있습니다.
Container Instances는 워크플로를 테스트하고 이해하는 데 훌륭한 솔루션입니다. 확장 가능한 프로덕션 배포의 경우 Azure Kubernetes Service 사용을 고려해 보세요. 자세한 정보는 배포 방법 및 위치를 참조하세요.
이 기사와 노트북은 Azure의 프로덕션 환경에서 신경망을 학습하고 배포하는 엔드투엔드 워크플로를 설정하는 데 사용되는 주요 기술을 보여줍니다. 연결된 Notebook의 연습에서는 Keras, Databricks Koalas, MLflow 및 Azure ML 과 같은 도구를 사용하여 사용자 고유의 Azure Databricks 환경 내에서 이를 생성하는 데 필요한 단계를 안내합니다.
(이 글은 AI의 도움을 받아 번역되었습니다. 원문이 궁금하시다면 여기를 클릭해 주세요)
