작성자: JV Roig
Alibaba Cloud에서 생성형 AI 서비스를 배포하고 사용할 수 있는 일반적인 방법은 세 가지가 있습니다.
• IaaS(서비스형 인프라)
• PaaS(서비스형 플랫폼)
• MaaS(서비스형 모델)
1부에서는 첫 번째 접근 방식을 다루겠습니다. IaaS
IaaS 배포의 가장 큰 장점은 전체 스택을 100% 제어할 수 있다는 점입니다. 여기에는 다음이 포함됩니다.
• 운영 체제
• 인스턴스 유형 및 크기
• LLM 서버 소프트웨어(예: Hugging Face, vLLM, llama.cpp 등)
• 모델 선택(말 그대로 모든 모델)
또한 genAI 스택과 동일한 가상 머신에 존재하기를 원하는 다른 애플리케이션이나 소프트웨어를 쉽게 제어할 수 있습니다.
놀랍게 들릴지 모르지만, 속담에 이런 말이 있습니다. “큰 힘에는 큰 책임이 따른다!”
IaaS 배포에는 막대한 관리 오버헤드가 수반됩니다. 이제 다음과 같은 엄청난 양의 일을 책임져야 합니다.
• OS 보안, 패치 및 유지 관리
• LLM 서버 소프트웨어 보안, 패치 및 유지 관리
• 성능 확장 및 로드 밸런싱 인프라
이미 생성형 AI에 대한 특정 접근 방식에 투자한 경우(예: 사용자와 팀이 이미 llama.cpp를 사용하여 생성형 AI 기능을 배포하는 전문가인 경우), IaaS genAI 배포가 사용 사례에 적합합니다. 전체 스택을 관리해야 하는 대신 필요한 유연성을 100% 확보할 수 있습니다.
이제 IaaS 접근 방식을 통해 생성형 AI 배포를 시작해 보겠습니다.
여기서 핵심 서비스는 물론 Alibaba Cloud의 대표적인 IaaS 제품인 Elastic Compute Service(ECS)입니다.
특히, GPU 기반 인스턴스를 사용하여 선호하는 OS와 생성형 AI 플랫폼을 호스팅할 것입니다.
이 튜토리얼에서 선택하는 주요 기술은 다음과 같습니다.
• 운영 체제는 Ubuntu 22.04 LTS(NVIDIA CUDA 호환성을 위해)
• LLM 서버 소프트웨어로 llama.cpp(커뮤니티 github 페이지 참조: https://github.com/ggerganov/llama.cpp)
• T4 GPU를 사용하는 ECS 인스턴스 유형(P100, V100 또는 A10도 작동합니다. T4는 저렴하고 사용하기 쉬우며 이 튜토리얼의 요구 사항에 적합한 성능을 제공합니다)
그럼 시작해 보겠습니다!
ECS 콘솔 개요에서 Create Instance을 클릭하여 새 인스턴스를 생성합니다. 여기에서 Ubuntu 22.04 LTS를 운영 체제로 사용하는 GPU 기반 인스턴스를 생성합니다.
일반적인 단계는 다음과 같습니다.
• 청구 방법으로 Pay-as-you-go를 선택합니다.
• 원하는 지역을 선택합니다. 이 예시에서는 싱가포르를 사용했습니다.
• 네트워크 및 영역에서 기본 VPC, 사용 가능한 모든 영역 및 해당 영역의 기본 vSwitch를 선택합니다.
• 인스턴스 및 이미지에서 All Instance Types을 클릭합니다.
• 아키텍처의 경우, 원하는 가속기가 있는 인스턴스만 표시되도록 인스턴스를 필터링하려면 GPU/FPGA/ASIC 상자를 클릭합니다.
• 위의 스크린샷과 비슷한 목록이 표시됩니다. 단일 T4(16GB GPU RAM 포함) 또는 선택한 영역에서 사용 가능한 저렴한 인스턴스를 선택하세요. 데모가 작동하는지 확인하려면 최소 16GB 의 GPU RAM이 있는 GPU를 가져옵니다.
• CPU 코어는 8개 이상, 시스템 RAM은 16GB 이상일 수 있습니다.
• 이미지에서 Public Images를 선택한 다음 Ubuntu를 선택합니다. 버전 목록에서 Ubuntu 22.04 64-bit를 선택하고 Free Security Hardening에 체크된 상태로 유지합니다.
• 스토리지에서 1TB 이상의 시스템 디스크가 필요할 수 있습니다. LLM은 대용량이기 때문입니다. 크기를 적절하게 설정하세요. 확실하지 않은 경우 1024 GiB(1TB)를 입력하세요.
• 대역폭 및 보안 그룹의 경우, Assign Public IPv4 Address에 체크하세요.
• Pay-by-traffic을 선택하고 최대 대역폭으로 100Mbps를 선택합니다. 대용량 파일을 다운로드할 예정이므로(LLM은 대용량) 100Mbps 대역폭을 사용하겠습니다.
• 나중에 인스턴스에 SSH를 할 수 있도록 키 쌍을 설정해야 합니다. 로그인 이름으로 ecs-user를 선택합니다(루트로 로그인하지 않도록 하기 위해).
• 아직 사용 가능한 키 쌍이 없는 경우 Create Key Pair를 클릭한 다음 키 쌍을 만든 후 목록을 새로 고칩니다.
• 마지막으로 오른쪽의 ECS 서비스 약관에 동의하고 Create Order를 클릭합니다.
이제 인스턴스가 실행 중이므로 필요한 소프트웨어를 설정할 수 있도록 인스턴스에 연결할 차례입니다.
여기서는 제공된 키 쌍을 사용하여 인스턴스에 쉽게 SSH할 수 있는 ECS의 기본 기능인 Workbench 원격 연결을 사용하겠습니다. 그런 다음 OS를 업데이트하고 Python이 설치되었는지 확인한 다음 Nvidia 드라이버와 CUDA를 설치합니다.
• 인스턴스에 연결하려면 인스턴스 목록(ECS Console -> Instances & Images -> Instances)으로 이동하세요.
• 목록에 최근에 실행한 인스턴스가 표시됩니다. Actions 열에서 Connect 옵션을 클릭하고 Sign in now을 선택합니다.
• 연결에 Public IP를 선택하고, SSH Key Authentication을 선택한 다음 사용자 이름으로 ecs-user를 사용합니다.
• 프라이빗 키의 경우, 박스를 클릭하여 저장된 프라이빗 키를 선택합니다. (키 쌍을 생성할 때 저장했을 것입니다)
축하합니다! 브라우저에 멋진 SSH 창이 나타나면 소프트웨어 구성을 요청할 수 있습니다.
먼저 다음 명령어로 OS를 업데이트해 보겠습니다.
• sudo apt update
• sudo apt upgrade
python이 설치되었는지 확인합니다. 다음 명령어로 python 버전을 확인합니다.
• python3 --version
Python 3.10.12 또는 이와 유사하게 표시되어야 합니다.
가장 어려운 부분은 다음 단계입니다. Nvidia 드라이버와 CUDA를 설치하는 것입니다.
1. 먼저, 드라이버를 구축하기 위해 리눅스 헤더가 필요합니다.
sudo apt-get install linux-headers-$(uname -r)
2. 다음 단계를 따르세요: https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local
기본 설치 관리자 명령(하나씩)으로 시작한 다음 드라이버 설치 관리자 명령(legacy kernel module flavor 사용)으로 시작합니다.
ECS 인스턴스 시작 구성 시 최대 대역폭 옵션을 선택하지 않은 경우, 이 작업은 예상보다 훨씬 오래 걸립니다(NV 다운로드의 GB).
3. 드라이버 설치 후 실행합니다:
echo export PATH=/usr/local/cuda-12.5/bin${PATH:+:${PATH}} >> .bashrc
4. 인스턴스를 재부팅하고(cmd: sudo reboot) 다시 연결합니다.
5. CUDA 존재 여부를 확인합니다:
nvcc –version
다음과 같은 화면이 표시됩니다:
6. NV 드라이버가 있는지 확인합니다:
nvidia-smi
다음과 같은 화면이 표시됩니다:
여기까지 왔다면 축하합니다! Nvidia 드라이버와 CUDA를 성공적으로 설치하셨으니 이제 인스턴스의 모든 기능을 생성형 AI를 위해 사용할 준비가 되었습니다!
이 튜토리얼에서는 매우 인기 있는 커뮤니티 프로젝트인 llama.cpp를 사용하겠습니다.
1. llama.cpp 설치하기
설치 명령:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
make -j 8 GGML_CUDA=1
(make -j 8은 컴파일에 8개의 스레드를 사용하라는 의미입니다. 인스턴스가 8개를 초과하는 경우, 이 숫자를 늘려 인스턴스가 보유한 만큼의 코어를 사용하세요.)
(이 과정은 시간이 걸리므로 잠시 기다려주세요.)
2. 설치 테스트를 위해 LLM을 다운로드합니다:
cd models
wget https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GGUF/resolve/main/qwen1_5-7b-chat-q4_k_m.gguf
3. 다운로드한 모델을 사용하여 추론을 테스트합니다.
cd ..
./main -m models/qwen1_5-7b-chat-q4_k_m.gguf -p "Question: Alibaba Cloud에 대해 설명해 주세요. 저는 비기술 기업 임원입니다. 답변:" -ngl 999 -c 1000 -n 2000
출력은 다음과 같아야 합니다.
여기서는 작은 LLM인 Qwen1.5 7B-chat의 양자화된(즉, 압축된) 버전을 GGUF 형식으로 다운로드했습니다.
이미 특정 GGUF 모델을 사용하고 있는 경우, 이제 해당 모델을 인스턴스에 다운로드하여 사용해야 합니다.
물론 genAI 배포의 진정한 목표는 자체 애플리케이션이 생성형 AI 기능을 사용할 수 있도록 API 액세스를 제공하는 LLM 서버를 갖추는 것입니다.
3단계에서는 llama.cpp를 설치하고 하나 이상의 모델을 다운로드한 다음 로컬 추론을 수행했습니다.
이제 서버 모드에서 llama.cpp를 사용하겠습니다.
./llama-server -m [model_path/model_name.gguf] -ngl 999 --host 0.0.0.0 --port 8080 --api-key [your-desired-api-key]
참고: --port 8080은 VM의 포트 8080을 서버에서 사용하도록 지정합니다. 애플리케이션이 llama.cpp 서버에 액세스할 수 있도록 하려면 VM의 보안 그룹에 8080 액세스를 추가하거나 보안 그룹에 이미 화이트리스트로 지정한 다른 포트 번호를 지정해야 합니다.
기타 옵션:
-cb
= 연속 일괄 처리 사용(권장)-fa
= 플래시 주의 활성화(예: Qwen2에 필요)-np N
= N 슬롯을 병렬로 활성화하여 결과적으로 최대 컨텍스트 크기를 N만큼 분할하면(컨텍스트 크기가 작은 모델에는 권장되지 않음) 여러 요청에 대한 사용자 환경이 개선됩니다.
참고:
llama.cpp 서버의 경우 올바른 채팅 템플릿을 적용하지 않으면 LLM이 알 수 없는 채팅 구분자를 콘텐츠의 일부로 '인식'하여 자체적으로 대화를 진행하여 GPU 사이클을 낭비하게 됩니다. 예:
• llama2의 경우, 서버 호출에 --chat-template llama2
를 추가해야 합니다.
• llama3의 경우 llama3
, openai-like는 chatml
입니다.
• 참조: https://github.com/ggerganov/llama.cpp/wiki/Templates-supported-by-llama_chat_apply_template
다음은 Llama 3 8B 지시문을 사용한 올바른 서버 호출의 예입니다.
llama.cpp/llama-server -m LLMs/gguf/Meta-Llama-3-8B-Instruct-v2.Q5_K_M.gguf -ngl 999 -cb -np 3 --host 0.0.0.0 --port 8080 --api-key myapikey --chat-template llama3
위의 예에서는 올바른 채팅 템플릿을 지정하고 -ngl 999를 사용하여 서버에 모든 레이어를 GPU로 오프로드하도록 지시하여 성능을 극대화했습니다.
다음은 Qwen2를 사용한 예시입니다.
llama.cpp/llama-server -m LLMs/gguf/qwen2-7b-instruct-q5_k_m.gguf -ngl 999 -fa -cb -np 3 --host 0.0.0.0 --port 8080 --api-key myapikey
위의 예시에서는 llama.cpp에서 qwen2를 사용하여 -fa 플래그(qwen2에 필요)를 통해 Flash Attention을 사용했습니다. llama.cpp에서 지원하는 기본 템플릿을 사용하므로 채팅 템플릿을 지정할 필요가 없습니다.
llama.cpp 서버가 실행되면(모델을 처음 로드할 때 시작하는 데 시간이 걸릴 수 있으므로 조금만 기다려주세요) 마지막으로 해야 할 일은 코드를 통해 API 서버에 액세스하는 것입니다!
OpenAI 클라이언트 Python 라이브러리가 필요하므로 먼저 pip를 사용하여 설치합니다:
pip install openai
다음은 인스턴스에 연결하기 위한 샘플 python 코드입니다.
llama.cpp 서버의 장점은 OpenAI 호환 API 서버를 제공한다는 것입니다. 즉, 여러분이나 여러분의 팀이 이미 OpenAI API 스타일을 사용하는 코드를 많이 보유하고 있다면 llama.cpp 기반 Alibaba Cloud 인스턴스를 쉽게 사용할 수 있습니다. 올바른 호스트, 포트 및 API 키를 구성하는 것 외에는 기존 코드를 거의 변경하지 않고 그대로 사용할 수 있습니다.
위에서 코드를 실행했을 때의 샘플 출력을 볼 수 있습니다. 시스템 프롬프트에 따라 해적처럼 대답하며 휴가나 항해 중에 할 수 있는 일을 제안해 주었습니다.
파트 1은 꽤나 긴 여정이었습니다! ECS 인스턴스를 생성하고, 인스턴스에서 GPU를 사용할 수 있도록 Nvidia 드라이버와 CUDA를 설치한 다음, 우리만의 llama.cpp 서버를 설치하고 구성했습니다.
마지막으로 OpenAI 호환 API 서버를 제공하는 전용 프라이빗 인스턴스를 통해 생성형 AI 기능을 애플리케이션에 쉽게 통합할 수 있었습니다.
*다음 파트 2: 단계는 줄이고 관리 오버헤드는 줄이면서 더 쉽고 빠르게 생성형 AI를 배포하는 방법을 알아보세요!
저자 소개: JV는 Alibaba Cloud PH의 선임 솔루션 아키텍트이며 팀의 데이터 및 생성형 AI 전략을 이끌고 있습니다. 이 글의 내용이 현재 비즈니스 문제와 관련이 있다고 생각되면 jv.roig@alibaba-inc.com로 JV에게 문의해 주세요.
본 기사의 원본은 영문으로 작성되었습니다. 원본 문서 여기 참조.
84 posts | 3 followers
FollowRegional Content Hub - September 9, 2024
Regional Content Hub - September 9, 2024
Regional Content Hub - April 15, 2024
JJ Lim - November 1, 2021
Regional Content Hub - August 12, 2024
Regional Content Hub - March 20, 2024
84 posts | 3 followers
FollowElastic and secure virtual cloud servers to cater all your cloud hosting needs.
Learn MorePowerful parallel computing capabilities based on GPU technology.
Learn MoreTop-performance foundation models from Alibaba Cloud
Learn MoreA convenient and secure cloud-based Desktop-as-a-Service (DaaS) solution
Learn MoreMore Posts by Regional Content Hub