在 GKE 上部署 Meta Llama 3 8B 与 TGI DLC
Meta Llama 3 是 Meta 发布的 Llama 家族的最新 LLM;有 8B 和 70B 两种尺寸,包括基础模型和指令调整模型。文本生成推理 (TGI) 是 Hugging Face 开发的用于部署和提供 LLM 的工具包,具有高性能文本生成功能。此外,Google Kubernetes Engine (GKE) 是 Google Cloud 中的完全托管 Kubernetes 服务,可使用 GCP 的基础设施大规模部署和运行容器化应用程序。
本示例展示了如何在 GKE 集群上部署来自 Hugging Face Hub 的 LLM,例如 Meta Llama 3 8B Instruct,该集群运行专用的容器,以在使用 TGI 的 Hugging Face DLC 的安全且受管理的环境中部署 LLM。
设置/配置
首先,您需要在本地机器上安装 gcloud
和 kubectl
,它们分别是 Google Cloud 和 Kubernetes 的命令行工具,分别用于与 GCP 和 GKE 集群进行交互。
- 要安装
gcloud
,请按照 Cloud SDK 文档 - 安装 gcloud CLI 中的说明进行操作。 - 要安装
kubectl
,请按照 Kubernetes 文档 - 安装工具 中的说明进行操作。
可选地,为了简化本教程中命令的使用,您需要为 GCP 设置以下环境变量
export PROJECT_ID=your-project-id
export LOCATION=your-location
export CLUSTER_NAME=your-cluster-name
然后,您需要登录到您的 GCP 帐户并将项目 ID 设置为您要用于部署 GKE 集群的项目 ID。
gcloud auth login
gcloud auth application-default login # For local development
gcloud config set project $PROJECT_ID
登录后,您需要在 GCP 中启用必要的服务 API,例如 Google Kubernetes Engine API、Google Container Registry API 和 Google Container File System API,这些 API 是部署 GKE 集群和 TGI 的 Hugging Face DLC 所必需的。
gcloud services enable container.googleapis.com
gcloud services enable containerregistry.googleapis.com
gcloud services enable containerfilesystem.googleapis.com
此外,要使用 kubectl
与 GKE 集群凭据进行交互,您还需要安装 gke-gcloud-auth-plugin
,可以使用以下方法使用 gcloud
安装该插件
gcloud components install gke-gcloud-auth-plugin
不需要通过 gcloud
特定方式安装 gke-gcloud-auth-plugin
,要了解有关替代安装方法的更多信息,请访问 https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin。
创建 GKE 集群
一切设置完毕后,您可以继续创建 GKE 集群和节点池,在本例中将是一个单个 GPU 节点,以便使用 GPU 加速器进行高性能推理,也遵循 TGI 基于其内部 GPU 优化建议。
要部署 GKE 集群,将使用“自动驾驶”模式,因为它是大多数工作负载的推荐模式,因为底层基础设施由 Google 管理。或者,您也可以使用“标准”模式。
在创建 GKE 自动驾驶集群之前,请务必检查 GKE 文档 - 通过选择机器系列优化自动驾驶 Pod 性能,因为并非所有版本都支持 GPU 加速器,例如 nvidia-l4
在 GKE 集群版本 1.28.3 或更低版本中不受支持。
gcloud container clusters create-auto $CLUSTER_NAME \
--project=$PROJECT_ID \
--location=$LOCATION \
--release-channel=stable \
--cluster-version=1.28 \
--no-autoprovisioning-enable-insecure-kubelet-readonly-port
要选择 GKE 集群在您所在位置的特定版本,您可以运行以下命令
gcloud container get-server-config \
--flatten="channels" \
--filter="channels.channel=STABLE" \
--format="yaml(channels.channel,channels.defaultVersion)" \
--location=$LOCATION
有关更多信息,请访问 https://cloud.google.com/kubernetes-engine/versioning#specifying_cluster_version。
创建 GKE 集群后,您可以使用以下命令获取凭据,以便通过 kubectl
访问该集群
gcloud container clusters get-credentials $CLUSTER_NAME --location=$LOCATION
可选:在 GKE 中设置机密
由于 meta-llama/Meta-Llama-3.1-8B-Instruct
是一个受限模型,因此您需要使用 kubectl
设置一个包含 Hugging Face Hub 令牌的 Kubernetes 机密。
要为 Hugging Face Hub 生成自定义令牌,您可以按照 https://huggingface.co/docs/hub/en/security-tokens 中的说明进行操作;推荐的方法是安装 huggingface_hub
Python SDK,如下所示
pip install --upgrade --quiet huggingface_hub
然后使用生成的令牌登录,该令牌对受限/私有模型具有读取访问权限
huggingface-cli login
最后,您可以使用以下方法使用 huggingface_hub
Python SDK 检索令牌来创建包含为 Hugging Face Hub 生成的令牌的 Kubernetes 机密
kubectl create secret generic hf-secret \
--from-literal=hf_token=$(python -c "from huggingface_hub import get_token; print(get_token())") \
--dry-run=client -o yaml | kubectl apply -f -
或者,您也可以直接设置令牌,如下所示
kubectl create secret generic hf-secret \ --from-literal=hf_token=hf_*** \ --dry-run=client -o yaml | kubectl apply -f -
有关如何在 GKE 集群中设置 Kubernetes 机密的更多信息,请访问 https://cloud.google.com/secret-manager/docs/secret-manager-managed-csi-component。
部署 TGI
现在你可以继续进行 Hugging Face DLC for TGI 的 Kubernetes 部署,它将从 Hugging Face Hub 提供的 meta-llama/Meta-Llama-3.1-8B-Instruct
模型中提供服务。
要探索可以通过 TGI 提供服务的所有模型,你可以在 Hub 中探索标有 text-generation-inference
的模型,访问地址为 https://huggingface.co/models?other=text-generation-inference。
Hugging Face DLC for TGI 将通过 kubectl
部署,从 config/
目录中的配置文件进行部署
deployment.yaml
:包含 Pod 的部署细节,包括对 Hugging Face DLC for TGI 的引用,并将MODEL_ID
设置为meta-llama/Meta-Llama-3.1-8B-Instruct
。service.yaml
:包含 Pod 的服务详细信息,为 TGI 服务公开端口 8080。- (可选)
ingress.yaml
:包含 Pod 的 Ingress 详细信息,将服务公开到外部世界,以便可以通过 Ingress IP 访问它。
kubectl apply -f config/
Kubernetes 部署可能需要几分钟才能准备好,因此你可以使用以下命令检查部署状态
kubectl get pods
或者,你可以使用以下命令等待部署准备就绪
kubectl wait --for=condition=Available --timeout=700s deployment/tgi-deployment
使用 TGI 进行推理
要对已部署的 TGI 服务运行推理,你可以通过以下两种方式之一:
将已部署的 TGI 服务端口转发到端口 8080,以便通过
localhost
访问,使用以下命令:kubectl port-forward service/tgi-service 8080:8080
通过 Ingress 的外部 IP 访问 TGI 服务,这是这里的默认方案,因为你在
config/ingress.yaml
文件中定义了 Ingress 配置(但可以跳过,改用端口转发),可以使用以下命令检索外部 IP:kubectl get ingress tgi-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
通过 cURL
要使用 cURL
向 TGI 服务发送 POST 请求,你可以运行以下命令:
curl http://localhost:8080/generate \
-X POST \
-d '{"inputs":"<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nYou are a helpful assistant.<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nWhat is 2+2?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n","parameters":{"temperature":0.7, "top_p": 0.95, "max_new_tokens": 128}}' \
-H 'Content-Type: application/json'
或者向 Ingress IP 发送 POST 请求:
curl http://$(kubectl get ingress tgi-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')/generate \
-X POST \
-d '{"inputs":"<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nYou are a helpful assistant.<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nWhat is 2+2?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n","parameters":{"temperature":0.7, "top_p": 0.95, "max_new_tokens": 128}}' \
-H 'Content-Type: application/json'
这将产生以下输出:
{"generated_text":"The answer to 2+2 is 4."}
要使用预期的聊天模板格式生成 inputs
,你可以使用以下代码片段:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
tokenizer.apply_chat_template(
[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is 2+2?"},
],
tokenize=False,
add_generation_prompt=True,
)
通过 Python
要使用 Python 运行推理,你可以使用 openai
Python SDK(请参阅 https://platform.openai.com/docs/quickstart 中的安装说明),将 localhost 或 Ingress IP 设置为客户端的 base_url
,然后运行以下代码:
from huggingface_hub import get_token
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1/",
api_key=get_token() or "-",
)
chat_completion = client.chat.completions.create(
model="tgi",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is 2+2?"},
],
max_tokens=128,
)
这将产生以下输出:
ChatCompletion(id='', choices=[Choice(finish_reason='eos_token', index=0, logprobs=None, message=ChatCompletionMessage(content='The answer to 2+2 is 4!', role='assistant', function_call=None, tool_calls=None))], created=1718108522, model='meta-llama/Meta-Llama-3-8B-Instruct', object='text_completion', system_fingerprint='2.0.2-sha-6073ece', usage=CompletionUsage(completion_tokens=12, prompt_tokens=28, total_tokens=40))
删除 GKE 集群
最后,当你完成在 GKE 集群上使用 TGI 后,你可以安全地删除 GKE 集群,以避免产生不必要的费用。
gcloud container clusters delete $CLUSTER_NAME --location=$LOCATION
或者,你也可以将已部署 Pod 的副本数量缩减为 0,如果你想保留集群,因为使用 GKE Autopilot 模式部署的默认 GKE 集群只运行一个 e2-small
实例。
kubectl scale --replicas=0 deployment/tgi-deployment
📍 在 GitHub 上查找完整的示例 此处!