Đă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

storage.yaml
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

deployment.yaml
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

service.yaml
apiVersion: v1
kind: Service
metadata:
  name: llamacpp
  namespace: llamacpp
spec:
  selector:
    app: llamacpp
  ports:
  - name: llama
    protocol: TCP
    port: 8080
    targetPort: 8080

Ingress

ingress.yaml
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,

hello@nvtienanh.info