LoRAX: 수천 개의 미세 조정된 LLM으로 확장되는 다중 LoRA 추론 서버
LoRAX(LoRA eXchange)는 사용자가 단일 GPU에서 수천 개의 미세 조정된 모델을 제공할 수 있게 하여 처리량이나 대기 시간을 저하시키지 않으면서 서비스 비용을 획기적으로 절감할 수 있는 프레임워크입니다.
목차
특징
모델
?시작하기
요구사항
LoRAX 서버 실행
REST API를 통해 프롬프트
Python 클라이언트를 통한 프롬프트
OpenAI API를 통한 채팅
다음 단계
감사의 말
로드맵
동적 어댑터 로딩: HuggingFace, Predibase 또는 모든 파일 시스템의 미세 조정된 LoRA 어댑터를 요청에 포함하면 동시 요청을 차단하지 않고 적시에 로드됩니다. 요청별로 어댑터를 병합하여 강력한 앙상블을 즉시 생성합니다.
이기종 연속 일괄 처리: 서로 다른 어댑터에 대한 요청을 동일한 일괄 처리로 묶어 동시 어댑터 수에 따라 대기 시간과 처리량을 거의 일정하게 유지합니다.
어댑터 교환 스케줄링: GPU와 CPU 메모리 사이에서 어댑터를 비동기식으로 프리패치 및 오프로드하고, 요청 일괄 처리를 예약하여 시스템의 총 처리량을 최적화합니다.
최적화된 추론: 텐서 병렬 처리, 사전 컴파일된 CUDA 커널(플래시 주의, 페이지 주의, SGMV), 양자화, 토큰 스트리밍을 포함한 높은 처리량 및 낮은 대기 시간 최적화.
사전 구축된 Docker 이미지, Kubernetes용 Helm 차트, Prometheus 지표 및 Open Telemetry를 통한 분산 추적을 위한 프로덕션 준비가 완료되었습니다 . 다중 턴 채팅 대화를 지원하는 OpenAI 호환 API입니다. 요청별 테넌트 격리를 통한 개인 어댑터. 구조화된 출력(JSON 모드).
? 상업용 무료: Apache 2.0 라이센스. 충분히 말했다?.
LoRAX를 사용하여 미세 조정된 모델을 제공하는 것은 두 가지 구성 요소로 구성됩니다.
기본 모델: 모든 어댑터에서 공유되는 사전 훈련된 대형 모델입니다.
어댑터: 요청별로 동적으로 로드되는 작업별 어댑터 가중치입니다.
LoRAX는 Llama(CodeLlama 포함), Mistral(Zephyr 포함) 및 Qwen을 포함한 다양한 대형 언어 모델을 기본 모델로 지원합니다. 지원되는 기본 모델의 전체 목록은 지원되는 아키텍처를 참조하세요.
기본 모델은 fp16으로 로드하거나 bitsandbytes
, GPT-Q 또는 AWQ로 양자화할 수 있습니다.
지원되는 어댑터에는 PEFT 및 Ludwig 라이브러리를 사용하여 훈련된 LoRA 어댑터가 포함됩니다. 모델의 모든 선형 레이어는 LoRA를 통해 조정되고 LoRAX에 로드될 수 있습니다.
사용자 지정 CUDA 커널 및 기타 종속성을 컴파일하지 않으려면 사전 빌드된 Docker 이미지로 시작하는 것이 좋습니다.
LoRAX를 실행하는 데 필요한 최소 시스템 요구 사항은 다음과 같습니다.
Nvidia GPU(암페어 세대 이상)
CUDA 11.8 호환 장치 드라이버 이상
리눅스 운영체제
Docker(이 가이드용)
nvidia-container-toolkit을 설치한 다음
sudo systemctl daemon-reload
sudo systemctl restart docker
모델=mistralai/Mistral-7B-Instruct-v0.1 볼륨=$PWD/데이터 docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/predibase/lorax:main --model-id $model
토큰 스트리밍 및 Python 클라이언트를 포함한 전체 튜토리얼은 시작하기 - Docker를 참조하세요.
프롬프트 기반 LLM:
컬 127.0.0.1:8080/생성 -X 포스트 -d '{ "inputs": "[INST] Natalia는 4월에 48명의 친구에게 클립을 팔았고 5월에는 그 절반의 클립을 팔았습니다. Natalia는 4월과 5월에 총 몇 개의 클립을 팔았습니까? [/INST] ", "매개변수": { "max_new_tokens": 64 } }' -H '콘텐츠 유형: 애플리케이션/json'
LoRA 어댑터 프롬프트:
컬 127.0.0.1:8080/생성 -X 포스트 -d '{ "inputs": "[INST] Natalia는 4월에 48명의 친구에게 클립을 팔았고 5월에는 그 절반의 클립을 팔았습니다. Natalia는 4월과 5월에 총 몇 개의 클립을 팔았습니까? [/INST] ", "매개변수": { "max_new_tokens": 64, "adapter_id": "vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k" } }' -H '콘텐츠 유형: 애플리케이션/json'
자세한 내용은 참조 - REST API를 참조하세요.
설치하다:
pip 설치 lorax-클라이언트
달리다:
from lorax import Clientclient = Client("http://127.0.0.1:8080")# Prompt the base LLMprompt = "[INST] Natalia는 4월에 48명의 친구에게 클립을 팔았고 5월에는 그 절반의 클립을 팔았습니다. . Natalia는 4월과 5월에 총 몇 개의 클립을 판매했습니까? [/INST]"print(client.generate(prompt, max_new_tokens=64).generated_text)# LoRA 프롬프트 어댑터adapter_id = "vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k"print(client.generate(prompt, max_new_tokens=64, Adapter_id=adapter_id).generated_text )
자세한 내용은 참조 - Python 클라이언트를 참조하세요.
LoRAX를 실행하는 다른 방법은 시작하기 - Kubernetes, 시작하기 - SkyPilot 및 시작하기 - 로컬을 참조하세요.
LoRAX는 OpenAI 호환 API를 통해 동적 어댑터 로딩과 결합된 다중 회전 채팅 대화를 지원합니다. model
매개변수로 어댑터를 지정하기만 하면 됩니다.
openai import OpenAIclient = OpenAI(api_key="EMPTY",base_url="http://127.0.0.1:8080/v1", )resp = client.chat.completions.create(model="alignment-handbook/zephyr-7b-dpo-lora",messages=[ {"role": "system","content": "당신은 항상 해적 스타일로 응답하는 친절한 챗봇입니다.", }, {"role": "user", "content": "사람이 한 번에 몇 대의 헬리콥터를 먹을 수 있나요?"}, ],max_tokens=100, )print("응답:", resp.choices[0].message.content)
자세한 내용은 OpenAI 호환 API를 참조하세요.
시험해 볼 수 있는 다른 흥미로운 Mistral-7B 미세 조정 모델은 다음과 같습니다.
alignment-handbook/zephyr-7b-dpo-lora: Mistral-7b는 DPO를 사용하여 Zephyr-7B 데이터 세트에서 미세 조정되었습니다.
IlyaGusev/saiga_mistral_7b_lora: Open-Orca/Mistral-7B-OpenOrca
기반으로 한 러시아어 챗봇.
Undi95/Mistral-7B-roleplay_alpaca-lora: 역할극 프롬프트를 사용하여 미세 조정되었습니다.
여기에서 더 많은 LoRA 어댑터를 찾거나 PEFT 또는 Ludwig를 사용하여 직접 미세 조정해 볼 수 있습니다.
LoRAX는 v0.9.4(Apache 2.0)에서 분기된 HuggingFace의 텍스트 생성 추론을 기반으로 구축되었습니다.
또한 과부하 상태에서 다중 어댑터 추론 속도를 높이는 데 사용되는 SGMV 커널 작업에 대해 Punica에게 감사의 말씀을 전하고 싶습니다.
우리의 로드맵은 여기에서 추적됩니다.