hugs 文件
在 AWS 上結合 Inferentia 和 Trainium 使用 HUGS
並獲得增強的文件體驗
開始使用
在 AWS 上結合 Inferentia 和 Trainium 使用 HUGS
Hugging Face 生成式 AI 服務 (Hugging Face Generative AI Services),又稱 HUGS,可以透過 AWS Marketplace 產品部署在亞馬遜網路服務 (Amazon Web Services, AWS) 上。
此次合作為 AWS 客戶帶來了 Hugging Face 龐大的預訓練模型庫及其文字生成推理 (Text Generation Inference, TGI) 解決方案,實現了在 AWS 基礎設施內無縫整合最先進的大語言模型 (Large Language Models, LLMs)。
HUGS 提供了經過精心挑選和手動基準測試的、託管在 Hugging Face Hub 上的效能最佳、最新的開放 LLM 集合,並將其提供給經過 TGI 最佳化的容器應用程式,允許使用者在 AWS 或本地環境中部署第三方 Kubernetes 應用程式。
藉助 HUGS,開發人員可以輕鬆地使用 AWS 基礎設施查詢、訂閱和部署 Hugging Face 模型,利用 AWS Neuron Inferentia2 在最佳化的、零配置的 TGI 容器上的強大功能。
HUGS 在 HUGS 0.2.0 版本中提供了以下與 AWS Neuron 相容的模型(下方列出了 Hugging Face 模型 ID 及其 HUGS IMAGE_NAME
)
- meta-llama/Meta-Llama-3.1-8B-Instruct:
neuron-meta-llama-meta-llama-3.1-8b-instruct
- meta-llama/Meta-Llama-3.1-70B-Instruct:
neuron-meta-llama-meta-llama-3.1-70b-instruct
- NousResearch/Hermes-3-Llama-3.1-8B:
neuron-nousresearch-hermes-3-llama-3.1-8b
- NousResearch/Hermes-3-Llama-3.1-70B:
neuron-nousresearch-hermes-3-llama-3.1-70b
- NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO:
neuron-nousresearch-nous-hermes-2-mixtral-8x7b-dpo
- mistralai/Mixtral-8x7B-Instruct-v0.1:
neuron-mistralai-mixtral-8x7b-instruct-v0.1
- mistralai/Mistral-7B-Instruct-v0.3:
neuron-mistralai-mistral-7b-instruct-v0.3
- mistralai/Mixtral-8x22B-Instruct-v0.1:
neuron-mistralai-mixtral-8x22b-instruct-v0.1
您可以在支援的模型中找到 HUGS 支援的所有模型。
在 AWS Marketplace 上訂閱 HUGS
-
按照頁面上的說明在 AWS Marketplace 中訂閱該產品。在撰寫本文時(2024 年 12 月),步驟如下:
- 點選 `Continue to Subscribe`(繼續訂閱),然後進入下一頁。
- 點選 `Continue to Configuration`(繼續配置),然後進入下一頁。
- 選擇交付選項,例如 `HUGS v2 for NVIDIA GPUs and AWS Inferentia2`,以及軟體版本,例如 `0.2.0`。請注意,AWS Neuron Inferentia2 支援已從 0.2.0 版本開始包含。
然後點選 `Continue to Launch`(繼續啟動)。您就成功訂閱了 HUGS。現在,您可以按照以下步驟,使用提供的容器 URI,透過 Amazon EKS 部署您偏好的 HUGS 容器和模型。
要了解您是否已訂閱,您可以檢視產品頁面頂部是否出現藍色彈窗,上面寫著“您有權訪問此產品”,這意味著您或您組織中的其他人已經為您的賬戶申請了訪問許可權;或者,您可以進入 AWS 控制檯中的 AWS Marketplace 服務,搜尋“HUGS (HUgging Face Generative AI Services)”是否列在您已訂閱的產品中。
在 Amazon EKS 上部署 HUGS
本示例展示瞭如何在 Amazon EKS 上建立 Kubernetes 叢集,如何建立一個具有必要許可權和計算需求的 Inferentia2 節點組,以及如何使用 Helm 模板在運行於 Inferentia2 上的 Amazon EKS 上部署 HUGS。
本示例假設您有一個 AWS 賬戶,已經安裝並設定了 AWS CLI,並且已經使用具有必要許可權的賬戶登入,可以訂閱 AWS Marketplace 中的產品,以及建立和管理 IAM 許可權和資源,如彈性 Kubernetes 服務 (EKS)、彈性容器服務 (ECS) 和 EC2。
要求
在繼續之前,您需要安裝 `kubectl`、`eksctl` 和 `helm`,以便分別與 Kubernetes 叢集互動、在 Amazon EKS 上建立、配置和刪除資源,以及與 Helm 模板互動。
要安裝 `kubectl` 和 `eksctl`,您可以按照 Amazon EKS 文件 - 設定 kubectl 和 eksctl 中的說明進行操作。而對於 `helm`,您可以按照 Helm 文件 - 安裝 Helm 中的說明進行操作。
最後,為了方便起見,將設定以下環境變數:
export REGION="us-east-1"
export NAMESPACE="default"
export CLUSTER_NAME="hugs-cluster"
export CLUSTER_VERSION="1.30"
export NODE_GROUP_NAME="hugs-node-group"
export SERVICE_ACCOUNT_NAME="hugs-service-account"
export DEPLOYMENT_NAME="hugs"
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
export AMI_ID=$(aws ssm get-parameter --name /aws/service/eks/optimized-ami/$CLUSTER_VERSION/amazon-linux-2-gpu/recommended/image_id --region $REGION --query "Parameter.Value" --output text)
如果您的 AWS 賬戶有多個配置檔案,請記得將 `AWS_PROFILE` 環境變數設定為您的配置檔案,以便 EKS 命令使用正確的配置檔案。
可選地,在建立叢集之前,您可能需要建立啟用 AWS LoadBalancer Controller 所需的 IAM 策略,即 `AWSLoadBalancerControllerIAMPolicy`,以便部署需要啟用 AWS LoadBalancer Controller 的 ingress,具體請參閱 使用 Helm 安裝 AWS Load Balancer Controller - 步驟 1:使用 eksctl 建立 IAM 角色。
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
請注意,該策略每個賬戶只需建立一次,這意味著如果已經建立,您可以重複使用現有的。否則,您也可以使用不同的名稱建立該策略,但在本示例中,該策略假定名為 `AWSLoadBalancerControllerIAMPolicy`。
最後,請注意,本指南預設將向您展示如何使用 `inf2.xlarge` 例項的 Nodegroup 建立 EKS 叢集,因此請確保您有足夠的 EC2 配額來啟動 AWS Inferentia2 例項,更多資訊請參閱 AWS re:Post - Inferentia 和 Trainium 服務配額。
設定 Amazon EKS
要建立 EKS 叢集、節點組並新增必要的 IAM 許可權,您應該使用提供的配置檔案 `eks-cluster.yaml` 執行 `eksctl`,該檔案如下所示:
# Specifies the API version and kind of the configuration
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
# Defines the basic cluster metadata
metadata:
name: $CLUSTER_NAME # Cluster name, used in various AWS resource names
region: $REGION # AWS region where the cluster will be created
version: $CLUSTER_VERSION # Kubernetes version to use for the cluster
# IAM configuration for the cluster
iam:
withOIDC: true # Enables IAM roles for service accounts (IRSA) using OIDC
serviceAccounts:
# Configures a service account for marketplace metering
- metadata:
name: $SERVICE_ACCOUNT_NAME
namespace: $NAMESPACE
attachPolicyARNs:
- arn:aws:iam::aws:policy/AWSMarketplaceMeteringRegisterUsage
# Configures a service account for the AWS Load Balancer Controller (just required
# if ingress is enabled within the HUGS Helm Template)
- metadata:
name: aws-load-balancer-controller
namespace: $NAMESPACE
attachPolicyARNs:
- arn:aws:iam::$AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy
roleName: AmazonEKSLoadBalancerControllerRole
# Defines the managed node group for the cluster
managedNodeGroups:
- name: $NODE_GROUP_NAME
instanceType: inf2.48xlarge # Inf2-enabled instance type, required by HUGS
minSize: 1
maxSize: 2 # Set to a greater number if you want to enable auto-scaling
desiredCapacity: 1 # Fixed size node group, can be adjusted for scaling
volumeSize: 500
ami: $AMI_ID
amiFamily: AmazonLinux2
iam:
attachPolicyARNs:
- arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
- arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
- arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
overrideBootstrapCommand: |
#!/bin/bash
/etc/eks/bootstrap.sh $CLUSTER_NAME
# Specifies the EKS add-ons to be installed (default ones)
# All the addons below will be installed within the `kube-system` namespace
addons:
- name: vpc-cni # Amazon VPC CNI plugin for Kubernetes
- name: coredns # CoreDNS for Kubernetes DNS services
- name: kube-proxy # kube-proxy for Kubernetes network proxy
# Configures CloudWatch logging for the cluster
cloudWatch:
clusterLogging:
enableTypes: ["*"] # Enables all types of control plane logging
由於 AWS LoadBalancer Controller 是可選的並且是 Ingress 所需的,如果您決定稍後不部署 Ingress,那麼在進入下一步之前,您應該刪除 `aws-load-balancer-controller` 的 `iam.serviceAccounts` 部分,即應從上述檔案中刪除以下內容:
# Configures a service account for the AWS Load Balancer Controller (just required
# if ingress is enabled within the HUGS Helm Template)
- metadata:
name: aws-load-balancer-controller
namespace: $NAMESPACE
attachPolicyARNs:
- arn:aws:iam::$AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy
roleName: AmazonEKSLoadBalancerControllerRole
然後您需要執行以下命令,該命令會將上面環境變數中設定的值替換到 `huggingface/hugs-helm-chart` 中提供的 `eks-cluster.yaml` 檔案中。為了在 `eks-cluster.yaml` 檔案中替換環境變數的值,將使用 `envsubst`,Windows 使用者可能無法使用此工具。
envsubst < eks-cluster.yaml > cluster.yaml
一旦 `cluster.yaml` 檔案更新後,您只需執行以下命令:
eksctl create cluster --config-file cluster.yaml
可選地,如果您想啟用或使用 AWS LoadBalancer Controller,您將需要在部署 HUGS 之前單獨部署它,以便啟用 Ingress;否則,請隨意跳到下面的 HUGS 部署部分。
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
--namespace $NAMESPACE \
--set clusterName=$CLUSTER_NAME \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller
如果您決定在 HUGS 部署中部署 AWS LoadBalancer Controller 並啟用 Ingress,那麼在部署 HUGS 之前,您需要等到 ALB 控制器執行起來。為此,您可以使用以下 `kubectl` 命令:
kubectl wait --namespace $NAMESPACE \
--for=condition=ready pod \
--selector=app.kubernetes.io/name=aws-load-balancer-controller \
--timeout=90s
使用 Helm 在 Amazon EKS 上部署 HUGS
最後,您可以安裝 Helm 模板以從 `huggingface/hugs-helm-chart` 部署 HUGS,如下所示:
helm repo add hugs https://raw.githubusercontent.com/huggingface/hugs-helm-chart/0.0.4/charts/hugs helm repo update hugs
安裝後,要為給定模型(例如 `neuron-meta-llama-meta-llama-3.1-8b-instruct`)部署 HUGS 容器,您需要在訂閱並配置後訪問 AWS Marketplace 中 HUGS 產品的“Launch this Software”選項卡,在那裡您將看到所有可用的 `CONTAINER_URI`。在這種情況下,由於我們想展示如何在 AWS Inferentia2 上部署 LLM,您需要選擇任何以 `neuron-...` 開頭的容器 URI,因為這些是與 AWS Neuron 裝置相容的,例如 `XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/hugging-face/neuron-meta-llama-meta-llama-3.1-8b-instruct`,然後只需匯出以下環境變數:
export IMAGE_REGISTRY="XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com"
export IMAGE_REPOSITORY="hugging-face"
export IMAGE_NAME="neuron-meta-llama-meta-llama-3.1-8b-instruct"
在這種情況下,我們使用了 `neuron-meta-llama-meta-llama-3.1-8b-instruct` 模型,但您可以選擇/使用本指南引言中列出的任何可用模型,或者您可以在支援的模型中瀏覽所有與 AWS Neuron 相容的模型。
然後,您可以使用以下任一方法安裝 Helm 模板:
(推薦)透過自定義 `values.yaml` 檔案
您應該首先建立一個符合 `huggingface/hugs-helm-chart` 值的 `values.yaml` 檔案,然後更新與 AWS Inferentia2 相關的部分:
image: registry: $IMAGE_REGISTRY # Add your custom HUGS Registry here repository: $IMAGE_REPOSITORY # For AWS should always be "hugging-face" name: $IMAGE_NAME tag: latest serviceAccountName: $SERVICE_ACCOUNT_NAME securityContext: privileged: true ingress: enabled: true className: alb annotations: alb.ingress.kubernetes.io/scheme: internet-facing hosts: - host: "" paths: - path: / pathType: Prefix resources: requests: aws.amazon.com/neuron: 1 limits: aws.amazon.com/neuron: 1 nodeSelector: eks.amazonaws.com/nodegroup: $NODE_GROUP_NAME
上面建立的 `values.yaml` 檔案僅包含與我們的特定配置以及 AWS Inferentia2 和 AWS EKS 限制相關的必要值。然後,我們需要像之前一樣使用 `envsubst` 替換上面定義的變數,從教程開始時定義的環境變數中獲取值:
envsubst < values.yaml > values-replaced.yaml
最後,使用 `helm install` 安裝替換後的檔案 `values-replaced.yaml`:
helm install -f values-replaced.yaml $DEPLOYMENT_NAME hugs/hugs
為了測試替換是否正確並檢查 Helm 模板將建立什麼,您可以隨時呼叫完全相同的命令,但使用 `helm template` 而不是 `helm install`,並檢查將應用於 EKS 叢集的生成/生成的 Kubernetes Manifest 檔案。
helm template -f values-replaced.yaml $DEPLOYMENT_NAME hugs/hugs
透過在執行 `helm install` 時使用 `--set` 選項
helm install $DEPLOYMENT_NAME hugs/hugs \ --set image.registry=$IMAGE_REGISTRY \ --set image.repository=$IMAGE_REPOSITORY \ --set image.name=$IMAGE_NAME \ --set image.tag="0.2.0" \ --set resources.requests."aws\.amazon\.com/neuron"=1 \ --set resources.limits."aws\.amazon\.com/neuron"=1 \ --set serviceAccountName=$SERVICE_ACCOUNT_NAME \ --set nodeSelector."eks\.amazonaws\.com/nodegroup"=$NODE_GROUP_NAME
請注意,對於巢狀值或複雜值,使用 CLI 引數可能會有些棘手,尤其是在字元轉義方面。
在 HUGS 上進行推理
要對已部署的 HUGS 服務執行推理,您可以選擇以下任一方式:
透過埠轉發將埠轉發到本地埠,例如 8080(以便您可以透過 `localhost` 向服務傳送請求),使用以下命令:
kubectl port-forward service/$DEPLOYMENT_NAME 8080:80
使用 ingress 的外部 IP 或主機名,僅當 AWS LoadBalancer Controller 已部署到 EKS 叢集,並且在 Helm 模板的 `values.yaml` 檔案中設定了 `ingress.enabled: true` 並帶有正確的 `alb` 配置。這可以透過以下命令獲取:
kubectl get ingress $DEPLOYMENT_NAME -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
然後,您可以從正在執行的 Pod 外部,透過 `localhost`、ingress IP 或 ingress 主機名向 Messages API 傳送請求。
在下面的推理示例指南中,主機假定為 `localhost`,這是透過 Kubernetes 使用埠轉發部署 HUGS 的情況。如果您已在 Kubernetes 上使用具有特定 IP、主機和/或 SSL (HTTPS) 的 ingress 部署 HUGS,請注意您應將下面的 `localhost` 引用更新為您的主機或 IP。
要在部署 HUGS 後執行推理,您可以從一個簡單的 `cURL` 命令開始,向 HUGS 暴露的 OpenAI API 相容端點發送請求,如下所示:
curl https://:8080/v1/chat/completions \
-X POST \
-d '{"model":"tgi","messages":[{"role":"user","content":"What is Deep Learning?"}],"temperature":0.7,"top_p":0.95,"max_tokens":128}}' \
-H 'Content-Type: application/json'
有關在 HUGS 上執行推理的更多資訊和不同替代方案,您應參考指南 在 HUGS 上執行推理。
解除安裝 HUGS
由於 HUGS 是透過 `helm install` 安裝的,您可以簡單地解除安裝它:
helm uninstall $DEPLOYMENT_NAME
`helm uninstall` 將刪除所有建立的工作負載,在這種情況下是 Deployment、Service、Ingress 和 Horizontal Pod Autoscaler (HPA);另外,如果您也安裝了 AWS LoadBalancer Controller,您也可以按如下方式解除安裝它:
helm uninstall aws-load-balancer-controller
或者,當您使用完 Amazon EKS 集群后,可以安全地刪除它以避免產生不必要的費用,如下所示:
eksctl delete cluster --name=$CLUSTER_NAME --region=$REGION