🦙

ローカルLLMであるOllamaをminikube(kubernetes)で動かしGGUFをインストールする

2024/08/10に公開

要約

  • minikubeを使えばair-gappedなOllamaを構築できます。
  • Ollamaのdataディレクトリにk8sのPVを使え、大容量ファイルを置けます。

インストールする環境

  • NvidiaのGPU1個積んだUbuntuマシン1台

環境構築

DockerをインストールしDockerをGPU対応させる

以下を参照。

https://zenn.dev/derbuihan/articles/a1e636d29e1b51

minikubeをインストールしk8sノードをシングルで起動する

# 公式サイトを参照
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb

# CPU、メモリもそれなりに使うので、k8sノードに持たせる
NODE_MEMORY="8g"
CPUS=4
# --gpus allがポイント
minikube start --memory=${NODE_MEMORY} --cpus=${CPUS} --driver docker --container-runtime docker --gpus all
# minikubeを操作するためのツールをインストール
sudo snap install kubectl --classic
sudo snap install helm --classic

Ollamaをminikubeにインストール

以下を参照。野良helmなので、Chartを全部読もう。

https://artifacthub.io/packages/helm/ollama-helm/ollama

  • 事前に512gi_pv_ollama.yamlを作成し、applyしておく
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ollama-pv
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 512Gi
  hostPath:
    path: /path/to/folder
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ollama-pvc
  namespace: ollama
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 512Gi
  • Ollamaをインストールする
# ollama用の名前空間を作成し通常使用する名前空間する
kubectl create ns ollama
kubectl config set-context $(kubectl config current-context) 

# ollama用のPVをollama名前空間に作成
kubectl apply -f 512gi_pv_ollama.yaml

# helmでollamaをダウンロード
helm repo add ollama-helm https://otwld.github.io/ollama-helm/
helm repo update
helm pull ollama-helm/ollama --untar

NUM_GPUS=1
# ollamaをminikubeにインストール
helm install ollama ./ollama \
--namespace ollama \
--set ollama.gpu.enabled=true \
--set ollama.gpu.type='nvidia' \
--set ollama.gpu.number=${NUM_GPUS} \
--set persistentVolume.enabled=true \
--set persistentVolume.existingClaim="ollama-pvc"

# tmuxの別ターミナルで以下を実行
minikube mount /path/to/folder:/tmp/hostpath-provisioner

# gemma-2-2b-it-Q6_K_LをHFからollama用PVにダウンロード
cd /path/to/folder
cd ollama/ollama-pvc
# 512GBの確保したPVの中にダウンロードされます。
wget https://huggingface.co/bartowski/gemma-2-2b-it-GGUF/blob/main/gemma-2-2b-it-Q6_K_L.gguf

# ollamaサーバに乗り込む
kubectl exec -ti deployments/ollama -- bash
# GPUが使えているか確認
nvidia-smi
# modelファイルが保存されていることを確認
cd /root/.ollama
ls gemma-2-2b-it-Q6_K_L.gguf
# Modelfileを作成しollamaにgemma2をインストール
echo "FROM ./gemma-2-2b-it-Q6_K_L.gguf" > Modelfile
ollama create gemma-2-2b-it-Q6_K_L -f Modelfile
# ollamaサーバから抜ける
exit

# 試験的にollamaと会話してみる。
kubectl exec -ti deployments/ollama -- ollama run gemma-2-2b-it-Q6_K_L
# 応答が確認できたら、PortForwardを行い、APIをホストマシンにも使えるようにする
export POD_NAME=$(kubectl get pods --namespace ollama -l "app.kubernetes.io/name=ollama,app.kubernetes.io/instance=ollama" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace ollama $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
kubectl --namespace ollama port-forward $POD_NAME 8080:$CONTAINER_PORT
# 以下にすることでホストマシン以外にもオープンすることができる
# kubectl --namespace ollama port-forward --address 0.0.0.0 $POD_NAME 8080:$CONTAINER_PORT

構築したOllamaをLangChainで使ってみる

以下を参照

https://qiita.com/Tadataka_Takahashi/items/cb6be826e2e9ae95afad

from langchain_ollama import ChatOllama
llm = ChatOllama(model="gemma-2-2b-it-Q6_K_L:latest", base_url="http://localhost:8080", )
from langchain.memory import ChatMessageHistory
msgs = ChatMessageHistory()
msgs.add_user_message("自己紹介してください")
resp = llm.predict_messages(msgs.messages)
print(resp.content)

回答

こんにちは!私はGemma、Google DeepMindによってトレーニングされた大規模言語モデルです。 😊

私はテキストベースのAIアシスタントで、オープンウェイトモデルとして公開されています。 

日本語で話しかけていただければ、喜んでお手伝いします!どんなことでも聞いてください。 😄  

例えば、
* 文章を要約したり
* 翻訳したり
* Storyの作成などを手伝ったり
* あなたの質問に答えることができます 


何についてお話したいですか? 🤔  

環境のクリーンアップ

minikube delete

Enjoy!

番外編

インターネットからモデルをダウンロードして使いたい場合

インターネット環境の場合: HelmのオプションでModelを指定して環境構築する

NUM_GPUS=1
helm install ollama ./ollama \
--namespace ollama \
--set ollama.gpu.enabled=true \
--set ollama.gpu.type='nvidia' \
--set ollama.gpu.number=${NUM_GPUS} \
--set ollama.models[0]='mistral' \
--set ollama.models[1]='gemma2'  \
--set persistentVolume.enabled=true \
--set persistentVolume.existingClaim="ollama-pvc" \

インターネットプロキシ環境の場合: Helmのオプションで環境変数を指定してから、Modelを指定して環境構築する

NUM_GPUS=1
helm install ollama ./ollama \
--namespace ollama \
--set ollama.gpu.enabled=true \
--set ollama.gpu.type='nvidia' \
--set ollama.gpu.number=${NUM_GPUS} \
--set persistentVolume.enabled=true \
--set persistentVolume.existingClaim="ollama-pvc" \
--set ollama.models[0]='mistral' \
--set ollama.models[1]='gemma2'  \
--set extraEnv[0].name=HTTP_PROXY \
--set-string extraEnv[0].value=http://myproxy.com:8080 \
--set extraEnv[1].name=HTTPS_PROXY \
--set-string extraEnv[1].value=http://myproxy.com:8080 \
--set extraEnv[2].name=NO_PROXY \
--set-string extraEnv[2].value=0.0.0.0/32\\,127.0.0.0/8\\,192.168.0.0/16\\,10.0.0.0/8\\,172.16.0.0/12\\,.local\\,localhost\\,.localdomain

Modelの追加改廃

Kubernetes上のPodに乗り込んでollamaコマンドで操作します。

kubectl exec -ti deployments/ollama -- bash
ollama pull llama3.1:8b
ollama pull llama3-groq-tool-use:8b
ollama rm llama3.1:8b
# /root/.ollama 配下にDLされます。

Ollamaのバージョンアップ対応

helm install インストール時のコマンドに--set image.tag=0.3.6を追加すれば
OllamaのDockerイメージバージョンが0.3.6になる。

最新のDockerイメージバージョンは以下参照。

Ollamaのバージョンアップ対応コマンド例

NUM_GPUS=1
helm upgrade ollama ./ollama \
--namespace ollama \
--set image.tag=0.3.6 \
--set ollama.gpu.enabled=true \
--set ollama.gpu.type='nvidia' \
--set ollama.gpu.number=${NUM_GPUS} \
--set ollama.models[0]='mistral' \
--set ollama.models[1]='gemma2'  \
--set persistentVolume.enabled=true \
--set persistentVolume.existingClaim="ollama-pvc" \

Discussion