Batch inference
Batch inference mengirim banyak prompt sekaligus lewat S3 dan mengembalikan hasilnya ke S3. Cocok untuk pekerjaan besar yang tidak butuh jawaban seketika.
Intisari
- Masukan berupa berkas JSONL di S3; hasilnya juga ditulis ke S3.
- Format masukan mengikuti API
InvokeModelatauConverse. - Tidak mendukung tool calling maupun structured output — tiap record diproses independen, tanpa interaksi bolak-balik.
- Tidak berlaku untuk provisioned model, dan tidak bisa memakai prompt caching.
- Tarifnya lebih murah dari on-demand — ini pengungkit biaya terbesar untuk pekerjaan besar.
Kapan dipakai
| Pekerjaan | Batch cocok? |
|---|---|
| Mengklasifikasi 100.000 tiket dukungan | Sangat |
| Meringkas seluruh arsip dokumen | Sangat |
| Menjalankan dataset evaluasi besar | Ya |
| Menghasilkan metadata untuk pipeline ingest | Ya |
| Menjawab pertanyaan pengguna | Tidak — asinkron |
| Alur agent dengan tool | Tidak — tool calling tidak didukung |
Format masukan
{"recordId":"001","modelInput":{"messages":[{"role":"user","content":[{"text":"Klasifikasikan: printer tidak menyala"}]}],"inferenceConfig":{"maxTokens":50}}}
{"recordId":"002","modelInput":{"messages":[{"role":"user","content":[{"text":"Klasifikasikan: lupa password"}]}],"inferenceConfig":{"maxTokens":50}}}
Satu baris JSON per record, tanpa koma antar baris — itulah JSONL. recordId yang kamu tentukan
akan muncul lagi di hasilnya, dan itu satu-satunya cara mencocokkan keluaran dengan masukan.
Menjalankan
kelola = boto3.client("bedrock")
job = kelola.create_model_invocation_job(
jobName="klasifikasi-tiket-2026-08",
roleArn="arn:aws:iam::123456789012:role/BedrockBatchRole",
modelId=MODEL_ID,
inputDataConfig={"s3InputDataConfig": {
"s3Uri": "s3://batch-ku/masukan/tiket.jsonl"}},
outputDataConfig={"s3OutputDataConfig": {
"s3Uri": "s3://batch-ku/keluaran/"}},
)
print(kelola.get_model_invocation_job(jobIdentifier=job["jobArn"])["status"])
Jangan polling status dengan loop. Job batch bisa berjalan berjam-jam. Bedrock menerbitkan
perubahan status ke EventBridge — pakai rule yang memicu Lambda saat job selesai, seperti pola di Fase 1.
Loop while yang menunggu di Lambda hanya membakar waktu eksekusi.
Membaca hasil
import json
import boto3
s3 = boto3.client("s3")
isi = s3.get_object(Bucket="batch-ku", Key="keluaran/…/tiket.jsonl.out")["Body"]
for baris in isi.iter_lines():
rec = json.loads(baris)
if "modelOutput" in rec:
teks = rec["modelOutput"]["output"]["message"]["content"][0]["text"]
print(rec["recordId"], teks)
else:
print(rec["recordId"], "GAGAL:", rec.get("error"))
Perhatikan cabang else: sebagian record bisa gagal sementara sisanya berhasil. Kode yang
mengasumsikan semua record punya modelOutput akan meledak di berkas hasil yang sebenarnya
sebagian besar sukses.
Batasan yang perlu dihafal
| Batasan | Konsekuensinya |
|---|---|
| Tidak mendukung tool calling | Alur agent tidak bisa dibatch |
| Tidak mendukung structured output | Minta format JSON lewat instruksi prompt, lalu validasi sendiri |
| Tiap record independen | Tidak ada percakapan multi-giliran |
| Tidak untuk provisioned model | Pilih salah satu |
| Prompt caching tidak berlaku | Prefiks panjang yang berulang tetap dibayar penuh |
| Asinkron | Rancang alurnya berbasis event sejak awal |
Tempatnya dalam strategi biaya
| Teknik | Untuk beban | Penghematan |
|---|---|---|
| Model lebih kecil | Semua | Sering paling besar |
| Prompt caching | Interaktif, prefiks berulang | Besar |
| Batch inference | Offline, volume besar | Besar |
maxTokens yang ketat | Semua | Sedang |
| Provisioned Throughput | Stabil dan tinggi | Hanya di atas titik impas |
Latihan: ambil 200 pertanyaan dari log invocation-mu, susun jadi JSONL, dan jalankan sebagai job batch untuk mengklasifikasikan topiknya. Bandingkan biaya dan waktunya dengan 200 panggilan on-demand berurutan, dan catat kedua angkanya.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.