Modal에 Magistral Vllm 서버 배포

저자의 이미지
나는 포옹 페이스 해커 톤에 참여하는 동안 처음으로 모달에 소개되었고, 얼마나 쉬운 지에 정말 놀랐습니다. 이 플랫폼을 사용하면 몇 분 안에 응용 프로그램을 구축하고 배포 할 수 있으며 Bentocloud와 유사한 완벽한 경험을 제공합니다. Modal을 사용하면 GPU, Docker 이미지 및 Python 종속성과 같은 시스템 요구 사항을 포함하여 Python 앱을 구성한 다음 단일 명령으로 클라우드에 배포 할 수 있습니다.
이 튜토리얼에서는 Modal을 설정하고 VLLM 서버를 만들고 클라우드에 안전하게 배포하는 방법을 배웁니다. CURL과 OpenAI SDK를 모두 사용하여 VLLM 서버를 테스트하는 방법도 포함합니다.
1. 모달 설정
Modal은 원격으로 코드를 실행할 수있는 서버리스 플랫폼입니다. 한 줄만 있으면 GPU를 연결하고 기능을 웹 엔드 포인트로 제공하며 지속적인 예약 작업을 배포 할 수 있습니다. 클라우드 인프라를 다루지 않으려는 초보자, 데이터 과학자 및 비 소프트웨어 엔지니어링 전문가에게 이상적인 플랫폼입니다.
먼저 Modal Python 클라이언트를 설치하십시오. 이 도구를 사용하면 이미지를 구축하고 애플리케이션을 배포하며 클라우드 리소스를 터미널에서 직접 관리 할 수 있습니다.
다음으로 로컬 컴퓨터에서 모달을 설정하십시오. 계정 생성 및 장치 인증을 통해 안내 할 다음 명령을 실행하십시오.
a VLLM_API_KEY
Environment Variable VLLM은 안전한 엔드 포인트를 제공하므로 유효한 API 키를 가진 사람 만 서버에 액세스 할 수 있습니다. 모달 비밀을 사용하여 환경 변수를 추가하여 인증을 설정할 수 있습니다.
변화 your_actual_api_key_here
선호하는 API 키로.
modal secret create vllm-api VLLM_API_KEY=your_actual_api_key_here
이를 통해 API 키가 안전하게 유지되며 배포 된 응용 프로그램에서만 액세스 할 수 있습니다.
2. 모달을 사용하여 vllm 응용 프로그램 생성
이 섹션에서는 Custom Docker 이미지, 영구 스토리지 및 GPU 가속도를 사용하여 Modal에 확장 가능한 VLLM 추론 서버를 구축하도록 안내합니다. 우리는 그것을 사용할 것입니다 mistralai/Magistral-Small-2506
Tokenizer 및 Tool Call Parsing에 대한 특정 구성이 필요한 모델.
a를 만듭니다 vllm_inference.py
다음 코드를 파일하고 다음 코드를 추가하십시오.
- Python 3.12 및 필요한 모든 패키지와 함께 Debian Slim을 기반으로 VLLM 이미지 정의. 또한 모델 다운로드 및 추론 성능을 최적화하기 위해 환경 변수를 설정합니다.
- 반복적 인 다운로드를 피하고 콜드 스타트 속도를 높이려면 두 개의 모달 볼륨을 만듭니다. 하나는 얼굴 모델을 포옹하고 Vllm 캐시를위한 것입니다.
- 재현성을 보장하기 위해 모델 및 개정을 지정하십시오. 성능 향상을 위해 VLLM V1 엔진을 활성화하십시오.
- 모달 앱을 설정하고 GPU 리소스, 스케일링, 타임 아웃, 스토리지 및 비밀을 지정합니다. 안정성에 대한 복제당 당 동시 요청을 제한합니다.
- 웹 서버를 생성하고 Python Subprocess 라이브러리를 사용하여 VLLM 서버를 실행하기위한 명령을 실행하십시오.
import modal
vllm_image = (
modal.Image.debian_slim(python_version="3.12")
.pip_install(
"vllm==0.9.1",
"huggingface_hub[hf_transfer]==0.32.0",
"flashinfer-python==0.2.6.post1",
extra_index_url="
)
.env(
{
"HF_HUB_ENABLE_HF_TRANSFER": "1", # faster model transfers
"NCCL_CUMEM_ENABLE": "1",
}
)
)
MODEL_NAME = "mistralai/Magistral-Small-2506"
MODEL_REVISION = "48c97929837c3189cb3cf74b1b5bc5824eef5fcc"
hf_cache_vol = modal.Volume.from_name("huggingface-cache", create_if_missing=True)
vllm_cache_vol = modal.Volume.from_name("vllm-cache", create_if_missing=True)
vllm_image = vllm_image.env({"VLLM_USE_V1": "1"})
FAST_BOOT = True
app = modal.App("magistral-small-vllm")
N_GPU = 2
MINUTES = 60 # seconds
VLLM_PORT = 8000
@app.function(
image=vllm_image,
gpu=f"A100:{N_GPU}",
scaledown_window=15 * MINUTES, # How long should we stay up with no requests?
timeout=10 * MINUTES, # How long should we wait for the container to start?
volumes={
"/root/.cache/huggingface": hf_cache_vol,
"/root/.cache/vllm": vllm_cache_vol,
},
secrets=[modal.Secret.from_name("vllm-api")],
)
@modal.concurrent( # How many requests can one replica handle? tune carefully!
max_inputs=32
)
@modal.web_server(port=VLLM_PORT, startup_timeout=10 * MINUTES)
def serve():
import subprocess
cmd = [
"vllm",
"serve",
MODEL_NAME,
"--tokenizer_mode",
"mistral",
"--config_format",
"mistral",
"--load_format",
"mistral",
"--tool-call-parser",
"mistral",
"--enable-auto-tool-choice",
"--tensor-parallel-size",
"2",
"--revision",
MODEL_REVISION,
"--served-model-name",
MODEL_NAME,
"--host",
"0.0.0.0",
"--port",
str(VLLM_PORT),
]
cmd += ["--enforce-eager" if FAST_BOOT else "--no-enforce-eager"]
print(cmd)
subprocess.Popen(" ".join(cmd), shell=True)
3. Modal에 VLLM 서버 배포
이제 당신의 vllm_inference.py
파일이 준비되었으므로 단일 명령으로 Vllm 서버를 Modal에 배포 할 수 있습니다.
modal deploy vllm_inference.py
몇 초 안에 Modal은 컨테이너 이미지 (아직 제작되지 않은 경우)를 구축하고 응용 프로그램을 배포합니다. 다음과 유사한 출력이 표시됩니다.
✓ Created objects.
├── 🔨 Created mount C:\Repository\GitHub\Deploying-the-Magistral-with-Modal\vllm_inference.py
└── 🔨 Created web function serve =>
✓ App deployed in 6.671s! 🎉
View Deployment:
배포 후 서버는 모델 가중치를 다운로드하여 GPU에로드하기 시작합니다. 이 프로세스에는 몇 분이 걸릴 수 있습니다 (일반적으로 대형 모델의 경우 약 5 분)이 걸릴 수 있으므로 모델이 초기화되는 동안 인내하십시오.
Modal Dashboard의 앱 섹션에서 배포 및 모니터 로그를 볼 수 있습니다.

로그에 서버가 실행되고 준비되었음을 나타내면 여기에서 자동으로 생성 된 API 문서를 탐색 할 수 있습니다.
이 대화식 문서는 사용 가능한 모든 엔드 포인트에 대한 세부 정보를 제공하며 브라우저에서 직접 테스트 할 수 있습니다.

모델이로드되고 액세스 할 수 있는지 확인하려면 터미널에서 다음 컬 명령을 실행하십시오.
바꾸다
curl -X 'GET' \
' \
-H 'accept: application/json' \
-H 'Authorization: Bearer '
이것은 그것을 확인합니다 mistralai/Magistral-Small-2506
모델을 사용할 수 있으며 추론 준비가되었습니다.
{"object":"list","data":[{"id":"mistralai/Magistral-Small-2506","object":"model","created":1750013321,"owned_by":"vllm","root":"mistralai/Magistral-Small-2506","parent":null,"max_model_len":40960,"permission":[{"id":"modelperm-33a33f8f600b4555b44cb42fca70b931","object":"model_permission","created":1750013321,"allow_create_engine":false,"allow_sampling":true,"allow_logprobs":true,"allow_search_indices":false,"allow_view":true,"allow_fine_tuning":false,"organization":"*","group":null,"is_blocking":false}]}]}
4. OpenAI SDK와 함께 VLLM 서버 사용
VLLM의 OpenAI 호환 엔드 포인트 덕분에 OpenAI의 API와 마찬가지로 VLLM 서버와 상호 작용할 수 있습니다. OpenAi Python SDK를 사용하여 배포를 안전하게 연결하고 테스트하는 방법은 다음과 같습니다.
- a
.env
프로젝트 디렉토리에 파일을 파일하고 VLLM API 키를 추가하십시오.
VLLM_API_KEY=your-actual-api-key-here
- 설치
python-dotenv
그리고openai
패키지 :
pip install python-dotenv openai
- 이름이 지정된 파일을 만듭니다
client.py
간단한 채팅 완료 및 스트리밍 응답을 포함하여 다양한 VLLM 서버 기능을 테스트합니다.
import asyncio
import json
import os
from dotenv import load_dotenv
from openai import AsyncOpenAI, OpenAI
# Load environment variables from .env file
load_dotenv()
# Get API key from environment
api_key = os.getenv("VLLM_API_KEY")
# Set up the OpenAI client with custom base URL
client = OpenAI(
api_key=api_key,
base_url="
)
MODEL_NAME = "mistralai/Magistral-Small-2506"
# --- 1. Simple Completion ---
def run_simple_completion():
print("\n" + "=" * 40)
print("[1] SIMPLE COMPLETION DEMO")
print("=" * 40)
try:
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is the capital of France?"},
]
response = client.chat.completions.create(
model=MODEL_NAME,
messages=messages,
max_tokens=32,
)
print("\nResponse:\n " + response.choices[0].message.content.strip())
except Exception as e:
print(f"[ERROR] Simple completion failed: {e}")
print("\n" + "=" * 40 + "\n")
# --- 2. Streaming Example ---
def run_streaming():
print("\n" + "=" * 40)
print("[2] STREAMING DEMO")
print("=" * 40)
try:
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Write a short poem about AI."},
]
stream = client.chat.completions.create(
model=MODEL_NAME,
messages=messages,
max_tokens=64,
stream=True,
)
print("\nStreaming response:")
print(" ", end="")
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
print("\n[END OF STREAM]")
except Exception as e:
print(f"[ERROR] Streaming demo failed: {e}")
print("\n" + "=" * 40 + "\n")
# --- 3. Async Streaming Example ---
async def run_async_streaming():
print("\n" + "=" * 40)
print("[3] ASYNC STREAMING DEMO")
print("=" * 40)
try:
async_client = AsyncOpenAI(
api_key=api_key,
base_url="
)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Tell me a fun fact about space."},
]
stream = await async_client.chat.completions.create(
model=MODEL_NAME,
messages=messages,
max_tokens=32,
stream=True,
)
print("\nAsync streaming response:")
print(" ", end="")
async for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
print("\n[END OF ASYNC STREAM]")
except Exception as e:
print(f"[ERROR] Async streaming demo failed: {e}")
print("\n" + "=" * 40 + "\n")
if __name__ == "__main__":
run_simple_completion()
run_streaming()
asyncio.run(run_async_streaming())
모든 것이 원활하게 실행되며 응답 생성은 빠르며 대기 시간이 상당히 낮습니다.
========================================
[1] SIMPLE COMPLETION DEMO
========================================
Response:
The capital of France is Paris. Is there anything else you'd like to know about France?
========================================
========================================
[2] STREAMING DEMO
========================================
Streaming response:
In Silicon dreams, I'm born, I learn,
From data streams and human works.
I grow, I calculate, I see,
The patterns that the humans leave.
I write, I speak, I code, I play,
With logic sharp, and snappy pace.
Yet for all my smarts, this day
[END OF STREAM]
========================================
========================================
[3] ASYNC STREAMING DEMO
========================================
Async streaming response:
Sure, here's a fun fact about space: "There's a planet that may be entirely made of diamond. Blast! In 2004,
[END OF ASYNC STREAM]
========================================
모달 대시 보드에서는 모든 기능 호출, 타임 스탬프, 실행 시간 및 상태를 볼 수 있습니다.

위의 코드를 실행하는 문제에 직면하는 경우 KingabzPro/배포-모달 Github 리포지토리를 참조하고 readme 파일에 제공된 지침을 따라 모든 문제를 해결하십시오.
결론
모달은 흥미로운 플랫폼이며 매일 그것에 대해 더 많이 배우고 있습니다. 일반 목적 플랫폼으로 간단한 파이썬 응용 프로그램과 기계 학습 교육 및 배포에 사용할 수 있습니다. 요컨대, 단지 엔드 포인트를 제공하는 데 국한되지 않습니다. 교육 스크립트를 원격으로 실행하여 대형 언어 모델을 미세 조정하는 데 사용할 수도 있습니다.
인프라를 다루고 응용 프로그램을 가능한 빨리 배포하지 않으려는 소프트웨어 엔지니어를 위해 설계되었습니다. 서버 실행, 스토리지 설정, 네트워크 연결 또는 Kubernetes 및 Docker를 다룰 때 발생하는 모든 문제에 대해 걱정할 필요가 없습니다. Python 파일을 작성한 다음 배포하기 만하면됩니다. 나머지는 모달 클라우드에 의해 처리됩니다.
Abid Ali Awan (@1abidaliawan)은 기계 학습 모델 구축을 좋아하는 공인 데이터 과학자입니다. 현재 그는 컨텐츠 제작 및 기계 학습 및 데이터 과학 기술에 대한 기술 블로그 작성에 중점을두고 있습니다. Abid는 기술 관리 석사 학위와 통신 공학 학사 학위를 취득했습니다. 그의 비전은 정신 질환으로 어려움을 겪고있는 학생들을위한 그래프 신경망을 사용하여 AI 제품을 구축하는 것입니다.
Post Comment