---
# System prepended metadata

title: 1. 通用型分散式訓練與推論架構

---


# 1. 通用型分散式訓練與推論架構

## 1.1 分散式訓練（Distributed Training）

### 1.1.1 為何需要分散式訓練

隨著模型參數量與訓練資料規模快速成長，單一機器的 GPU 記憶體與計算能力已不足以支撐合理時間內完成訓練。分散式訓練透過多台節點協同運算，加速模型收斂，並支援超過單機記憶體上限的模型或批次大小。([IBM][1])

### 1.1.2 常見並行策略

1. **資料並行（Data Parallelism）**

   * 每個工作節點持有一份完整模型權重，各自處理資料子集，計算梯度後再進行同步或非同步的梯度聚合。([IBM][1])
   * 適用於影像分類、語言模型等多數深度學習任務。
![image](https://hackmd.io/_uploads/HkQ41WolWe.png)

2. **模型並行（Model Parallelism）**

   * 將同一個模型拆分到不同節點，適用於單一模型即大於單卡記憶體（例如超大型語言模型）。([dlsys.cs.washington.edu][2])
![image](https://hackmd.io/_uploads/Sk8K1Wslbx.png)

3. **流水線並行（Pipeline Parallelism）**

   * 依照網路層或子模組切成階段，資料如同「流水線」通過不同節點，提升硬體使用率。([Vipul Vaibhaw][3])

4. **混合並行（Hybrid Parallelism）**

   * 實務上常結合資料並行＋模型並行＋流水線並行，搭配 ZeRO / FSDP 等技術以最佳化記憶體與通訊開銷。

### 1.1.3 通用分散式訓練架構概念

典型的分散式訓練架構可抽象為下列元件：([tensorflow.org][4])

* **參與節點**

  * *Workers*：負責前向與反向運算。
  * *Parameter Servers* 或 *All-Reduce Group*：負責梯度聚合與權重更新。
* **通訊模式**

  * Parameter-Server 架構：集中式權重儲存，Workers 每一步將梯度 push/pull 到伺服器。
  * All-Reduce 架構：權重分散在所有節點，透過 ring-all-reduce 等演算法進行同步。
* **共享儲存與資料來源**

  * 分散式檔案系統或物件儲存（S3/GCS/Azure Blob），供 Workers 並行讀取訓練批次。
* **排程與容錯**

  * 由 K8S 或雲端平台負責節點生命週期管理、重啟失敗節點、彈性擴縮。
![image](https://hackmd.io/_uploads/B1A4g-jlbx.png)

> 建議搭配圖示：
>
> * TensorFlow *Distributed training with ParameterServerStrategy* 文件中的叢集示意圖（Workers + Parameter Servers）。([tensorflow.org][4])
> * IBM *What is Distributed Machine Learning?* 對資料並行的示意圖。([IBM][1])

---

## 1.2 分散式推論（Distributed Inference）

### 1.2.1 需求來源

模型上線後，實際臨床或商業場景往往需要：

* 高併發請求（多位醫師同時呼叫報告生成）
* 嚴格延遲需求（秒級回應）
* 多區域部署與容錯

因此會採用分散式推論架構，以多個模型副本與多層負載平衡來分散流量，並在需要時自動擴充資源。([Google Cloud][5])

### 1.2.2 通用推論架構元件

1. **入口層（API Gateway / Endpoint）**

   * 提供統一 URL，負責驗證、流量控制與版本導流。
   * 例如 Azure Machine Learning 的 Online Endpoint，可掛多個部署（A/B、藍綠）。([Microsoft Learn][6])

2. **模型服務層（Model Serving）**

   * 多個模型容器副本（Pods / Instances），由 K8S 或雲端服務管理。
   * 支援同步線上推論與批次推論（Batch Prediction/Batch Endpoint）。([Google Cloud Documentation][7])

3. **特徵前處理與後處理服務**

   * 將上游業務資料轉換為模型輸入格式（特徵工程、標準化）。
   * 將模型輸出轉為報告、分數或標籤，並結合規則檢查。

4. **儲存與監控**

   * 紀錄每筆推論請求、模型版本、延遲與錯誤率。
   * 監控推論分布與資料飄移，觸發再訓練流程。([Microsoft Learn][8])
![image](https://hackmd.io/_uploads/SyYKlWjgZl.png)

> 建議搭配圖示：
>
> * Azure Machine Learning *Endpoints for inference* 中「endpoint with multiple deployments」圖示，清楚顯示 endpoint 與多個 deployment 的關係。([Microsoft Learn][6])
> * Vertex AI Predictions / Online & Batch Prediction 相關教學中的架構圖，顯示從 BigQuery 或 GCS 到 BatchPredictionJob/Endpoint 的資料流程。([Google Cloud Documentation][7])

---

## 1.3 三大雲廠分散式訓練與推論架構

### 1.3.1 Google Cloud（GCP：Vertex AI + GKE）

**（1）分散式訓練**

* 官方 *Vertex AI Serverless training overview* 提供一張 workflow 圖，說明：

  * 資料來源（BigQuery / Cloud Storage）
  * 建立 Training Job（自訂容器或框架）
  * 平台自動配置多台 GPU/TPU 執行訓練
  * 結果寫回 Model 資源與 Artifact Registry。([Google Cloud Documentation][9])
* 搭配 *Architecture for MLOps using TFX and Vertex AI Pipelines*，可看到：

  * 以 Pipelines 串接資料前處理、訓練、評估與部署的整體 CI/CD/CT 架構。([Google Cloud Documentation][10])

**（2）分散式推論**

* *Overview of getting inferences on Vertex AI* 及相關文件說明：

  * **Online Prediction**：模型部署到 Endpoint，由多個後端副本處理 HTTP 請求。
  * **Batch Prediction**：以 BatchPredictionJob 對 GCS/BigQuery 做離線推論，適合大量資料並行處理。([Google Cloud Documentation][7])
* Vertex AI 概念架構圖中，也標示了「Training」與「Serve / Inference」分層，底層以 GKE、GPU/TPU 為基礎。([Medium][11])
![image](https://hackmd.io/_uploads/BkqRlbjeZx.png)


> 建議插圖：
>
> * Vertex AI 官方「Serverless training workflow」圖（訓練篇）。([Google Cloud Documentation][9])
> * Vertex AI 官方「ML workflow / predictions overview」圖（推論篇）。([Google Cloud Documentation][12])
![image](https://hackmd.io/_uploads/SJCbZ-ogZe.png)

---

### 1.3.2 AWS（SageMaker + EKS）

**（1）分散式訓練**

* *Model training – Amazon SageMaker AI* 官方文件提供一張示意圖：

  * 訓練資料存於 S3。
  * SageMaker 依 Job 定義啟動多個 EC2 訓練節點。
  * 訓練完成後模型存回 S3，並可註冊到 Model Registry。([AWS 文檔][13])
* *Guidance for Distributed Model Training on AWS* 與對應 PDF 則給出更完整架構：

  * 支援以 Kubeflow on EKS 或 SageMaker Managed Training 執行混合式分散訓練。
  * 圖中包含 VPC、EKS 叢集、S3、CloudWatch、SageMaker Training Jobs 等元件。([Amazon Web Services, Inc.][14])
![image](https://hackmd.io/_uploads/r1f4bZslbg.png)
![image](https://hackmd.io/_uploads/rkrubZilZx.png)

**（2）分散式推論**

* AWS 官方與範例專案 *Distributed training and inference using SageMaker AI and MLFlow* 中的架構圖顯示：

  * SageMaker Endpoint 或 EKS 上的模型服務，多副本背後連 S3/Feature Store。
  * API Gateway / ALB 對外提供 REST 介面。
  * MLflow / CloudWatch 收集推論紀錄與指標。([GitHub][15])
![image](https://hackmd.io/_uploads/BJuqbWslZg.png)

> 建議插圖：
>
> * SageMaker 官方訓練架構圖（train-model 文件中的圖）。([AWS 文檔][13])
> * AWS *Guidance for Distributed Model Training on AWS* PDF 中的參考架構圖。([d1.awsstatic.com][16])
> * GitHub 專案 *distributed-training-inference-sagemaker-mlflow* README 內的 end-to-end 架構圖（訓練＋推論）。([GitHub][15])

---

### 1.3.3 Microsoft Azure（Azure ML + AKS）

**（1）分散式訓練**

* *Architecture & key concepts – Azure Machine Learning* 提供整體平台圖：

  * Workspace、Data Store、Compute Cluster（包括 GPU 節點）與 Pipelines。
  * Training job 透過 Azure ML Compute Cluster 執行，支援分散式框架（PyTorch、TensorFlow 等）。([Microsoft Learn][17])
* Azure Architecture Center 的 MLOps 文章，則以三種應用（CV、NLP 等）展示 end-to-end 架構：

  * 從資料擷取、特徵處理，到訓練、模型註冊、部署與再訓練。([Microsoft Learn][8])
![image](https://hackmd.io/_uploads/HJAaZbigZx.png)

**（2）分散式推論**

* *Endpoints for inference – Azure ML* 提供 endpoint 與多 deployment 的概念圖：

  * 單一 Endpoint 之下可掛多個 deployment（例如 v1 / v2 模型）。
  ![image](https://hackmd.io/_uploads/B1eGfWsxWl.png)

  * 支援佔比流量路由，以便 A/B 測試或漸進式升級。([Microsoft Learn][6])
* MLOps 指南與 Azure AI Architecture 資料顯示：
![image](https://hackmd.io/_uploads/rkLbfZjxWx.png)

  * 前端透過 Application Gateway / API Management 進入。
  * 後端可選擇 Azure ML Online Endpoint 或 AKS 部署容器化模型，搭配 Azure Monitor、Log Analytics 做監控。([Microsoft Learn][8])
![image](https://hackmd.io/_uploads/rkheM-sl-g.png)

> 建議插圖：
>
> * Azure ML 官方「architecture & key concepts」平台圖（訓練＋管理）。([Microsoft Learn][17])
> * Azure ML Endpoints 官方「endpoint with multiple deployments」圖（推論）。([Microsoft Learn][6])

---

# 2. 多模態醫療報告生成之分散式設計

在上述通用架構之上，本節聚焦於多模態醫療報告生成（影像 + 結構化病歷 + 檢驗 + 文字紀錄 + 語音）的實作方式，分成訓練與推論兩階段。

---

## 2.1 多模態分散式訓練：醫療報告生成

### 2.1.1 資料與模態設計

* **結構化模態**：以 FHIR Resource（Encounter、Observation、Condition、Procedure 等）統一描述病歷、檢驗、處置。
* **影像模態**：PACS 輸出之 DICOM 影像，需保留 Study/Series/Instance metadata。
* **文字模態**：以往人工撰寫之報告、病摘、會診紀錄。
* **語音模態**：醫師口述報告之音檔，先經 ASR 轉文字。
* **標註目標**：標準化醫療報告全文（含 Impression / Findings / Recommendation）與必要結構欄位。

每一筆訓練樣本可整理為：

```text
{ patient_id, encounter_id,
  modalities: { image, structured, text_context, speech_transcript },
  target_report,
  meta: { modality_type, department, device_model, date_time, annotator_id }
}
```

### 2.1.2 分散式訓練流程（對應三大雲的通用做法）

1. **資料匯入與前處理**

   * 資料湖（GCS/S3/Blob）存放原始多模態資料。
   * 以 Spark 或 Dask 在 K8S（GKE/EKS/AKS）上進行大規模 ETL：

     * 去識別化、檔案格式轉換（DICOM → tensor）。
     * Alignment：將同一次 encounter 的影像、檢驗、報告與語音對齊。([Google Cloud Documentation][10])

2. **特徵工程與資料切分**

   * 使用 Ray Data / Spark DataFrame 等工具，在叢集中完成：

     * 病種分層抽樣、平衡不同科別與設備。
     * 自動建立 train/val/test split 版本並記錄在數據倉儲（BigQuery/Redshift/Synapse）。

3. **多模態模型架構**

   * 影像 Encoder（ResNet/ViT 等）
   * 文本 Encoder / LLM（醫療語料微調）
   * 語音透過 ASR 轉文字後併入文本模態
   * 融合層（類似 LLaVA/Vision-LLM 架構），將影像 embedding 經 projection 接入 LLM input。([Vipul Vaibhaw][3])

4. **分散式訓練與超參數調校**

   * 在 Vertex AI Training / SageMaker Training / Azure ML Compute Cluster 上以多機多卡方式訓練：

     * 使用 DDP / FSDP / ZeRO 等技術實現資料並行與參數分散。([AWS 文檔][18])
   * 以 Ray Tune 或各雲端自帶超參數服務做搜尋，優化學習率、batch size、loss 組合。

5. **模型註冊與版本管理**

   * 訓練完成後將模型與評估指標註冊到：

     * Vertex AI Model Registry、SageMaker Model Registry 或 Azure ML Model Registry。([Google Cloud][5])
   * 紀錄資料版本、程式版本與實驗設定，以因應醫療稽核需求。

> 教學上可以將 1.3 的三大雲架構圖，再加上一層「多模態 Encoder + LLM 模型訓練」標註，說明同一套設計如何在不同雲上落地。

---

## 2.2 多模態分散式推論：醫療報告生成
<svg width="800" height="1150" xmlns="http://www.w3.org/2000/svg">
  <!-- Definitions for markers and filters -->
  <defs>
    <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#555" />
    </marker>
    <filter id="dropShadow" x="-20%" y="-20%" width="140%" height="140%">
      <feGaussianBlur in="SourceAlpha" stdDeviation="3"/>
      <feOffset dx="2" dy="2" result="offsetblur"/>
      <feComponentTransfer>
        <feFuncA type="linear" slope="0.3"/>
      </feComponentTransfer>
      <feMerge>
        <feMergeNode/>
        <feMergeNode in="SourceGraphic"/>
      </feMerge>
    </filter>
  </defs>

  <!-- Background -->
  <rect width="800" height="1150" fill="#ffffff" />

  <!-- Title -->
  <text x="400" y="40" font-family="sans-serif" font-size="24" font-weight="bold" text-anchor="middle" fill="#333">
    2. 多模態醫療報告生成：分散式訓練架構
  </text>
  <text x="400" y="65" font-family="sans-serif" font-size="14" fill="#666" text-anchor="middle">
    2.1.1 資料模態設計 & 2.1.2 分散式訓練流程
  </text>

  <!-- ========================== Phase 1: Inputs (2.1.1) ========================== -->
  <g transform="translate(50, 100)">
    <rect x="0" y="0" width="700" height="140" fill="#e3f2fd" stroke="#2196f3" stroke-width="2" rx="10" filter="url(#dropShadow)" />
    <text x="20" y="30" font-family="sans-serif" font-size="16" font-weight="bold" fill="#0d47a1">2.1.1 多模態資料輸入</text>
    
    <!-- Input Nodes -->
    <g transform="translate(30, 50)">
      <!-- Node 1 -->
      <rect x="0" y="0" width="150" height="70" fill="#fff" stroke="#1976d2" rx="5" />
      <text x="75" y="30" font-family="sans-serif" font-size="14" font-weight="bold" text-anchor="middle" fill="#333">結構化模態</text>
      <text x="75" y="50" font-family="sans-serif" font-size="11" text-anchor="middle" fill="#555">FHIR (Encounter/Obs)</text>

      <!-- Node 2 -->
      <rect x="165" y="0" width="150" height="70" fill="#fff" stroke="#1976d2" rx="5" />
      <text x="240" y="30" font-family="sans-serif" font-size="14" font-weight="bold" text-anchor="middle" fill="#333">影像模態</text>
      <text x="240" y="50" font-family="sans-serif" font-size="11" text-anchor="middle" fill="#555">DICOM / PACS</text>

      <!-- Node 3 -->
      <rect x="330" y="0" width="150" height="70" fill="#fff" stroke="#1976d2" rx="5" />
      <text x="405" y="30" font-family="sans-serif" font-size="14" font-weight="bold" text-anchor="middle" fill="#333">文字模態</text>
      <text x="405" y="50" font-family="sans-serif" font-size="11" text-anchor="middle" fill="#555">病摘 / 會診紀錄</text>

      <!-- Node 4 -->
      <rect x="495" y="0" width="150" height="70" fill="#fff" stroke="#1976d2" rx="5" />
      <text x="570" y="30" font-family="sans-serif" font-size="14" font-weight="bold" text-anchor="middle" fill="#333">語音模態</text>
      <text x="570" y="50" font-family="sans-serif" font-size="11" text-anchor="middle" fill="#555">口述音檔 (ASR轉文字)</text>
    </g>
  </g>

  <!-- Arrow Down -->
  <line x1="400" y1="240" x2="400" y2="280" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)" />

  <!-- ========================== Phase 2: ETL (2.1.2 Part 1) ========================== -->
  <g transform="translate(50, 280)">
    <rect x="0" y="0" width="700" height="280" fill="#fff8e1" stroke="#ff8f00" stroke-width="2" rx="10" filter="url(#dropShadow)" />
    <text x="20" y="30" font-family="sans-serif" font-size="16" font-weight="bold" fill="#e65100">2.1.2 資料匯入與前處理 (ETL)</text>
    
    <!-- Data Lake -->
    <g transform="translate(40, 50)">
      <path d="M0,15 A30,10 0 1,1 60,15 A30,10 0 1,1 0,15 M0,15 v50 A30,10 0 0,0 60,65 v-50" fill="#ffe0b2" stroke="#ef6c00" stroke-width="2"/>
      <text x="30" y="45" font-family="sans-serif" font-size="12" text-anchor="middle" font-weight="bold">Data Lake</text>
      <text x="30" y="60" font-family="sans-serif" font-size="10" text-anchor="middle">(GCS/S3/Blob)</text>
    </g>

    <!-- Spark Process -->
    <rect x="140" y="50" width="520" height="80" fill="#fff" stroke="#ef6c00" stroke-dasharray="5,5" rx="5" />
    <text x="400" y="70" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle" fill="#e65100">運算叢集 (Spark/Dask on K8S)</text>
    
    <rect x="160" y="80" width="140" height="40" fill="#ffe0b2" rx="3" />
    <text x="230" y="105" font-family="sans-serif" font-size="12" text-anchor="middle">去識別化 & 格式轉換</text>
    
    <rect x="310" y="80" width="180" height="40" fill="#ffcc80" rx="3" stroke="#e65100" stroke-width="2"/>
    <text x="400" y="100" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">Alignment (對齊)</text>
    <text x="400" y="115" font-family="sans-serif" font-size="10" text-anchor="middle">Group by Encounter ID</text>

    <rect x="500" y="80" width="140" height="40" fill="#ffe0b2" rx="3" />
    <text x="570" y="105" font-family="sans-serif" font-size="12" text-anchor="middle">特徵工程 & 切分</text>

    <!-- Arrow inside ETL -->
    <line x1="100" y1="90" x2="140" y2="90" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)" />
    
    <!-- Sample Structure -->
    <rect x="140" y="160" width="360" height="90" fill="#fff3e0" stroke="#ef6c00" rx="5" />
    <text x="155" y="180" font-family="monospace" font-size="11" fill="#333" xml:space="preserve">
訓練樣本物件 (Training Sample):
{ 
  patient_id, encounter_id,
  modalities: {image, struct, text, speech},
  target_report, meta
}
    </text>

    <!-- Data Warehouse -->
    <g transform="translate(560, 160)">
      <path d="M0,15 A30,10 0 1,1 60,15 A30,10 0 1,1 0,15 M0,15 v50 A30,10 0 0,0 60,65 v-50" fill="#ffe0b2" stroke="#ef6c00" stroke-width="2"/>
      <text x="30" y="45" font-family="sans-serif" font-size="12" text-anchor="middle" font-weight="bold">Data Warehouse</text>
      <text x="30" y="60" font-family="sans-serif" font-size="10" text-anchor="middle">(BQ/Redshift)</text>
      <text x="30" y="90" font-family="sans-serif" font-size="10" text-anchor="middle" fill="#e65100">Split 紀錄</text>
    </g>
    
    <line x1="500" y1="205" x2="550" y2="205" stroke="#555" stroke-width="1" stroke-dasharray="4,4" marker-end="url(#arrowhead)" />

  </g>

  <!-- Arrow Down -->
  <line x1="400" y1="560" x2="400" y2="600" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)" />

  <!-- ========================== Phase 3: Model & Training (2.1.2 Part 2) ========================== -->
  <g transform="translate(50, 600)">
    <rect x="0" y="0" width="700" height="320" fill="#e8f5e9" stroke="#2e7d32" stroke-width="2" rx="10" filter="url(#dropShadow)" />
    <text x="20" y="30" font-family="sans-serif" font-size="16" font-weight="bold" fill="#1b5e20">2.1.2 多模態模型與分散式訓練</text>

    <!-- Model Arch -->
    <g transform="translate(40, 50)">
      <rect x="0" y="0" width="620" height="120" fill="#fff" stroke="#4caf50" rx="5" />
      <text x="10" y="20" font-family="sans-serif" font-size="12" fill="#388e3c" font-weight="bold">模型架構 (Model Architecture)</text>
      
      <!-- Components -->
      <rect x="40" y="40" width="120" height="60" fill="#c8e6c9" stroke="#2e7d32" rx="3" />
      <text x="100" y="65" font-family="sans-serif" font-size="12" text-anchor="middle">影像 Encoder</text>
      <text x="100" y="80" font-family="sans-serif" font-size="10" text-anchor="middle">(ResNet/ViT)</text>

      <rect x="180" y="40" width="120" height="60" fill="#c8e6c9" stroke="#2e7d32" rx="3" />
      <text x="240" y="65" font-family="sans-serif" font-size="12" text-anchor="middle">文本 Encoder</text>
      <text x="240" y="80" font-family="sans-serif" font-size="10" text-anchor="middle">(LLM/Bert)</text>

      <text x="320" y="75" font-size="20" font-weight="bold" fill="#2e7d32">→</text>

      <rect x="350" y="40" width="100" height="60" fill="#a5d6a7" stroke="#2e7d32" rx="3" />
      <text x="400" y="65" font-family="sans-serif" font-size="12" text-anchor="middle" font-weight="bold">Fusion Layer</text>
      <text x="400" y="80" font-family="sans-serif" font-size="10" text-anchor="middle">(Projection)</text>
      
      <text x="460" y="75" font-size="20" font-weight="bold" fill="#2e7d32">→</text>

      <rect x="490" y="40" width="100" height="60" fill="#81c784" stroke="#1b5e20" rx="3" stroke-width="2" />
      <text x="540" y="65" font-family="sans-serif" font-size="12" text-anchor="middle" font-weight="bold">LLM</text>
      <text x="540" y="80" font-family="sans-serif" font-size="10" text-anchor="middle">Report Gen</text>
    </g>

    <!-- Distributed Training Platform -->
    <g transform="translate(40, 190)">
      <rect x="0" y="0" width="620" height="100" fill="#f1f8e9" stroke="#8bc34a" stroke-dasharray="5,5" rx="5" />
      <text x="310" y="25" font-family="sans-serif" font-size="14" text-anchor="middle" fill="#33691e" font-weight="bold">雲端訓練叢集 (Vertex AI / SageMaker / Azure ML)</text>
      
      <!-- Tech blocks -->
      <rect x="50" y="40" width="240" height="40" fill="#dcedc8" stroke="#558b2f" rx="3" />
      <text x="170" y="65" font-family="sans-serif" font-size="12" text-anchor="middle" font-weight="bold">平行化技術</text>
      <text x="170" y="85" font-family="sans-serif" font-size="10" text-anchor="middle" fill="#333">(DDP / FSDP / ZeRO)</text>

      <rect x="330" y="40" width="240" height="40" fill="#dcedc8" stroke="#558b2f" rx="3" />
      <text x="450" y="65" font-family="sans-serif" font-size="12" text-anchor="middle" font-weight="bold">超參數調校</text>
      <text x="450" y="85" font-family="sans-serif" font-size="10" text-anchor="middle" fill="#333">(Ray Tune / Bayesian Opt)</text>
    </g>
    
    <!-- Connection Model to Platform -->
    <line x1="310" y1="170" x2="310" y2="190" stroke="#2e7d32" stroke-width="2" marker-end="url(#arrowhead)" />
  </g>

  <!-- Arrow Down -->
  <line x1="400" y1="920" x2="400" y2="960" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)" />

  <!-- ========================== Phase 4: Output (2.1.2 Part 3) ========================== -->
  <g transform="translate(50, 960)">
    <rect x="0" y="0" width="700" height="150" fill="#f3e5f5" stroke="#7b1fa2" stroke-width="2" rx="10" filter="url(#dropShadow)" />
    <text x="20" y="30" font-family="sans-serif" font-size="16" font-weight="bold" fill="#4a148c">2.1.2 模型註冊與版本管理</text>
    
    <g transform="translate(200, 50)">
      <!-- Registry Icon -->
      <path d="M0,15 A40,12 0 1,1 80,15 A40,12 0 1,1 0,15 M0,15 v50 A40,12 0 0,0 80,65 v-50" fill="#e1bee7" stroke="#8e24aa" stroke-width="2"/>
      <text x="40" y="45" font-family="sans-serif" font-size="12" text-anchor="middle" font-weight="bold">Model Registry</text>
      <text x="40" y="60" font-family="sans-serif" font-size="10" text-anchor="middle">(Vertex/SageMaker)</text>
    </g>

    <g transform="translate(350, 60)">
       <text x="0" y="0" font-family="sans-serif" font-size="14" font-weight="bold" fill="#4a148c">稽核項目 (Audit)</text>
       <line x1="0" y1="5" x2="200" y2="5" stroke="#7b1fa2" stroke-width="1"/>
       <text x="10" y="25" font-family="sans-serif" font-size="12" fill="#333">• 資料版本 (Data Version)</text>
       <text x="10" y="45" font-family="sans-serif" font-size="12" fill="#333">• 程式碼版本 (Code Commit)</text>
       <text x="10" y="65" font-family="sans-serif" font-size="12" fill="#333">• 實驗設定 (Hyperparams)</text>
    </g>

    <line x1="290" y1="80" x2="340" y2="80" stroke="#7b1fa2" stroke-width="2" stroke-dasharray="4,4" />
  </g>

</svg>
### 2.2.1 臨床使用情境

* 放射科醫師於 PACS 選擇某一檢查影像並點選「AI 報告草稿」。
* 住院醫師於 EMR 開啟出院摘要頁面，呼叫 AI 生成初稿。
* 語音輸入情境：醫師以口述方式補充說明，系統將語音轉文字納入報告 context。

### 2.2.2 分散式推論核心流程

1. **入口與驗證**

   * 醫院內部系統透過 VPN / 專線連線至雲端 Endpoint（或院內私有雲）。
   * API Gateway / Endpoint 負責身份驗證、權限檢查與流量管控。([Microsoft Learn][6])

2. **多模態資料蒐集與前處理**

   * Orchestrator 服務：

     * 向 FHIR Gateway 取得結構化病歷與檢驗值。
     * 向 PACS Adapter 拉取 DICOM 影像。
     * 將語音送至 ASR 服務產生 transcript。
   * 前處理服務將資料轉成標準 JSON/張量格式，包含必要 metadata。

3. **多模態 Encoder 與 LLM 推論（分散式）**

   * 在 K8S 叢集上建立 GPU Node Pool，由 Ray / KServe / vLLM 等框架管理推論：

     * 影像 Encoder 服務取得影像 embedding。
     * 文本 Encoder 服務處理病史摘要、檢驗結果與 ASR 文字。
     * LLM 服務結合多模態 embedding 與結構化欄位生成報告草稿。([Medium][11])
   * 透過 autoscaling 與多副本部署，支援多位醫師同時呼叫。

4. **規則檢核與稽核資訊產出**

   * 報告草稿送至 Rule Engine：

     * 比對健保申報規則（診斷碼、處置碼組合）。
     * 對照臨床指引（例如某檢驗異常時報告是否有提及）。
   * 產生標註，例如「建議補充 Impression」、「診斷碼與敘述不一致」等。

5. **醫師審閱與回寫**

   * 前端 UI 顯示：

     * 影像縮圖、檢驗重要欄位、多模態 AI 草稿與規則提示。
   * 醫師編輯後簽章，最終報告回寫至 EMR / PACS，同時儲存：

     * AI 草稿版本
     * 人工修改差異
     * 使用之模型版本與時間戳
   * 這些資料可回流到 2.1 的訓練流程，作為持續學習的標註來源。

### 2.2.3 分散式推論的醫療特別考量

* **安全與隱私**

  * 採最小暴露原則，僅傳送訓練/推論所需欄位。
  * 全程加密傳輸，並以審計紀錄（audit log）追蹤每次存取。([Google Cloud Documentation][19])

* **延遲與可用性**

  * 規劃醫院所在地區的多區域部署、備援節點。
  * 對於非即時需求（批次出院摘要生成），可改走 Batch Endpoint 減少尖峰負載。([Google Cloud Documentation][7])

* **人機協作定位**

  * 系統明確定位為「報告草稿生成與輔助提示」，不取代醫師臨床判斷。
  * 必須保留「可追溯」證據，包含輸入模態摘要、模型版本與修改紀錄，以符合醫院內部審查與外部監理需求。

 

[1]: https://www.ibm.com/think/topics/distributed-machine-learning?utm_source=chatgpt.com "What Is Distributed Machine Learning?"
[2]: https://dlsys.cs.washington.edu/pdf/lecture11.pdf?utm_source=chatgpt.com "Lecture 11: Distributed Training and ..."
[3]: https://vaibhawvipul.github.io/2024/09/29/Distributed-Training-of-Deep-Learning-models-Part-~-1.html?utm_source=chatgpt.com "Distributed Training of Deep Learning models - Part ~ 1"
[4]: https://www.tensorflow.org/guide/distributed_training?utm_source=chatgpt.com "Distributed training with TensorFlow"
[5]: https://cloud.google.com/vertex-ai?utm_source=chatgpt.com "Vertex AI Platform"
[6]: https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints?view=azureml-api-2&utm_source=chatgpt.com "Endpoints for inference - Azure Machine Learning"
[7]: https://docs.cloud.google.com/vertex-ai/docs/predictions/overview?utm_source=chatgpt.com "Overview of getting inferences on Vertex AI"
[8]: https://learn.microsoft.com/en-us/azure/architecture/ai-ml/guide/machine-learning-operations-v2?utm_source=chatgpt.com "Machine learning operations - Azure Architecture Center"
[9]: https://docs.cloud.google.com/vertex-ai/docs/training/overview?utm_source=chatgpt.com "Vertex AI serverless training overview"
[10]: https://docs.cloud.google.com/architecture/architecture-for-mlops-using-tfx-kubeflow-pipelines-and-cloud-build?utm_source=chatgpt.com "Architecture for MLOps using TensorFlow Extended, Vertex ..."
[11]: https://medium.com/%40techlatest.net/what-is-google-cloud-vertex-ai-its-architecture-and-key-features-3a265ae09f82?utm_source=chatgpt.com "Google Cloud Vertex AI, its architecture, and key components"
[12]: https://docs.cloud.google.com/vertex-ai/docs/start/introduction-unified-platform?utm_source=chatgpt.com "Introduction to Vertex AI"
[13]: https://docs.aws.amazon.com/sagemaker/latest/dg/train-model.html?utm_source=chatgpt.com "Model training - Amazon SageMaker AI"
[14]: https://aws.amazon.com/solutions/guidance/distributed-model-training-on-aws/?utm_source=chatgpt.com "Guidance for Distributed Model Training on AWS"
[15]: https://github.com/aws-samples/distributed-training-inference-sagemaker-mlflow?utm_source=chatgpt.com "aws-samples/distributed-training-inference-sagemaker ..."
[16]: https://d1.awsstatic.com/solutions/guidance/architecture-diagrams/distributed-model-training-on-aws.pdf?utm_source=chatgpt.com "Guidance for Distributed Model Training on AWS - awsstatic.com"
[17]: https://learn.microsoft.com/en-us/AZURE/machine-learning/concept-azure-machine-learning-architecture?preserve-view=true&view=azureml-api-1&utm_source=chatgpt.com "Architecture & key concepts (v1) - Azure Machine Learning"
[18]: https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-intro.html?utm_source=chatgpt.com "Introduction to the SageMaker AI distributed data ..."
[19]: https://docs.cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture?utm_source=chatgpt.com "GKE cluster architecture | Google Kubernetes Engine (GKE)"

 
---

## 3. GPU 最佳化使用：訓練與推論的系統設計模組與演算法

### 3.1 設計目標與考量

在大型深度學習與多模態模型（特別是 LLM 類）情境下，GPU 成本與延遲往往是系統設計的關鍵限制。GPU 最佳化的目標可整理為三點：

1. **提升吞吐量與縮短訓練／推論時間**：透過並行化、混合精度與 kernel 最佳化，充分利用 Tensor Core 等硬體特性。
2. **降低記憶體壓力與成本**：利用參數分散、梯度壓縮與量化等方法，在同樣硬體上容納更大模型或更多併發請求。
3. **維持數值穩定與模型品質**：在使用混合精度與量化時，需要輔以適當的 loss scaling、校正與離線評估流程，確保預後表現不受明顯影響。

以下分別從訓練與推論兩個角度，整理常見設計模組與演算法。

---

### 3.2 GPU 訓練最佳化模組與演算法

#### 3.2.1 混合精度訓練（Mixed-Precision Training）

* **概念**：在不影響收斂的前提下，將大部分矩陣運算改用 FP16/FP8 等低精度，在關鍵累加或統計運算仍使用 FP32。
* **硬體基礎**：NVIDIA Volta 之後的 GPU（V100、A100、H100 等）具備 Tensor Cores，可對半精度矩陣乘法提供顯著加速。官方指南顯示，混合精度搭配 Tensor Cores 可在多個網路上達到數倍加速且維持相同準確度。
* **實作重點**：

  * 使用框架提供的 AMP（automatic mixed precision）API。
  * 加入 loss scaling 避免 underflow。
  * 在雲端平台（Vertex AI、SageMaker、Azure ML）上，選擇支援 Tensor Core 的 GPU 機型並啟用相對應容器。

#### 3.2.2 並行策略與記憶體最佳化

* **資料並行 + All-Reduce**

  * 使用 NCCL 支援的 ring-all-reduce 在多 GPU 間同步梯度，是目前主流做法。

* **模型並行與流水線並行**

  * 超大模型需將不同層分散到不同 GPU，並透過 pipeline parallelism 提高利用率；DeepSpeed、Megatron-LM 等框架已內建這類策略。

* **FSDP / ZeRO / Checkpointing**

  * 透過 Fully Sharded Data Parallel（FSDP）或 ZeRO 將參數、梯度與 optimizer state 以分片形式分佈在多節點，搭配 activation checkpointing，可顯著降低單卡記憶體使用。

#### 3.2.3 Kernel Fusion 與編譯器最佳化

* **Operator / Kernel Fusion**

  * 透過將多個連續算子融合成單一 GPU kernel，減少 memory round-trip 與 kernel launch overhead。
  * 2024 年 Souffle 等研究顯示，針對深度學習推論與訓練進行全域 DAG 分析與 kernel fusion，可相對 TensorRT、XLA 再獲得 3–7 倍加速。

* **深度學習編譯器**

  * XLA、TVM、MLIR/IREE 等工具可針對模型計算圖進行自動最佳化與編譯，為訓練與推論帶來更佳效能。

#### 3.2.4 I/O 與資料管線

* **高效率輸入管線**

  * 針對影像與語音訓練，必須確保資料解壓、增強與載入不成為瓶頸。
  * 做法包括：

    * 使用 RecordIO/TFRecord/Parquet 等順序讀取格式。
    * 在 CPU 端或另一組 GPU 上進行資料前處理並以 prefetch/batching 餵給訓練程式。([Google Cloud Documentation][1])

* **多 GPU 拓樸與頻寬考量**

  * 2024 年 GPU benchmark 研究指出，多 GPU 叢集中 NVLink/NVSwitch 拓樸與 PCIe 頻寬對訓練效率影響顯著，選擇具備高頻寬互連的機型是大型模型訓練的重要設計決策。

---

### 3.3 GPU 推論最佳化模組與演算法

對於 LLM 與多模態報告生成系統，推論階段往往佔整體成本的大宗。近期主流做法是使用專門的 LLM 推論引擎，例如 vLLM、TensorRT-LLM、DeepSpeed-MII 等。

#### 3.3.1 核心推論引擎與功能

* **TensorRT-LLM**

  * NVIDIA 開源的 LLM 推論最佳化套件，整合 TensorRT、CUDA、cuDNN。
  * 提供：

    * 客製化 attention kernel
    * in-flight batching
    * paged KV cache
    * 多種精度量化（FP8、FP4、INT4 AWQ、INT8 SmoothQuant）
    * speculative decoding 等功能。

* **vLLM / DeepSpeed-MII**

  * vLLM 主打「paged attention」與高效率 KV cache 管理，可大幅提高單 GPU 併發數。
  * DeepSpeed-MII 則整合 DeepSpeed 推論最佳化與模型壓縮技術。最新研究顯示，TensorRT-LLM 在 Nvidia 硬體上的延遲與吞吐量通常優於 vLLM 與 DeepSpeed-MII，但不同引擎在能耗與部署彈性上各有優劣。

#### 3.3.2 重要演算法技巧

1. **量化（Quantization）**

   * 以 INT8、INT4 或混合精度（例如 W4A16KV8）表達權重與 KV cache，可在幾乎不犧牲品質的情況下降低記憶體與延遲。

2. **KV Cache 管理與分頁（Paged KV Cache）**

   * 將 KV cache 以頁面形式管理，支援多請求共享與重複利用，減少記憶體碎片與拷貝開銷，特別適合長上下文 LLM 報告生成任務。

3. **動態批次與請求排程（Dynamic Batching & Scheduling）**

   * 動態將多個請求合併成 GPU 友善的 batch，以 trade-off 延遲與吞吐量。
   * 現代推論平臺多採用「in-flight batching」與多階層排程策略，以適應不同長度與優先順序的請求。

4. **Speculative Decoding / Draft-Execute 架構**

   * 由一個較小的「草稿模型」先生成多個候選 token，再由大型模型驗證與接受部分輸出，減少大模型實際運算次數。

5. **多 GPU／多節點推論**

   * 對超大模型，可透過 tensor parallel 或 pipeline parallel 將推論分散到多張 GPU；
   * 近期也有將編碼與解碼拆分到不同 GPU、或採用分離式推論（disaggregated inference）的系統設計。

---

### 3.4 與三大雲平臺的映射

* **GCP（Vertex AI + GKE）**

  * 以 A3/H100 或 A2/A100 GPU 節點搭配 Vertex AI Training、Vertex Online/Batch Prediction；
  * 可在 GKE 上自建 vLLM/TensorRT-LLM 服務，利用 autoscaling 與 GPU node pool 控管成本。([Medium][2])

* **AWS（SageMaker + EKS）**

  * 利用 p4/p5（A100/H100）實例與 SageMaker 分散式訓練功能，搭配 SageMaker Endpoint 或在 EKS 上執行 TensorRT-LLM/vLLM；
  * 官方架構文件提供從 S3 → Training Jobs → Endpoint 的完整範例。([AWS 文檔][3])

* **Azure（Azure ML + AKS）**

  * 使用 Azure ML Compute Cluster（N 系列 GPU）與 job API 執行分散式訓練；
  * 推論可透過 Azure ML Online Endpoint 或在 AKS 部署推論引擎，並藉由 Application Gateway / Azure Monitor 監控效能。([Microsoft Learn][4])

---

## 4. 推論與訓練之資安防護設計

### 4.1 威脅模型與風險概述

近期文獻將機器學習系統的資安與隱私風險分為三類：

1. **資料層風險**：資料外洩、重識別攻擊、敏感特徵反推（如 membership inference）。
2. **模型層風險**：對抗樣本、模型竊取、模型反向工程、惡意權重注入。
3. **系統層風險**：弱存取控制、API 濫用、log 中殘留敏感資訊、供應鏈攻擊等。

因此，訓練與推論環境的資安防護需要跨越資料、模型與基礎設施三個層面，並與雲端平台既有資安機制整合。

---

### 4.2 訓練階段的防護架構

#### 4.2.1 存取控制與身分管理

* **RBAC 與最小權限原則**

  * 針對資料儲存區（例如 GCS/S3/Blob）、模型倉庫、訓練叢集，設計角色導向存取控制（RBAC）；
  * 僅允許特定專責人員存取原始去識別前的資料，訓練程式則僅能讀取以 pseudonymized ID 表示的資料集。

* **強化認證機制**

  * 管理者與 CI/CD 系統需使用多因子認證與短效存取權杖（short-lived tokens），降低長效憑證外洩風險。

#### 4.2.2 資料隱私與加密

* **靜態與傳輸中加密**

  * 訓練資料與模型權重在雲端儲存時採用伺服器端或客戶端加密，金鑰由 KMS 管理；
  * 所有跨服務通訊以 TLS 保護，避免中間人攻擊。

* **隱私強化技術（PETs）**

  * 視情境引入差分隱私訓練、聯邦學習或安全多方計算等方式，降低單一機構資料外洩的風險；近期綜述指出，這些技術可有效降低主動與被動隱私攻擊成功率。

#### 4.2.3 Confidential Computing 與硬體保護

* **機密運算（Confidential Computing）**

  * 透過硬體可信執行環境（TEE），在 CPU/GPU 訓練過程中對記憶體內容進行加密，避免雲端平臺管理者或惡意 hypervisor 攻擊。
  * GCP 的 Confidential VMs on H100、AWS Nitro Enclaves、Azure Confidential VM 都支援在機密環境中執行 AI 訓練與分析。

#### 4.2.4 訓練資料與程式的供應鏈安全

* **資料版本與來源追蹤**

  * 建立 Data Catalog 與 lineage 紀錄，標註資料來源、處理流程與使用目的，以利稽核與回溯。
* **容器與套件掃描**

  * 訓練用 Docker 映像需經過惡意軟體與弱點掃描，並建置固定的基底映像版本，降低供應鏈植入風險。

---

### 4.3 推論階段的防護架構

#### 4.3.1 API 與端點保護

* **Endpoint 存取控制**

  * 對外僅曝露 API Gateway / Endpoint，後端推論服務留在私有子網路；
  * 使用 OAuth2 / OIDC 或院內 SSO 進行端點存取控制，搭配 rate limiting、防暴力測試與 IP 過濾。([Microsoft Learn][5])

* **輸入驗證與節流**

  * 對推論請求進行大小、格式與頻率檢查，避免被用來進行 prompt injection、大量探測或 DoS 攻擊。

#### 4.3.2 模型保護與誤用防範

* **防止模型竊取與反向工程**

  * 控制推論 API 回應的細節與頻寬（例如不回傳 logits），減少以查詢方式複製模型的可能。
* **對抗樣本與濫用偵測**

  * 監控輸入分布與模型輸出，偵測異常查詢模式（如大量隨機輸入或特定攻擊樣板），必要時限制來源或觸發人工審查。

#### 4.3.3 日誌與稽核

* **安全日誌設計**

  * 針對每次推論紀錄：時間、呼叫者身分、模型版本與必要的輸入摘要（避免完整記錄敏感內容）；
  * 使用集中式 log 平臺與 SIEM 工具進行關聯分析。

* **隱私保護的監控**

  * 在不暴露病人個資的前提下，監控模型效能與 drift，必要時僅保存匿名化統計資料。

---

### 4.4 三大雲平臺資安機制對照

* **GCP**

  * IAM + Cloud KMS + VPC Service Controls 控制存取邊界；
  * Cloud Logging / Cloud Monitoring 提供模型與推論監控；
  * Confidential VMs for H100/A3 支援機密訓練與推論。

* **AWS**

  * IAM、KMS、VPC、Security Group 形成網路與存取控制基礎；
  * SageMaker 提供 Dataset & Model lineage、Endpoint-level 日誌與 CloudWatch 監控；
  * Nitro Enclaves 支援關鍵任務在隔離環境中運行。([AWS 文檔][3])

* **Azure**

  * Entra ID（原 Azure AD） + RBAC + Key Vault 管理身分與金鑰；
  * Azure ML 與 Azure Monitor/Log Analytics 整合模型監控與稽核；
  * Confidential VM / Confidential Container 提供機密運算環境。([Microsoft Learn][4])

 

[1]: https://docs.cloud.google.com/architecture/architecture-for-mlops-using-tfx-kubeflow-pipelines-and-cloud-build?utm_source=chatgpt.com "Architecture for MLOps using TensorFlow Extended, Vertex ..."
[2]: https://medium.com/%40techlatest.net/what-is-google-cloud-vertex-ai-its-architecture-and-key-features-3a265ae09f82?utm_source=chatgpt.com "Google Cloud Vertex AI, its architecture, and key components"
[3]: https://docs.aws.amazon.com/sagemaker/latest/dg/train-model.html?utm_source=chatgpt.com "Model training - Amazon SageMaker AI"
[4]: https://learn.microsoft.com/en-us/AZURE/machine-learning/concept-azure-machine-learning-architecture?preserve-view=true&view=azureml-api-1&utm_source=chatgpt.com "Architecture & key concepts (v1) - Azure Machine Learning"
[5]: https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints?view=azureml-api-2&utm_source=chatgpt.com "Endpoints for inference - Azure Machine Learning"
