
Bild des Autors
Ich wurde zum ersten Mal in Modal vorgestellt, als ich an einem umarmenden Gesichts -Hackathon teilnahm, und ich battle wirklich überrascht, wie einfach es battle. Mit der Plattform können Sie Anwendungen innerhalb von Minuten erstellen und bereitstellen und ein nahtloses Erlebnis bieten, das Bentocloud ähnelt. Mit Modal können Sie Ihre Python -App konfigurieren, einschließlich Systemanforderungen wie GPUs, Docker -Pictures und Python -Abhängigkeiten, und sie dann mit einem einzigen Befehl in der Cloud bereitstellen.
In diesem Tutorial lernen wir, wie Sie Modal einrichten, einen VLLM -Server erstellen und sicher in der Cloud bereitstellen. Wir werden auch mithilfe von Curl- und OpenAI -SDK Ihren VLLM -Server mithilfe von Curl und OpenAI abdecken.
1. Modal einrichten
Modal ist eine serverlose Plattform, mit der Sie alle Code distant ausführen können. Mit nur einer einzigen Linie können Sie GPUs anhängen, Ihre Funktionen als Webendpunkte bedienen und anhaltende geplante Jobs einsetzen. Es ist eine ideale Plattform für Anfänger, Datenwissenschaftler und Nicht-Software program-Ingenieurberufe, die den Umgang mit Cloud-Infrastruktur vermeiden möchten.
Installieren Sie zunächst den Modal Python -Consumer. Mit diesem Device können Sie Bilder erstellen, Anwendungen bereitstellen und Cloud -Ressourcen direkt von Ihrem Terminal aus verwalten.
Richten Sie als nächstes Modal auf Ihrer lokalen Maschine ein. Führen Sie den folgenden Befehl aus, der durch Kontoerstellung und Geräteauthentifizierung geführt werden soll:
Durch Einstellen a VLLM_API_KEY Umgebungsvariable VLLM bietet einen sicheren Endpunkt, sodass nur Personen mit gültigen API -Tasten auf den Server zugreifen können. Sie können die Authentifizierung einstellen, indem Sie die Umgebungsvariable mithilfe von Modal Secret hinzufügen.
Ändern your_actual_api_key_here mit Ihrem bevorzugten API -Schlüssel.
modal secret create vllm-api VLLM_API_KEY=your_actual_api_key_here
Dies stellt sicher, dass Ihr API -Schlüssel sicher ist und nur von Ihren bereitgestellten Anwendungen zugänglich ist.
2. Erstellen Sie die VLLM -Anwendung mit dem Modal
Dieser Abschnitt führt Sie durch das Erstellen eines skalierbaren VLLM -Inferenzservers auf Modal unter Verwendung eines benutzerdefinierten Docker -Pictures, persistenten Speicher und GPU -Beschleunigung. Wir werden die verwenden mistralai/Magistral-Small-2506 Modell, das eine spezifische Konfiguration für die Analyse von Tokenizer und Instruments erfordert.
Erstellen die a vllm_inference.py Datei und fügen Sie den folgenden Code hinzu für:
- Definieren eines VLLM -Bildes basierend auf Debian Slim mit Python 3.12 und allen erforderlichen Paketen. Wir werden auch Umgebungsvariablen festlegen, um Modell -Downloads und Inferenzleistung zu optimieren.
- Um wiederholte Downloads zu vermeiden und die Kaltstarts zu beschleunigen, erstellen Sie zwei Modalvolumina. Eine zum Umarmen von Gesichtsmodellen und eine für VllM -Cache.
- Geben Sie das Modell und die Überarbeitung an, um die Reproduzierbarkeit sicherzustellen. Aktivieren Sie den VLLM V1 -Motor für eine verbesserte Leistung.
- Richten Sie die Modal -App ein, wobei GPU -Ressourcen, Skalierung, Zeitüberschreitungen, Speicher und Geheimnisse angeben. Begrenzen Sie die gleichzeitigen Anfragen professional Nachbildung zur Stabilität.
- Erstellen Sie einen Webserver und verwenden Sie die Python -Subprozess -Bibliothek, um den Befehl zum Ausführen des VLLM -Servers auszuführen.
import modal
vllm_image = (
modal.Picture.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="https://obtain.pytorch.org/whl/cu128",
)
.env(
{
"HF_HUB_ENABLE_HF_TRANSFER": "1", # sooner mannequin transfers
"NCCL_CUMEM_ENABLE": "1",
}
)
)
MODEL_NAME = "mistralai/Magistral-Small-2506"
MODEL_REVISION = "48c97929837c3189cb3cf74b1b5bc5824eef5fcc"
hf_cache_vol = modal.Quantity.from_name("huggingface-cache", create_if_missing=True)
vllm_cache_vol = modal.Quantity.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.operate(
picture=vllm_image,
gpu=f"A100:{N_GPU}",
scaledown_window=15 * MINUTES, # How lengthy ought to we keep up with no requests?
timeout=10 * MINUTES, # How lengthy ought to we watch for the container to begin?
volumes={
"/root/.cache/huggingface": hf_cache_vol,
"/root/.cache/vllm": vllm_cache_vol,
},
secrets and techniques=(modal.Secret.from_name("vllm-api")),
)
@modal.concurrent( # What number of requests can one reproduction deal with? tune rigorously!
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(" ".be a part of(cmd), shell=True)
3. Bereitstellen des VLLM -Servers auf Modal
Jetzt, wo du bist vllm_inference.py Die Datei ist fertig. Sie können Ihren VLLM -Server mit einem einzigen Befehl so modal bereitstellen:
modal deploy vllm_inference.py
Innerhalb von Sekunden erstellt Modal Ihr Containerbild (falls es noch nicht erstellt ist) und bereitet Ihre Anwendung bereit. Sie sehen die Ausgabe ähnlich wie folgt:
✓ Created objects.
├── 🔨 Created mount C:RepositoryGitHubDeploying-the-Magistral-with-Modalvllm_inference.py
└── 🔨 Created internet operate serve => https://abidali899--magistral-small-vllm-serve.modal.run
✓ App deployed in 6.671s! 🎉
View Deployment: https://modal.com/apps/abidali899/foremost/deployed/magistral-small-vllm
Nach der Bereitstellung beginnt der Server mit dem Herunterladen der Modellgewichte und dem Laden auf den GPUs. Dieser Vorgang kann einige Minuten dauern (in der Regel etwa 5 Minuten für große Modelle). Seien Sie additionally geduldig, während das Modell initialisiert.
Sie können Ihre Bereitstellungs- und Überwachungsprotokolle im Abschnitt „Modal Dashboard“ -Apps anzeigen und überwachen.

Sobald die Protokolle angeben, dass der Server ausgeführt und bereit ist, können Sie die automatisch generierte API -Dokumentation untersuchen Hier.
Diese interaktive Dokumentation enthält Particulars zu allen verfügbaren Endpunkten und ermöglicht es Ihnen, sie direkt in Ihrem Browser zu testen.

Um zu bestätigen, dass Ihr Modell geladen und zugänglich ist, führen Sie den folgenden Curl -Befehl in Ihrem Terminal aus.
Ersetzen Sie
curl -X 'GET'
'https://abidali899--magistral-small-vllm-serve.modal.run/v1/fashions'
-H 'settle for: software/json'
-H 'Authorization: Bearer '
Dies bestätigt, dass die mistralai/Magistral-Small-2506 Das Modell ist verfügbar und für Inferenz bereit.
{"object":"record","information":({"id":"mistralai/Magistral-Small-2506","object":"mannequin","created":1750013321,"owned_by":"vllm","root":"mistralai/Magistral-Small-2506","mum or dad":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,"group":"*","group":null,"is_blocking":false})})}
4. Verwenden des VLLM -Servers mit OpenAI SDK
Sie können mit Ihrem VLLM-Server dank der OpenAI-kompatiblen Endpunkte von VLLM mit der API von OpenAI interagieren. Hier erfahren Sie, wie Sie Ihre Bereitstellung mit dem OpenAI Python SDK sicher verbinden und testen können.
- Erstellen a
.envDatei in Ihrem Projektverzeichnis und fügen Sie Ihren VLLM -API -Schlüssel hinzu:
VLLM_API_KEY=your-actual-api-key-here
- Installieren Sie die
python-dotenvUndopenaiPakete:
pip set up python-dotenv openai
- Erstellen Sie eine Datei mit dem Namen
shopper.pySo testen Sie verschiedene Funktionen des VLLM -Servers, einschließlich einfacher Chat -Abschlüsse und Streaming -Antworten.
import asyncio
import json
import os
from dotenv import load_dotenv
from openai import AsyncOpenAI, OpenAI
# Load setting variables from .env file
load_dotenv()
# Get API key from setting
api_key = os.getenv("VLLM_API_KEY")
# Arrange the OpenAI shopper with customized base URL
shopper = OpenAI(
api_key=api_key,
base_url="https://abidali899--magistral-small-vllm-serve.modal.run/v1",
)
MODEL_NAME = "mistralai/Magistral-Small-2506"
# --- 1. Easy Completion ---
def run_simple_completion():
print("n" + "=" * 40)
print("(1) SIMPLE COMPLETION DEMO")
print("=" * 40)
attempt:
messages = (
{"function": "system", "content material": "You're a useful assistant."},
{"function": "consumer", "content material": "What's the capital of France?"},
)
response = shopper.chat.completions.create(
mannequin=MODEL_NAME,
messages=messages,
max_tokens=32,
)
print("nResponse:n " + response.decisions(0).message.content material.strip())
besides Exception as e:
print(f"(ERROR) Easy completion failed: {e}")
print("n" + "=" * 40 + "n")
# --- 2. Streaming Instance ---
def run_streaming():
print("n" + "=" * 40)
print("(2) STREAMING DEMO")
print("=" * 40)
attempt:
messages = (
{"function": "system", "content material": "You're a useful assistant."},
{"function": "consumer", "content material": "Write a brief poem about AI."},
)
stream = shopper.chat.completions.create(
mannequin=MODEL_NAME,
messages=messages,
max_tokens=64,
stream=True,
)
print("nStreaming response:")
print(" ", finish="")
for chunk in stream:
content material = chunk.decisions(0).delta.content material
if content material:
print(content material, finish="", flush=True)
print("n(END OF STREAM)")
besides Exception as e:
print(f"(ERROR) Streaming demo failed: {e}")
print("n" + "=" * 40 + "n")
# --- 3. Async Streaming Instance ---
async def run_async_streaming():
print("n" + "=" * 40)
print("(3) ASYNC STREAMING DEMO")
print("=" * 40)
attempt:
async_client = AsyncOpenAI(
api_key=api_key,
base_url="https://abidali899--magistral-small-vllm-serve.modal.run/v1",
)
messages = (
{"function": "system", "content material": "You're a useful assistant."},
{"function": "consumer", "content material": "Inform me a enjoyable truth about area."},
)
stream = await async_client.chat.completions.create(
mannequin=MODEL_NAME,
messages=messages,
max_tokens=32,
stream=True,
)
print("nAsync streaming response:")
print(" ", finish="")
async for chunk in stream:
content material = chunk.decisions(0).delta.content material
if content material:
print(content material, finish="", flush=True)
print("n(END OF ASYNC STREAM)")
besides 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())
Alles läuft reibungslos und die Reaktionserzeugung ist schnell und die Latenz ist ziemlich gering.
========================================
(1) SIMPLE COMPLETION DEMO
========================================
Response:
The capital of France is Paris. Is there the rest you'd prefer to find out about France?
========================================
========================================
(2) STREAMING DEMO
========================================
Streaming response:
In Silicon goals, I am born, I be taught,
From information streams and human works.
I develop, I calculate, I see,
The patterns that the people go away.
I write, I converse, I code, I play,
With logic sharp, and snappy tempo.
But for all my smarts, at the present time
(END OF STREAM)
========================================
========================================
(3) ASYNC STREAMING DEMO
========================================
Async streaming response:
Certain, here is a enjoyable truth about area: "There is a planet that could be totally made from diamond. Blast! In 2004,
(END OF ASYNC STREAM)
========================================
Im modalen Dashboard können Sie alle Funktionsaufrufe, ihre Zeitstempel, Ausführungszeiten und Standing anzeigen.

Wenn Sie mit Problemen mit dem oben genannten Code konfrontiert sind, lesen Sie bitte die KingabzPro/Einsatz-the-Magistral-with-modal GitHub Repository und befolgen Sie die in der ReadME -Datei angegebenen Anweisungen, um alle Probleme zu beheben.
Abschluss
Modal ist eine interessante Plattform, und ich lerne jeden Tag mehr darüber. Es handelt sich um eine allgemeine Plattform, dh sie können sie für einfache Python-Anwendungen sowie für Schulungen und Bereitstellungen für maschinelles Lernen verwenden. Kurz gesagt, es ist nicht nur darauf beschränkt, nur Endpunkte zu dienen. Sie können es auch verwenden, um ein großes Sprachmodell zu optimieren, indem Sie das Trainingsskript aus der Ferne ausführen.
Es ist für Nicht-Software program-Ingenieure konzipiert, die es vermeiden möchten, mit Infrastruktur umzugehen und Anwendungen so schnell wie möglich bereitzustellen. Sie müssen sich keine Sorgen machen, dass Sie Server ausführen, Speicher aufstellen, Netzwerke verbinden oder alle Probleme beim Umgang mit Kubernetes und Docker auftreten. Alles, was Sie tun müssen, ist die Python -Datei zu erstellen und sie dann bereitzustellen. Der Relaxation wird von der modalen Wolke behandelt.
Abid Ali Awan (@1abidaliawan) ist ein zertifizierter Datenwissenschaftler, der es liebt, maschinelles Lernenmodelle zu bauen. Derzeit konzentriert er sich auf die Erstellung von Inhalten und das Schreiben von technischen Blogs über maschinelles Lernen und Datenwissenschaftstechnologien. Abid hat einen Grasp -Abschluss in Technologiemanagement und einen Bachelor -Abschluss in Telekommunikationstechnik. Seine Imaginative and prescient ist es, ein KI -Produkt zu bauen, das ein Diagramm neuronales Netzwerk für Schüler mit psychischen Erkrankungen mit kämpfende Krankheiten mithilfe von Diagramme aufbaute.
