EasyLLMOps: 強力な言語モデルのための簡単な MLOps。
EasyLLMOps は、言語モデルの管理とスケーリングのために Google Kubernetes Engine (GKE) にデプロイできる Open WebUI で構築されたプロジェクトです。 Terraform と手動の両方の展開方法を提供し、堅牢な MLOps プラクティスを組み込んでいます。これには、自動化のための Jenkins と Ansible による CI/CD パイプライン、パフォーマンスに関する洞察のための Prometheus および Grafana によるモニタリング、トラブルシューティングと分析のための ELK スタックによる集中ログが含まれます。開発者は、プロジェクトの Web サイトで詳細なドキュメントと手順を見つけることができます。
LLM を利用したアプリケーションを構築および展開する開発者。 LLM を使用するデータ サイエンティストと機械学習エンジニア。 LLM インフラストラクチャの管理を担当する DevOps チーム。 LLM を自社の業務に統合しようとしている組織。
あまり時間をかけたくない場合は、次のスクリプトを実行してコーヒーを楽しんでください。
chmod +x ./cluster.sh
./cluster.sh
Terraform を使用する前に、必ず GCP で認証してください。
gcloud auth application-default login
このセクションでは、アプリケーションをできるだけ早く立ち上げて実行するためのクイック スタート ガイドを提供します。詳細な手順については、次のセクションを参照してください。
1. クラスターをセットアップします。
アプリケーションを GKE にデプロイしている場合は、Terraform を使用して Kubernetes クラスタのセットアップを自動化できます。 iac/terraform
ディレクトリに移動し、Terraform を初期化します。
cd iac/terraform
terraform init
構成を計画して適用します。
実行プランを生成して、Terraform が作成または変更するリソースを確認し、構成を適用してクラスターをセットアップします。
terraform plan
terraform apply
2. クラスター情報を取得します。
GKE クラスタを操作するには、その構成を取得する必要があります。次のコマンドを使用して、現在のクラスター構成を表示できます。
cat ~ /.kube/config
クラスターを管理するためにkubectl
コンテキストが正しく設定されていることを確認してください。
より実践的な展開プロセスについては、次の手順に従います。
1. Nginx Ingress コントローラーをデプロイします。
Nginx Ingress Controller は、Kubernetes クラスター内のサービスへの外部アクセスを管理します。名前空間を作成し、Helm を使用して Ingress コントローラーをインストールします。
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
後で必要になるため、Nginx Ingress コントローラーの IP アドレスを記録してください。
2. API キー シークレットを構成します。
API キーなどの環境変数を Kubernetes シークレットに安全に保存します。モデル提供用の名前空間を作成し、 .env
ファイルからシークレットを作成します。
kubectl create ns model-serving
kubens model-serving
kubectl delete secret easyllmops-env
kubectl create secret generic easyllmops-env --from-env-file=.env -n model-serving
kubectl describe secret easyllmops-env -n model-serving
3. 権限を付与します。
Kubernetes リソースには多くの場合、特定の権限が必要です。必要なロールとバインディングを適用します。
cd deployments/infrastructure
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
4. Redis を使用してキャッシュ サービスをデプロイします。
次に、Redis を使用してセマンティック キャッシュ サービスをデプロイします。
cd ./deployments/redis
helm dependency build
helm upgrade --install redis .
5. LiteLLM を展開します。
LiteLLM サービスをデプロイします。
kubens model-serving
helm upgrade --install litellm ./deployments/litellm
6. Open WebUI を展開します。
次に、ウェブ UI を GKE クラスタにデプロイします。
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7. アプリケーションを試してみましょう。
ブラウザを開いて GKE クラスタの URL (例: ステップ 1 のhttp://172.0.0.0
) に移動し、URL の末尾に.nip.io
を追加します (例: http://172.0.0.0.nip.io
)。 。 Open WebUI が表示されるはずです。
自動化された CI/CD パイプラインの場合は、次のように Jenkins と Ansible を使用します。
1. Jenkins サーバーをセットアップします。
まず、サービス アカウントを作成し、それにCompute Admin
ロールを割り当てます。次に、サービス アカウントの Json キー ファイルを作成し、 iac/ansible/secrets
ディレクトリに保存します。
次に、ポート 8081 と 50000 でのトラフィックを許可するファイアウォール ルールを使用して、Ubuntu 22.04 を実行する「jenkins-server」という名前の Google Compute Engine インスタンスを作成します。
ansible-playbook iac/ansible/deploy_jenkins/create_compute_instance.yaml
前提条件をインストールし、Docker イメージを取得し、Docker ソケットと公開ポート 8081 および 50000 にアクセスできる特権コンテナーを作成することで、サーバーに Jenkins をデプロイします。
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. Jenkins にアクセスします。
SSH 経由で Jenkins サーバーにアクセスするには、公開鍵と秘密鍵のペアを作成する必要があります。次のコマンドを実行してキー ペアを作成します。
ssh-keygen
Metadata
を開き、 ssh-keys
値をコピーします。
サーバーにアクセスできるようにするには、Jenkins サーバーのパスワードを見つける必要があります。まず、Jenkins サーバーにアクセスします。
ssh < USERNAME > : < EXTERNAL_IP >
次に、次のコマンドを実行してパスワードを取得します。
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
Jenkins がデプロイされたら、ブラウザーからアクセスします。
http://<EXTERNAL_IP>:8081
3. Jenkins プラグインをインストールします。
Jenkins を Docker、Kubernetes、GKE と統合するには、次のプラグインをインストールします。
プラグインをインストールしたら、Jenkins を再起動します。
sudo docker restart jenkins-server
4. Jenkins を構成します。
4.1. Webhook を GitHub リポジトリに追加して、Jenkins ビルドをトリガーします。
GitHub リポジトリに移動し、 Settings
をクリックします。 Webhooks
をクリックし、 Add Webhook
をクリックします。 Jenkins サーバーの URL を入力します (例: http://<EXTERNAL_IP>:8081/github-webhook/
)。次に、 Let me select individual events
をクリックし、 Let me select individual events
を選択します。 Push
とPull Request
を選択し、 Add Webhook
をクリックします。
4.2. Github リポジトリを Jenkins ソース コード リポジトリとして追加します。
Jenkins ダッシュボードに移動し、 New Item
をクリックします。プロジェクトの名前 (例: easy-llmops
) を入力し、 Multibranch Pipeline
を選択します。 OK
をクリックします。 Configure
をクリックし、 Add Source
をクリックします。 GitHub
を選択し、 Add
をクリックします。 GitHub リポジトリの URL を入力します (例: https://github.com/bmd1905/EasyLLMOps
)。 Credentials
フィールドでAdd
を選択し、 Username with password
を選択します。 GitHub のユーザー名とパスワードを入力します (または個人のアクセス トークンを使用します)。 Test Connection
をクリックし、 Save
をクリックします。
4.3. Docker Hub の認証情報をセットアップします。
まず、Docker Hub アカウントを作成します。 Docker Hub Web サイトにアクセスし、 Sign Up
をクリックします。ユーザー名とパスワードを入力します。 Sign Up
をクリックします。 Create Repository
をクリックします。リポジトリの名前 (例: easy-llmops
) を入力し、 Create
をクリックします。
Jenkins ダッシュボードから、 Manage Jenkins
> Credentials
に移動します。 Add Credentials
をクリックします。 Username with password
を選択し、 Add
をクリックします。 Docker Hub のユーザー名、アクセス トークンを入力し、 ID
dockerhub
に設定します。
4.4. Kubernetes 認証情報をセットアップします。
まず、GKE クラスタにアクセスするための Jenkins サーバーのサービス アカウントを作成します。 GCP コンソールに移動し、[IAM と管理] > [サービス アカウント] に移動します。 Kubernetes Engine Admin
ロールを持つ新しいサービス アカウントを作成します。サービス アカウントに名前と説明を付けます。サービス アカウントをクリックし、 Keys
タブをクリックします。 Add Key
をクリックし、キーの種類としてJSON
選択します。 Create
をクリックして、JSON ファイルをダウンロードします。
次に、Jenkins ダッシュボードから、 Manage Jenkins
> Cloud
に移動します。 New cloud
をクリックします。 Kubernetes
を選択します。クラスタの名前 (例: gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
[Kubernetes 名前空間] gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
, enter the namespace of your cluster (eg
model-serving ). In the
[資格情報] フィールド). In the
field, select
and select
。プロジェクト ID と JSON ファイルへのパスを入力します。
5. セットアップをテストします。
新しいコミットを GitHub リポジトリにプッシュします。 Jenkins に新しいビルドが表示されるはずです。
1. Discord Webhook を作成します。
まず、Discord Webhook を作成します。 Discord Web サイトにアクセスし、 Server Settings
をクリックします。 Integrations
をクリックします。 Create Webhook
をクリックします。 Webhook の名前 (例: easy-llmops-discord-webhook
) を入力し、 Create
をクリックします。 Webhook URL をコピーします。
2. Helm リポジトリの構成
まず、Prometheus と Grafana に必要な Helm リポジトリを追加する必要があります。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
これらのコマンドは、公式の Prometheus および Grafana Helm リポジトリを追加し、ローカルの Helm チャート情報を更新します。
3. 依存関係のインストール
Prometheus には、Helm で管理できる特定の依存関係が必要です。監視ディレクトリに移動し、次の依存関係を構築します。
helm dependency build ./deployments/monitoring/kube-prometheus-stack
4. Prometheus のデプロイ
次に、Helm を使用して Prometheus とその関連サービスをデプロイします。
kubectl create namespace monitoring
helm upgrade --install -f deployments/monitoring/kube-prometheus-stack.expanded.yaml kube-prometheus-stack deployments/monitoring/kube-prometheus-stack -n monitoring
このコマンドは次のことを行います。
helm upgrade --install
: これにより、Prometheus が存在しない場合はインストールされ、存在する場合はアップグレードされます。-f deployments/monitoring/kube-prometheus-stack.expanded.yaml
: これは、構成用のカスタム値ファイルを指定します。kube-prometheus-stack
: これは Helm インストールのリリース名です。deployments/monitoring/kube-prometheus-stack
: これはインストールに使用するチャートです。-n monitoring
: インストール先の名前空間を指定します。デフォルトでは、サービスは外部に公開されません。これらにアクセスするには、ポート転送を使用できます。
プロメテウスの場合:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090
次に、 http://localhost:9090
で Prometheus にアクセスします。
グラファナの場合:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
次に、 http://localhost:3000
で Grafana にアクセスします。
通常、Grafana のデフォルトの認証情報は次のとおりです。
5. テストアラート
まず、サンプル アラートを作成する必要があります。 monitoring
ディレクトリに移動し、次のコマンドを実行します。
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093
次に、新しいターミナルで次のコマンドを実行します。
curl -XPOST -H " Content-Type: application/json " -d ' [
{
"labels": {
"alertname": "DiskSpaceLow",
"severity": "critical",
"instance": "server02",
"job": "node_exporter",
"mountpoint": "/data"
},
"annotations": {
"summary": "Disk space critically low",
"description": "Server02 has only 5% free disk space on /data volume"
},
"startsAt": "2023-09-01T12:00:00Z",
"generatorURL": "http://prometheus.example.com/graph?g0.expr=node_filesystem_free_bytes+%2F+node_filesystem_size_bytes+%2A+100+%3C+5"
},
{
"labels": {
"alertname": "HighMemoryUsage",
"severity": "warning",
"instance": "server03",
"job": "node_exporter"
},
"annotations": {
"summary": "High memory usage detected",
"description": "Server03 is using over 90% of its available memory"
},
"startsAt": "2023-09-01T12:05:00Z",
"generatorURL": "http://prometheus.example.com/graph?g0.expr=node_memory_MemAvailable_bytes+%2F+node_memory_MemTotal_bytes+%2A+100+%3C+10"
}
] ' http://localhost:9093/api/v2/alerts
このコマンドはサンプル アラートを作成します。次のコマンドを実行すると、アラートが作成されたことを確認できます。
curl http://localhost:9093/api/v2/status
または、Discord チャンネルを手動で確認することもできます。
このセットアップは、Kubernetes クラスターに包括的な監視機能を提供します。 Prometheus がメトリクスを収集し、Grafana がメトリクスを視覚化することで、パフォーマンスを効果的に追跡し、潜在的な問題に対するアラートを設定し、インフラストラクチャとアプリケーションに関する貴重な洞察を得ることができます。
集中ログは、Kubernetes にデプロイされたアプリケーションの監視とトラブルシューティングに不可欠です。このセクションでは、GKE クラスタのログを記録するために Filebeat を使用して ELK スタック (Elasticsearch、Logstash、Kibana) をセットアップする方法を説明します。
0.クイックラン
この単一の helmfile スクリプトを使用して、ELK スタックを開始できます。
cd deployments/ELK
helmfile sync
1. Helm を使用して ELK スタックをインストールする
Helm を使用して ELK スタック コンポーネントをデプロイします。
まず、ログ コンポーネントの名前空間を作成します。
kubectl create ns logging
kubens logging
次に、Elasticsearch をインストールします。
helm install elk-elasticsearch elastic/elasticsearch -f deployments/ELK/elastic.expanded.yaml --namespace logging --create-namespace
Elasticsearch の準備が完了するまで待ちます。
echo " Waiting for Elasticsearch to be ready... "
kubectl wait --for=condition=ready pod -l app=elasticsearch-master --timeout=300s
Logstash が Elasticsearch にアクセスするためのシークレットを作成します。
kubectl create secret generic logstash-elasticsearch-credentials
--from-literal=username=elastic
--from-literal=password= $( kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d )
キバナをインストールします。
helm install elk-kibana elastic/kibana -f deployments/ELK/kibana.expanded.yaml
Logstash をインストールします。
helm install elk-logstash elastic/logstash -f deployments/ELK/logstash.expanded.yaml
Filebeat をインストールします。
helm install elk-filebeat elastic/filebeat -f deployments/ELK/filebeat.expanded.yaml
2. Kibana にアクセスします。
サービスを使用して Kibana を公開し、ブラウザーからアクセスします。
kubectl port-forward -n logging svc/elk-kibana-kibana 5601:5601
このスクリプトを使用して Kibana パスワードを取得してください。
kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d
ブラウザを開いてhttp://localhost:5601
に移動します。
3. ログ収集の検証
これで、Kibana で Kubernetes ポッドからのログを確認できるようになります。ダッシュボードと視覚化を作成してログを分析し、アプリケーションの動作についての洞察を得ることができます。
Cast AI にアクセスして無料アカウントにサインアップし、TOKEN を取得してください。
次に、次の行を実行して GKE に接続します。
curl -H " Authorization: Token <TOKEN> " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
Cast AI の UI でI ran this script
をクリックし、構成コードをコピーしてターミナルに貼り付けます。
CASTAI_API_TOKEN= < API_TOKEN > CASTAI_CLUSTER_ID= < CASTAI_CLUSTER_ID > CLUSTER_NAME=easy-llmops-gke INSTALL_AUTOSCALER=true INSTALL_POD_PINNER=true INSTALL_SECURITY_AGENT=true LOCATION=asia-southeast1-b PROJECT_ID=easy-llmops /bin/bash -c " $( curl -fsSL ' https://api.cast.ai/v1/scripts/gke/onboarding.sh ' ) "
I ran this script
をクリックし、インストールが完了するまで待ちます。
その後、Cast AI の UI にダッシュボードが表示されます。
Cast AI を使用してクラスターを最適化する時期が来ました。 「 Available savings
セクションに移動し、 Rebalance
ボタンをクリックします。
Langfuse と Supabase にアクセスして無料アカウントにサインアップして API キーを取得し、.env.example ファイル内のプレースホルダーを API キーに置き換えてください。
EasyLLMOps への貢献を歓迎します。開始方法の詳細については、CONTRIBUTING.md を参照してください。
EasyLLMOps は MIT ライセンスに基づいてリリースされています。詳細については、LICENSE ファイルを参照してください。
研究で EasyLLMOps を使用する場合は、次のように引用してください。
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
質問、問題、コラボレーションについては、GitHub リポジトリで問題を開くか、メンテナに直接連絡してください。