Last Update: Aug 30, 2024
- 이 가이드는 AWS Neuron-CC 버전 2.13 기반의 가이드 입니다.
- Aug 23, 2024 에 AWS Neuron-CC 버전 2.14 를 탑재한 v1.0-hf-tgi-0.0.24-pt-2.1.2-inf-neuronx-py310가 퍼블리시 되었습니다. 이 버전 기반하의 가이드는 README-NeuronCC-2-14 를 보세요. 하지만, 아래의 내용을 확인한 후에 보시기를 권장 합니다. 이유는 많은 내용이 생략이 되어 있고, 필요한 부분만이 기술 되어 있습니다.
이 문서는 AWS Inferentia2 EC2 기반에서 한국어 파인 튜닝 모델을 서빙하는 과정을 설명합니다. 이 과정을 완료 하면 다음과 데모 영상 을 해볼 수 있습니다. 주요 단계는 다음과 같습니다:
- Amazon EC2 Inferentia2 인스턴스 설치 (inf2.8xlarge와 inf2.xlarge)
- 모델 컴파일: inf2.8xlarge에서 TGI Docker 이미지를 사용하여 한국어 모델 컴파일
- 한국어 파인 튜닝 모델: MLP-KTLim/llama-3-Korean-Bllossom-8B
- AWS Neuron 컴파일된 모델을 Hugging Face Hub에 업로드
- 모델 서빙: inf2.xlarge에서 TGI Docker를 사용하여 모델 서빙
- 추론 테스트: Completion API와 Message API를 사용한 curl 명령어로 테스트
- Gradio를 통한 웹 인터페이스 구현 및 테스트
주요 도구 및 기술:
- Hugging Face Text Generation Inference (HF TGI)
- Optimum Cli 로 파인 튜닝 모델을 AWS Neuron Model 로 컴파일
- TGI Docker Serving
- Gradio
다음 단계:
- 이 노트북은 Amazon Inferentia2 EC2 에 모델을 배포를 한 예시 입니다. Amazon SageMaker Endpoint 에도 배포가 가능하고, 다음 노트북 02-deploy-llama-3-neuron-moel-inferentia2 을 실행 하시면 됩니다.
이 과정을 통해 사용자는 AWS EC2 Inferentia2 활용하여 효율적으로 한국어 LLM 모델을 서빙하고 테스트할 수 있습니다. 문서는 각 단계별 상세한 명령어와 설정 방법, 그리고 결과 확인 방법을 제공합니다.
- 먼저 AWS 계정에 아래에 해당되는 기본적인 Quota 가 필요 합니다. inf2.xlarge 는 vCPUS 4개, inf2.8xlarge 32 개 필요 합니다. Running On-Demand Inf Instances 가 36 개 이상 있어야 합니다. 여기를 통해서 inf2 spec 확인 해보세요.
여기서는 2개의 INF2 가 필요합니다. 컴파일을 위해서 inf2.8xlarge, 모델 서빙을 위해서 inf2.xlarge 필요 합니다.
- inf2.xlarge 는 메모리가 16 GB 이어서, 컴파일시 inf2.8xlarge 를 사용 합니다.
- Region: us-east-1 에서 진행 했음.
- AMI, Instance Type 지정.
- [중요] Storage 는 512 GB 로 수정해주세요.
- Trouble Shooting: Error
- inf2.xlarge EC2 런칭시에 아래와 같은 에러:
- Failed to start the instance i-04c1XXXXXXXX The requested configuration is currently not supported. Please check the documentation for supported configurations.
- 솔루션
- 위의 이유는 해당 Region 및 Availability Zone (AZ) 에 해당 EC2 가 부족하여 발생하는 에러 입니다. EC2 생성시에 Network 부분의 Subnet 을 바꾸어서 해보세요. 그래도 에러가 발생하면 AWS Account 팀에 문의 바랍니다.
- inf2.xlarge EC2 런칭시에 아래와 같은 에러:
위의 2.1, 2.2 과정을 반복해주세요. 단 2.1 에서 instance 를 inf2.8xlarge 로 선택 해주세요.
- EC2: inf2.8xlarge 에서 합니다.
- 가상 환경 진입 및 버전 확인
- 필요 프로그램 설치
- huggingface_hub 를 설치 합니다. 추후 모델 다운로드 및 업로드시에 사용 합니다.
pip install huggingface_hub
- huggingface_hub 를 설치 합니다. 추후 모델 다운로드 및 업로드시에 사용 합니다.
-
neuronx-tgi 도커 이미지를 다운로드 합니다. 이 도커 이미지는 2024년 5월에 퍼블리싱 되었습니다.
docker pull ghcr.io/huggingface/neuronx-tgi:0.0.23
-
도커를 실행하여 도커에 진입하여 neuron-cc 버전을 확인 합니다.
docker run -it --entrypoint /bin/bash \ ghcr.io/huggingface/neuronx-tgi:latest
여기서는 MLP-KTLim/llama-3-Korean-Bllossom-8B 한국어 모델을 optimum-cli 를 통해서 컴파일 하겠습니다. 자세한 사항은 Exporting neuron models using NeuronX TGI 을 참고하세요.
- 블로그 Task-specialized LLM을 위한 비용 효율적인 서빙 전략: AWS Inferentia2와 Hugging Face Optimum을 활용한 자체 개발 LLM 서빙하기 에 다음과 내용으로 벤치마킹을 하였고, inf2.xlarge 사용시에 batch_size = 4 가 가장 성능이 좋았기에, 아래 컴파일시에도 동일한 설정을 사용 하였습니다.
- "Amazon EC2 g5.xlarge와 Amazon EC2 inf2.xlarge의 추론 성능을 비교하기 위해 사용한 모델은 특정 task를 수행하기 위해 미세조정 학습을 한 7B 크기의 LLM입니다"
time docker run --entrypoint optimum-cli \
-v $(pwd)/data:/data --privileged \
ghcr.io/huggingface/neuronx-tgi:latest \
export neuron --model MLP-KTLim/llama-3-Korean-Bllossom-8B \
--batch_size 4 --sequence_length 4096 \
--auto_cast_type fp16 --num_cores 2 \
data/llama-3-Korean-Bllossom-8B
컴파일 실행 결과 화면 (약 5분 40초 걸림)
- Hugging Face Hub 에 모델을 업로드하기 위해서는 "쓰기용" HF Writable Token 이 필요 합니다., 이후에 아래와 같이 명령어를 사용하여 로긴 하세요.
- 토큰을 환경 변수에 저장
export API_TOKEN=<HF Writable Token 입력>
- HF 에 로그인
huggingface-cli login --token $API_TOKEN
- 토큰을 환경 변수에 저장
- 아래와 같이 Gonsoo/AWS-Neuron-llama-3-Korean-Bllossom-8B 에 업로드
huggingface-cli upload Gonsoo/AWS-Neuron-llama-3-Korean-Bllossom-8B \ ./data/llama-3-Korean-Bllossom-8B --exclude "checkpoint/**"
- Hugging Face Hub 에 등록된 모델 화면 입니다.
- EC2: inf2.xlarge 에서 합니다.
- 가상 환경 진입 및 버전 확인
- 필요 프로그램 설치
- huggingface_hub 를 설치 합니다. 추후 모델 다운로드 및 업로시에 사용 합니다.
pip install huggingface_hub
- huggingface_hub 를 설치 합니다. 추후 모델 다운로드 및 업로시에 사용 합니다.
- neuronx-tgi 도커 이미지를 다운로드 합니다. 이 도커 이미지는 2024년 5월에 퍼블리싱 되었습니다.
docker pull ghcr.io/huggingface/neuronx-tgi:0.0.23
아래와 같이 Gonsoo/AWS-Neuron-llama-3-Korean-Bllossom-8B 에서 모델을 다운로드 받습니다. 현재 폴더에서 data 폴더를 생성후에 실행 합니다.
huggingface-cli download Gonsoo/AWS-Neuron-llama-3-Korean-Bllossom-8B \
--local-dir ./data/AWS-Neuron-llama-3-Korean-Bllossom-8B
-
로컬에 Neuron 모델은 ./data/AWS-Neuron-llama-3-Korean-Bllossom-8B 에 있습니다. 아래와 같이 docker run 을 통해서 TGI docker container 를 실행합니다.
docker run \ -p 8080:80 \ -v $(pwd)/data:/data \ --privileged \ ghcr.io/huggingface/neuronx-tgi:latest \ --model-id /data/AWS-Neuron-llama-3-Korean-Bllossom-8B
-
도커 실행 명령어를 실행한 후의 화면 입니다.
-
도커 실행 명령어가 완료되어 TGI docker container 가 대기 중입니다.
- 실행중인 도커 확인 하기
sudo ss -tuln
sudo ss -tuln | grep 8080
아래의 추론 명령서 형식은 TGI Official Git Repo 를 참고 하세요.
- 아래 curl 명령어를 실행 합니다.
curl 127.0.0.1:8080/generate \ -X POST \ -d '{"inputs":"딥러닝이 뭐야?","parameters":{"max_new_tokens":512}}' \ -H 'Content-Type: application/json'
- 아래는 total_time="25.099483509s" validation_time="336.958µs" queue_time="24.691µs" inference_time="25.09912212s" time_per_token="49.021722ms" 의 걸린 시간을 보여 줍니다.
- 아래 명령어를 실행 합니다.
curl localhost:8080/v1/chat/completions \ -X POST \ -d '{ "model": "tgi", "messages": [ { "role": "system", "content": "당신은 인공지능 전문가 입니다." }, { "role": "user", "content": "딥러닝이 무엇입니까?" } ], "stream": false, "max_tokens": 512 }' \ -H 'Content-Type: application/json'
- 아래는 total_time="24.338049835s" validation_time="394.38µs" queue_time="38.361µs" inference_time="24.337617254s" time_per_token="49.266431ms 시간을 보여주고, 위의 결과와 유사 합니다.
- 아래 내용은 위의 "추론 테스트 하기 (Message API)" 실행 중에, 스크린샷 화면 입니다. 두개의 코어가 거의 다 사용되고 있고, Memory 19.4 GB 사용되고 있습니다.
- EC2: inf2.2xlarge 에서 합니다.
- 아래와 같이 EC2 의 inbound rules 에 8081 포트를 추가 합니다. 8081 는 Gradio App 에서 사용할 포트 입니다.
- 아래의 Git 을 EC2: inf2.xlarge 에 Clone 을 합니다. 01-Run-Gradio-Chat-UX.ipynb 노트북을 오픈 합니다. 아래의 그림을 참조 하세요.
- 노트북의 셀을 하나씩 모두 실행하고, 마지막 셀이 아래 처럼 실행해서 보이면 성공 입니다.
- EC2: Inf2.xlarge 의 퍼블릭 IP 확인 하기
- 브라우저 열고, http://Auto-assigned-IP-address:8081 을 입력 합니다. (예:http://54.224.3.4:8081/ )
- 드디어 테스트 시작
g/Llama-2-inference.png)
- 로컬 노트북 (혹은 로컬 컴퓨터) 에서 아래와 같이 터미널을 열고, SSH 로 원격 머신에 SSH 로 연결 합니다.
ssh -i ~/.ssh/your_key.pem -L 8081:localhost:8081 ubuntu@public_ip
- 이후에 아래와 같이 로컬의 브라우저를 열고 입력 합니다.
http://localhost:8081/
여기까지 오셨으면 성공 하셨습니다. 축하 드립니다. ^^
Contributor: 문곤수 (Gonsoo Moon)