Tutorial Lengkap NVIDIA NIM (NVIDIA Inference Microservices) untuk Developer Indonesia
Penulis: Ruby Abdullah Tanggal: 27 September 20261. Pendahuluan
NVIDIA NIM (NVIDIA Inference Microservices) adalah platform inferensi AI yang dikembangkan oleh NVIDIA untuk mempermudah deployment model-model AI dalam skala produksi. NIM menyediakan container microservice yang sudah dioptimasi untuk menjalankan model-model AI populer seperti Llama 3.1, Mistral, Gemma, dan banyak lagi, dengan performa inferensi yang sangat tinggi berkat optimasi GPU langsung dari NVIDIA.
Mengapa NVIDIA NIM Penting?
Dalam ekosistem AI saat ini, salah satu tantangan terbesar bukan lagi melatih model, melainkan men-deploy model tersebut ke produksi dengan efisien. NVIDIA NIM hadir untuk menjawab tantangan ini dengan beberapa keunggulan utama:
NIM vs Alternatif Lain
| Fitur | NVIDIA NIM | vLLM | Ollama | OpenAI API |
|-------|-----------|------|--------|------------|
| Kecepatan Inferensi | Sangat Tinggi (TensorRT-LLM) | Tinggi | Sedang | Tinggi |
| Self-Hosted | Ya | Ya | Ya | Tidak |
| Cloud API Gratis | Ya (build.nvidia.com) | Tidak | Tidak | Tidak (berbayar) |
| OpenAI Compatible | Ya | Ya | Ya | Ya (native) |
| Multi-GPU Support | Excellent | Baik | Terbatas | N/A |
| Enterprise Support | Ya (NVIDIA AI Enterprise) | Community | Community | Ya |
| Optimasi FP8/INT4 | Built-in | Plugin | Terbatas | N/A |
2. Prasyarat dan Setup
2.1 Membuat Akun NVIDIA NGC
Langkah pertama adalah membuat akun di NVIDIA NGC (NVIDIA GPU Cloud), yang merupakan portal utama untuk mengakses semua layanan NVIDIA AI.
2.2 Mendapatkan API Key
Setelah memiliki akun, Anda perlu mendapatkan API key untuk mengakses NIM endpoints:
nvapi-xxxxxxxxxxxx)Anda juga bisa mengelola API key melalui NGC dashboard di https://org.ngc.nvidia.com.
2.3 Instalasi Python SDK
Untuk menggunakan NIM dari Python, Anda memerlukan beberapa package. Karena NIM kompatibel dengan OpenAI API, Anda bisa menggunakan OpenAI Python SDK:
# Instalasi OpenAI SDK (kompatibel dengan NIM)
pip install openai
Instalasi LangChain NVIDIA integration (opsional, untuk workflow LangChain)
pip install langchain-nvidia-ai-endpoints
Instalasi requests untuk HTTP calls langsung (opsional)
pip install requests
Instalasi httpx untuk async calls (opsional)
pip install httpx
2.4 Konfigurasi Environment Variable
Simpan API key sebagai environment variable agar tidak ter-expose di kode:
# Linux/Mac
export NVIDIAAPIKEY="nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Windows (PowerShell)
$env:NVIDIAAPIKEY = "nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Atau simpan di file .env
echo 'NVIDIAAPIKEY=nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' >> .env
3. Penggunaan Dasar: Cloud API
NVIDIA menyediakan akses gratis ke NIM endpoints melalui build.nvidia.com. Ini sangat cocok untuk prototyping, testing, dan pengembangan awal sebelum beralih ke deployment self-hosted.
3.1 Text Generation dengan cURL
Contoh paling sederhana adalah melakukan text generation menggunakan cURL. NIM menggunakan format yang identik dengan OpenAI Chat Completions API:
# Text generation dengan Llama 3.1 8B Instruct
curl -s https://integrate.api.nvidia.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $NVIDIAAPIKEY" \
-d '{
"model": "meta/llama-3.1-8b-instruct",
"messages": [
{
"role": "system",
"content": "Kamu adalah asisten AI yang membantu developer Indonesia. Jawab dalam Bahasa Indonesia yang jelas dan teknis."
},
{
"role": "user",
"content": "Jelaskan perbedaan antara REST API dan GraphQL secara singkat."
}
],
"temperature": 0.7,
"maxtokens": 1024
}'
3.2 Text Generation dengan Python (OpenAI SDK)
Karena NIM kompatibel dengan OpenAI API, Anda bisa langsung menggunakan library openai di Python:
import os
from openai import OpenAI
Inisialisasi client dengan base URL NIM
client = OpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
Chat completion - contoh chatbot Bahasa Indonesia
response = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[
{
"role": "system",
"content": "Kamu adalah asisten AI untuk developer Indonesia. "
"Berikan jawaban yang praktis dan mudah dipahami."
},
{
"role": "user",
"content": "Bagaimana cara membuat REST API sederhana dengan FastAPI?"
}
],
temperature=0.7,
maxtokens=1024
)
print(response.choices[0].message.content)
3.3 Embedding Generation
NIM juga menyediakan model embedding untuk keperluan semantic search, RAG (Retrieval-Augmented Generation), dan clustering teks:
import os
from openai import OpenAI
client = OpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
Generate embeddings untuk teks Bahasa Indonesia
texts = [
"Cara memasak rendang yang enak dan autentik",
"Resep gulai kambing khas Padang",
"Tutorial pemrograman Python untuk pemula",
"Panduan deployment aplikasi ke cloud server"
]
response = client.embeddings.create(
model="nvidia/nv-embedqa-e5-v5",
input=texts,
encodingformat="float"
)
Menampilkan dimensi embedding dan beberapa nilai pertama
for i, embeddingdata in enumerate(response.data):
vector = embeddingdata.embedding
print(f"Teks: '{texts[i][:50]}...'")
print(f" Dimensi: {len(vector)}")
print(f" 5 nilai pertama: {vector[:5]}")
print()
Menghitung similarity antara dua teks
import numpy as np
def cosinesimilarity(veca, vecb):
a = np.array(veca)
b = np.array(vecb)
return np.dot(a, b) / (np.linalg.norm(a) np.linalg.norm(b))
Bandingkan similarity teks kuliner vs teks programming
simkuliner = cosinesimilarity(
response.data[0].embedding,
response.data[1].embedding
)
simbeda = cosinesimilarity(
response.data[0].embedding,
response.data[2].embedding
)
print(f"Similarity rendang vs gulai: {simkuliner:.4f}")
print(f"Similarity rendang vs Python: {simbeda:.4f}")
3.4 Vision Model (Multimodal)
NIM mendukung model vision yang bisa memproses gambar bersamaan dengan teks. Ini sangat berguna untuk analisis gambar, OCR, dan visual question answering:
import os
import base64
from openai import OpenAI
client = OpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
Encode gambar lokal ke base64
def encodeimage(imagepath):
with open(imagepath, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
Contoh 1: Analisis gambar dari URL
response = client.chat.completions.create(
model="meta/llama-3.2-90b-vision-instruct",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Jelaskan apa yang ada di gambar ini dalam Bahasa Indonesia."
},
{
"type": "imageurl",
"imageurl": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg"
}
}
]
}
],
maxtokens=512
)
print("Deskripsi gambar:")
print(response.choices[0].message.content)
Contoh 2: Analisis gambar dari file lokal
imagebase64 = encodeimage("screenshot.png")
response = client.chat.completions.create(
model="meta/llama-3.2-90b-vision-instruct",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Apa yang tertulis di gambar ini?"},
{
"type": "imageurl",
"imageurl": {
"url": f"data:image/png;base64,{imagebase64}"
}
}
]
}
],
maxtokens=512
)
3.5 Format Request dan Response
NIM mengikuti format OpenAI API secara ketat. Berikut struktur lengkap request dan response:
Request Body:{
"model": "meta/llama-3.1-8b-instruct",
"messages": [
{"role": "system", "content": "System prompt di sini"},
{"role": "user", "content": "Pertanyaan user"},
{"role": "assistant", "content": "Jawaban sebelumnya (untuk multi-turn)"},
{"role": "user", "content": "Pertanyaan lanjutan"}
],
"temperature": 0.7,
"maxtokens": 1024,
"topp": 0.9,
"stream": false,
"stop": ["\n\n"],
"frequencypenalty": 0.0,
"presencepenalty": 0.0
}
Response Body:
{
"id": "chatcmpl-xxxxxxxx",
"object": "chat.completion",
"created": 1727388000,
"model": "meta/llama-3.1-8b-instruct",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Jawaban dari model..."
},
"finishreason": "stop"
}
],
"usage": {
"prompttokens": 45,
"completiontokens": 128,
"totaltokens": 173
}
}
4. Penggunaan Lanjutan: Self-Hosted dengan Docker
Untuk penggunaan produksi dengan volume tinggi, kontrol penuh atas data, atau kebutuhan latensi rendah, Anda bisa men-deploy NIM container di infrastruktur sendiri.
4.1 Prasyarat Self-Hosted
Sebelum memulai deployment self-hosted, pastikan Anda memiliki:
- GPU NVIDIA: Minimal GPU dengan VRAM yang cukup untuk model yang dipilih (misalnya, Llama 3.1 8B membutuhkan minimal 1x GPU 24GB seperti RTX 4090 atau A10G)
- NVIDIA Driver: Versi 535.129.03 atau lebih baru
- Docker: Versi 24.0 atau lebih baru
- NVIDIA Container Toolkit: Untuk mengaktifkan akses GPU di dalam container Docker
- NGC API Key: Untuk mengunduh container dari NGC registry
4.2 Instalasi NVIDIA Container Toolkit
# Tambahkan repository NVIDIA Container Toolkit
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
Instalasi toolkit
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
Konfigurasi Docker runtime
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Verifikasi instalasi
docker run --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu22.04 nvidia-smi
4.3 Login ke NGC Registry
# Login ke NGC container registry
echo "$NGCAPIKEY" | docker login nvcr.io --username '$oauthtoken' --password-stdin
4.4 Deploy NIM Container
Berikut cara men-deploy NIM container untuk model Llama 3.1 8B Instruct:
# Set environment variables
export NGCAPIKEY="nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export LOCALNIMCACHE="$HOME/.cache/nim"
mkdir -p "$LOCALNIMCACHE"
Deploy NIM container untuk Llama 3.1 8B Instruct
docker run -d \
--name nim-llama31-8b \
--gpus all \
--shm-size=16g \
-e NGCAPIKEY="$NGCAPIKEY" \
-v "$LOCALNIMCACHE:/opt/nim/.cache" \
-p 8000:8000 \
nvcr.io/nim/meta/llama-3.1-8b-instruct:latest
Tunggu container siap (biasanya 2-5 menit untuk download dan load model)
Cek status container
docker logs -f nim-llama31-8b
4.5 Verifikasi Deployment
Setelah container berjalan, verifikasi bahwa NIM endpoint sudah siap:
# Health check
curl -s http://localhost:8000/v1/health/ready
Lihat model yang tersedia
curl -s http://localhost:8000/v1/models | python3 -m json.tool
Test inferensi
curl -s http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta/llama-3.1-8b-instruct",
"messages": [
{"role": "user", "content": "Halo! Siapa kamu?"}
],
"maxtokens": 256
}'
4.6 Konfigurasi GPU dan Model
Anda bisa mengatur konfigurasi GPU secara spesifik untuk optimasi performa:
# Deploy dengan GPU tertentu (misalnya hanya GPU 0 dan 1)
docker run -d \
--name nim-llama31-70b \
--gpus '"device=0,1"' \
--shm-size=32g \
-e NGCAPIKEY="$NGCAPIKEY" \
-e NIMMAXMODELLEN=8192 \
-e NIMTENSORPARALLELSIZE=2 \
-v "$LOCALNIMCACHE:/opt/nim/.cache" \
-p 8000:8000 \
nvcr.io/nim/meta/llama-3.1-70b-instruct:latest
Parameter penting yang bisa dikonfigurasi:
| Environment Variable | Deskripsi | Default |
|---------------------|-----------|---------|
| NIMMAXMODELLEN | Panjang konteks maksimal | Model default |
| NIMTENSORPARALLELSIZE | Jumlah GPU untuk tensor parallelism | 1 |
| NIMMAXBATCHSIZE | Ukuran batch maksimal | Auto |
| NIMGPUMEMORYUTILIZATION | Persentase VRAM yang digunakan | 0.9 |
| NIMLOGLEVEL | Level logging (DEBUG, INFO, WARNING) | INFO |
4.7 Docker Compose untuk Multi-Model Deployment
Untuk menjalankan beberapa model sekaligus, gunakan Docker Compose:
# docker-compose.yml
version: '3.8'
services:
nim-llama-8b:
image: nvcr.io/nim/meta/llama-3.1-8b-instruct:latest
containername: nim-llama-8b
runtime: nvidia
environment:
- NGCAPIKEY=${NGCAPIKEY}
- NIMMAXMODELLEN=4096
- NVIDIAVISIBLEDEVICES=0
volumes:
- nim-cache:/opt/nim/.cache
ports:
- "8001:8000"
shmsize: '16g'
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
nim-embedding:
image: nvcr.io/nim/nvidia/nv-embedqa-e5-v5:latest
containername: nim-embedding
runtime: nvidia
environment:
- NGCAPIKEY=${NGCAPIKEY}
- NVIDIAVISIBLEDEVICES=1
volumes:
- nim-cache:/opt/nim/.cache
ports:
- "8002:8000"
shmsize: '8g'
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
nginx-lb:
image: nginx:alpine
containername: nim-loadbalancer
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
dependson:
- nim-llama-8b
- nim-embedding
volumes:
nim-cache:
4.8 Monitoring dan Health Checks
NIM menyediakan endpoint monitoring built-in yang bisa diintegrasikan dengan Prometheus dan Grafana:
# Health check endpoint
curl http://localhost:8000/v1/health/ready
Response: {"status": "ready"}
Metrics endpoint (format Prometheus)
curl http://localhost:8000/metrics
Contoh script monitoring sederhana
#!/bin/bash
while true; do
STATUS=$(curl -s -o /dev/null -w "%{httpcode}" http://localhost:8000/v1/health/ready)
if [ "$STATUS" != "200" ]; then
echo "[$(date)] WARNING: NIM tidak merespons (HTTP $STATUS)"
# Kirim notifikasi ke Telegram atau Slack
else
echo "[$(date)] OK: NIM berjalan normal"
fi
sleep 30
done
5. Integrasi dengan Python
5.1 Menggunakan OpenAI Python SDK
Cara paling mudah mengintegrasikan NIM ke aplikasi Python adalah menggunakan OpenAI SDK, karena NIM sepenuhnya kompatibel:
import os
from openai import OpenAI
Untuk cloud API (build.nvidia.com)
cloudclient = OpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
Untuk self-hosted NIM
localclient = OpenAI(
baseurl="http://localhost:8000/v1",
apikey="not-used" # Self-hosted tidak memerlukan API key
)
def chatwithnim(client, usermessage, systemprompt=None):
"""Fungsi helper untuk chat dengan NIM."""
messages = []
if systemprompt:
messages.append({"role": "system", "content": systemprompt})
messages.append({"role": "user", "content": usermessage})
response = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=messages,
temperature=0.7,
maxtokens=1024
)
return response.choices[0].message.content
Contoh penggunaan: Chatbot customer service Bahasa Indonesia
systemprompt = """Kamu adalah asisten customer service untuk toko online Indonesia.
Jawab pertanyaan pelanggan dengan sopan, ramah, dan profesional dalam Bahasa Indonesia.
Jika ditanya tentang status pesanan, minta nomor pesanan mereka."""
jawaban = chatwithnim(
cloudclient,
"Saya mau tanya, pesanan saya sudah sampai mana ya?",
systemprompt
)
print(jawaban)
5.2 Streaming Responses
Untuk pengalaman pengguna yang lebih baik, gunakan streaming agar response ditampilkan secara bertahap:
import os
from openai import OpenAI
client = OpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
def streamchat(usermessage):
"""Stream response dari NIM untuk UX yang lebih responsif."""
stream = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[
{
"role": "system",
"content": "Kamu adalah penulis teknis yang ahli dalam teknologi AI."
},
{"role": "user", "content": usermessage}
],
temperature=0.7,
maxtokens=2048,
stream=True # Aktifkan streaming
)
fullresponse = ""
for chunk in stream:
if chunk.choices[0].delta.content is not None:
content = chunk.choices[0].delta.content
print(content, end="", flush=True)
fullresponse += content
print() # Newline setelah streaming selesai
return fullresponse
Contoh: Generate artikel teknis
response = streamchat(
"Tulis penjelasan singkat tentang bagaimana transformer bekerja "
"untuk audience developer Indonesia yang baru belajar AI."
)
5.3 Menggunakan LangChain NVIDIA AI Endpoints
Jika Anda sudah menggunakan LangChain, ada integrasi khusus untuk NVIDIA NIM:
import os
from langchainnvidiaaiendpoints import ChatNVIDIA, NVIDIAEmbeddings
from langchaincore.messages import HumanMessage, SystemMessage
Inisialisasi chat model
llm = ChatNVIDIA(
model="meta/llama-3.1-8b-instruct",
nvidiaapikey=os.environ.get("NVIDIAAPIKEY"),
temperature=0.7,
maxtokens=1024
)
Chat sederhana
messages = [
SystemMessage(content="Kamu adalah asisten coding untuk developer Indonesia."),
HumanMessage(content="Buatkan contoh fungsi Python untuk validasi NIK (KTP).")
]
response = llm.invoke(messages)
print(response.content)
Inisialisasi embedding model
embeddings = NVIDIAEmbeddings(
model="nvidia/nv-embedqa-e5-v5",
nvidiaapikey=os.environ.get("NVIDIAAPIKEY")
)
Generate embeddings
texts = [
"Panduan penggunaan e-commerce di Indonesia",
"Tutorial membuat website dengan Django",
"Resep masakan tradisional Nusantara"
]
vectors = embeddings.embeddocuments(texts)
print(f"Jumlah vectors: {len(vectors)}")
print(f"Dimensi per vector: {len(vectors[0])}")
Contoh: RAG pipeline sederhana dengan NVIDIA NIM
from langchaincore.prompts import ChatPromptTemplate
from langchaincore.outputparsers import StrOutputParser
Template prompt untuk RAG
ragprompt = ChatPromptTemplate.frommessages([
("system", """Kamu adalah asisten yang menjawab pertanyaan berdasarkan konteks yang diberikan.
Jawab HANYA berdasarkan informasi dalam konteks. Jika konteks tidak memuat jawaban, katakan 'Maaf, informasi tidak tersedia.'
Konteks:
{context}"""),
("user", "{question}")
])
Chain
chain = ragprompt | llm | StrOutputParser()
Jalankan chain
result = chain.invoke({
"context": "PT RUBYTHALIB DATA KONSULTA adalah perusahaan konsultan AI yang berlokasi di SCBD, Jakarta Selatan. Perusahaan ini menyediakan layanan konsultasi AI, pelatihan, dan pengembangan solusi AI custom.",
"question": "Di mana lokasi PT RUBYTHALIB DATA KONSULTA?"
})
print(result)
5.4 Function Calling / Tool Use
NIM mendukung function calling yang memungkinkan model memanggil fungsi eksternal:
import os
import json
from openai import OpenAI
client = OpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
Definisikan tools/functions
tools = [
{
"type": "function",
"function": {
"name": "cekcuaca",
"description": "Mengecek kondisi cuaca di suatu kota di Indonesia",
"parameters": {
"type": "object",
"properties": {
"kota": {
"type": "string",
"description": "Nama kota, misalnya Jakarta, Surabaya, Bandung"
},
"satuan": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Satuan suhu"
}
},
"required": ["kota"]
}
}
},
{
"type": "function",
"function": {
"name": "konversimatauang",
"description": "Konversi mata uang dari IDR ke mata uang lain",
"parameters": {
"type": "object",
"properties": {
"jumlah": {
"type": "number",
"description": "Jumlah uang dalam Rupiah (IDR)"
},
"matauangtujuan": {
"type": "string",
"description": "Kode mata uang tujuan (USD, EUR, SGD, dll)"
}
},
"required": ["jumlah", "matauangtujuan"]
}
}
}
]
Simulasi fungsi
def cekcuaca(kota, satuan="celsius"):
# Dalam produksi, ini akan memanggil API cuaca sungguhan
datacuaca = {
"Jakarta": {"suhu": 32, "kondisi": "Cerah berawan"},
"Bandung": {"suhu": 24, "kondisi": "Hujan ringan"},
"Surabaya": {"suhu": 34, "kondisi": "Cerah"},
}
return json.dumps(datacuaca.get(kota, {"suhu": 28, "kondisi": "Data tidak tersedia"}))
def konversimatauang(jumlah, matauangtujuan):
kurs = {"USD": 15500, "EUR": 17000, "SGD": 11500}
rate = kurs.get(matauangtujuan, 15000)
hasil = jumlah / rate
return json.dumps({"hasil": round(hasil, 2), "matauang": matauangtujuan})
Kirim request dengan tools
response = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[
{"role": "user", "content": "Berapa cuaca di Jakarta hari ini?"}
],
tools=tools,
toolchoice="auto"
)
Proses tool calls
message = response.choices[0].message
if message.toolcalls:
for toolcall in message.toolcalls:
functionname = toolcall.function.name
arguments = json.loads(toolcall.function.arguments)
# Eksekusi fungsi yang diminta
if functionname == "cekcuaca":
result = cekcuaca(arguments)
elif functionname == "konversimatauang":
result = konversimatauang(arguments)
print(f"Function: {functionname}")
print(f"Arguments: {arguments}")
print(f"Result: {result}")
5.5 Batch Processing
Untuk memproses banyak request secara efisien, gunakan async atau batch processing:
import os
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
async def processsingle(prompt, index):
"""Proses satu prompt dan kembalikan hasilnya."""
try:
response = await client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[
{
"role": "system",
"content": "Kamu adalah penerjemah profesional Indonesia-Inggris."
},
{"role": "user", "content": f"Terjemahkan ke Bahasa Inggris: {prompt}"}
],
temperature=0.3,
maxtokens=512
)
return {
"index": index,
"input": prompt,
"output": response.choices[0].message.content,
"tokens": response.usage.totaltokens
}
except Exception as e:
return {"index": index, "input": prompt, "error": str(e)}
async def batchtranslate(texts, maxconcurrent=5):
"""Batch processing dengan concurrency limit."""
semaphore = asyncio.Semaphore(maxconcurrent)
async def limitedprocess(prompt, index):
async with semaphore:
return await processsingle(prompt, index)
tasks = [limitedprocess(text, i) for i, text in enumerate(texts)]
results = await asyncio.gather(tasks)
return sorted(results, key=lambda x: x["index"])
Contoh: Batch translate teks Bahasa Indonesia
textstotranslate = [
"Selamat pagi, apa kabar?",
"Saya sedang belajar pemrograman Python.",
"Indonesia adalah negara kepulauan terbesar di dunia.",
"Teknologi kecerdasan buatan semakin berkembang pesat.",
"Jakarta merupakan ibu kota Indonesia yang padat penduduk.",
"Kami menyediakan layanan konsultasi AI untuk perusahaan.",
"Rendang adalah makanan terenak di dunia menurut CNN.",
"Startup teknologi di Indonesia tumbuh dengan sangat cepat."
]
Jalankan batch processing
results = asyncio.run(batchtranslate(textstotranslate))
for r in results:
if "error" in r:
print(f"[ERROR] {r['input']}: {r['error']}")
else:
print(f"ID: {r['input']}")
print(f"EN: {r['output']}")
print(f"Tokens: {r['tokens']}")
print()
6. Best Practices
6.1 Pemilihan Model yang Tepat
Memilih model yang sesuai dengan kebutuhan sangat penting untuk mengoptimalkan biaya dan performa:
| Use Case | Model Rekomendasi | Alasan |
|----------|------------------|--------|
| Chatbot umum | Llama 3.1 8B Instruct | Cepat, ringan, cukup untuk percakapan umum |
| Analisis dokumen kompleks | Llama 3.1 70B Instruct | Pemahaman konteks lebih baik |
| Code generation | Llama 3.1 8B/70B Instruct | Baik untuk coding tasks |
| Embedding / Search | NV-EmbedQA-E5-v5 | Dioptimasi untuk retrieval |
| Analisis gambar | Llama 3.2 90B Vision | Multimodal capabilities |
| Task sederhana (klasifikasi, ekstraksi) | Llama 3.1 8B | Hemat resource |
Prinsip utama: Mulai dengan model terkecil yang memenuhi kebutuhan, lalu upgrade jika kualitas output tidak memadai.6.2 Optimasi Latency dan Throughput
# 1. Gunakan maxtokens yang tepat (jangan terlalu besar)
response = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[{"role": "user", "content": "Jawab dalam 1 kalimat: Apa itu AI?"}],
maxtokens=100 # Sesuaikan dengan ekspektasi panjang jawaban
)
2. Gunakan temperature rendah untuk task deterministik
response = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[{"role": "user", "content": "Ekstrak nama dan email dari teks ini: ..."}],
temperature=0.1, # Rendah untuk konsistensi
maxtokens=256
)
3. Gunakan stop sequences untuk menghentikan generasi lebih awal
response = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[{"role": "user", "content": "Berikan 3 poin utama tentang AI:"}],
stop=["\n4.", "\n\n\n"], # Berhenti setelah 3 poin
maxtokens=512
)
6.3 Caching Strategies
Implementasikan caching untuk mengurangi panggilan API yang redundan:
import hashlib
import json
import os
from functools import lrucache
Simple in-memory cache
class NIMCache:
def init(self, cachedir="./nimcache"):
self.cachedir = cachedir
os.makedirs(cachedir, existok=True)
def getcachekey(self, model, messages, temperature):
"""Generate cache key dari parameter request."""
content = json.dumps({
"model": model,
"messages": messages,
"temperature": temperature
}, sortkeys=True)
return hashlib.sha256(content.encode()).hexdigest()
def get(self, model, messages, temperature):
"""Ambil response dari cache jika ada."""
key = self.getcachekey(model, messages, temperature)
cachefile = os.path.join(self.cachedir, f"{key}.json")
if os.path.exists(cachefile):
with open(cachefile, "r") as f:
return json.load(f)
return None
def set(self, model, messages, temperature, response):
"""Simpan response ke cache."""
key = self.getcachekey(model, messages, temperature)
cachefile = os.path.join(self.cachedir, f"{key}.json")
with open(cachefile, "w") as f:
json.dump(response, f)
cache = NIMCache()
def cachedchat(client, model, messages, temperature=0.7, maxtokens=1024):
"""Chat dengan caching untuk menghindari request duplikat."""
# Cek cache (hanya untuk temperature rendah / deterministik)
if temperature < 0.3:
cached = cache.get(model, messages, temperature)
if cached:
print("[CACHE HIT]")
return cached
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
maxtokens=maxtokens
)
result = response.choices[0].message.content
if temperature < 0.3:
cache.set(model, messages, temperature, result)
return result
6.4 Error Handling dan Retry
Implementasi error handling yang robust untuk aplikasi produksi:
import time
import os
from openai import OpenAI, APIError, RateLimitError, APIConnectionError
client = OpenAI(
baseurl="https://integrate.api.nvidia.com/v1",
apikey=os.environ.get("NVIDIAAPIKEY")
)
def chatwithretry(messages, maxretries=3, initialdelay=1.0):
"""
Kirim request ke NIM dengan retry mechanism.