Hugging Face 生成式 AI 服务 (HUGS) 文档
HUGS 在 AWS 上使用 NVIDIA GPU
并获得增强的文档体验
开始使用
HUGS 在 AWS 上使用 NVIDIA GPU
Hugging Face 生成式 AI 服务,也称为 HUGS,可以通过 AWS Marketplace 产品在 Amazon Web Services (AWS) 中部署。
此次合作将 Hugging Face 广泛的预训练模型库及其文本生成推理 (TGI) 解决方案带给 AWS 客户,从而能够在 AWS 基础设施内无缝集成最先进的大型语言模型 (LLM)。
HUGS 提供对精选且手动基准测试过的最佳性能和最新开放 LLM 集合的访问,这些 LLM 托管在 Hugging Face Hub 中,用于 TGI 优化的容器应用程序,允许用户在 AWS 或本地环境中部署第三方 Kubernetes 应用程序。
借助 HUGS,开发人员可以使用 AWS 基础设施轻松查找、订阅和部署 Hugging Face 模型,从而在优化的零配置 TGI 容器上利用 NVIDIA GPU 的强大功能。
在 AWS Marketplace 上订阅 HUGS
-
按照页面上的说明在 AWS Marketplace 中订阅该产品。在撰写本文时(2024 年 12 月),步骤如下:
- 点击
Continue to Subscribe
,然后进入下一页。 - 点击
Continue to Configuration
,然后进入下一页。 - 选择交付选项,例如
HUGS v2 for NVIDIA GPUs and AWS Inferentia2
,以及软件版本,例如0.2.0
。
- 点击
然后点击
Continue to Launch
。您已成功订阅 HUGS。现在您可以按照以下步骤,使用提供的容器 URI,通过 Amazon EKS 部署您首选的 HUGS 容器和模型。
要知道您是否已订阅,您可以查看产品页面顶部是否出现蓝色模态框,其中显示“You have access to this product”,这意味着您或您组织中的其他人已经为您的帐户请求了访问权限;否则,您可以转到 AWS 控制台中的 AWS Marketplace 服务,并搜索“HUGS (HUgging Face Generative AI Services)”是否列在您订阅的产品中。
在 Amazon EKS 上部署 HUGS
本示例演示了如何在 Amazon EKS 上创建 Kubernetes 集群,如何创建具有必要权限和计算要求的节点组,以及如何使用 Helm 模板在 Amazon EKS 上部署 HUGS。
本示例假定您拥有 AWS 账户,您已 安装并设置了 AWS CLI,并且您已登录到您的帐户,并具有必要的权限来订阅 AWS Marketplace 中的产品,以及创建和管理 IAM 权限和资源,例如 Elastic Kubernetes Service (EKS)、Elastic Container Service (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 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)
如果您的 AWS 账户有多个配置文件,请记住将 AWS_PROFILE
环境变量设置为您的配置文件,以便 EKS 命令使用正确的配置文件。
设置 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: "1.30" # 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: g5.xlarge # GPU-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
# 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
或者,您可以从 huggingface/hugs-helm-chart
GitHub 存储库下载该文件,如下所示:
curl -O https://raw.githubusercontent.com/huggingface/hugs-helm-chart/main/aws/eks-cluster.yaml
可选地,在创建集群之前,您可能需要创建启用 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
。
或者,如果您决定跳过上面 AWS LoadBalancer 的创建,则应在继续下一步之前删除 aws-load-balancer-controller
的 iam.serviceAccounts
。
然后,您需要运行以下命令,该命令将替换上面在 eks-cluster.yaml
文件(在 huggingface/hugs-helm-chart
中提供)中设置的环境变量值。要替换上面 eks-cluster.yaml
文件中的环境变量值,将使用 envsubst
,这可能不适用于 Windows 用户。
envsubst < eks-cluster.yaml > eks-cluster.yaml
一旦 eks-cluster.yaml
文件更新,您就可以运行以下命令
eksctl create cluster --config-file eks-cluster.yaml
如果您想启用或使用 AWS LoadBalancer,则需要在部署 HUGS 之前单独部署它,以便启用 ingress。
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
如果您决定部署 AWS LoadBalancer Controller 并在 HUGS 部署中启用 ingress,则需要等到 ALB 控制器运行后再部署 HUGS,为此,您可以使用以下 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 模板以部署带有选定模型的 HUGS 容器,例如 meta-llama/Llama-3.1-8B-Instruct
;并且您需要设置 AWS Marketplace 为您的帐户提供的容器 URI,可以通过运行 helm install
时使用 --set
选项(如下所示),或者在 eks-values.yaml
文件(在 huggingface/hugs-helm-chart
中提供)中修改其值。
curl -O https://raw.githubusercontent.com/huggingface/hugs-helm-chart/main/aws/eks-values.yaml
helm repo add hugs https://raw.githubusercontent.com/huggingface/hugs-helm-chart/main/charts/hugs
helm repo update hugs
helm install $DEPLOYMENT_NAME hugs/hugs \
-f eks-values.yaml \
--set image.registry="XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com" \
--set image.repository="hugging-face" \
--set image.name="nvidia-meta-llama-meta-llama-3.1-8b-instruct" \
--set image.tag="0.1.0" \
--set serviceAccountName=$SERVICE_ACCOUNT_NAME \
--set nodeSelector."eks\.amazonaws\.com/nodegroup"=$NODE_GROUP_NAME
上述命令假定您已按照本示例中的步骤操作,如果您更改了节点组名称、服务帐户名称、容器或加速器数量;您应该手动修改或从 eks-values.yaml
创建一个新的 values.yaml
文件,并包含您的自定义设置。
HUGS 上的推理
要在已部署的 HUGS 服务上运行推理,您可以选择:
通过端口转发将端口转发到本地端口,例如 8080(以便您可以通过
localhost
向服务发送请求),命令如下:kubectl port-forward service/$DEPLOYMENT_NAME 8080:80
使用 ingress 的外部 IP 或主机名,如果
ingress.enabled: true
,可以使用以下命令检索:kubectl get ingress $DEPLOYMENT_NAME -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
然后,您可以从运行 pod 外部通过 localhost
、ingress IP 或 ingress 主机名向 Messages API 发送请求。
在以下指南的推理示例中,主机假定为 localhost
,这是通过 Kubernetes 和端口转发部署 HUGS 的情况。如果您已使用 ingress 在特定 IP、主机和/或 SSL (HTTPS) 下在 Kubernetes 上部署了 HUGS,请注意您应该将下面的 localhost
引用更新为您的主机或 IP。
请参阅 在 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