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:
Kluster ACK Pro yang tidak menjalankan ContainerOS, menjalankan Kubernetes 1.22 atau versi lebih baru, dengan minimal 3 node dan memori bebas 3 GB per node. Lihat Create an ACK Pro cluster.
Suite AI cloud-native terinstal dengan komponen ack-fluid yang telah diterapkan. Lihat Deploy the cloud-native AI suite.
Arena versi 0.9.15 atau lebih baru terinstal. Lihat Configure the Arena client.
Komponen ack-kserve terinstal. Lihat Install ack-kserve.
OSS diaktifkan. Lihat Activate OSS.
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
Instal Git dan plugin Large File Support (LFS):
sudo yum install git sudo yum install git-lfsKlon 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.gitMasuk ke direktori hasil kloning, lalu tarik file model yang dikelola oleh LFS:
cd Qwen-7B-Chat-Int8 git lfs pull
Unggah model ke OSS
Masuk ke Konsol OSS dan catat nama bucket OSS Anda. Untuk membuat bucket, lihat Create a bucket.
Instal dan konfigurasikan ossutil. Lihat Install ossutil.
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>
EOFGanti <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 createdBuat 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.yamlOutput yang diharapkan:
dataset.data.fluid.io/qwen-7b-chat-int8 created
jindoruntime.data.fluid.io/qwen-7b-chat-int8 createdLangkah 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 statusLangkah 4: Verifikasi hasil akselerasi
Periksa status cache dataset
kubectl get dataset qwen-7b-chat-int8Output 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 23hStatus 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 sDengan 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-int8Jika 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 yamlBuat 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-int8Tunggu 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_NAMELangkah Selanjutnya
Pelajari lebih lanjut tentang akselerasi data Fluid: Overview of Fluid
Jelajahi konfigurasi cache JindoRuntime lanjutan: Use JindoFS to accelerate access to OSS