Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Stellen Sie Modelle mithilfe von kubectl aus dem lokalen NVMe-Speicher bereit
In diesem Thema erfahren Sie, wie Sie Inferenzendpunkte auf Amazon bereitstellen SageMaker HyperPod, die Modellgewichte aus dem lokalen NVMe-Speicher eines Knotens laden, anstatt sie von Amazon S3 oder Amazon FSx über das Netzwerk abzurufen. Durch das lokale Auslesen der Gewichtungen entfällt der Netzwerk-Hop beim Pod-Start. Dadurch wird die Kaltstartzeit des Inferenz-Pods reduziert. Dies ist nützlich für Autoscaling-Ereignisse, Workloads, die von Null aus skalieren, und latenzempfindliche Failover. Verwenden Sie für Workloads, bei denen die Kaltstart-Latenz kein Problem darstellt, oder und überspringen Sie dieses Thema. modelSourceType: s3 fsx
Lokales NVMe ist knotenlokal und kurzlebig: Daten auf NVMe gehen verloren, wenn ein Knoten ausgetauscht wird, z. B. bei einer Spot-Unterbrechung, einem Hardwarefehler oder einer AMI-Aktualisierung. Bei den Ansätzen in diesem Thema wird dies unterschiedlich gehandhabt — bei einigen müssen Sie jeden Knoten vorab mit Daten füllen, bei anderen wird automatisch auf Amazon S3 zurückgegriffen, wenn das Modell nicht lokal zwischengespeichert wird. Lokaler NVMe-Instance-Speicher befindet sich normalerweise in den Instance-Familien P, G und Trn. Informationen zur Überprüfung der Verfügbarkeit für Ihren Instance-Typ finden Sie in den Amazon EC2-Instance-Store-Spezifikationen.
Je nach Ihren Speicheranforderungen können Sie aus den folgenden Ansätzen wählen:
| # | Ansatz | Description |
|---|---|---|
| 1 | Kubernetes-Volume (kein Fallback) | Wird verwendet, wenn Modellgewichte auf NVMe auf jedem Knoten vorhanden sind. Einfachste Einrichtung, für die keine Amazon S3-, Amazon FSx- oder PV/PVC InitContainer erforderlich sind. |
| 2 | Kubernetes-Volume mit Fallback | Wird verwendet, wenn das Modell möglicherweise nicht auf allen Knoten auf NVMe vorhanden ist. Sie geben eine benutzerdefinierte Version aninitContainer, die zuerst NVMe überprüft und mithilfe von IRSA-Anmeldeinformationen von Amazon S3 herunterlädt, falls das Modell fehlt. |
| 3 | Amazon S3 mit Prefetch und Fallback | Verwenden Sie diese Option, wenn Sie Modellgewichte für den Pod-Start dem RAM zuordnen möchten. Sie geben eine benutzerdefinierte Version aninitContainer, die zuerst NVMe überprüft und auf das Kopieren aus dem vom Betreiber bereitgestellten Amazon S3-Mount zurückgreift, wenn das Modell nicht lokal zwischengespeichert ist. |
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Sie:
-
Richten Sie Inferenzfunktionen auf Ihren Amazon-Clustern ein. SageMaker HyperPod Weitere Informationen finden Sie unter Richten Sie Ihre HyperPod Cluster für die Modellbereitstellung ein.
-
Das kubectl-Hilfsprogramm
wurde installiert und jq in Ihrem Terminal konfiguriert. -
Pre-populated Modellieren Sie Gewichtungen auf dem lokalen NVMe-Speicher Ihrer Zielknoten (Anweisungen finden Sie unterLaden Sie Modellgewichtungen vorab auf NVMe).
Wählen Sie Ihren Bereitstellungsansatz
Ermitteln Sie anhand des folgenden Entscheidungsablaufs, welcher Ansatz für Ihren Anwendungsfall geeignet ist.
┌────────────────────────────┐ │ Want to use a volume of │ │ your choice, e.g. NVMe? │ └─────┬──────────────┬───────┘ YES │ │ NO ▼ ▼ ┌──────────────────────┐ Use S3/FSx/HF │ Are you sure EVERY │ as-is (no volume │ node has the model │ override needed) │ on NVMe? │ └─────┬──────────┬─────┘ YES │ │ NO ▼ ▼ ┌─────────────────┐ ┌───────────────────────────────┐ │ Approach 1 │ │ Do you need the operator to │ │ │ │ create S3/FSx PVCs as a │ │ Use k8sVolume │ │ fallback when the model is │ │ field in CRD to │ │ missing on a node? │ │ read from NVMe │ └──────┬────────────────┬───────┘ │ directly. │ YES │ │ NO └─────────────────┘ ▼ ▼ ┌──────────────────┐ ┌──────────────────────┐ │ Approach 3 │ │ Approach 2 │ │ │ │ │ │ Use S3 with │ │ Use k8sVolume with a │ │ prefetch enabled.│ │ custom initContainer │ │ Custom │ │ you create that │ │ initContainer │ │ checks NVMe first │ │ checks NVMe │ │ and downloads from │ │ first, falls │ │ S3 via IRSA if the │ │ back to S3, and │ │ model is missing. │ │ copies to RAM. │ └──────────────────────┘ └──────────────────┘
Stellen Sie die Bereitstellung mithilfe eines Kubernetes-Volumes bereit (kein Fallback)
Verwenden Sie diesen Ansatz, wenn Sie Modellgewichtungen für NVMe auf jedem Knoten haben und das einfachste Setup wünschen — keine Amazon S3- oder Amazon FSx-Konfiguration, nein PV/PVC, und keine InitContainers.
Wenn Sie festlegenmodelSourceType: kubernetesVolume, überspringt der Operator die Erstellung vollständig. PV/PVC Es wird kein CSI-Treiber, Amazon S3 Fuse Mount oder Amazon FSx Mount verwendet. Das vom Kunden bereitgestellte model-weights Volume wird direkt in der Pod-Spezifikation verwendet, und der Worker liest Modelldaten von NVMe unter. /opt/ml/model
Wichtig
Bei Verwendung modelSourceType: kubernetesVolume leitet der Operator den erwarteten Volume-Namen aus Ihrer Worker-Konfiguration abmodelVolumeMount.name. kubernetes.volumesmuss ein Volume mit demselben Namen enthalten. Der Operator überprüft dies und lehnt die Bereitstellung mit einer KubernetesVolumeValidationFailed Bedingung ab, wenn kein passendes Volume gefunden wird. In den folgenden Beispielen verwenden beide. model-weights
-
Erstellen Sie die
InferenceEndpointConfigYAML-Datei. Ersetzen Sie die Platzhalterwerte durch Ihre tatsächlichen Ressourcenbezeichner.cat <<EOF> deploy_nvme_k8s_volume.yaml apiVersion: inference.sagemaker.aws.amazon.com/v1 kind: InferenceEndpointConfig metadata: name: nvme-k8s-volume namespace: default spec: endpointName: nvme-k8s-volume modelName: Qwen2.5-VL-7B-Instruct invocationEndpoint: v1/chat/completions replicas: 1 modelSourceConfig: modelSourceType: kubernetesVolume kubernetes: volumes: - name: model-weights hostPath: path: /opt/dlami/nvme/<YOUR_MODEL> type: Directory loadBalancer: healthCheckPath: /health worker: image: lmcache/vllm-openai:latest args: - /opt/ml/model - --max-model-len - "15000" - --tensor-parallel-size - "1" modelInvocationPort: containerPort: 8000 name: http modelVolumeMount: name: model-weights mountPath: /opt/ml/model resources: limits: nvidia.com/gpu: "1" requests: cpu: "6" memory: 30Gi nvidia.com/gpu: "1" environmentVariables: - name: PYTHONHASHSEED value: "123" - name: VLLM_REQUEST_TIMEOUT value: "600" EOFAnmerkung
Informationen zur Konfiguration von KV-Caching und intelligentem Routing für eine verbesserte Leistung finden Sie unter. Konfigurieren Sie KV-Caching und intelligentes Routing
-
Stellen Sie das
InferenceEndpointConfigbereit.kubectl apply -f deploy_nvme_k8s_volume.yaml -
Überprüfen Sie den Bereitstellungsstatus.
kubectl describe InferenceEndpointConfig nvme-k8s-volume -n default
Stellen Sie die Bereitstellung mithilfe eines Kubernetes-Volumes mit Fallback bereit
Verwenden Sie diesen Ansatz, wenn sich das Modell möglicherweise auf NVMe auf einem bestimmten Knoten befindet oder nicht. Ein hostPath Volume funktioniert nur auf Knoten, auf denen die Daten vorhanden sind. Pods, die auf anderen Knoten geplant sind, würden einen leeren oder nicht vorhandenen Pfad bereitstellen, was zum Ausfall des Modellservers führen würde.
Bei diesem Ansatz legen Sie ein benutzerdefiniertes System fest modelSourceType: kubernetesVolume und stellen es bereitinitContainer, das zuerst NVMe überprüft und mithilfe von IRSA-Anmeldeinformationen von Amazon S3 herunterlädt, falls das Modell fehlt.
Richten Sie IRSA ein
Konfigurieren Sie vor der Bereitstellung IAM Roles for Service Accounts (IRSA) so, dass Ihre Pods Anmeldeinformationen für das Herunterladen von Amazon S3 erhalten.
-
Rufen Sie die OIDC-Anbieter-ID für Ihren Cluster ab.
aws eks describe-cluster --name <CLUSTER_NAME> --region <REGION> \ --query "cluster.identity.oidc.issuer" --output text -
Erstellen Sie eine IAM-Vertrauensrichtlinie. Speichern Sie Folgendes unter und ersetzen Sie
trust-policy.jsondabei die Platzhalterwerte.{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>:sub": "system:serviceaccount:<NAMESPACE>:<SA_NAME>", "oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>:aud": "sts.amazonaws.com" } } }] }Warnung
Beschränken Sie die Vertrauensrichtlinie immer auf einen bestimmten Namespace und ServiceAccount Namen. Verwenden Sie niemals Platzhalter in der Betreffbedingung (z. B.
system:serviceaccount:*:*), da dadurch jeder ServiceAccount in einem beliebigen Namespace die Rolle übernehmen könnte. -
Erstellen Sie die IAM-Rolle und fügen Sie eine bereichsbezogene Amazon S3-Leserichtlinie für Ihren Modell-Bucket hinzu.
aws iam create-role --role-name <ROLE_NAME> \ --assume-role-policy-document file://trust-policy.json aws iam put-role-policy --role-name <ROLE_NAME> \ --policy-name S3ModelReadAccess \ --policy-document '{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::<YOUR_BUCKET>", "arn:aws:s3:::<YOUR_BUCKET>/<YOUR_MODEL_PREFIX>/*" ] }] }' -
Erstellen Sie das Kubernetes-Dienstkonto mit der IRSA-Anmerkung.
kubectl create sa <SA_NAME> -n <NAMESPACE> kubectl annotate sa <SA_NAME> -n <NAMESPACE> \ eks.amazonaws.com/role-arn=arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
Bereitstellen des Modells
-
Erstellen Sie die YAML-Datei
InferenceEndpointConfig. Ersetzen Sie die Platzhalterwerte durch Ihre tatsächlichen Ressourcenbezeichner.cat <<EOF> deploy_nvme_k8s_volume_fallback.yaml apiVersion: inference.sagemaker.aws.amazon.com/v1 kind: InferenceEndpointConfig metadata: name: nvme-k8s-volume-fallback namespace: default spec: endpointName: nvme-k8s-volume-fallback modelName: Qwen2.5-VL-7B-Instruct invocationEndpoint: v1/chat/completions replicas: 1 modelSourceConfig: modelSourceType: kubernetesVolume kubernetes: serviceAccountName: <YOUR_SERVICE_ACCOUNT> initContainers: - name: smart-loader image: public.ecr.aws/aws-cli/aws-cli:latest command: ["/bin/bash", "-c"] args: - | if [ "$(ls -A /model)" ]; then echo "NVMe hit — model already present ($(du -sh /model | cut -f1))" else echo "NVMe miss — downloading from S3" aws s3 sync s3://<YOUR_BUCKET>/<YOUR_MODEL>/ /model/ fi volumeMounts: - name: model-weights mountPath: /model volumes: - name: model-weights hostPath: path: /opt/dlami/nvme/<YOUR_MODEL> type: DirectoryOrCreate loadBalancer: healthCheckPath: /health worker: image: lmcache/vllm-openai:latest args: - /opt/ml/model - --max-model-len - "15000" - --tensor-parallel-size - "1" modelInvocationPort: containerPort: 8000 name: http modelVolumeMount: name: model-weights mountPath: /opt/ml/model resources: limits: nvidia.com/gpu: "1" requests: cpu: "6" memory: 30Gi nvidia.com/gpu: "1" environmentVariables: - name: PYTHONHASHSEED value: "123" EOFAnmerkung
Informationen zur Konfiguration von KV-Caching und intelligentem Routing für eine verbesserte Leistung finden Sie unter. Konfigurieren Sie KV-Caching und intelligentes Routing
-
Stellen Sie das
InferenceEndpointConfigbereit.kubectl apply -f deploy_nvme_k8s_volume_fallback.yaml -
Überprüfen Sie den Bereitstellungsstatus.
kubectl describe InferenceEndpointConfig nvme-k8s-volume-fallback -n default
Stellen Sie die Bereitstellung mithilfe von Amazon S3 mit Prefetch und NVMe-Fallback bereit
Verwenden Sie diesen Ansatz, wenn Sie eine Inferenzleistung erzielen möchten, indem Sie die Modellgewichte im RAM verteilen und automatisch auf Amazon S3 zurückgreifen, wenn das Modell nicht lokal auf NVMe zwischengespeichert wird.
Wenn Sie auf setzen modelSourceType: s3prefetchEnabled: true, erstellt der Operator automatisch zwei Volumes:
-
Ein Volume, das nach Ihrem
modelVolumeMount.name(normalerweisemodel-weights) benannt ist — einer Amazon S3-CSI-Sicherheitshalterung, die Ihr Modell enthält -
model-weights-copy— ein RAM-backedemptyDirOrt, von dem aus der Mitarbeiter liest
Sie fügen ein benutzerdefiniertes nvme-cache Volume hinzu, das auf den lokalen NVMe-Speicher des Knotens verweist, und ein benutzerdefiniertes, initContainer das:
-
Wenn das Modell auf NVMe vorhanden ist, kopiert es von NVMe nach RAM (
model-weights-copy), wobei das Netzwerk vollständig übersprungen wird. -
Wenn das Modell fehlt, wird wieder vom Amazon S3-Mount (
model-weights) nach RAM () kopiert.model-weights-copyKopiert optional auf NVMe, sodass nachfolgende Pod-Starts auf demselben Knoten den schnellen lokalen Pfad verwenden.
Wichtig
Überschreiben model-weights Sie es nichtkubernetes.volumes, wenn Sie diesen Ansatz verwenden. Der Operator erstellt einen model-weights Verweis auf das Amazon S3-CSI-Volume. Wenn Sie es überschreiben, wird das vom Betreiber bereitgestellte Volume entfernt, das Ihr InitContainer als Fallback benötigt. Verwenden Sie einen separaten Volume-Namen (z. B.) für Ihren NVMe-HostPath. nvme-cache
Wichtig
Nicht in einschließenmodel-weights-copy. kubernetes.volumes Es ist ein reservierter Name, der automatisch vom Betreiber erstellt wird. Ihr InitContainer kann darauf verweisen, darf ihn volumeMounts aber nicht als Volume deklarieren.
-
Erstellen Sie die
InferenceEndpointConfigYAML-Datei. Ersetzen Sie die Platzhalterwerte durch Ihre tatsächlichen Ressourcenbezeichner.cat <<EOF> deploy_nvme_s3_prefetch_fallback.yaml apiVersion: inference.sagemaker.aws.amazon.com/v1 kind: InferenceEndpointConfig metadata: name: nvme-s3-prefetch-fallback namespace: default spec: endpointName: nvme-s3-prefetch-fallback modelName: Qwen2.5-VL-7B-Instruct invocationEndpoint: v1/chat/completions replicas: 1 modelSourceConfig: modelSourceType: s3 s3Storage: bucketName: <YOUR_BUCKET> region: <YOUR_REGION> prefetchEnabled: true kubernetes: serviceAccountName: <YOUR_SERVICE_ACCOUNT> initContainers: - name: smart-loader image: public.ecr.aws/aws-cli/aws-cli:latest command: ["/bin/bash", "-c"] args: - | # Check NVMe first, fall back to S3 mount, then copy to RAM if [ "$(ls -A /nvme)" ]; then echo "NVMe hit ($(du -sh /nvme | cut -f1))" echo "Copying model from NVMe to RAM..." cp -r /nvme/* /model/ else echo "NVMe miss — copying from S3 mount to NVMe, then NVMe to RAM" cp -r /s3-model/* /nvme/ cp -r /nvme/* /model/ fi echo "Done. $(du -sh /model | cut -f1) in RAM." volumeMounts: - name: model-weights mountPath: /s3-model - name: nvme-cache mountPath: /nvme - name: model-weights-copy mountPath: /model volumes: - name: nvme-cache hostPath: path: /opt/dlami/nvme/<YOUR_MODEL> type: DirectoryOrCreate loadBalancer: healthCheckPath: /health worker: image: lmcache/vllm-openai:latest args: - /opt/ml/model - --max-model-len - "15000" - --tensor-parallel-size - "1" modelInvocationPort: containerPort: 8000 name: http modelVolumeMount: name: model-weights mountPath: /opt/ml/model resources: limits: nvidia.com/gpu: "1" requests: cpu: "6" memory: 30Gi nvidia.com/gpu: "1" environmentVariables: - name: PYTHONHASHSEED value: "123" - name: VLLM_REQUEST_TIMEOUT value: "600" EOFAnmerkung
Informationen zur Konfiguration von KV-Caching und intelligentem Routing für eine verbesserte Leistung finden Sie unter. Konfigurieren Sie KV-Caching und intelligentes Routing
-
Stellen Sie das
InferenceEndpointConfigbereit.kubectl apply -f deploy_nvme_s3_prefetch_fallback.yaml -
Überprüfen Sie den Bereitstellungsstatus.
kubectl describe InferenceEndpointConfig nvme-s3-prefetch-fallback -n default
Grundlegendes zu Model-Weights und Model-Weights-Copy mit Prefetch
Bei Verwendung von Prefetch erstellt der Operator zwei modellbezogene Volumes:
-
Ein Volume, das nach Ihrem
modelVolumeMount.name(in der Regelmodel-weights) benannt ist — einem Amazon S3-CSI-Sicherheitshalter, der Ihr Modell enthält -
model-weights-copy— ein RAM-backed EmptyDir, aus dem der Worker tatsächlich liest
In deinem InferenceEndpointConfig definierst du:
modelVolumeMount: name: model-weights mountPath: /opt/ml/model
Während Sie darauf verweisenmodel-weights, wannprefetchEnabled: true, ist es tatsächlich model-weights-copy das, was /opt/ml/model im Worker-Container gemountet wird. Wenn Sie einen benutzerdefinierten InitContainer verwenden, stellen Sie sicher, dass Sie die Daten in das aufgerufene Volume kopieren model-weights-copy — dort erwartet der Worker sie zu finden.
WennprefetchEnabled: false, gibt es nur ein Volume (benannt nach IhremmodelVolumeMount.name) und es wird direkt dort gemountet. /opt/ml/model
Konfigurieren Sie ein benutzerdefiniertes Dienstkonto
Sie können Ihren Inferenzendpunkt-Pods mithilfe des spec.kubernetes.serviceAccountName Felds im ein benutzerdefiniertes Kubernetes ServiceAccount zuweisen. InferenceEndpointConfig Dies ist nützlich, um Ihren Worker-Containern oder Init-Containern AWS
Anmeldeinformationen über IRSA (IAM Roles for Service Accounts) zur Verfügung zu stellen — zum Beispiel, um in einem Fallback-Szenario Modellgewichte von Amazon S3 herunterzuladen.
Wichtig
Die Unterstützung für benutzerdefinierte Dienstkonten ist standardmäßig deaktiviert und muss vor der Verwendung explizit von einem Cluster-Administrator aktiviert werden. Detaillierte Anweisungen finden Sie unter Aktivieren Sie benutzerdefinierte Dienstkonten.
Wenn Sie keinen angeben ServiceAccount, wird der Standardnamespace ServiceAccount verwendet.
Aktivieren Sie benutzerdefinierte Dienstkonten
Die Unterstützung für benutzerdefinierte Dienstkonten ist standardmäßig deaktiviert. Ein Cluster-Administrator muss ihn in der Helm-Konfiguration des Operators aktivieren, bevor Benutzer ServiceAccounts in ihrer Konfiguration auf benutzerdefinierte Einstellungen verweisen könnenInferenceEndpointConfig.
-
Aktualisieren Sie die Helm-Werte des Operators, um die Funktion zu aktivieren. Wenn Sie den Operator über Helm eingesetzt haben, führen Sie ein Upgrade mit dem folgenden Flag durch:
helm upgrade hyperpod-inference-operator <CHART_PATH> \ --set enableCustomServiceAccounts=true \ --reuse-values -
Wenn Sie den Operator als Amazon EKS-Add-on bereitgestellt haben, aktualisieren Sie die Add-On-Konfiguration, sodass sie
enableCustomServiceAccounts: truein den erweiterten Konfigurationseinstellungen enthalten ist. -
Stellen Sie sicher, dass auf dem Operator-Pod die Umgebungsvariable gesetzt ist:
kubectl get deployment hyperpod-inference-controller-manager \ -n hyperpod-inference-system \ -o jsonpath='{.spec.template.spec.containers[0].env}' | jq '.[] | select(.name=="ENABLE_CUSTOM_SERVICE_ACCOUNTS")'Sie sollten Folgendes sehen:
{ "name": "ENABLE_CUSTOM_SERVICE_ACCOUNTS", "value": "true" }
Wichtig
Wenn diese Funktion nicht aktiviert ist, kubernetes.serviceAccountName wird jede InferenceEndpointConfig angegebene Funktion mit einem DeploymentFailed Status und der Meldung abgelehnt:kubernetes.serviceAccountName is not enabled. Requires addon
configuration (enableCustomServiceAccounts: true).
Benennen Sie das Dienstkonto
Bevor Sie auf ein benutzerdefiniertes Objekt verweisen können ServiceAccount, muss ein Clusteradministrator es als vom Benutzer zuweisbar kennzeichnen:
kubectl label serviceaccount <your-service-account> \ sagemaker.amazonaws.com/user-assignable=true \ -n <namespace>
Nur ServiceAccounts mit diesem Label können Inferenzendpunkte darauf verweisen. Dies ist eine Sicherheitskontrolle, um eine unbefugte Rechteerweiterung zu verhindern.
Geben Sie das Dienstkonto in Ihrer Konfiguration an
Fügen Sie das serviceAccountName Feld spec.kubernetes unter Ihrem hinzuInferenceEndpointConfig:
apiVersion: inference.sagemaker.aws.amazon.com/v1 kind: InferenceEndpointConfig metadata: name: my-inference-endpoint namespace: my-namespace spec: kubernetes: serviceAccountName: my-inference-sa # ... rest of your config
Regeln für die Validierung
Der Operator validiert das serviceAccountName Feld sowohl bei Erstellungs- als auch bei Aktualisierungsvorgängen. Ihre Bereitstellung wird mit einem DeploymentFailed Status abgelehnt, wenn eine der folgenden Bedingungen erfüllt ist:
-
Das ServiceAccount existiert nicht im Namespace —
serviceAccountName "X" not found in namespace "Y" -
Dem ServiceAccount fehlt das erforderliche Label —
serviceAccountName "X" is not labeled as user-assignable (requires label sagemaker.amazonaws.com/user-assignable=true) -
Das ServiceAccount ist das System des Betreibers ServiceAccount —
serviceAccountName must not reference the operator's service account
Anmerkung
Alle Container im Inferenz-Pod (Worker, Init-Container und Sidecars) erben die Berechtigungen der angegebenen Container. ServiceAccount Wenn der mit einer Anmerkung versehen ServiceAccount isteks.amazonaws.com/role-arn, erhält der Pod temporäre AWS Anmeldeinformationen für diese IAM-Rolle. Cluster-Administratoren sollten die Bezeichnung ServiceAccounts als vom Benutzer zuweisbar kennzeichnen, nachdem sie die zugehörigen RBAC-Rollen und IAM-Berechtigungen überprüft haben.
Anmerkung
Wenn a gelöscht ServiceAccount wird, während an bereits ausgeführt InferenceEndpointConfig wird, werden vorhandene Pods mit ihren aktuellen Anmeldeinformationen weiter ausgeführt, bis sie neu gestartet werden. Die Erstellung neuer Pods (z. B. während der Skalierung oder Neuplanung) schlägt jedoch fehl, da der Pod nicht ServiceAccount mehr existiert. Der Operator überprüft, ServiceAccount wann das Deployment zum ersten Mal erstellt wird und wann die IEC-Spezifikation aktualisiert wird — er überwacht das nicht kontinuierlich. ServiceAccount Die Aktualisierung der IEC-Spezifikation nach dem Löschen der SA führt zu einem Status. DeploymentFailed
Bewährte Sicherheitsmethoden für benutzerdefinierte Dienstkonten
Wenn Sie eine benutzerdefinierte Version ServiceAccount mit Inferenzendpunkten verwenden, erstellt der HyperPod Inferenzoperator Bereitstellungen in Ihrem Namen. Alle Container im Inferenz-Pod — einschließlich Worker, Init-Container und Sidecars — erben die Berechtigungen der angegebenen Container. ServiceAccount Folgen Sie diesen bewährten Methoden, um Ihren Cluster zu sichern.
Sperren Sie die RBAC-Berechtigungen
-
Erstellen Sie ServiceAccount für jede Inferenz einen eigenen Workload. Verwenden Sie es nicht für ServiceAccounts Workloads, die nichts miteinander zu tun haben.
-
Binden Sie nur die mindestens erforderlichen RBAC-Berechtigungen. Wenn Ihr Init-Container beispielsweise nur aus Amazon S3 lesen muss, ServiceAccount sollte er keine Berechtigungen zum Auflisten oder Ändern von Kubernetes-Ressourcen haben.
# Example: minimal Role for an inference workload that only needs S3 access via IRSA # No Kubernetes API permissions needed — IRSA provides AWS credentials directly apiVersion: v1 kind: ServiceAccount metadata: name: my-inference-sa namespace: my-namespace labels: sagemaker.amazonaws.com/user-assignable: "true" annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<SCOPED_ROLE_NAME> -
Vermeiden Sie es, clusterweite Berechtigungen (ClusterRoleBindings) für die Verwendung durch Inferenz-Pods zu ServiceAccounts gewähren.
Umfang: IRSA IAM-Rollen
-
Vergewissern Sie sich, dass die IAM-Rolle ServiceAccount dem Prinzip der
eks.amazonaws.com/role-arngeringsten Rechte folgt, wenn Sie Anmerkungen zu einem WITH hinzufügen. -
Beschränken Sie die Amazon S3-Berechtigungen auf den spezifischen Bucket und das Präfix, das Ihre Modellgewichte enthält.
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::<YOUR_BUCKET>", "arn:aws:s3:::<YOUR_BUCKET>/<YOUR_MODEL_PREFIX>/*" ] }] } -
Verwenden Sie keine breit angelegten verwalteten Richtlinien, wie z. B.
AmazonS3FullAccessin der Produktion. Verwenden SieAmazonS3ReadOnlyAccessoder eine benutzerdefinierte Richtlinie, die auf Ihren Modell-Bucket zugeschnitten ist.
Schützen Sie das vom Benutzer zuweisbare Label
-
Nur Clusteradministratoren sollten das Label hinzufügen oder entfernen.
sagemaker.amazonaws.com/user-assignable=trueVerwenden Sie Kubernetes RBAC, um einzuschränken, wer ServiceAccount Labels in Ihrem Namespace ändern kann. -
Prüfen Sie die RBAC-Rollen und IAM-Berechtigungen, die mit a verknüpft sind, bevor Sie sie als vom Benutzer zuweisbar kennzeichnen. ServiceAccount
-
Prüfen Sie regelmäßig, welche das Label tragen. ServiceAccounts
user-assignablekubectl get serviceaccounts -n <NAMESPACE> -l sagemaker.amazonaws.com/user-assignable=true -
Stellen Sie sicher, dass Rollen, die keine Administratoren sind
patchupdate, keinecreateVerben für Ressourcen enthalten. ServiceAccount Der Operator validiert dasuser-assignableLabel bei der Bereitstellung, verhindert jedoch nicht, dass nicht autorisierte Benutzer das Label zu a hinzufügen. ServiceAccount Die wichtigste Maßnahme zum Schutz dieses Labels besteht darin, einzuschränken, wer Änderungen ServiceAccounts per RBAC vornehmen kann. Non-admin Benutzer sollten nur Folgendes habengetund darauf zugreifen:list# Example: RBAC Role for non-admin users — read-only access to ServiceAccounts apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: sa-read-only namespace: <NAMESPACE> rules: - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get", "list"]
Wichtig
Der HyperPod Inferenzoperator fungiert als Vermittler, der Bereitstellungen im Namen der Benutzer erstellt. Im Gegensatz zu Standard-Kubernetes-Workloads, bei denen der Aufrufer direkt Pods erstellt, weist der Operator die angegebenen Pods den von ihm erstellten Pods zu. ServiceAccount Das bedeutet, dass alle einem Benutzer zugewiesenen Berechtigungen effektiv jedem zur Verfügung stehen, der in ServiceAccount diesem Namespace einen erstellen kann. InferenceEndpointConfig Stellen Sie sicher, dass RBAC auf Namespace-Ebene steuert, wer Ressourcen erstellen und aktualisieren kann. InferenceEndpointConfig
Laden Sie Modellgewichtungen vorab auf NVMe
Wenn Sie NVMe vor der Bereitstellung auf bestimmten Knoten vorab auffüllen müssen, können Sie einen einmaligen Pod für die Synchronisierung von Amazon S3 verwenden.
Anmerkung
Dieser Ansatz zielt auf einen bestimmten Knoten ab nodeName und funktioniert nicht mit Autoscaling. Verwenden Sie für Autoscaling-Szenarien das Kubernetes-Volume mit Fallback oder Amazon S3 mit Prefetch-Ansätzen, die fehlende Modelle automatisch über die InitContainer-Fallback-Logik behandeln.
-
Erstellen Sie die Preload-Pod-YAML-Datei. Ersetzen Sie die Platzhalterwerte durch Ihre tatsächlichen Ressourcenbezeichner.
cat <<EOF> nvme-s3-copy.yaml apiVersion: v1 kind: Pod metadata: name: nvme-s3-copy namespace: default spec: nodeName: <TARGET_NODE> restartPolicy: Never containers: - name: s3-copy image: public.ecr.aws/aws-cli/aws-cli:latest command: ["/bin/bash", "-c"] args: - | echo "=== Starting S3 sync to NVMe ===" aws s3 sync s3://<YOUR_BUCKET>/<YOUR_MODEL>/ /nvme/<YOUR_MODEL>/ --region <YOUR_REGION> echo "=== Sync complete ===" ls -la /nvme/<YOUR_MODEL>/ du -sh /nvme/<YOUR_MODEL>/ echo "=== Done ===" volumeMounts: - name: nvme-storage mountPath: /nvme serviceAccountName: default volumes: - name: nvme-storage hostPath: path: /opt/dlami/nvme type: Directory EOF -
Wenden Sie den Pod an und überwachen Sie den Fortschritt der Synchronisierung.
kubectl apply -f nvme-s3-copy.yaml kubectl get pod nvme-s3-copy -w kubectl logs nvme-s3-copy -f -
Bereinigen Sie den Pod, nachdem die Synchronisierung abgeschlossen ist.
kubectl delete pod nvme-s3-copy
Namen reservierter Volumes
Der Operator verwaltet mehrere interne Volumes, die nicht über überschrieben werden können. kubernetes.volumes Die Verwendung eines dieser Namen führt zu einer KubernetesVolumeValidationFailed Bedingung.
| # | Name | Zweck |
|---|---|---|
| 1 | shm |
Gemeinsamer Speicher (/dev/shm) für die Kommunikation zwischen Prozessen |
| 2 | model-weights-copy |
RAM-backed EmptyDir wird verwendet wenn prefetchEnabled: true |
| 3 | parallel-copy-configmap |
ConfigMap für paralleles Kopierskript (Prefetch) |
| 4 | lmcache-config |
LMCache-Konfigurationsvolumen |
| 5 | gated-model-downloader-configmap |
ConfigMap für das Download-Skript für Gated Models |
Dinge, die man sich merken sollte
-
Verwenden Sie keine reservierten Datenträgernamen. Der Operator verwaltet mehrere interne Volumes (sieheNamen reservierter Volumes). Die Verwendung eines dieser Namen
kubernetes.volumesführt zu einerKubernetesVolumeValidationFailedBedingung. -
Die Namen der Volumes müssen übereinstimmen. Der Operator leitet den Datenträgernamen von ab
modelVolumeMount.name. Bei Verwendungkubernetes.volumesmussmodelSourceType: kubernetesVolumees ein Volume mit demselben Namen enthalten. -
Hängen Sie Volumes an der richtigen Stelle in Ihrem InitContainer ein. Stellen Sie sicher, dass jedes von Ihnen erstellte Volume im richtigen Pfad in Ihrem InitContainer gemountet ist.
-
Für ist kein benutzerdefiniertes Dienstkonto erforderlich. S3/FSx Wenn Sie keine benutzerdefinierten Dienstkonten erstellen können oder dies nicht möchten, können Sie
modelSourceType: s3oder verwendenfsx. Der Betreiber stellt S3/FSx Volumen automatisch bereit. Sie können dem vom Betreiber verwalteten Speicher weiterhin benutzerdefinierte VolumesinitContainersund Volumes mit Override-Funktion hinzufügen. -
IRSA-Anmeldeinformationen werden in alle Container eingefügt. Wenn Sie ein Dienstkonto mit einer IRSA-Anmerkung einrichten
kubernetes.serviceAccountName, fügt Amazon EKS AWS Anmeldeinformationen (aws-iam-tokenVolume,,AWS_WEB_IDENTITY_TOKEN_FILE) in alle Container einAWS_ROLE_ARN, einschließlich Ihrer benutzerdefinierten InitContainers. -
Bei Verwendung nicht festlegen.
modelLocationkubernetesVolumeDer Lautstärkepfad wird von gesteuertkubernetes.volumes. Das Festlegen desmodelLocationmodelSourceTypekubernetesVolumeZeitpunkts führt zu einem Validierungsfehler. -
Verstehe, wie
model-weightsvs mit Prefetchmodel-weights-copyfunktioniert. WennprefetchEnabled: true, erstellt der Operator zwei modellbezogene Volumen:-
model-weights— das Quell-Volume (von Amazon S3/Amazon FSx PVC oder Ihrem Override) -
model-weights-copy— ein RAM-backed EmptyDir, aus dem der Worker tatsächlich liest
-
-
Während Sie
model-weightsin Ihrer Konfiguration angeben, wannprefetchEnabled: true, wird esmodel-weights-copytatsächlich/opt/ml/modelim Worker-Container gemountet. Wenn Sie einen benutzerdefinierten InitContainer verwenden, stellen Sie sicher, dass Sie die Daten in das aufgerufene Volume kopierenmodel-weights-copy— dort erwartet der Worker, sie zu finden. WennprefetchEnabled: false, gibt es nur ein Volume (benannt nach IhremmodelVolumeMount.name) und es wird direkt dort gemountet./opt/ml/model
Fehlerbehebung
Verwenden Sie diese Debugging-Befehle, wenn Ihre Bereitstellung nicht wie erwartet funktioniert.
-
Überprüfen Sie den
InferenceEndpointConfigStatus, um den allgemeinen Bereitstellungsstatus und etwaige Konfigurationsprobleme zu sehen.kubectl describe InferenceEndpointConfig <ENDPOINT_NAME> -n <NAMESPACE> -
Überprüfen Sie den Kubernetes-Bereitstellungsstatus.
kubectl describe deployment <ENDPOINT_NAME> -n <NAMESPACE> -
Überprüfen Sie den Status aller Kubernetes-Objekte in Ihrem Namespace.
kubectl get pods,svc,deployment,InferenceEndpointConfig,sagemakerendpointregistration -n <NAMESPACE> -
Überprüfen Sie die InitContainer-Protokolle, wenn der Schritt zum Laden des Modells fehlschlägt.
kubectl logs <POD_NAME> -c smart-loader -n <NAMESPACE> -
Wenn die Bereitstellung mit „nicht im Namespace gefunden“ fehlschlägt, überprüfen Sie, ob Folgendes vorhanden ist: ServiceAccount
kubectl get serviceaccount <name> -n <namespace> -
Wenn die Bereitstellung mit der Meldung „nicht als vom Benutzer zuweisbar gekennzeichnet“ fehlschlägt, bitten Sie Ihren Cluster-Administrator, das erforderliche Label hinzuzufügen:
kubectl label serviceaccount <name> sagemaker.amazonaws.com/user-assignable=true -n <namespace> -
Wenn die Bereitstellung mit der Meldung „darf nicht auf das Dienstkonto des Betreibers verweisen“ fehlschlägt, erstellen Sie ein separates Konto ServiceAccount für Ihre Arbeitslast. Sie können nicht den eigenen ServiceAccount Operator des HyperPod Inferenzoperators verwenden.