All Products
Search
Document Center

Container Service for Kubernetes:Mempercepat model menggunakan Fluid pada KServe

Last Updated:Mar 26, 2026

Large language models (LLMs) dapat dengan mudah mencapai puluhan gigabyte, menyebabkan cold start yang lambat dan latensi restart tinggi saat file model ditarik dari Object Storage Service (OSS). Fluid mengatasi hal ini dengan menyimpan cache file model secara lokal di node kluster menggunakan JindoRuntime. Setelah pemuatan pertama, layanan inferensi membaca file model dari cache memori JindoFS lokal alih-alih menariknya dari OSS, sehingga restart berikutnya jauh lebih cepat. Topik ini menjelaskan cara menyiapkan caching berbasis Fluid untuk model Qwen-7B-Chat-Int8 dan menerapkannya sebagai layanan inferensi KServe yang didukung oleh vLLM pada GPU NVIDIA V100.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Cara kerja

Fluid memperkenalkan dua resource kustom Kubernetes yang bekerja bersama:

  • Dataset — mendeklarasikan path penyimpanan remote mana yang akan diekspos: dalam kasus ini, path bucket OSS yang berisi file model.

  • JindoRuntime — menjalankan kluster JindoFS yang menyimpan cache konten dataset di memori pada node kluster, sehingga pembacaan berikutnya dilayani secara lokal alih-alih dari OSS.

Saat layanan inferensi KServe memasang dataset, server vLLM membaca file model dari cache JindoFS lokal alih-alih menariknya dari OSS setiap kali dimulai.

Langkah 1: Siapkan data model dan unggah ke OSS

Unduh model Qwen-7B-Chat-Int8

  1. Instal Git dan plugin Large File Support (LFS):

    sudo yum install git
    sudo yum install git-lfs
  2. Klon repositori Qwen-7B-Chat-Int8 dari ModelScope, melewatkan unduhan LFS selama proses kloning:

    GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat-Int8.git
  3. Masuk ke direktori hasil kloning, lalu tarik file model yang dikelola oleh LFS:

    cd Qwen-7B-Chat-Int8
    git lfs pull

Unggah model ke OSS

  1. Masuk ke Konsol OSS dan catat nama bucket OSS Anda. Untuk membuat bucket, lihat Create a bucket.

  2. Instal dan konfigurasikan ossutil. Lihat Install ossutil.

  3. Buat direktori di bucket dan unggah file model:

    ossutil mkdir oss://<your-bucket-name>/Qwen-7B-Chat-Int8
    ossutil cp -r ./Qwen-7B-Chat-Int8 oss://<your-bucket-name>/Qwen-7B-Chat-Int8

Langkah 2: Buat dataset dan JindoRuntime

Buat Secret untuk kredensial OSS

Buat Secret Kubernetes untuk menyimpan pasangan AccessKey yang digunakan untuk mengakses bucket OSS:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: oss-secret
stringData:
  fs.oss.accessKeyId: <your-access-key-id>
  fs.oss.accessKeySecret: <your-access-key-secret>
EOF

Ganti <your-access-key-id> dan <your-access-key-secret> dengan kredensial aktual Anda. Untuk mendapatkan pasangan AccessKey, lihat Obtain an AccessKey pair.

Output yang diharapkan:

secret/oss-secret created

Buat dataset dan JindoRuntime

Buat file bernama resource.yaml dengan konten berikut. Untuk detail konfigurasi, lihat Use JindoFS to accelerate access to OSS.

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: qwen-7b-chat-int8
spec:
  mounts:
    - mountPoint: oss://<oss_bucket>/Qwen-7b-chat-Int8  # Ganti dengan path OSS aktual Anda
      options:
        fs.oss.endpoint: <oss_endpoint>                  # Ganti dengan endpoint bucket OSS Anda
      name: models
      path: "/"
      encryptOptions:
        - name: fs.oss.accessKeyId
          valueFrom:
            secretKeyRef:
              name: oss-secret
              key: fs.oss.accessKeyId
        - name: fs.oss.accessKeySecret
          valueFrom:
            secretKeyRef:
              name: oss-secret
              key: fs.oss.accessKeySecret
---
apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: qwen-7b-chat-int8  # Harus sesuai dengan nama dataset
spec:
  replicas: 3
  tieredstore:
    levels:
      - mediumtype: MEM       # Cache di memori
        volumeType: emptyDir
        path: /dev/shm
        quota: 3Gi            # Kapasitas cache per replika
        high: "0.95"
        low: "0.7"
  fuse:
    resources:
      requests:
        memory: 2Gi
    properties:
      fs.oss.download.thread.concurrency: "200"
      fs.oss.read.buffer.size: "8388608"
      fs.oss.read.readahead.max.buffer.count: "200"
      fs.oss.read.sequence.ambiguity.range: "2147483647"

Terapkan konfigurasi:

kubectl apply -f resource.yaml

Output yang diharapkan:

dataset.data.fluid.io/qwen-7b-chat-int8 created
jindoruntime.data.fluid.io/qwen-7b-chat-int8 created

Langkah 3: Terapkan layanan inferensi vLLM

Terapkan model Qwen-7B-Chat-Int8 sebagai layanan inferensi KServe menggunakan vLLM. Flag --data memasang dataset Fluid ke dalam kontainer, sehingga model dibaca dari cache JindoFS.

arena serve kserve \
    --name=qwen-fluid \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
    --gpus=1 \
    --cpu=4 \
    --memory=12Gi \
    --data="qwen-7b-chat-int8:/mnt/models/Qwen-7B-Chat-Int8" \
    "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen-7B-Chat-Int8 --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"

Output yang diharapkan:

inferenceservice.serving.kserve.io/qwen-fluid created
INFO[0002] The Job qwen-fluid has been submitted successfully
INFO[0002] You can run `arena serve get qwen-fluid --type kserve -n default` to check the job status

Langkah 4: Verifikasi hasil akselerasi

Periksa status cache dataset

kubectl get dataset qwen-7b-chat-int8

Output yang diharapkan:

NAME                UFS TOTAL SIZE   CACHED     CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
qwen-7b-chat-int8   17.01GiB         10.46MiB   18.00GiB         0.1%                Bound   23h

Status PHASE: Bound mengonfirmasi bahwa dataset telah terikat dan JindoRuntime aktif. Persentase cache meningkat seiring layanan inferensi membaca file model.

Periksa waktu startup server

Jalankan perintah berikut untuk mengukur berapa lama server membutuhkan waktu hingga siap:

# Dapatkan nama Pod untuk layanan inferensi
POD_NAME=$(kubectl get po | grep qwen-fluid | awk -F " " '{print $1}')
# Periksa berapa lama server membutuhkan waktu hingga siap
kubectl logs $POD_NAME | grep -i "server ready takes"

Output yang diharapkan:

server ready takes 25.875763 s

Dengan caching Fluid diaktifkan, file model dilayani dari memori lokal pada restart berikutnya alih-alih ditarik dari OSS, sehingga mengurangi waktu startup. Peningkatan kecepatan aktual bervariasi tergantung pada ukuran dataset, memori node, dan kondisi jaringan.

Untuk data benchmark yang membandingkan waktu akses dengan dan tanpa cache, lihat bagian Step 3: Create applications to test data acceleration dalam “Use JindoFS to accelerate access to OSS.”

Pemecahan Masalah

JindoRuntime tidak siap

Gejala: Dataset tetap berada dalam fase non-Bound setelah menerapkan resource.yaml.

Penyebab: Worker JindoRuntime mungkin tertunda karena memori tidak mencukupi. Setiap replika meminta 3 GiB memori cache ditambah 2 GiB untuk sidecar Fuse.

Solusi: Periksa event pada JindoRuntime:

kubectl describe jindoruntime qwen-7b-chat-int8

Jika node kekurangan memori bebas, kurangi nilai quota dalam tieredstore atau tambahkan node dengan memori yang lebih tersedia.

Galat akses OSS

Gejala: Dataset menampilkan galat atau Pod JindoRuntime melaporkan akses ditolak.

Penyebab: ID AccessKey atau rahasia AccessKey dalam Secret oss-secret salah, atau AccessKey tidak memiliki izin baca pada bucket OSS.

Fix: Verifikasi kredensial dalam Secret:

kubectl get secret oss-secret -o yaml

Buat ulang Secret dengan nilai yang benar jika diperlukan, lalu restart JindoRuntime.

Pod layanan inferensi macet di inisialisasi

Gejala: Pod qwen-fluid tetap berada dalam status Init.

Penyebab: Sidecar Fuse mungkin belum memasang dataset, atau dataset belum berada dalam fase Bound.

Solusi: Periksa fase dataset terlebih dahulu:

kubectl get dataset qwen-7b-chat-int8

Tunggu hingga status PHASE: Bound sebelum Pod layanan inferensi dapat dilanjutkan. Jika dataset sudah dalam status Bound tetapi Pod masih macet, periksa event Pod:

kubectl describe pod $POD_NAME

Langkah Selanjutnya

Referensi