EasyllMops:強力な言語モデル用の楽なmlops。
EasyllMopsは、Google Kubernetes Engine(GKE)に展開できるOpen WebUIを使用して構築されたプロジェクトで、言語モデルを管理およびスケーリングすることができます。 Terraformと手動の展開方法の両方を提供し、堅牢なMLOPSプラクティスを組み込んでいます。これには、Jenkinsを備えたCI/CDパイプラインと自動化の可能性、プロメテウスとグラファナによるパフォーマンスの洞察の監視、トラブルシューティングと分析のためのELKスタックでの集中ロギングが含まれます。開発者は、プロジェクトのWebサイトで詳細なドキュメントと手順を見つけることができます。
開発者は、LLMを搭載したアプリケーションを構築および展開します。 LLMSで作業するデータサイエンティストと機械学習エンジニア。 LLMインフラストラクチャの管理を担当するDevOpsチーム。 LLMを運用に統合しようとしている組織。
あなたがあまり時間を費やしたくない場合は、このスクリプトを実行してコーヒーを楽しんでください:
chmod +x ./cluster.sh
./cluster.sh
Terraformを使用する前に、GCPで認証することを忘れないでください。
gcloud auth application-default login
このセクションでは、アプリケーションをできるだけ早くアップして実行するための非常にクイックスタートガイドを提供します。より詳細な手順については、次のセクションを参照してください。
1.クラスターを設定します。
アプリケーションをGKEに展開している場合は、Terraformを使用してKubernetesクラスターのセットアップを自動化できます。 iac/terraform
ディレクトリに移動し、テラフォームを初期化します。
cd iac/terraform
terraform init
構成を計画して適用します:
実行計画を生成して、Terraformが作成または変更するリソースを確認し、構成を適用してクラスターを設定します。
terraform plan
terraform apply
2。クラスター情報を取得します:
GKEクラスターと対話するには、その構成を取得する必要があります。次のコマンドで現在のクラスター構成を表示できます。
cat ~ /.kube/config
クラスターを管理するために、 kubectl
コンテキストが正しく設定されていることを確認してください。
より実践的な展開プロセスについては、次の手順に従ってください。
1。NginxIngressコントローラーを展開します:
Nginx Ingressコントローラーは、Kubernetesクラスター内のサービスへの外部アクセスを管理します。名前空間を作成し、ヘルムを使用してイングレスコントローラーをインストールします。
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。オープンWebUIを展開します:
次に、Web UIをGKEクラスターに展開します。
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7。アプリケーションを遊んでください:
ブラウザを開いて、GKEクラスターのURL(ステップ1のhttp://172.0.0.0
など)のURLに移動し、URLの最後に.nip.io
を追加します( http://172.0.0.0.nip.io
) 。オープンWebUIが表示されるはずです:
自動化されたCI/CDパイプラインの場合、次のようにJenkinsとAnsibleを使用してください。
1.ジェンキンスサーバーのセットアップ:
まず、サービスアカウントを作成し、 Compute Admin
役割を割り当てます。次に、サービスアカウントのJSONキーファイルを作成し、 iac/ansible/secrets
ディレクトリに保存します。
次に、「Jenkins-Server」という名前のGoogle Compute Engineインスタンスを作成し、Ubuntu 22.04を実行して、ポート8081および50000のトラフィックを可能にするファイアウォールルールを使用します。
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。ジェンキンスにアクセス:
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://:8081
3.ジェンキンスプラグインをインストール:
次のプラグインをインストールして、JenkinsをDocker、Kubernetes、およびGKEと統合します。
プラグインをインストールした後、Jenkinsを再起動します。
sudo docker restart jenkins-server
4。ジェンキンスの構成:
4.1。 githubリポジトリにWebhooksを追加して、Jenkinsのビルドをトリガーします。
GitHubリポジトリに移動し、 Settings
をクリックします。 Webhooks
をクリックして、 Add Webhook
をクリックします。 JenkinsサーバーのURL( http://
)を入力します。次に、 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
のフィールドで、 Username with password
Add
て選択]を選択します。 githubユーザー名とパスワードを入力します(または、個人的なアクセストークンを使用してください)。 Test Connection
をクリックして、 Save
をクリックします。
4.3。 Docker Hub資格情報をセットアップします。
まず、Docker Hubアカウントを作成します。 Docker Hub Webサイトにアクセスして、 Sign Up
をクリックします。ユーザー名とパスワードを入力します。 Sign Up
をクリックします。 Create Repository
をクリックします。リポジトリの名前( easy-llmops
など)を入力し、 Create
をクリックします。
Jenkins Dashboardから、 Manage Jenkins
> Credentials
を管理します。 Add Credentials
をクリックします。 Username with password
を選択し、 Add
をクリックします。 Docker Hubユーザー名を入力し、トークンにアクセスし、 ID
dockerhub
に設定します。
4.4。 Kubernetes資格情報をセットアップします。
まず、Jenkinsサーバーのサービスアカウントを作成して、GKEクラスターにアクセスします。 GCPコンソールに移動し、IAM&Admin>サービスアカウントに移動します。 Kubernetes Engine Admin
ロールで新しいサービスアカウントを作成します。サービスアカウントに名前と説明を与えます。 [サービスアカウント]をクリックして、 Keys
タブをクリックします。 Add Key
をクリックし、キータイプとしてJSON
選択します。 [JSONファイルのCreate
をクリックしてダウンロードします。
次に、Jenkins Dashboardから、 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
). In the
資格情報のフィールド). In the
field, select
PrivateからGoogleサービスアカウントの追加and select
選択します。 Project-IDとJSONファイルへのパスを入力します。
5。セットアップをテストします。
GitHubリポジトリに新しいコミットをプッシュします。ジェンキンスに新しいビルドが表示されるはずです。
1. Discord webhookを作成します:
まず、Discord Webhookを作成します。 Discord Webサイトにアクセスして、 Server Settings
をクリックします。 Integrations
をクリックします。 Create Webhook
をクリックします。 WebHook( easy-llmops-discord-webhook
など)の名前を入力し、 Create
をクリックします。 WebHook URLをコピーします。
2。ヘルムリポジトリを構成します
まず、プロメテウスとグラファナに必要なヘルムリポジトリを追加する必要があります。
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
これらのコマンドは、公式のプロメテウスとグラファナのヘルムリポジトリを追加し、地元のヘルムチャート情報を更新します。
3.依存関係をインストールします
Prometheusには、ヘルムで管理できる特定の依存関係が必要です。監視ディレクトリに移動し、これらの依存関係を構築します。
helm dependency build ./deployments/monitoring/kube-prometheus-stack
4。プロメテウスを展開します
次に、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
:これは、ヘルムインストールのリリース名です。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のデフォルトの資格情報は通常、次のとおりです。
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 Stack(Elasticsearch、Logstash、Kibana)をセットアップすることをガイドします。
0。クイックラン
この単一のヘルムファイルスクリプトを使用して、エルクスタックをキックオフできます。
cd deployments/ELK
helmfile sync
1.ヘルム付きのエルクスタックをインストールします
ヘルムを使用して、エルクスタックコンポーネントを展開します。
まず、ロギングコンポーネントの名前空間を作成します。
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 )
Kibana:インストール:
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を公開し、ブラウザを介してアクセスしてください。
kubectl port-forward -n logging svc/elk-kibana-kibana 5601:5601
このスクリプトを使用して、キバナのパスワードを取得してください。
kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d
ブラウザを開き、 http://localhost:5601
に移動します。
3.ログコレクションを確認します
これで、KibanaのKubernetesポッドからのログを見ることができるはずです。ダッシュボードと視覚化を作成してログを分析し、アプリケーションの動作に関する洞察を得ることができます。
AIをキャストして、無料のアカウントにサインアップしてトークンを入手してください。
次に、この行を実行してGKEに接続します。
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
ヒットします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
、インストールが完了するためにWaiteを実行しました。
次に、キャストAIのUIでダッシュボードを見ることができます。
キャストAIでクラスターを最適化する時が来ました! Available savings
海のアクションに移動し、 Rebalance
ボタンをクリックします。
LangFuseとSupabaseにアクセスして無料のアカウントにサインアップしてAPIキーを取得し、PlaceHodersを.env.Env.ExampleファイルにAPIキーに置き換えてください。
EasyllMopsへの貢献を歓迎します!開始方法の詳細については、converting.mdをご覧ください。
EasyllMopsはMITライセンスの下でリリースされます。詳細については、ライセンスファイルを参照してください。
研究でEasyllMopsを使用している場合は、次のように引用してください。
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
質問、問題、またはコラボレーションについては、GitHubリポジトリで問題を開くか、メンテナーに直接連絡してください。