高级用法#
多 GPU 支持#
MAISI Nim 支持多 GPU 配置,以增强性能并加速处理。利用多个 GPU 的逻辑如下:
如果
num_output_samples
参数设置为N
并且有N
个可见的 GPU,则将并行处理N
个图像,每个 GPU 处理一个图像。如果
num_output_samples
参数大于 GPU 的数量,例如,如果 GPU 的数量为M
且N > M
,则将并行处理M
个图像。剩余的图像将被排队,并在 GPU 可用时进行处理。
请注意,系统上可用的 GPU 数量已正确配置且可见。 例如,您可以在运行 Docker 容器时设置 CUDA 可见设备,以指定应使用哪些 GPU
docker run --gpus "all" -e CUDA_VISIBLE_DEVICES=0,1 \
--rm -it -e NGC_API_KEY=$NGC_API_KEY --net=host \
-e GENERATE_IMAGE_TIMEOUT=3600 nvcr.io/nim/nvidia/maisi:1.0.0
注意: 如果您使用
--gpus "device=2,3"
而不是--gpus "all"
,请注意,GPU 在容器内会被重新编号。 具体来说,主机上的 GPU 2 变为容器中的 GPU 0,主机上的 GPU 3 变为容器中的 GPU 1。 因此,您仍然应该设置CUDA_VISIBLE_DEVICES=0,1
以正确映射 GPU。
将数据写入 Blob 存储#
要将生成的图像和掩码写入 Blob 存储,应指定 pre_signed_url
参数。pre_signed_url
参数是一个预签名 URL,允许您安全地将文件上传到 Blob 存储服务(例如 AWS S3),而无需直接访问您的存储凭据。此 URL 是使用特定权限和过期时间生成的,确保上传只能在定义的时间范围内以及使用指定的权限进行。
生成预签名 URL 示例#
不同的云提供商有不同的方法来生成预签名 URL。 请查看他们的官方文档以了解详细信息。这里我们以 AWS S3 为例。
您可以使用 Python 中的 boto3
库为 S3 存储桶生成预签名 URL。如果您使用 AWS CloudShell,则 boto3
已预先安装,并且凭据已自动配置。对于本地环境,请确保您的 AWS 凭据已正确配置。 有关更多详细信息,请参阅官方文档。
以下是如何使用 Python 中的 boto3
为上传对象到 S3 存储桶生成预签名 URL 的示例
import boto3
# Create an S3 client
s3_client = boto3.client('s3')
# Define the bucket name, object key, and expiration time
bucket_name = '<bucket name>'
# optionally you can add a prefix to represent a folder structure like '<uploaded folder>/<uploaded filename>.zip'
object_key = '<uploaded filename>.zip'
expiration = 36000 # The URL expires in 10 hours
# Generate a pre-signed URL for uploading an object
pre_signed_url = s3_client.generate_presigned_url(
'put_object',
Params={'Bucket': bucket_name, 'Key': object_key},
ExpiresIn=expiration
)
# Print the pre-signed URL
print(pre_signed_url)
在 Payload 中指定预签名 URL#
获得有效的预签名 URL 后,您可以在请求 payload 中指定 pre_signed_url
,例如
import requests
base_url = "https://127.0.0.1:8000"
payload = {
"num_output_samples": 1,
"body_region": ["abdomen"],
"anatomy_list": ["liver", "spleen"],
"output_size": [512, 512, 512],
"spacing": [1.0, 1.0, 1.0],
"image_output_ext": ".nii.gz",
"label_output_ext": ".nii.gz",
"pre_signed_url": "https://<example>.s3.amazonaws.com/...",
}
generation_response = requests.post(f"{base_url}/v1/maisi/run", json=payload)
if generation_response.status_code == 200:
print("Files generated successfully and uploaded to the provided pre-signed URL!")
else:
print("Failed to generate files. Status code: ", generation_response.status_code)
print("Response: ", generation_response.json())
将数据写入本地挂载目录#
要将生成的图像和掩码写入本地挂载目录,应在请求 payload 中指定 local_working_dir
参数。要启用此功能,在运行 NIM 容器时必须挂载本地目录
docker run --gpus all --rm -it -e NGC_API_KEY=$NGC_API_KEY --net=host -v /path/on/host:/path/in/container nvcr.io/nim/nvidia/maisi:1.0.0
请确保该目录具有正确的权限,以允许 Docker 容器写入它(例如,对其执行 sudo chmod -R 777
)。如果目录是 /path/on/host/results/
,那么在推理请求 payload 中,local_working_dir
应为 /path/in/container/results/
。
设置超时#
为图像生成设置自定义超时时间(默认为 1800 秒)
docker run --gpus all --rm -it -e NGC_API_KEY=$NGC_API_KEY \
-e GENERATE_IMAGE_TIMEOUT=3600 --net=host nvcr.io/nim/nvidia/maisi:1.0.0
更改端口#
FastAPI 应用程序的默认端口是 8000
,在运行容器时添加环境变量 NIM_HTTP_API_PORT
可以更改它。例如
docker run --gpus all --rm -it -e NGC_API_KEY=$NGC_API_KEY \
-e NIM_HTTP_API_PORT=12000 --net=host nvcr.io/nim/nvidia/maisi:1.0.0
注意: 某些端口(例如 8001、8002 和 8080)可能已被容器内的其他服务使用。 避免将
NIM_HTTP_API_PORT
设置为这些端口以防止冲突。