hugs 文档

在 AWS 上结合 NVIDIA GPU 使用 HUGS

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

在 AWS 上结合 NVIDIA GPU 使用 HUGS

Hugging Face 生成式 AI 服务(也称为 HUGS)可以通过 AWS Marketplace 产品在 Amazon Web Services (AWS) 中部署。

此次合作为 AWS 客户带来了 Hugging Face 庞大的预训练模型库及其文本生成推理(Text Generation Inference, TGI)解决方案,实现了在 AWS 基础设施内无缝集成最先进的大型语言模型 (LLM)。

HUGS 提供了对 Hugging Face Hub 中托管的一系列经过精选和手动基准测试的高性能最新开放式 LLM 的访问权限,这些模型被集成到针对 TGI 优化的容器应用中,允许用户在 AWS 或本地环境中部署第三方 Kubernetes 应用。

借助 HUGS,开发者可以利用 AWS 基础设施轻松查找、订阅和部署 Hugging Face 模型,并在经过优化、零配置的 TGI 容器上发挥 NVIDIA GPU 的强大功能。

在 AWS Marketplace 上订阅 HUGS

  1. 前往 HUGS AWS Marketplace 列表

    HUGS on AWS Marketplace

  2. 按照页面上的说明在 AWS Marketplace 中订阅该产品。在撰写本文时(2024 年 12 月),步骤如下:

    1. 点击 `Continue to Subscribe`,然后进入下一页。
    2. 点击 `Continue to Configuration`,然后进入下一页。
    3. 选择交付选项,例如 `HUGS v2 for NVIDIA GPUs and AWS Inferentia2`,以及软件版本,例如 `0.2.0`。

    HUGS Configuration on AWS Marketplace

  3. 然后点击 `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 权限和资源(如弹性 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 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` 配置。

然后您需要运行以下命令,该命令会将上面环境变量中设置的值替换到 `huggingface/hugs-helm-chart` 中提供的 `eks-cluster.yaml` 文件中。为了在 `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

如果您决定在 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 模板来部署带有选定模型的 HUGS 容器,例如 `meta-llama/Llama-3.1-8B-Instruct`;您需要设置 AWS Marketplace 为您的账户提供的容器 URI,可以通过运行 `helm install` 时使用 `--set` 选项(如下所示),或者在 `huggingface/hugs-helm-chart` 中提供的 `eks-values.yaml` 文件中修改其值。

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.enabled: true`,则使用 ingress 的外部 IP 或主机名,可以通过以下命令获取:

    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 上运行推理 查看如何在 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
< > 在 GitHub 上更新