使用 NVIDIA Clara Holoscan 加速進行放射學與放射治療的多器官渲染作業

作者 NVIDIA

NVIDIA Clara Holoscan 的醫療器材人工智慧運算平台,結合了用於低延遲感測器及網路連接的硬體系統、用於資料處理及人工智慧的最佳化函式庫,以及用於運行從嵌入式裝置、邊緣到雲端的串流媒體、影像及其他應用程式的核心微服務。

圖 1:NVIDIA Clara Holoscan

NVIDIA Clara Holoscan 流暢橋接了智慧型儀器與資料中心,支援軟體定義醫療器材的訊號處理、人工智慧推論及視覺化工作流。它的應用場合涵蓋放射學、微創手術、機器人手術、患者監控等領域。 這個完全加速的框架用以開發即時多模式應用程式,使用最佳化的微服務容器、無程式碼設計工具和範例應用程式。

在資料中心或雲端環境中,具有擴充性的 NVIDIA Clara Holoscan 架構能從嵌入式裝置和 NVIDIA 認證邊緣伺服器擴展到 NVIDIA DGX 系統。您可以使用該平台,視需要增減醫療器材的運算和輸入/輸出功能,在延遲性、成本、空間、電源和頻寬的需求間取得平衡。

放射治療

放射治療是 NVIDIA Clara Holoscan 的其中一項重要應用場合,在進行放射治療的過程中,需要處理影像來分割要治療的器官和腫瘤。單獨分割相鄰器官有助於辨識腫瘤及其大小。醫師還能用它來建立一個詳細準確的 3D 影像地圖,可繪製出輻射光束通過其他器官的最佳軌跡,將影響性降至最低。

放射治療系統搭配 3D 模型甚至可即時調整患者解剖結構的變化。手動分割多個器官的影像是件極為耗時的事,不過使用人工智慧卻能顯著加快分割速度。圖 2 顯示使用 NVIDIA Clara Holoscan 部署 3D 多器官分割應用程式的架構。

圖 2:使用 NVIDIA Clara Holoscan 進行 3D 多器官分割的部署架構

下文介紹如何建立與部署一個以 UNETR 為基礎的 3D 多器官分割應用程式(UNETR 是一個以 transformer 為基礎的 3D 分割模型)。

MONAI 部署 UNETR 應用程式

UNEt transformer(UNETR)模型架構的新穎之處,在於以 transformer 為基礎的編碼器可學習輸入體積的序列表示,有效取得全域多尺度資訊。transformer 編碼器通過不同解析度的跳躍連接(skip connection)直接連接到解碼器,以運算最終的語義分段輸出。

使用 Multi-Atlas Labeling Beyond the Cranial Vault(BTCV)資料集測試 UNETR 模型的有效性,該資料集內有 30 名受試者的腹部電腦斷層掃描(CT)資料,其中 13 個器官在美國范德堡大學醫學院暨醫學中心臨床放射科醫生的監督下,由解讀員加上註釋。將多器官分割問題描述為一個單通道輸入的 13 類分割任務。

我們使用 MONAI Deploy App SDK,在 NVIDIA Clara AGX 開發者套件上建立及部署 UNETR 模型;這個開發者套件結合了高效率的 Jetson AGX Xavier 嵌入式 Arm SoC、強大的 NVIDIA RTX 6000 GPU 與 ConnectX-6 SmartNIC 的 100 GbE 連線速度。

開發者套件提供了一個易於使用的平台,用於開發軟體定義、支援人工智慧的即時照護點醫療器材。MONAI Deploy App SDK 提供了一個框架和相關工具,用於設計、驗證及分析用於醫療應用程式之人工智慧推論工作流程的效能。

以下重點介紹了建立及部署 UNETR 應用程式的步驟:

  1. 設定您的環境並安裝 MONAI Deploy App SDK 軟體包
  2. 建立 UNETR 模型特定分割運算子
  3. 加入 MONAI App Deploy SDK DICOM 域特定運算子建立應用程式類別,並且將其與 UNETR 運算子連接。
  4. 打包 UNETR 應用程式

若需更多資訊,請參閱以下資源:

使用 NVIDIA Clara Render Service 呈現渲染內容

我們使用可從 NGC 下載的 NVIDIA Clara Render Server 應用程式容器,以呈現 MONAI Deploy 應用程式的分割輸出內容。

Render Service 內有三個容器:渲染伺服器(Render Server)、資料集服務(Dataset Service)及控制台(Dashboard)。

渲染伺服器容器

渲染伺服器容器處理資料集的即時串流和渲染作業。

使用以下命令提取渲染伺服器容器:

docker pull nvcr.io/nvidia/clara/renderserver_ng:0.8.1-2108.1

使用以下命令運行渲染伺服器容器:

nvidia-docker run -it --rm -d \--name renderserver \--network claranet \-p 2050:2050 \-v `pwd`/input:/app/datasets \nvcr.io/nvidia/clara-renderserver:linux-x86-0.8.1

資料集服務容器

資料集服務容器處理資料集。它目前只支援 MHD、RAW、JSON 和 META 等檔案。

使用以下命令提取資料集服務容器:

docker pull nvcr.io/nvidia/clara/clara-datasetservice:0.8.1-2108.1

每個資料集所需的檔案位於資料夾 /datasets 底下,由 UNETR 應用程式生成。以下是生成的檔案清單:

config.meta config_render.json img0066.nii.gz img0066.output.mhd img0066.output.raw
  • config.meta 定義資料集應使用的基本資訊和配置。
  • config_render.json 定義載入時資料集搭配渲染伺服器使用的預設渲染設定值(燈光、攝影機、傳遞函數等)。
  • img0066.gz 從 DICOM 轉換的原始影像。
  • img0066.output.mhd MHD 格式的遮罩影像。這個 .raw 檔案內有實際像素。

使用以下命令啟動資料集服務容器:

export ARGS_SERVICE_RSDS_PORT=50055 # Port number of Dataset Service

export ARGS_SERVICE_RSNG_IP=xxx.xxx.xxx.xxx # IP address of Render Service

export ARGS_SERVICE_RSNG_PORT=2050 # Port number of Render Service

export ARGS_SERVICE_RSUI_IP=xxx.xxx.xxx.xxx # IP address of Dashboard

export ARGS_SERVICE_RSUI_PORT=8080 # Port number of Dashboard

docker run -it --rm -d \-v `pwd`:/app/datasets \-p ${ARGS_SERVICE_RSDS_PORT:-50055}:50055 \-e SERVICE_RSNG_IP=${ARGS_SERVICE_RSNG_IP:-renderserver} \-e SERVICE_RSNG_PORT=${ARGS_SERVICE_RSNG_PORT:-2050} \-e SERVICE_RSUI_IP=${ARGS_SERVICE_RSUI_IP:-dashboard} \-e SERVICE_RSUI_PORT=${ARGS_SERVICE_RSUI_PORT:-8080} \--name clara-datasetservice \nvcr.io/clara/clara-datasetservice:0.8.1
_RSNG_IP=xxx.xxx.xxx.xxx # IP address of Render Service

控制台容器

控制台容器是一個網頁應用程式和 API 伺服器。以 JavaScript 語言,使用 React 和 Node.js 寫出這些元件,並向後相容支援用 Angular 編寫的老舊 WebUI。

使用以下命令提取控制台容器:

docker pull nvcr.io/nvidia/clara/clara-dashboard:0.8.1-2108.1

使用以下命令啟動控制台容器:

 docker run -it --rm -d
-p ${ARGS_SERVICE_RSUI_PORT:-8080}:8080
-e SERVICE_RSDS_IP=${ARGS_SERVICE_RSDS_IP:-datasetservice}
-e SERVICE_RSDS_PORT=${ARGS_SERVICE_RSDS_PORT:-50055}
-e SERVICE_RSNG_IP=${ARGS_SERVICE_RSNG_IP:-renderserver}
-e SERVICE_RSNG_PORT=${ARGS_SERVICE_RSNG_PORT:-2050}
-e NODE_ENV=${ARGS_NODE_ENV:-standalone}
--name clara-dashboard
nvcr.io/clara/clara-dashboard:

請從渲染伺服器應用程式功能表中的資料集清單中選擇一個項目,以啟動即時互動串流(圖 3)。

圖 3:NVIDIA Clara 控制台:資料集視圖

請選擇資料集名稱旁邊的更新圖示,以上傳渲染設定值的修改內容。首次載入資料集時,該圖示處於非啟用狀態,但後續若有更動渲染設定值(如更改視圖位置、攝影機設定值或傳遞函數設定值)後便會啟用該圖示。更新時會將資料集渲染設定值上傳到資料集服務資料庫。

圖 4:NVIDIA Clara 控制台:組件視圖

在 NVIDIA Clara 渲染伺服器加入語音命令

您可以使用語音命令和文字查詢,以互動方式操作 NVIDIA Clara 渲染伺服器。加入 Riva 語音伺服器和 Zero-shot 對話管理伺服器便能做到這一點,可通過 HTTP 上的 REST API 呼叫服務用戶端。如需更多資訊,請見 NVIDIA Riva 語音技巧

安裝控制台、渲染伺服器及資料集服務這三個容器後,必須再啟用自動語音辨識(automatic speech recognition,ASR)與文字轉語音(text-to-speech,TTS)服務的情況下存取 Riva 伺服器。Zero-shot 對話管理伺服器應在邊緣伺服器上運行(圖 2)。

您可為即時串流互動內容加入各種語音命令,例如「放大/縮小」和「向左/向右平移」,或是更複雜的語音命令,像是「移除肋骨」。

整合 Zero-shot 對話管理伺服器與 NVIDIA Clara 控制台

如要整合 Zero-shot 對話管理與 NVIDIA Clara,請執行以下步驟:

  1. 加入使用者介面欄位,以從用戶處獲取文字命令。
  2. 在儀表板中加入程式碼,透過用戶文字向 Zero-shot 對話管理伺服器發送 HTTP GET 請求。Zero shot GET 請求必須採用以下格式:http://<Zero Shot Server IP>:<PORT>/<Project Name>/process_query?query=<user entered text>
  3. 在儀表板中加入程式碼,處理來自 Zero-shot 對話管理伺服器的回應。
  4. 確認特定意圖(例如「放大/縮小」)後,儀表板必須對請求執行動作,讓儀表板後端執行相對應的動作。儀表板呼叫適當的 gRPC API,接觸渲染伺服器及資料集服務。

整合 Riva ASR 和 TTS 服務與 NVIDIA Clara 控制台

如要透過 Riva 加入可用的 ASR 服務,請執行以下步驟:

  1. 在控制台使用者介面加入程式碼,以請求存取麥克風。
  2. 參考 Riva ASR 範例,實行用戶音訊輸入到控制台後端的串流功能。您可使用 Web Audio API 和 Socket.IO。
  3. 修改控制台後端,以便從使用者介面收到請求時適當呼叫 Riva 伺服器及返回回應。這主要涉及匯入 Riva proto 檔案。如需更多資訊,請見 gRPC & Protocol Buffers

控制台使用者介面從儀表板後端接收到轉錄的回應後,將其轉發到 Zero-shot 對話管理伺服器,該伺服器返回相對應的回應。控制台執行適當步驟,並使用 Zero-shot 對話管理員的回應呼叫 Riva TTS,以便使用者介面獲得可當成回應播放的音訊內容。

同樣的,使用以下步驟整合 Riva TTS 服務與 NVIDIA Clara 控制台:

  1. 在使用者介面中執行一種方式播放從 Riva TTS 接收到的音訊。
  2. 在控制台使用者介面中加入程式碼,以將 zero-shot 回應文字發送到控制台後端。
  3. 將所有 gRPC 用戶端邏輯加入控制台後端,以便它可連接到 Riva TTS 伺服器。成功後,將語音回應內容發送回控制台使用者介面進行播放。

圖 5 依次顯示了 NVIDIA Clara 控制台、Riva 與 Zero-shot 對話管理員之間呼叫 API 的情況。

圖 5:NVIDIA Clara 控制台、Riva 與 Zero-shot 對話管理員的互動情況

使用 NVIDIA Fleet Command 進行部署

NVIDIA Fleet Command 讓不同規模的企業都能享有安全的邊緣人工智慧。您可透過雲端環境部署和管理 NGC 目錄或 NGC Private Registry 中的應用程式,以無線方式更新系統軟體,還有藉由瀏覽器及網路連線從遠端管理系統。如需更多資訊,請見為 Fleed Command 開發您的應用程式

為應用程式建立一個 Helm chart,便能使用 Fleet Command 部署 NVIDIA Clara Holoscan 應用程式。Helm 是一個軟體包管理器,用於在 Kubernetes 中部署容器化應用程式,這跟用於 Linux 的 Debian/RPM,或是用於基於 Java 應用程式的 Jar/War 非常相似。

Helm 環境中的軟體包稱為 chart,是特定目錄樹中的檔案集合,用於描述一組相關的範本。目錄名稱是無版本控制資訊的 chart 的名稱。當 chart 打包為 archive,這些 chart 目錄會被打包到一個 TGZ 檔案中,其檔案名稱有包含其版本,使用 SemVer2 版本控制格式。以下是 NVIDIA Clara archive 名稱的範例格式:

clara-renderserver {semVer2}.tgz

您可使用以下命令建立新的 Helm chart:

helm create clara-renderserver

這個命令建立 clara-renderserver chart 目錄,還有 chart 中使用的常用檔案和目錄。具體來說,這是 chart 目錄的樹形結構:

|-- Chart.yaml # A YAML file containing information about the chart
|-- templates # A directory of templates that, when combined with values ,will generate valid Kubernetes manifest files.
|   |-- _helpers.tpl 
|   |-- cache-volume-claim.yaml
|   |-- cache-volume.yaml
|   |-- deployment.yaml
|   |-- svc.yaml
|   |-- volume-claim.yaml
|   `-- volume.yaml
`-- values.yaml # The default configuration values for this chart
# A YAML file containing information about the chart

使用 /templates 目錄裡的 deployment.yaml 檔案定義 Kubernetes 中部署物件的結構:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "clara-renderer.fullname" . }}
  labels:
{{ include "clara-renderer.labels" . | indent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "clara-renderer.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
     [metadata info]
      spec:
    {{- with .Values.images.pullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      containers:
      - name: ui-{{ .Chart.Name }}
        image: "{{ .Values.images.namespace }}/{{ .Values.images.renderui }}:{{ .Values.images.tag }}"
        imagePullPolicy: {{ .Values.images.pullPolicy }}
        env:
        - name: SERVICE_RSDS_IP
          value: "0.0.0.0"
        - [more env variable assignment]
        ports:
          - name: "{{ .Values.ui.portName }}"
            containerPort: {{ .Values.ui.port }}
            hostPort: {{ .Values.ui.hostPort }}
            protocol: TCP
      - name: renderer-{{ .Chart.Name }}
        image: "{{ .Values.images.namespace }}/{{ .Values.images.renderserver }}:{{ .Values.images.tag }}"
        imagePullPolicy: {{ .Values.images.pullPolicy }}
        ports:
          - name: "{{ .Values.rsng.portName }}"
            containerPort: {{ .Values.rsng.port }}
            protocol: TCP
        env:
        - name: CUDA_CACHE_PATH
          value: "/cache/CudaCache"
        - name: OPTIX_CACHE_PATH
          value: "/cache/OptixCache"
        volumeMounts:
        [volume mount information]
      - name: dataset-service-{{ .Chart.Name }}
        image: "{{ .Values.images.namespace }}/{{ .Values.images.datasetservice }}:{{ .Values.images.tag }}"
        imagePullPolicy: {{ .Values.images.pullPolicy }}
        env:
        - name: DATASET_REPO_PATH
          value: "/datasets"
        -[dataset env variable assignment]

如要驗證 Helm chart 請運行以下命令:

helm lint clara-renderserver

接著打包 Helm chart:

helm package clara-renderserver

如需更多在 NGC 上發布 Helm chart 的資訊,請見 NGC Helm Charts

如要使用 NVIDIA Fleet Command 進行部署,請按照您建立的 Helm chart 建立應用程式:

圖 6:在 Fleet Command 中加入應用程式

下一步是為應用程式新增部署:

圖 7:在 Fleet Command 中建立部署

建立部署時,應用程式將部署在 Fleet Command 中的配對邊緣站點上。請使用 Helm upgrade 命令更改應用程式的配置。

進行部分系統更新可能需要重新開機。如要重新開機,Fleet Command Stack 會在系統運行後自動重新啟動應用程式。應能通過系統更新或系統重新開機,正常恢復及持續運行 NVIDIA Clara Holoscan 應用程式。

總結

更多關於開始使用的資訊,請見 NVIDIA Clara Holoscan 產品頁面。進一步瞭解 NVIDIA GTC 大會討論醫療領域採用人工智慧的資訊。

若需更多資訊,請參閱以下資源: