- Đăng vào
Deploy Large Language Model trên Kubernetes sử dụng llama.cpp
Giới thiệu
Large language model (LLM) là một loại mô hình ngôn ngữ được đào tạo bằng cách sử dụng các kỹ thuật học sâu trên tập dữ liệu văn bản khổng lồ. Các mô hình này có khả năng tạo văn bản tương tự như con người và thực hiện các tác vụ xử lý ngôn ngữ tự nhiên khác nhau 123. LLM được sử dụng rộng rãi trong các ứng dụng trí tuệ nhân tạo (AI) như dịch, chatbot và trợ lý ảo AI. Ngoài ra, LLM còn được áp dụng trong lĩnh vực chăm sóc sức khỏe, phát triển phần mềm và nhiều lĩnh vực khác.
llama.cpp
llama.cpp là một thư viện mã nguồn mở viết bằng ngôn ngữ C/C++ và được phát triển bởi Georgi Gerganov. Nó cho phép có thể chạy Facebook’s LLaMA model trên các máy tính với cấu hình thông thường mà không cần phải sử dụng các server với cấu hình mạnh mẽ. Điểm nổi bật của llama.cpp là nó cho phép chúng ta chạy một số LLM mà không cần phải sử dụng GPU. Chi tiết bạn có thể xem thêm tại llama.cpp.
Tiến hành
Mục tiêu của mình là host được LLM model lên Kubernetes sau đó cấu hình với Extension VSCode: continue. llama.cpp hỗ trợ chúng ta tạo 1 HTTP API server để giúp tương tác với LLM thông qua webapp đơn giản, cụ thể có thể đọc thêm: llama.cpp/example/server
Phần 1: Deploy nhưng bị lỗi lúc start pod
Mình có ghi lại quá trình mình tiến hành, như video ở trên. Trong phần này mình deploy dùng image ghcr.io/ggerganov/llama.cpp:full
, mọi thứ khá suôn sẻ tuy nhiên mỗi khi start thì Pod failed, với lỗi:
/app/.devops/tools.sh: line 40: 7 Illegal instruction ./main $arg
Thử mãi không được mình đi ngủ, hôm sau rảnh tìm kiếm các issue trên repo thì search ra lỗi đó có thể liên quan đến issue này: https://github.com/ggerganov/llama.cpp/issues/537. Có thể docker image mặc định chưa được deploy với code mới nhất nên mình sẽ thử clone source code và build docker image.
Phần 2: Deploy thành công
Như đã nói ở trên, lần này mình clone code và checkout bản release mới nhất lúc này là b1433
. Sau đó mình có sửa .devops/full.Dockerfile
1 đoạn là thêm EXPOSE 8080
vào cuối file, sau đó build
docker build -f .devops/full.Dockerfile . -t nvtienanh/llama.cpp:b1433
docker push nvtienanh/llama.cpp:b1433
Kubernetes manifest
Dưới đây là các file yaml mình dùng để deploy.
Storage
Cluster của mình sử dụng NFS, bạn nhở sửa chỗ highlight cho phù hợp
kind: PersistentVolume
apiVersion: v1
metadata:
name: llamacpp-models-pv
labels:
app: llamacpp
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
server: <ip-nfs-server>
path: "<nfs-share-folder>/llamacpp-models"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: llamacpp-models
labels:
app: llamacpp
namespace: llamacpp
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
volumeName: llamacpp-models-pv
Tiếp theo bạn vài download model và lưu vào folder NFS <nfs-share-folder>/llamacpp-models
, trong ví dụ này mình sử dụng model codellama-7b-instruct.Q4_K_M.gguf
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: llamacpp
namespace: llamacpp
labels:
app: llamacpp
spec:
replicas: 1
selector:
matchLabels:
app: llamacpp
template:
metadata:
labels:
app: llamacpp
spec:
securityContext:
fsGroup: 0
runAsUser: 0
containers:
- name: llamacpp
image: nvtienanh/llama.cpp:b1433
imagePullPolicy: Always
args:
[
"--server",
"-c",
"1024",
"--host",
"0.0.0.0",
"--port",
"8080",
"-t",
"4",
"-m",
"/models/codellama-7b-instruct.Q4_K_M.gguf"]
ports:
- containerPort: 8080
volumeMounts:
- name: llm-models
mountPath: /models
resources: {}
volumes:
- name: llm-models
persistentVolumeClaim:
claimName: llamacpp-models
Service
apiVersion: v1
kind: Service
metadata:
name: llamacpp
namespace: llamacpp
spec:
selector:
app: llamacpp
ports:
- name: llama
protocol: TCP
port: 8080
targetPort: 8080
Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: llamacpp
namespace: llamacpp
labels:
app: llamacpp
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
ingressClassName: nginx
rules:
- host: your-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: llamacpp
port:
number: 8080
tls:
- hosts:
- your-domain.com
secretName: ssl-your-domain.com
Sau khi đã chuẩn bị hết mọi thứ, chúng ta chỉ cần deploy thôi:
kubectl create namespace llamacpp
kubectl apply -f storage.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
VSCode extention: continue
Đây là 1 plugin dành cho VSCode, hiện tại nó vẫn đang được phát triển và là một dự án mã nguồn mỡ. Plugin này bằng cách kết nối đến các LLM model giúp nó hoạt động như một code assistance, hô trợ develop thực hiện một vài công việc như: code review, code suggestion, viết unit test, ... Chúng ta có thể click vào đây để cài đặt: https://marketplace.visualstudio.com/items?itemName=Continue.continue
Sau khi cài đặt xong chúng ta vào:
- Trên Windows:
C:\Users\nvtie\.continue\config.py
- Trên Linux:
~/.continue/config.py
Thêm vào như bên dưới
from continuedev.libs.llm.llamacpp import LlamaCpp
config = ContinueConfig(
...
models=Models(
default=LlamaCpp(
max_context_length=4096,
server_url="https://your-domain.com")
)
)
Sau đó reload lại VSCode và cùng trải nghiệm xem nhé. Chi tiết có thể xem 2 video ở trên của mình.
Hy vọng bài viết này sẽ có ích.
Anh Nguyễn,