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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.