AizuDemy

Deploy LLM High-Throughput di VPS: Panduan vLLM & Ray Serve

Deploy LLM High-Throughput di VPS: Panduan vLLM & Ray Serve
IKLAN
IDCloudHost
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 6 mnt baca baca
โšก TL;DR

Poin Kunci Artikel Ini:

  • Saat Ollama Mulai Keteteran di Server ProduksiBayangkan kamu baru selesai bikin fitur chatbot keren di laptop pakai Ollama.
  • Ollama memang pas buat eksperimen lokal karena praktis.
  • Ollama mengalokasikan memori dalam satu blok besar berurutan untuk tiap prompt.
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

Saat Ollama Mulai Keteteran di Server Produksi

Bayangkan kamu baru selesai bikin fitur chatbot keren di laptop pakai Ollama. Semuanya jalan mulus. Tapi begitu aplikasi di-deploy ke VPS GPU dan diakses puluhan pengguna bersamaan, server langsung terasa lambat atau malah crash terkena error Out-Of-Memory (OOM).

Masalah ini wajar terjadi. Ollama memang pas buat eksperimen lokal karena praktis. Namun saat harus melayani banyak antrean request sekaligus di server produksi, arsitektur dasarnya mulai kedodoran.

Penyebab utamanya ada pada pengelolaan Key-Value (KV) cache di VRAM GPU. Ollama mengalokasikan memori dalam satu blok besar berurutan untuk tiap prompt. Begitu banyak user masuk berbarengan, VRAM cepat habis karena fragmentasi memori. Akibatnya, pemrosesan antrean melambat drastis dan GPU kehabisan daya.

Solusi Produksi: Duet vLLM dan Ray Serve

Untuk kebutuhan skala produksi yang butuh kecepatan tinggi, kombinasi vLLM dan Ray Serve jadi pilihan standar para engineer.

vLLM menyelesaikan masalah boros memori ini lewat teknologi PagedAttention. Konsepnya mirip seperti cara sistem operasi mengelola RAM pakai Virtual Memory: KV cache dipecah menjadi blok-blok kecil yang tidak harus berurutan di VRAM.

Kenapa PagedAttention Sangat Efisien?

Lewat PagedAttention, pemborosan VRAM bisa ditekan sampai nyaris 0%. vLLM juga membawa fitur continuous batching. Jadi, request baru tidak perlu menunggu sampai request pengguna lain selesai 100%.

Tiap kali satu token selesai digenerasi, vLLM langsung menyelipkan request pengguna lain ke dalam proses generasi berikutnya. Efeknya, GPU bekerja optimal tanpa jeda menganggur.

Fungsi Ray Serve di Sisi Server

Kalau vLLM bekerja sebagai mesin pemroses utama, Ray Serve bertindak sebagai sistem pengaturnya. Ray Serve menangani pembagian traffic (routing HTTP), load balancing, pengaturan kapasitas otomatis (autoscaling), hingga manajemen multi-GPU.

Gabungan keduanya menghasilkan server LLM yang stabil, siap dipasang di produksi, dan mendukung format OpenAI API secara langsung.

Panduan Setup Langkah demi Langkah di VPS Linux

Mari langsung eksekusi setup vLLM dan Ray Serve di VPS Linux GPU. Pastikan server kamu menggunakan Ubuntu 22.04 LTS dengan GPU Nvidia (seperti RTX 4090, A10, atau L4) serta driver CUDA 12.1 atau yang lebih baru.

Langkah 1: Siapkan Environment Python

Pertama, buat virtual environment Python agar pustaka yang diinstal tidak bentrok dengan pustaka bawaan sistem.

# Update pustaka sistem & install Python venv
sudo apt update && sudo apt install -y python3-venv python3-pip

# Buat environment baru
python3 -m venv vllm-env
source vllm-env/bin/activate

# Upgrade pip & install PyTorch untuk CUDA 12.1
pip install --upgrade pip
pip install torch --index-url https://download.pytorch.org/whl/cu121

Langkah 2: Instalasi vLLM dan Ray Serve

Selanjutnya, pasang library vLLM dan modul Ray Serve. Tambahkan juga flash-attn untuk meningkatkan kecepatan eksekusi.

# Install vllm & ray serve
pip install vllm "ray[serve]"

# Install FlashAttention-2 untuk akselerasi ekstra
pip install flash-attn --no-build-isolation

Langkah 3: Jalankan Ray Cluster

Nyalakan modul Ray di VPS kamu untuk mengontrol pembagian resource GPU dan CPU.

# Jalankan Ray head node lokal
ray start --head --port=6379

# Cek status cluster Ray
ray status

Membangun Script Server OpenAI-Compatible

Buat berkas Python baru bernama app.py. Berkas ini berfungsi memuat model LLM (misalnya Qwen/Qwen2.5-7B-Instruct) menggunakan vLLM, lalu membungkusnya dengan router FastAPI milik Ray Serve.

import asyncio
from typing import AsyncGenerator
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
import ray
from ray import serve
from vllm.engine.arg_utils import AsyncEngineArgs
from vllm.engine.async_llm_engine import AsyncLLMEngine
from vllm.sampling_params import SamplingParams
from vllm.utils import random_uuid

app = FastAPI()

class ChatCompletionRequest(BaseModel):
    model: str
    prompt: str
    max_tokens: int = 512
    temperature: float = 0.7

@serve.deployment(num_replicas=1, ray_actor_options={"num_gpus": 1})
@serve.ingress(app)
class VLLMDeployment:
    def __init__(self):
        engine_args = AsyncEngineArgs(
            model="Qwen/Qwen2.5-7B-Instruct",
            tensor_parallel_size=1,
            gpu_memory_utilization=0.85,
            max_model_len=4096,
            trust_remote_code=True
        )
        self.engine = AsyncLLMEngine.from_engine_args(engine_args)

    @app.post("/v1/chat/completions")
    async def create_chat_completion(self, request: ChatCompletionRequest):
        request_id = f"cmpl-{random_uuid()}"
        sampling_params = SamplingParams(
            temperature=request.temperature,
            max_tokens=request.max_tokens
        )
        
        results_generator = self.engine.generate(
            request.prompt, 
            sampling_params, 
            request_id
        )

        async def stream_results() -> AsyncGenerator[str, None]:
            async for request_output in results_generator:
                text = request_output.outputs[0].text
                yield f"data: {text}\n\n"
            yield "data: [DONE]\n\n"

        return StreamingResponse(stream_results(), media_type="text/event-stream")

entrypoint = VLLMDeployment.bind()

Jalankan script server ini melalui terminal VPS kamu:

# Deploy aplikasi ke Ray Serve
serve run app:entrypoint --port 8000

Tuning PagedAttention dan Cara Mengatasi OOM

Pengaturan nilai parameter pada vLLM menentukan seberapa efisien GPU kamu bekerja. Jika angkanya terlalu tinggi, VRAM bisa jebol. Sebaliknya jika terlalu rendah, potensi performa GPU jadi mubazir.

Parameter Kunci Optimasi

  • gpu_memory_utilization: Porsi VRAM yang dialokasikan untuk model dan KV cache. Patok di angka 0.85 agar sisa memori aman untuk overhead CUDA.
  • max_model_len: Batas panjang token. Menurunkan batas ini dari 8192 ke 4096 bisa menghemat alokasi VRAM hingga setengahnya.
  • max_num_batched_tokens: Jumlah token maksimum yang diproses dalam satu alur batching. Nilai ideal biasanya antara 4096 sampai 8192.
  • tensor_parallel_size: Sesuaikan dengan jumlah fisik GPU di VPS untuk membagi beban model secara merata.

Tips Mengatasi Out-Of-Memory (OOM)

Jika kamu menemukan error CUDA out of memory saat awal memuat model, coba 3 langkah praktis ini:

  1. Turunkan nilai gpu_memory_utilization ke angka 0.80.
  2. Gunakan model versi kuantisasi seperti AWQ atau GPTQ (contoh: Qwen/Qwen2.5-7B-Instruct-AWQ) yang memangkas kebutuhan VRAM sampai 60%.
  3. Tambahkan opsi enforce_eager=True pada AsyncEngineArgs jika CUDA Graph memakan terlalu banyak VRAM di awal.

Hasil Uji Performa (Benchmarking)

Berikut perbandingan langsung antara setup Ollama standar dan vLLM + Ray Serve pada VPS yang sama (Spesifikasi: GPU Nvidia A10G 24GB VRAM, Model 7B Parameter):

Perbandingan Kinerja Throughput

  • Ollama Standar (10 Request Bersamaan): ~22 token/detik per user. Latensi P99 mencapai 14.2 detik karena antrean sekuensial.
  • vLLM + Ray Serve (10 Request Bersamaan): ~98 token/detik per user. Latensi P99 turun ke 1.8 detik berkat continuous batching.
  • Ollama Standar (50 Request Bersamaan): Gagal / Error CUDA OOM.
  • vLLM + Ray Serve (50 Request Bersamaan): Stabil melayani request dengan total throughput lebih dari 1.400 token/detik.

Kenaikan performa hingga 4-5 kali lipat ini membuktikan keunggulan PagedAttention dalam menangani traffic padat.

Kesimpulan

Beralih dari Ollama ke kombinasi vLLM dan Ray Serve adalah opsi tepat saat kamu ingin membawa model LLM ke lingkungan produksi. PagedAttention menekan efisiensi penggunaan VRAM, sementara Ray Serve memastikan routing dan skalabilitas API berjalan andal.

Langkah Selanjutnya: Cobalah masuk ke VPS GPU kamu, siapkan environment vLLM dan Ray Serve, lalu coba deploy model kuantisasi AWQ 7B dengan parameter gpu_memory_utilization=0.85 untuk merasakan perbedaannya secara langsung!

A
Aizu Dev

Tim penulis AizuDemy yang menyajikan tutorial teknologi, cloud, dan pengembangan perangkat lunak dalam Bahasa Indonesia.

๐Ÿ“– Artikel Terkait