Chroma-1.0
Chroma-1.0
이 문서는 FlashLabs가 개발한 오픈소스 종단간(end-to-end) 음성 대화 모델인 Chroma-1.0을 배포하고 사용하는 방법을 설명해요. Chroma-1.0은 직접 SGLang 배포 대신 FlashLabs Server 중심의 하이브리드 서빙 아키텍처를 사용하며, 특정 추론 구성 요소에서는 SGLang을 활용해요.
출처: 문서
본문
1. 모델 소개
Chroma-1.0은 FlashLabs가 개발한 오픈소스 종단간 음성 대화 모델로, 다음과 같은 핵심 기능에 중점을 둬요:
- 실시간 음성 생성 (Real-time Speech Generation): 낮은 지연 시간의 음성 합성을 지원해 실시간 대화 시나리오에 적합해요.
- 맞춤형 음성 복제 (Customized Voice Cloning): 특정 화자의 음성 특징을 복제하고 재현할 수 있어요.
- 종단간 아키텍처 (End-to-End Architecture): 음성에서 음성으로 이어지는 완전한 처리 워크플로우를 제공해요.
- 음성 추론 (Speech Reasoning): 음성 콘텐츠를 이해하고 처리하는 추론 능력을 갖추고 있어요.
2. 아키텍처 개요
Chroma-1.0은 직접적인 SGLang 배포가 아닌 하이브리드 서빙 아키텍처를 사용해요. 이 설계 선택의 이유는 다음과 같아요:
- 복잡한 모델 아키텍처 (Complex Model Architecture): 종단간 음성 처리 파이프라인에는 표준 텍스트 생성 루프를 넘어서는 특수 구성 요소가 포함돼요.
- KV Cache & 상태 관리 (KV Cache & State Management): 모델은 표준 구현과 다른 커스텀 KV cache 처리를 요구해요.
- 배치 제한 (Batching Limitations): 현재 구현은 배치 크기 1(batch size of 1)을 지원하므로, SGLang의 고급 연속 배치(continuous batching) 기능이 아직 완전히 적용되지 못해요.
따라서 전체 워크플로우를 관리하고 지원되는 특정 추론 구성 요소에 대해 SGLang을 선택적으로 활용하는 FlashLabs Server를 시작하게 돼요.
- 바깥 계층 (Outer Layer): FlashLabs Server (오디오 I/O, 상태, 모델 로직을 처리)
- 내부 엔진 (Inner Engine): SGLang 인스턴스 (적용 가능한 특정 가속에 활용)
3. 설치 및 설정
환경을 준비하고 모델을 준비하려면 다음 단계를 따르는 것을 권장해요.
1단계: Docker 이미지 가져오기
모든 의존성이 올바르게 구성되도록 Docker Hub에서 공식 사전 빌드 이미지를 내려받으세요.
docker pull flashlabs/chroma:latest
2단계: 모델 가중치 내려받기
Hugging Face에서 Chroma-4B 가중치를 내려받으세요. 다음 방법 중 하나를 선택할 수 있어요.
방법 1: Python 사용 (권장)
huggingface-cli download FlashLabs/Chroma-4B --local-dir Chroma-4B
방법 2: Git Clone 사용
클론하기 전에 Git LFS가 설치되어 있는지 확인하세요.
# Install Git LFS first
git lfs install
# Clone the repository
git clone https://huggingface.co/FlashLabs/Chroma-4B Chroma-4B
3단계: Chroma 코드 내려받기 (SGLang 버전)
git clone https://github.com/FlashLabs-AI-Corp/Chroma-SGLang.git
cd Chroma-SGLang
4단계: 서버 실행
docker run -d \
--gpus all \
-p 8000:8000 \
-w /app/Chroma-SGLang \
-v "your_Chroma-SGLang_path":/app/Chroma-SGLang \
-v "your_chroma_path":/model \
-e CHROMA_MODEL_PATH=/model \
-e DP_SIZE="1" \
flashlabs/chroma:latest \
/opt/conda/bin/python -m uvicorn api_server:app \
--host 0.0.0.0 \
--port 8000 \
--workers 1
아니면 다음의 한 줄 명령으로 간단히 실행할 수도 있어요:
docker-compose up -d
5. 클라이언트 사용 예시
서버가 실행되면 HTTP 요청으로 상호작용할 수 있어요.
Python 클라이언트
import requests
import base64
url = "http://localhost:8000/v1/chat/completions"
headers = {"Content-Type": "application/json"}
payload = {
"model": "chroma",
"messages": [
{
"role": "system",
"content": "You are Chroma, a voice agent developed by FlashLabs."
},
{
"role": "user",
"content": [
{"type": "audio", "audio": "assets/question_audio.wav"}
]
}
],
"max_tokens": 1000,
"return_audio": True
}
response = requests.post(url, json=payload, headers=headers)
result = response.json()
if result.get("audio"):
audio_data = base64.b64decode(result["audio"])
with open("output.wav", "wb") as f:
f.write(audio_data)
print("Audio saved to output.wav")
OpenAI SDK 호환 예시
from openai import OpenAI
client = OpenAI(
api_key="dummy",
base_url="http://localhost:8000/v1"
)
response = client.chat.completions.create(
model="chroma",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": [
{"type": "audio", "audio": "assets/question_audio.wav"}
]
}
],
extra_body={
"prompt_text": "I have not... I'm so exhausted, I haven't slept in a very long time. It could be because... Well, I used our... Uh, I'm, I just use... This is what I use every day. I use our cleanser every day, I use serum in the morning and then the moistu- daily moisturizer. That's what I use every morning.",
"prompt_audio": "assets/ref_audio.wav",
"return_audio": True
}
)
print(response)
CLI (cURL)
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "chroma",
"messages": [
{
"role": "system",
"content": "You are Chroma, a voice agent developed by FlashLabs."
},
{
"role": "user",
"content": [
{
"type": "audio",
"audio": "assets/question_audio.wav"
}
]
}
],
"max_tokens": 1000,
"return_audio": true
}' | jq -r '.audio' | base64 -d > output.wav