Menjalankan inferensi LLM pada GPU Cloud Run dengan Ollama


Dalam tutorial ini, Anda akan mempelajari cara men-deploy Gemma 2 Google, model bahasa besar (LLM) terbuka, pada layanan Cloud Run berkemampuan GPU (untuk inferensi cepat).

Anda akan menggunakan Ollama, server inferensi LLM untuk model terbuka. Setelah menyelesaikan tutorial, jangan ragu untuk menjelajahi model terbuka lainnya yang didukung oleh Ollama, termasuk Llama 3.1 (8B), Mistral (7B), dan Qwen2 (7B).

Tujuan

  • Men-deploy Ollama dengan model Gemma 2 di layanan Cloud Run yang mendukung GPU.
  • Mengirim perintah ke layanan Ollama di endpoint pribadinya.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Aktifkan API Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage.

    Mengaktifkan API

  7. Instal dan lakukan inisialisasi gcloud CLI.
  8. Minta kuota Total Nvidia L4 GPU allocation, per project per region untuk Cloud Run Admin API di halaman Kuota dan batas sistem untuk menyelesaikan tutorial ini.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan guna menyelesaikan tutorial ini, minta administrator untuk memberi Anda peran IAM berikut pada project Anda:

Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Menyiapkan gcloud

Untuk mengonfigurasi Google Cloud CLI untuk layanan Cloud Run Anda:

  1. Setel project default Anda:

    gcloud config set project PROJECT_ID

    Klik ikon untuk mengganti variabel PROJECT_ID dengan nama project yang Anda buat untuk tutorial ini. Hal ini memastikan bahwa semua listingan di halaman ini yang referensi PROJECT_ID sudah memiliki nilai yang benar telah diisi.

  2. Mengonfigurasi Google Cloud CLI agar dapat menggunakan region us-central1 untuk Cloud Run perintah.

    gcloud config set run/region us-central1

Membuat repositori Docker Artifact Registry

Buat repositori Docker guna menyimpan image container untuk tutorial ini:

gcloud artifacts repositories create REPOSITORY \
  --repository-format=docker \
  --location=us-central1

Ganti REPOSITORY dengan nama repositori. Contoh, repo.

Menggunakan Docker untuk membuat image container dengan Ollama dan Gemma

  1. Buat direktori untuk layanan Ollama dan ubah direktori kerja Anda ke direktori baru ini:

    mkdir ollama-backend
    cd ollama-backend
  2. Membuat file Dockerfile

    FROM ollama/ollama:0.3.6
    
    # Listen on all interfaces, port 8080
    ENV OLLAMA_HOST 0.0.0.0:8080
    
    # Store model weight files in /models
    ENV OLLAMA_MODELS /models
    
    # Reduce logging verbosity
    ENV OLLAMA_DEBUG false
    
    # Never unload model weights from the GPU
    ENV OLLAMA_KEEP_ALIVE -1 
    
    # Store the model weights in the container image
    ENV MODEL gemma2:9b
    RUN ollama serve & sleep 5 && ollama pull $MODEL 
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]

Menyimpan bobot model di image container untuk memulai instance yang lebih cepat

Google merekomendasikan penyimpanan bobot model untuk Gemma 2 (9B) dan model berukuran serupa langsung di image container.

Bobot model adalah parameter numerik yang menentukan perilaku LLM. Ollama harus sepenuhnya membaca file ini dan memuat bobot ke dalam memori GPU (VRAM) selama startup instance container, sebelum instance tersebut dapat mulai menyalurkan permintaan inferensi.

Di Cloud Run, startup instance container yang cepat sangatlah penting untuk meminimalkan latensi permintaan. Jika instance container Anda memiliki waktu startup yang lambat, layanan membutuhkan waktu lebih lama untuk menskalakan dari nol hingga satu instance, dan memerlukan lebih banyak waktu untuk melakukan penskalaan saat terjadi lonjakan lalu lintas.

Untuk memastikan startup yang cepat, simpan file model di image container itu sendiri. Proses ini lebih cepat dan lebih andal daripada mendownload file dari lokasi jarak jauh selama startup. Penyimpanan image container internal Cloud Run dioptimalkan untuk menangani lonjakan traffic, sehingga dapat menyiapkan sistem file container dengan cepat saat instance dimulai.

Perhatikan bahwa bobot model untuk Gemma 2 (9B) memerlukan penyimpanan sebesar 5,4 GB. Model yang lebih besar memiliki file bobot model yang lebih besar, dan file ini mungkin tidak praktis untuk disimpan dalam image penampung. Lihat Praktik terbaik: inferensi AI di Cloud Run dengan GPU untuk mengetahui ringkasan konsekuensinya.

Membangun image container menggunakan Cloud Build

Untuk mem-build image container dengan Cloud Build dan mendorongnya ke repositori Artifact Registry:

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
   --machine-type e2-highcpu-32

Perhatikan pertimbangan berikut:

  • Untuk build yang lebih cepat, perintah ini memilih jenis mesin yang canggih dengan lebih banyak CPU dan bandwidth jaringan.
  • Build akan memerlukan waktu sekitar 7 menit.
  • Alternatifnya adalah membangun image secara lokal dengan Docker dan mengirimkannya ke Artifact Registry. Proses ini mungkin lebih lambat daripada berjalan di Cloud Build, bergantung pada bandwidth jaringan Anda.

Men-deploy Ollama sebagai layanan Cloud Run

Dengan image container yang telah disimpan di repositori Artifact Registry, Anda sekarang siap untuk men-deploy Ollama sebagai layanan Cloud Run.

Buat akun layanan khusus

Buat akun layanan khusus yang digunakan layanan Ollama sebagai identitas layanannya:

gcloud iam service-accounts create OLLAMA_IDENTITY \
  --display-name="Service Account for Ollama Cloud Run service"

Ganti OLLAMA_IDENTITY dengan nama akun layanan yang ingin Anda buat, misalnya, ollama.

Praktik terbaiknya adalah membuat akun layanan khusus untuk setiap Layanan Cloud Run dengan kumpulan izin minimal yang diperlukan. Layanan Ollama tidak perlu memanggil API Google Cloud apa pun, yang berarti tidak perlu memberikan izin apa pun ke akun layanannya.

Men-deploy layanan

Men-deploy layanan ke Cloud Run:

gcloud beta run deploy ollama-gemma \
  --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 7 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --service-account OLLAMA_IDENTITY@PROJECT_ID. \
  --timeout=600

Perhatikan flag penting berikut dalam perintah ini:

  • --concurrency 4 disetel agar sesuai dengan nilai variabel lingkungan OLLAMA_NUM_PARALLEL.
  • --gpu 1 dengan --gpu-type nvidia-l4 menetapkan 1 GPU NVIDIA L4 ke setiap instance Cloud Run dalam layanan.
  • --no-allow-authenticated membatasi akses yang tidak diautentikasi ke layanan. Dengan menjaga privasi layanan, Anda dapat mengandalkan solusi bawaan Cloud Run Autentikasi Identity and Access Management (IAM) untuk layanan-ke-layanan komunikasi antarlayanan. Lihat Mengelola akses menggunakan IAM.
  • --no-cpu-throttling diperlukan untuk mengaktifkan GPU.
  • --service-account menetapkan identitas layanan untuk layanan.

Menetapkan konkurensi untuk performa optimal

Bagian ini memberikan konteks tentang setelan serentak yang direkomendasikan. Untuk optimal latensi permintaan, pastikan setelan --concurrency sama dengan setelan Ollama Variabel lingkungan OLLAMA_NUM_PARALLEL.

  • OLLAMA_NUM_PARALLEL menentukan jumlah slot permintaan yang tersedia per untuk menangani permintaan inferensi secara serentak.
  • --concurrency menentukan jumlah permintaan yang dikirim Cloud Run instance Ollama secara bersamaan.

Jika --concurrency melebihi OLLAMA_NUM_PARALLEL, Cloud Run dapat mengirim lebih banyak permintaan ke model di Ollama daripada slot permintaan yang tersedia. Hal ini menyebabkan antrean permintaan dalam Ollama, sehingga meningkatkan latensi permintaan untuk permintaan yang diantrekan. Hal ini juga menyebabkan penskalaan otomatis yang kurang responsif, karena antrean tidak memicu Cloud Run untuk menyebarkan skala dan memulai instance baru.

Ollama juga mendukung penyajian beberapa model dari satu GPU. Untuk sepenuhnya menghindari pengantrean permintaan pada instance Ollama, Anda tetap harus mengatur --concurrency untuk mencocokkan OLLAMA_NUM_PARALLEL.

Penting untuk diperhatikan bahwa meningkatkan OLLAMA_NUM_PARALLEL juga membuat permintaan paralel memerlukan waktu lebih lama.

Mengoptimalkan penggunaan

Untuk pemakaian GPU yang optimal, tingkatkan --concurrency, dengan menjaganya agar tetap dalam dua kali nilai OLLAMA_NUM_PARALLEL. Meskipun hal ini menyebabkan antrean permintaan di Ollama, hal ini dapat membantu meningkatkan penggunaan: Instance Ollama dapat segera memproses permintaan dari antrean, dan antrean membantu menyerap lonjakan traffic.

Menguji layanan Ollama yang di-deploy dengan curl

Setelah men-deploy layanan Ollama, Anda dapat mengirim permintaan ke layanan tersebut. Namun, jika Anda mengirim permintaan secara langsung, Cloud Run akan merespons dengan HTTP 401 Unauthorized. Hal ini disengaja, karena API inferensi LLM ditujukan untuk layanan lain seperti aplikasi frontend. Untuk informasi selengkapnya tentang layanan-ke-layanan autentikasi di Cloud Run, baca bagian Mengautentikasi service-to-service.

Untuk mengirim permintaan ke layanan Ollama, tambahkan {i>header<i} dengan token OIDC yang valid untuk permintaan, misalnya menggunakan proxy developer Cloud Run:

  1. Mulai proxy, dan saat diminta untuk menginstal komponen cloud-run-proxy, pilih Y:

    gcloud run services proxy ollama-gemma --port=9090
  2. Kirim permintaan ke proxy di tab terminal terpisah, biarkan proxy berjalan. Perhatikan bahwa proxy berjalan di localhost:9090:

    curl http://localhost:9090/api/generate -d '{
      "model": "gemma2:9b",
      "prompt": "Why is the sky blue?"
    }'

    Perintah ini akan memberikan output streaming yang mirip dengan ini:

    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false}
    ...
    

Pembersihan

  1. Hapus resource Google Cloud lain yang dibuat dalam tutorial ini:

Langkah selanjutnya