🦙
ローカルLLMであるOllamaをminikube(kubernetes)で動かしGGUFをインストールする
要約
- minikubeを使えばair-gappedなOllamaを構築できます。
- Ollamaのdataディレクトリにk8sのPVを使え、大容量ファイルを置けます。
インストールする環境
- NvidiaのGPU1個積んだUbuntuマシン1台
環境構築
DockerをインストールしDockerをGPU対応させる
以下を参照。
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を全部読もう。
- 事前に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で使ってみる
以下を参照
例
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