Morpheus 云部署指南
本云部署指南提供了设置部署 Morpheus 开发者套件所需的最少基础设施和配置的必要说明,并包括利用部署的示例工作流程。
本云部署指南包含以下步骤
NVIDIA 云原生核心堆栈的设置
Morpheus AI 引擎的设置
Morpheus SDK 客户端的设置
用于 MLflow 部署的模型
Morpheus MLflow 的设置
将模型部署到 Triton 推理服务器
创建 Kafka 主题
运行示例工作负载
注意:本指南需要访问 NGC 公共目录。
先决条件
在主机系统安装、配置并满足所有先决条件后,继续执行以下设置步骤。
设置 NGC API 密钥并安装 NGC Registry CLI
首先,您需要设置您的 NGC API 密钥,以便访问所有 Morpheus 组件,使用来自NGC Registry CLI 用户指南的链接说明。
创建 API 密钥后,创建一个包含 API 密钥的环境变量,供本文档后续使用的命令使用
export API_KEY="<NGC_API_KEY>"
接下来,使用来自NGC Registry CLI 用户指南的链接说明,在您的系统上安装和配置 NGC Registry CLI。
为 Morpheus 创建命名空间
接下来,创建一个命名空间和一个命名空间环境变量,以便组织通过云原生核心堆栈部署的 Kubernetes 集群,并将 Morpheus 相关部署与其他项目逻辑分离,使用以下命令
export NAMESPACE="<YOUR_NAMESPACE>"
kubectl create namespace ${NAMESPACE}
安装 Morpheus AI 引擎
Helm chart (morpheus-ai-engine
) 提供执行某些 Morpheus 工作流程所需的辅助组件,被称为 Morpheus AI 引擎。 它包含以下组件
来自 NVIDIA 的 Triton 推理服务器 [ ai-engine ],用于处理推理请求。
Kafka Broker [ broker ],用于消费和发布消息。
Zookeeper [ zookeeper ],用于维护 Kafka Brokers 之间的协调。
按照以下步骤安装 Morpheus AI 引擎
helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-ai-engine-24.10.tgz --username='$oauthtoken' --password=$API_KEY --untar
helm install --set ngc.apiKey="$API_KEY" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-ai-engine
安装完成后,您可以使用以下命令验证 Kubernetes Pod 是否成功运行
kubectl -n $NAMESPACE get all
输出
pod/ai-engine-65f59ddcf7-mdmdt 1/1 Running 0 54s
pod/broker-76f7c64dc9-6rldp 1/1 Running 1 54s
pod/zookeeper-87f9f4dd-znjnb 1/1 Running 0 54s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ai-engine ClusterIP 10.109.56.231 <none> 8000/TCP,8001/TCP,8002/TCP 54s
service/broker ClusterIP 10.101.103.250 <none> 9092/TCP 54s
service/zookeeper ClusterIP 10.110.55.141 <none> 2181/TCP 54s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ai-engine 1/1 1 1 54s
deployment.apps/broker 1/1 1 1 54s
deployment.apps/zookeeper 1/1 1 1 54s
NAME DESIRED CURRENT READY AGE
replicaset.apps/ai-engine-65f59ddcf7 1 1 1 54s
replicaset.apps/broker-76f7c64dc9 1 1 1 54s
replicaset.apps/zookeeper-87f9f4dd 1 1 1 54s
安装 Morpheus SDK 客户端
运行以下命令,将 Morpheus SDK 客户端(称为 Helm chart morpheus-sdk-client
)拉取到您的实例上
helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-sdk-client-24.10.tgz --username='$oauthtoken' --password=$API_KEY --untar
睡眠模式下的 Morpheus SDK 客户端
在睡眠模式下安装 Morpheus SDK 客户端 Pod,以便将其示例数据集和模型从容器复制到其他 Pod 可以访问的共享位置。 如果未提供 sdk.args
,则以下命令中使用 chart 中的默认值 /bin/sleep infinity
。
helm install --set ngc.apiKey="$API_KEY" \
--namespace $NAMESPACE \
helper \
morpheus-sdk-client
检查 Pod 的状态,确保它已启动并正在运行。
kubectl -n $NAMESPACE get all | grep sdk-cli-helper
输出
pod/sdk-cli-helper 1/1 Running 0 41s
用于 MLflow 部署的模型
连接到 sdk-cli-helper 容器,并将模型复制到 /common
,该目录映射到主机上的 /opt/morpheus/common
,MLflow 将在此处访问模型文件。
kubectl -n $NAMESPACE exec sdk-cli-helper -- cp -RL /workspace/models /common
安装 Morpheus MLflow
Morpheus MLflow Helm chart 提供带有 Triton 插件的 MLflow 服务器,用于从 Morpheus AI 引擎部署、更新和删除模型。 可以使用 NodePort 30500
访问 MLflow 服务器 UI。 按照以下步骤安装 Morpheus MLflow
helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-mlflow-24.10.tgz --username='$oauthtoken' --password=$API_KEY --untar
helm install --set ngc.apiKey="$API_KEY" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-mlflow
注意:如果默认端口已被分配,Helm 将抛出以下错误。 通过调整 morpheus-mlflow/values.yaml
文件中的 dashboardPort
值选择替代端口,删除之前的版本并重新安装。
Error: Service "mlflow" is invalid: spec.ports[0].nodePort: Invalid value: 30500: provided port is already allocated
安装完成后,您可以使用以下命令验证 MLflow Pod 是否成功运行
kubectl -n $NAMESPACE get all | grep pod/mlflow
输出
pod/mlflow-6d98 1/1 Running 0 39s
模型部署
连接到 MLflow Pod,将模型发布到 MLflow 服务器,然后将其部署到 Morpheus AI 引擎
kubectl -n $NAMESPACE exec -it deploy/mlflow -- bash
(mlflow) root@mlflow-6d98:/mlflow#
Important
:当存在 (mlflow)
时,命令直接在容器内。
首先,让我们在开始部署模型之前,检查一下我们将用于与 MLflow Triton 插件通信的命令的语法。 发布模型到 MLflow 服务器的形式为
(mlflow) root@mlflow-6d98:/mlflow# python publish_model_to_mlflow.py \
--model_name <REF_MODEL_NAME> \
--model_directory <MODEL_DIR_PATH> \
--flavor <MODEL_FLAVOR>
将模型部署到 Morpheus AI 引擎
(mlflow) root@mlflow-6d98:/mlflow# mlflow deployments create -t triton \
--flavor <MODEL_FLAVOR> \
--name <REF_MODEL_NAME> \
-m models:/<REF_MODEL_NAME>/1 \
-C "version=<VERSION_NUMBER>"
更新 Morpheus AI 引擎中已部署的模型
(mlflow) root@mlflow-6d98:/mlflow# mlflow deployments update -t triton \
--flavor <MODEL_FLAVOR> \
--name <REF_MODEL_NAME>/<EXISTING_VERSION_NUMBER> \
-m models:/<REF_MODEL_NAME>/<DESIRED_VERSION_NUMBER>
从 Morpheus AI 引擎中删除已部署的模型
(mlflow) root@mlflow-6d98:/mlflow# mlflow deployments delete -t triton \
--name <REF_MODEL_NAME>/<VERSION_NUMBER>
现在我们已经弄清楚如何部署模型,让我们继续下一步。 现在是时候部署相关模型了,这些模型已复制到 /opt/morpheus/common/models
,该目录绑定到 MLflow Pod 内的 /common/models
。
(mlflow) root@mlflow-6d98:/mlflow# ls -lrt /common/models
输出
drwxr-xr-x 3 ubuntu ubuntu 4096 Apr 13 23:47 sid-minibert-onnx
drwxr-xr-x 2 root root 4096 Apr 21 17:09 abp-models
drwxr-xr-x 4 root root 4096 Apr 21 17:09 datasets
drwxr-xr-x 4 root root 4096 Apr 21 17:09 fraud-detection-models
drwxr-xr-x 2 root root 4096 Apr 21 17:09 dfp-models
drwxr-xr-x 3 root root 4096 Apr 21 17:10 mlflow
drwxr-xr-x 2 root root 4096 Apr 21 17:10 log-parsing-models
drwxr-xr-x 2 root root 4096 Apr 21 17:10 phishing-models
drwxr-xr-x 2 root root 4096 Apr 21 17:10 sid-models
drwxr-xr-x 8 root root 4096 Apr 21 17:10 training-tuning-scripts
drwxr-xr-x 7 root root 4096 Apr 21 17:10 validation-inference-scripts
drwxr-xr-x 7 root root 4096 Apr 21 17:10 triton-model-repo
-rw-r--r-- 1 root root 4213 Apr 21 17:10 README.md
-rw-r--r-- 1 root root 4862 Apr 21 17:10 model_cards.csv
-rw-r--r-- 1 root root 1367 Apr 21 17:10 model-information.csv
发布并部署 sid-minibert-onnx 模型
(mlflow) root@mlflow-6d98:/mlflow# python publish_model_to_mlflow.py \
--model_name sid-minibert-onnx \
--model_directory /common/models/triton-model-repo/sid-minibert-onnx \
--flavor triton
(mlflow) root@mlflow-6d98:/mlflow# mlflow deployments create -t triton \
--flavor triton \
--name sid-minibert-onnx \
-m models:/sid-minibert-onnx/1 \
-C "version=1"
发布并部署 phishing-bert-onnx 模型
(mlflow) root@mlflow-6d98:/mlflow# python publish_model_to_mlflow.py \
--model_name phishing-bert-onnx \
--model_directory /common/models/triton-model-repo/phishing-bert-onnx \
--flavor triton
(mlflow) root@mlflow-6d98:/mlflow# mlflow deployments create -t triton \
--flavor triton \
--name phishing-bert-onnx \
-m models:/phishing-bert-onnx/1 \
-C "version=1"
发布并部署 abp-nvsmi-xgb 模型
(mlflow) root@mlflow-6d98:/mlflow# python publish_model_to_mlflow.py \
--model_name abp-nvsmi-xgb \
--model_directory /common/models/triton-model-repo/abp-nvsmi-xgb \
--flavor triton
(mlflow) root@mlflow-6d98:/mlflow# mlflow deployments create -t triton \
--flavor triton \
--name abp-nvsmi-xgb \
-m models:/abp-nvsmi-xgb/1 \
-C "version=1"
退出容器
(mlflow) root@mlflow-6d98:/mlflow# exit
验证模型部署
运行以下命令以验证模型是否已成功部署在 AI 引擎上
kubectl -n $NAMESPACE logs deploy/ai-engine
输出
I1202 14:09:03.098085 1 api.cu:79] TRITONBACKEND_ModelInitialize: abp-nvsmi-xgb (version 1)
I1202 14:09:03.101910 1 api.cu:123] TRITONBACKEND_ModelInstanceInitialize: abp-nvsmi-xgb_0 (GPU device 0)
I1202 14:09:03.543719 1 model_instance_state.cu:101] Using GPU for predicting with model 'abp-nvsmi-xgb_0'
I1202 14:09:03.563425 1 api.cu:123] TRITONBACKEND_ModelInstanceInitialize: abp-nvsmi-xgb_0 (GPU device 1)
I1202 14:09:03.980621 1 model_instance_state.cu:101] Using GPU for predicting with model 'abp-nvsmi-xgb_0'
I1202 14:09:03.981678 1 model_repository_manager.cc:1183] successfully loaded 'abp-nvsmi-xgb' version 1
创建 Kafka 主题
我们将需要创建 Kafka 主题,用于输入和输出数据,以运行一些管道示例。
检查是否已存在任何 Kafka 主题。 如果存在任何主题,您可以删除之前的主题或重新使用它们。
kubectl -n $NAMESPACE exec deploy/broker -c broker -- kafka-topics.sh --list --zookeeper zookeeper:2181
运行以下命令两次,一次创建输入主题,再次创建输出主题,确保输入主题和输出主题具有不同的名称
kubectl -n $NAMESPACE exec deploy/broker -c broker -- kafka-topics.sh \
--create \
--bootstrap-server broker:9092 \
--replication-factor 1 \
--partitions 3 \
--topic <YOUR_KAFKA_TOPIC>
本节介绍在 Morpheus 上运行的示例工作流程。 提供了四个示例管道。
执行网络钓鱼检测(PD)的 NLP 管道。
执行敏感信息检测(SID)的 NLP 管道。
执行异常行为分析(ABP)的 FIL 管道。
为每个管道提供了多个命令选项,具有不同的数据输入/输出方法,范围从本地文件到 Kafka 主题。
我们建议一次只部署一个管道。 要删除之前部署的管道,请运行以下命令
helm delete -n $NAMESPACE <YOUR_RELEASE_NAME>
要将消息发布到 Kafka 主题,我们需要将数据集复制到可以从主机访问的位置。
kubectl -n $NAMESPACE exec sdk-cli-helper -- cp -R /workspace/examples/data /common
有关命令的更多信息,请参阅Morpheus CLI 概述和构建管道文档。
注意:在运行示例管道之前,请确保满足以下条件
确保已部署管道特定的模型。
已创建输入和输出 Kafka 主题。
建议在
/opt/morpheus/common/data
下创建一个输出目录,该目录绑定到/common/data
(pod/容器),用于存储推理或验证结果。将 <YOUR_OUTPUT_DIR> 替换为您的目录名称。
将 <YOUR_INPUT_KAFKA_TOPIC> 替换为您的输入 Kafka 主题名称。
将 <YOUR_OUTPUT_KAFKA_TOPIC> 替换为您的输出 Kafka 主题名称。
将 <YOUR_RELEASE_NAME> 替换为您想要的名称。
作为参考,提供了 Morpheus SDK 客户端安装管道命令模板。 我们将在示例工作流程部分进一步检查这一点,但现在,让我们继续下一步。
helm install --set ngc.apiKey="$API_KEY" \
--set sdk.args="<REPLACE_RUN_PIPELINE_COMMAND_HERE>" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-sdk-client
运行 NLP 网络钓鱼检测管道
以下网络钓鱼检测管道示例使用预训练的 NLP 模型来分析电子邮件(正文)并确定是网络钓鱼还是良性。 以下显示的示例数据用作管道的输入。
{"data":"Abedin Huma <AbedinH@state.gov>Wednesday July 15 2009 1:44 PMRe: ArtWill be off campus at meetingBut you should definitely come I think they have found some good things."}
{"data":"See NIMills Cheryl D <MillsCD@state.gov>Saturday December 112010 1:36 PMFw: S is calling Leahy today - thx for all the help; advise if a diff no for him today"}
{"data":"Here is Draft"}
{"data":"Ok"}
管道示例,用于从文件读取数据,使用 phishing-bert-onnx
模型运行推理,并将推理结果写入指定的输出文件
helm install --set ngc.apiKey="$API_KEY" \
--set sdk.args="morpheus --log_level=DEBUG run \
--edge_buffer_size=4 \
--pipeline_batch_size=1024 \
--model_max_batch_size=32 \
pipeline-nlp \
--model_seq_length=128 \
--labels_file=data/labels_phishing.txt \
from-file --filename=./examples/data/email.jsonlines \
monitor --description 'FromFile Rate' --smoothing=0.001 \
deserialize \
preprocess --vocab_hash_file=data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \
monitor --description 'Preprocess Rate' \
inf-triton --model_name=phishing-bert-onnx --server_url=ai-engine:8000 --force_convert_inputs=True \
monitor --description 'Inference Rate' --smoothing=0.001 --unit inf \
add-class --label=is_phishing --threshold=0.7 \
serialize \
to-file --filename=/common/data/<YOUR_OUTPUT_DIR>/phishing-bert-onnx-output.jsonlines --overwrite" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-sdk-client
当管道成功运行时,输出目录中将出现一个输出文件 phishing-bert-onnx-output.jsonlines
。
管道示例,用于从输入 Kafka 主题读取消息,使用 phishing-bert-onnx
模型运行推理,并将推理结果写入输出 Kafka 主题
helm install --set ngc.apiKey="$API_KEY" \
--set sdk.args="morpheus --log_level=DEBUG run \
--edge_buffer_size=4 \
--pipeline_batch_size=1024 \
--model_max_batch_size=32 \
pipeline-nlp \
--model_seq_length=128 \
--labels_file=data/labels_phishing.txt \
from-kafka --input_topic <YOUR_INPUT_KAFKA_TOPIC> --bootstrap_servers broker:9092 \
monitor --description 'FromKafka Rate' --smoothing=0.001 \
deserialize \
preprocess --vocab_hash_file=data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \
monitor --description 'Preprocess Rate' \
inf-triton --force_convert_inputs=True --model_name=phishing-bert-onnx --server_url=ai-engine:8000 \
monitor --description='Inference Rate' --smoothing=0.001 --unit inf \
add-class --label=is_phishing --threshold=0.7 \
serialize --exclude '^ts_' \
to-kafka --output_topic <YOUR_OUTPUT_KAFKA_TOPIC> --bootstrap_servers broker:9092" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-sdk-client
在启动管道之前,请确保您创建了输入和输出 Kafka 主题。 管道启动后,使用以下命令从下载的示例中将各个对应的数据文件加载到选定的输入主题中
kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \
--broker-list broker:9092 \
--topic <YOUR_INPUT_KAFKA_TOPIC> < \
<YOUR_INPUT_DATA_FILE_PATH_EXAMPLE: /opt/morpheus/common/data/email.jsonlines>
注意:这应该仅用于通过此开发者套件进行开发。 从文件加载到 Kafka 不应用于 Morpheus 的生产部署。
运行 NLP 敏感信息检测管道
以下敏感信息检测管道示例使用预训练的 NLP 模型来摄取和分析 PCAP(数据包捕获网络流量)输入示例数据,如下例所示,以检查跨数据中心网络的 IP 流量。
{"timestamp": 1616380971990, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 73\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50410", "dest_port": "80", "flags": "24", "is_pii": false}
{"timestamp": 1616380971991, "host_ip": "10.188.40.56", "data_len": "139", "data": "\"{\\\"markerEmail\\\": \\\"FuRLFaAZ identify benefit BneiMvCZ join 92694759\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.25", "src_port": "50410", "dest_port": "80", "flags": "24", "is_pii": false}
管道示例,用于从文件读取数据,使用 sid-minibert-onnx
模型运行推理,并将推理结果写入指定的输出文件
helm install --set ngc.apiKey="$API_KEY" \
--set sdk.args="morpheus --log_level=DEBUG run \
--edge_buffer_size=4 \
--pipeline_batch_size=1024 \
--model_max_batch_size=32 \
pipeline-nlp \
--model_seq_length=256 \
from-file --filename=./examples/data/pcap_dump.jsonlines \
monitor --description 'FromFile Rate' --smoothing=0.001 \
deserialize \
preprocess --vocab_hash_file=data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \
monitor --description='Preprocessing rate' \
inf-triton --force_convert_inputs=True --model_name=sid-minibert-onnx --server_url=ai-engine:8000 \
monitor --description='Inference rate' --smoothing=0.001 --unit inf \
add-class \
serialize --exclude '^ts_' \
to-file --filename=/common/data/<YOUR_OUTPUT_DIR>/sid-minibert-onnx-output.jsonlines --overwrite" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-sdk-client
当管道成功运行时,输出目录中将出现一个输出文件 sid-minibert-onnx-output.jsonlines。
管道示例,用于从输入 Kafka 主题读取消息,使用 sid-minibert-onnx 模型运行推理,并将推理结果写入输出 Kafka 主题
helm install --set ngc.apiKey="$API_KEY" \
--set sdk.args="morpheus --log_level=DEBUG run \
--edge_buffer_size=4 \
--pipeline_batch_size=1024 \
--model_max_batch_size=32 \
pipeline-nlp \
--model_seq_length=256 \
from-kafka --input_topic <YOUR_INPUT_KAFKA_TOPIC> --bootstrap_servers broker:9092 \
monitor --description 'FromKafka Rate' --smoothing=0.001 \
deserialize \
preprocess --vocab_hash_file=data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \
monitor --description='Preprocessing Rate' \
inf-triton --force_convert_inputs=True --model_name=sid-minibert-onnx --server_url=ai-engine:8000 \
monitor --description='Inference Rate' --smoothing=0.001 --unit inf \
add-class \
serialize --exclude '^ts_' \
to-kafka --output_topic <YOUR_OUTPUT_KAFKA_TOPIC> --bootstrap_servers broker:9092" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-sdk-client
在启动管道之前,请确保您创建了输入和输出 Kafka 主题。 管道启动后,使用以下命令从下载的示例中将各个对应的数据文件加载到选定的输入主题中
kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \
--broker-list broker:9092 \
--topic <YOUR_INPUT_KAFKA_TOPIC> < \
<YOUR_INPUT_DATA_FILE_PATH_EXAMPLE: ${HOME}/examples/data/pcap_dump.jsonlines>
注意:这应该仅用于通过此开发者套件进行开发。 从文件加载到 Kafka 不应用于 Morpheus 的生产部署。
运行 FIL 异常行为分析管道
以下异常行为分析管道示例使用预训练的 FIL 模型来摄取和分析 NVIDIA 系统管理界面 (nvidia-smi
) 日志,如下例所示,作为输入示例数据,以识别 GPU 设备上的加密货币挖矿活动。
{"nvidia_smi_log.gpu.pci.tx_util": "0 KB/s", "nvidia_smi_log.gpu.pci.rx_util": "0 KB/s", "nvidia_smi_log.gpu.fb_memory_usage.used": "3980 MiB", "nvidia_smi_log.gpu.fb_memory_usage.free": "12180 MiB", "nvidia_smi_log.gpu.bar1_memory_usage.total": "16384 MiB", "nvidia_smi_log.gpu.bar1_memory_usage.used": "11 MiB", "nvidia_smi_log.gpu.bar1_memory_usage.free": "16373 MiB", "nvidia_smi_log.gpu.utilization.gpu_util": "0 %", "nvidia_smi_log.gpu.utilization.memory_util": "0 %", "nvidia_smi_log.gpu.temperature.gpu_temp": "61 C", "nvidia_smi_log.gpu.temperature.gpu_temp_max_threshold": "90 C", "nvidia_smi_log.gpu.temperature.gpu_temp_slow_threshold": "87 C", "nvidia_smi_log.gpu.temperature.gpu_temp_max_gpu_threshold": "83 C", "nvidia_smi_log.gpu.temperature.memory_temp": "57 C", "nvidia_smi_log.gpu.temperature.gpu_temp_max_mem_threshold": "85 C", "nvidia_smi_log.gpu.power_readings.power_draw": "61.77 W", "nvidia_smi_log.gpu.clocks.graphics_clock": "1530 MHz", "nvidia_smi_log.gpu.clocks.sm_clock": "1530 MHz", "nvidia_smi_log.gpu.clocks.mem_clock": "877 MHz", "nvidia_smi_log.gpu.clocks.video_clock": "1372 MHz", "nvidia_smi_log.gpu.applications_clocks.graphics_clock": "1312 MHz", "nvidia_smi_log.gpu.applications_clocks.mem_clock": "877 MHz", "nvidia_smi_log.gpu.default_applications_clocks.graphics_clock": "1312 MHz", "nvidia_smi_log.gpu.default_applications_clocks.mem_clock": "877 MHz", "nvidia_smi_log.gpu.max_clocks.graphics_clock": "1530 MHz", "nvidia_smi_log.gpu.max_clocks.sm_clock": "1530 MHz", "nvidia_smi_log.gpu.max_clocks.mem_clock": "877 MHz", "nvidia_smi_log.gpu.max_clocks.video_clock": "1372 MHz", "nvidia_smi_log.gpu.max_customer_boost_clocks.graphics_clock": "1530 MHz", "nvidia_smi_log.gpu.processes.process_info.0.process_name": "python", "nvidia_smi_log.gpu.processes.process_info.1.process_name": "tritonserver", "hostname": "ip-10-100-8-98", "timestamp": 1615542360.9566503}
管道示例,用于从文件读取数据,使用 abp-nvsmi-xgb
模型运行推理,并将推理结果写入指定的输出文件。
helm install --set ngc.apiKey="$API_KEY" \
--set sdk.args="morpheus --log_level=DEBUG run \
--edge_buffer_size=4 \
--pipeline_batch_size=1024 \
--model_max_batch_size=64 \
pipeline-fil --columns_file=data/columns_fil.txt \
from-file --filename=./examples/data/nvsmi.jsonlines \
monitor --description 'FromFile Rate' --smoothing=0.001 \
deserialize \
preprocess \
monitor --description='Preprocessing Rate' \
inf-triton --model_name=abp-nvsmi-xgb --server_url=ai-engine:8000 --force_convert_inputs=True \
monitor --description='Inference Rate' --smoothing=0.001 --unit inf \
add-class \
serialize --exclude '^nvidia_smi_log' --exclude '^ts_' \
to-file --filename=/common/data/<YOUR_OUTPUT_DIR>/abp-nvsmi-xgb-output.jsonlines --overwrite" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-sdk-client
管道示例,用于从输入 Kafka 主题读取消息,使用 abp-nvsmi-xgb
模型运行推理,并将推理结果写入输出 Kafka 主题
helm install --set ngc.apiKey="$API_KEY" \
--set sdk.args="morpheus --log_level=DEBUG run \
--pipeline_batch_size=1024 \
--model_max_batch_size=64 \
pipeline-fil --columns_file=data/columns_fil.txt \
from-kafka --input_topic <YOUR_INPUT_KAFKA_TOPIC> --bootstrap_servers broker:9092 \
monitor --description 'FromKafka Rate' --smoothing=0.001 \
deserialize \
preprocess \
monitor --description='Preprocessing Rate' \
inf-triton --model_name=abp-nvsmi-xgb --server_url=ai-engine:8000 --force_convert_inputs=True \
monitor --description='Inference Rate' --smoothing=0.001 --unit inf \
add-class \
serialize --exclude '^nvidia_smi_log' \ --exclude '^ts_' \
to-kafka --output_topic <YOUR_OUTPUT_KAFKA_TOPIC> --bootstrap_servers broker:9092" \
--namespace $NAMESPACE \
<YOUR_RELEASE_NAME> \
morpheus-sdk-client
在启动管道之前,请确保您创建了输入和输出 Kafka 主题。 管道启动后,使用以下命令从下载的示例中将各个对应的数据文件加载到选定的输入主题中
kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \
--broker-list broker:9092 \
--topic <YOUR_INPUT_KAFKA_TOPIC> < \
<YOUR_INPUT_DATA_FILE_PATH_EXAMPLE: ${HOME}/examples/data/nvsmi.jsonlines>
注意:这应该仅用于通过此开发者套件进行开发。 从文件加载到 Kafka 不应用于 Morpheus 的生产部署。
验证正在运行的管道
将 SDK 客户端部署以运行管道后,您可以使用以下命令检查 Pod 的状态
kubectl -n $NAMESPACE get pods sdk-cli-<RELEASE_NAME>
NAME READY STATUS RESTARTS AGE
sdk-cli-6c9575f648-gfdd2 1/1 Running 0 3m23s
然后检查管道是否成功运行,使用以下命令
kubectl -n $NAMESPACE logs sdk-cli-<RELEASE_NAME>
输出
Configuring Pipeline via CLI
Starting pipeline via CLI... Ctrl+C to Quit
Preprocessing rate: 7051messages [00:09, 4372.75messages/s]
Inference rate: 7051messages [00:04, 4639.40messages/s]
先决条件
具有创建/修改 EC2 实例能力的 AWS 账户
AWS EC2 G4 实例,配备 T4 或 V100 GPU,至少 64GB RAM,8 核 CPU 和 100 GB 存储空间。
为 AWS 安装云原生核心堆栈
在您的 AWS EC2 G4 实例上,按照链接文档中的说明安装NVIDIA 的 AWS 云原生核心堆栈。
先决条件
NVIDIA 认证系统
NVIDIA Volta GPU 或更新版本(计算能力 >= 7.0)
Ubuntu 20.04 LTS 或更新版本
在您的 NVIDIA 认证系统上,按照链接文档中的说明安装NVIDIA 云原生核心堆栈。
列出可用的 Kafka 主题。
kubectl -n $NAMESPACE exec deploy/broker -c broker -- kafka-topics.sh \
--list --zookeeper zookeeper:2181
创建具有单个复制因子的分区 Kafka 主题。
kubectl -n $NAMESPACE exec deploy/broker -c broker -- kafka-topics.sh \
--create \
--bootstrap-server broker:9092 \
--replication-factor 1 \
--partitions 1 \
--topic <YOUR_KAFKA_TOPIC>
将数据从文件加载到 Kafka 主题
kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \
--broker-list broker:9092 \
--topic <YOUR_KAFKA_TOPIC> < \
<YOUR_INPUT_DATA_FILE>
注意:这应该仅用于通过此开发者套件进行开发。 从文件加载到 Kafka 不应用于 Morpheus 的生产部署。
从 Kafka 主题消费消息
kubectl -n $NAMESPACE exec deploy/broker -c broker -- kafka-console-consumer.sh \
--bootstrap-server broker:9092 \
--topic <YOUR_KAFKA_TOPIC> \
--group <YOUR_CONSUMER_GROUP_ID>
删除 Kafka 主题
kubectl -n $NAMESPACE exec deploy/broker -c broker -- kafka-topics.sh \
--delete --zookeeper zookeeper:2181 \
--topic <YOUR_KAFKA_TOPIC>
有关如何使用 Morpheus Python API 自定义和运行您自己的优化 AI 管道的更多信息,请参阅以下文档。
本节列出了您在使用 Morpheus 或其支持组件时可能遇到的问题的解决方案。
常见问题
重启后模型卸载
当 Pod 重新启动时,K8s 不会自动加载模型。 由于模型以显式模式使用 MLflow 部署到 ai-engine,因此我们必须使用模型部署流程手动重新部署它们。
AI 引擎仅 CPU 模式
服务器重启后,k8s 上的 ai-engine Pod 可能会在 GPU 运算符基础设施可用之前启动,使其“认为”没有安装驱动程序(即,仅 CPU 模式)。
提高管道消息处理速率
需要考虑以下设置
为工作流程提供最佳线程数 (
—num threads
),因为线程过多或过少都会影响管道性能。考虑调整
pipeline_batch_size
和model_max_batch_size
Kafka 消息偏移提交失败
错误消息
1649207839.253|COMMITFAIL|rdkafka#consumer-2| [thrd:main]: Offset commit (manual) failed for 1/1 partition(s) in join-state wait-unassign-call: Broker: Unknown member: topic[0]@112071(Broker: Unknown member)
问题:如果独立 Kafka 集群从生产者接收到显著的消息吞吐量,则可能会发生此错误。
解决方案:重新安装 Morpheus 工作流程并减少 Kafka 主题的消息保留时间和消息生成速率。