End-to-end encrypted ML inference with Amazon SageMaker AI and FHE
Quick Summary
이 글은 Amazon SageMaker AI와 fully homomorphic encryption(FHE), concrete ml을 결합해 클라우드에서도 입력, 중간값, 응답을 복호화하지 않고 머신러닝 추론을 수행하는 구성과 구현 절차를 설명한다.
🖼️ 인포그래픽
🖼️ 4컷 인포그래픽
💡 한 줄 요약
이 글은 Amazon SageMaker AI와 fully homomorphic encryption(FHE), concrete-ml을 결합해 클라우드에서도 입력, 중간값, 응답을 복호화하지 않고 머신러닝 추론을 수행하는 구성과 구현 절차를 설명한다.
📌 핵심 요약
- 머신러닝 추론은 의료 기록, 기업 기밀, 개인 통신처럼 민감한 데이터를 다루는 경우가 많으며, 글은 클라우드 서비스 자체도 데이터를 읽지 못하게 한 채 추론을 수행하는 방법으로 FHE를 제시한다.
- FHE는 암호화된 데이터를 복호화하지 않고도 계산할 수 있게 하는 암호화 방식이며, ML 추론에서는 암호화된 질의에 모델을 적용해 암호화된 예측 결과를 생성하는 데 사용된다.
- 글은 이전의 저수준 SEAL 기반 수작업 구현과 달리, scikit-learn과 API 호환성이 있고 여러 모델 유형을 지원하는 concrete-ml을 활용해 더 높은 수준의 FHE 기반 추론 방식을 소개한다.
- 구현 흐름은 데이터 정규화, FHE 지원 모델 학습, SageMaker AI 호스팅, 클라이언트의 질의 암호화, 클라우드의 암호문 기반 계산, 클라이언트의 응답 복호화로 구성된다.
- 학습 단계에서는 Python 3.12, Docker, ECR, S3, IAM 역할 등을 준비하고, custom training container와 training_script.py, framework.py, start_training.py를 만들어 학습 작업을 실행한 뒤 server.zip과 client.zip 생성을 확인한다.
🧩 주요 포인트
- 머신러닝 추론은 의료 기록, 기업 기밀, 개인 통신처럼 민감한 데이터를 다루는 경우가 많으며, 글은 클라우드 서비스 자체도 데이터를 읽지 못하게 한 채 추론을 수행하는 방법으로 FHE를 제시한다.
- FHE는 암호화된 데이터를 복호화하지 않고도 계산할 수 있게 하는 암호화 방식이며, ML 추론에서는 암호화된 질의에 모델을 적용해 암호화된 예측 결과를 생성하는 데 사용된다.
- 글은 이전의 저수준 SEAL 기반 수작업 구현과 달리, scikit-learn과 API 호환성이 있고 여러 모델 유형을 지원하는 concrete-ml을 활용해 더 높은 수준의 FHE 기반 추론 방식을 소개한다.
- 구현 흐름은 데이터 정규화, FHE 지원 모델 학습, SageMaker AI 호스팅, 클라이언트의 질의 암호화, 클라우드의 암호문 기반 계산, 클라이언트의 응답 복호화로 구성된다.
- 학습 단계에서는 Python 3.12, Docker, ECR, S3, IAM 역할 등을 준비하고, custom training container와 training_script.py, framework.py, start_training.py를 만들어 학습 작업을 실행한 뒤 server.zip과 client.zip 생성을 확인한다.
🧠 상세 정리
1. 민감 데이터 추론 문제와 글의 목표
글은 머신러닝 추론이 의료 기록, 독점적 비즈니스 정보, 개인 통신처럼 민감한 데이터를 처리해야 하는 상황에서 출발한다. 핵심 질문은 클라우드에서 ML 추론을 실행하되, 클라우드 자체에는 데이터가 드러나지 않게 할 수 있는가이다. 더 구체적으로는 질의, 응답, 중간 계산값이 전체 추론 과정 동안 암호화된 상태로 유지되도록 강제할 수 있는지를 다룬다. 이를 위해 글은 Amazon SageMaker AI와 fully homomorphic encryption, 즉 FHE를 함께 사용하는 방식을 소개한다. 목표는 SageMaker AI 자체를 포함한 관찰자가 값을 읽을 수 없도록 설계된 엔드투엔드 암호화 ML 추론 시스템을 구성하는 것이다.
2. FHE가 ML 추론에 제공하는 기능
FHE는 암호화된 데이터를 복호화하지 않은 채 암호화된 형태로 처리할 수 있게 하는 암호화 방식이다. ML 추론에서는 사용자가 질의를 암호화하고, 모델은 그 암호화된 질의에 대해 계산을 수행해 암호화된 예측값을 만든다. 중요한 점은 모델이 계산 중에 질의나 중간값을 평문으로 볼 필요가 없다는 것이다. 이 때문에 클라우드에 모델을 배포하면서도 데이터 노출 위험을 줄일 수 있다. 글은 이러한 특성이 보안 요구와 클라우드 확장성 요구를 동시에 만족해야 하는 여러 산업 시나리오에서 유용하다고 설명한다.
3. 적용 가치가 있는 산업 시나리오
글은 FHE 기반 추론이 가치 있는 사례로 의료, 에너지, 통신 분야를 제시한다. 의료 분야에서는 보험사가 의사에게 의료 절차 결과를 예측하는 ML 모델을 제공하고 싶지만, 의사는 개인정보 보호 규정 때문에 환자 진단 데이터를 제3자에게 노출할 수 없다. 에너지 분야에서는 석유·가스 기업이 잠재 시추 지역의 위성 사진을 평가하는 모델을 클라우드에 두고 싶지만, 정치적으로 민감한 위치의 사진을 외부에 노출할 수 없다. 통신 분야에서는 고객 이메일에서 스팸과 피싱을 탐지하려 하지만, 고객 메시지는 제3자 환경에서도 암호화된 상태로 유지되어야 한다. 이 사례들은 모두 모델 배포와 데이터 비밀성 사이의 긴장을 보여준다.
4. 이전 접근과 concrete-ml 기반 접근의 차이
글은 이전에 SageMaker 엔드포인트에서 FHE를 활용한 실시간 추론을 다룬 글이 있었지만, 이번 글은 한 단계 더 나아간다고 설명한다. 이전 접근은 SEAL이라는 저수준 라이브러리를 사용해 선형 회귀 알고리즘을 직접 구성하는 방식이었다. 반면 이번 글은 FHE 기반 추론을 위해 만들어진 고수준 라이브러리 concrete-ml을 사용한다. concrete-ml은 여러 일반적인 모델 유형을 기본적으로 지원하며, 잘 알려진 머신러닝 라이브러리인 scikit-learn과 API 호환성도 갖추고 있다. 따라서 사용자는 저수준 암호 연산을 직접 다루기보다 ML 개발자에게 익숙한 추상화 위에서 FHE 추론을 구성할 수 있다.
5. 전체 솔루션 흐름
솔루션 개요는 모델 소유자와 클라이언트의 역할을 나누어 설명한다. 먼저 모델 소유자는 학습 데이터를 준비하며, concrete-ml은 모든 특징값이 [-1, 1] 같은 동일한 범위로 정규화되어 있을 때 잘 작동한다고 안내한다. 이후 모델 소유자는 평문 데이터로 FHE 지원 모델을 학습하고, 이 모델은 평문이 아니라 암호화된 데이터 위에서 계산하도록 설계된다. 학습된 모델은 SageMaker AI에 호스팅되고, 클라이언트는 모델이 지원하는 FHE 방식으로 질의를 암호화해 보낸다. 클라우드의 모델은 값을 복호화하지 않은 채 암호화된 질의를 암호화된 예측값으로 변환하고, 클라이언트가 응답을 받아 복호화해 예측 결과를 확인한다.
6. 기밀 컴퓨팅과의 대비
글은 FHE 접근이 AWS Nitro System과 Amazon EC2의 Nitro Enclaves 같은 기밀 컴퓨팅 환경과 다르면서도 보완적이라고 설명한다. Nitro Enclaves에서는 질의가 강화되고 격리된 환경 안에서 복호화되어 평문으로 처리된다. 이 환경은 CPU와 메모리 격리를 제공해 평문 처리의 위험을 줄이는 방식이다. 반면 FHE에서는 질의가 계산 과정 내내 암호화된 상태로 남아 있으며, 보안의 기반이 하드웨어나 소프트웨어 격리가 아니라 수학적 암호 체계에 놓인다. 따라서 두 방식은 같은 보안 문제를 다루지만, 데이터를 평문으로 처리하는지 여부와 신뢰의 근거가 다르다.
7. 필수 준비 사항과 권한 구성
구현을 위해서는 로컬 개발 환경에 Python 3.12가 설치되어 있어야 하고, pip로 패키지를 설치할 수 있어야 하며, Docker 또는 다른 컨테이너 빌드 소프트웨어가 필요하다. 글은 가상 환경 사용을 권장하지만 필수는 아니라고 밝힌다. AWS 계정에는 학습 및 추론 컨테이너 이미지를 저장할 Amazon ECR 리포지토리, 모델과 학습 코드, 키와 암호문을 저장할 Amazon S3 위치가 필요하다. 또한 모델 생성자, 추론 엔드포인트 생성자, 엔드포인트 자체, 클라이언트에 대한 IAM 역할이 필요하다고 설명한다. S3 보안 모범 사례를 따를 것을 권장하며, MNIST 손글씨 숫자 corpus 예제와 IAM 정책은 sample code 저장소에서 찾을 수 있다고 안내한다.
8. 학습 컨테이너 구축과 버전 정합성
학습 단계에서는 먼저 model-trainer 역할을 가정하고 Dockerfile.training 파일을 만든다. 이 Dockerfile은 Python 3.12 이미지를 기반으로 시스템 패키지를 업데이트하고 cmake를 설치한 뒤, sagemaker_training 5.1.1, concrete-ml 1.9.0, concrete-python 2.10.0, torch 2.3.1을 설치한다. 글은 Python, concrete-ml, concrete-python 버전이 전체 시스템에서 맞아야 한다고 강조한다. 이어 Docker 이미지를 빌드하고, ECR 로그인 명령으로 Docker를 인증한 뒤, 이미지를 ECR 리포지토리 이름으로 태그하고 push한다. 마지막으로 aws ecr describe-images 명령을 통해 imageDigest가 비어 있지 않고 latest 태그가 있는지 확인해 컨테이너가 사용 가능함을 검증한다.
9. 모델 학습 스크립트와 SageMaker 통합
모델 학습을 위해 training_script.py를 만들고, argparse, os, numpy, concrete.ml.sklearn의 학습할 모델 클래스, FHEModelDev를 사용하는 템플릿을 작성한다. do_training 함수에는 train 디렉터리에서 데이터를 읽는 로직과 모델 학습 로직을 구현해야 하며, 학습된 모델은 FHEModelDev(model_dir, model).save()로 저장된다. model_fn 함수는 SageMaker AI가 요구하지만 실제로 사용하지 않기 때문에 NotImplementedError를 발생시키는 형태로 둔다. 이어 framework.py에서 sagemaker.estimator.Framework를 상속한 Concrete 클래스를 만들어 custom training container를 SageMaker AI와 통합한다. 이 클래스에는 ECR 학습 컨테이너 위치를 image_uri로 지정하고, training_image_uri가 이 값을 반환하도록 구성한다.
10. 학습 작업 실행과 산출물 확인
학습 작업 실행은 Python 스크립트로 할 수 있으며, 콘솔이나 AWS CLI로도 가능하다고 글은 설명한다. Python 3.12 가상 환경을 만들고 활성화한 뒤 boto3 1.37.38과 sagemaker 2.243.2를 설치한다. start_training.py에서는 sagemaker.session.Session을 만들고, 앞서 정의한 Concrete 클래스를 사용해 entry_point, instance_count, instance_type, role, sagemaker_session, output_path, code_location 등을 지정한다. instance_type, role, output_path, code_location, inputs 값은 실제 환경에 맞게 수정해야 한다. python start_training.py를 실행한 뒤 aws sagemaker describe-training-job으로 TrainingJobStatus가 Completed인지 확인하고, S3 모델 경로에서 server.zip과 client.zip이 존재하는지 확인한다.
🧾 핵심 주장 / 시사점
- 이 글의 핵심은 클라우드 추론에서 데이터를 안전하게 다루는 방법을 인프라 격리보다 암호 계산 자체로 해결하려는 접근에 있다.
- concrete-ml을 사용하면 저수준 FHE 구현 부담을 줄일 수 있지만, 버전 정합성, 컨테이너 구성, 클라이언트 산출물 관리 같은 운영 세부사항은 여전히 중요하다.
- 학습은 평문 데이터로 수행되고 추론에서 암호화된 질의를 처리한다는 구분이 중요하며, 이를 놓치면 FHE가 전체 ML 파이프라인의 모든 단계를 암호화한다고 오해할 수 있다.
✅ 액션 아이템
- 학습 컨테이너 설정에서 framework.py의 image_uri를 실제 Amazon ECR training container 위치로 교체한다.
- start_training.py 실행 전 instance_type, role, output_path, code_location, inputs를 계정·버킷·데이터 위치에 맞게 확정한다.
- 학습 완료 후 모델 산출물 경로를 조회해 server.zip과 client.zip이 모두 생성됐는지 검증한다.
❓ 열린 질문
- encrypted_query_uri와 evaluation_keys_uri를 같은 요청에 담을 때 S3 권한 범위를 어떤 역할에 최소 부여할 것인가?
- 추론 엔드포인트가 Invalid JSON, 누락 필드, 잘못된 S3 URI, S3 다운로드 실패를 반환할 때 클라이언트 재시도 정책은 어떻게 둘 것인가?
- 비동기 추론 결과 ciphertext 저장 위치와 failure_path를 어떤 S3 경로로 분리해 운영할 것인가?