《異構計算云服務和 AI 加速器》系列,共包含以下文章:
- 異構計算云服務和 AI 加速器(一):功能特點
- 異構計算云服務和 AI 加速器(二):適用場景
- 異構計算云服務和 AI 加速器(三):GPU 虛擬化技術
- 異構計算云服務和 AI 加速器(四):FPGA 虛擬化技術
- 異構計算云服務和 AI 加速器(五):EAIS & AI 加速器
😊 如果您覺得這篇文章有用 ?? 的話,請給博主一個一鍵三連 🚀🚀🚀 吧 (點贊 🧡、關注 💛、收藏 💚)!!!您的支持 💖💖💖 將激勵 🔥 博主輸出更多優質內容!!!
異構計算云服務和 AI 加速器(四):FPGA 虛擬化技術
🚀
FPGA
(Field-Programmable Gate Array
,現場可編程門陣列)是一種可重構的半導體芯片,允許用戶根據需要動態配置硬件邏輯,從而實現定制化的數字電路功能。它介于通用處理器(如 CPU)和專用芯片(如 ASIC)之間,兼具靈活性和高性能計算能力。
將 FPGA 的高性價比算力通過云輸出,使得 FPGA 的算力普惠化、平民化,這是 FPGA as a Service
的核心出發點和立足點。同時,云上使用 FPGA 與 FPGA 的傳統使用方式也有著非常大的區別。FPGA as a Service
的核心就是 FPGA 虛擬化技術。
目前 FPGA 虛擬化技術還在發展初期,近幾年隨著云計算和 AI 技術的發展,才逐漸成為工業和學術領域研究的熱點。關于 FPGA 虛擬化技術的介紹文獻也比較少,關于 FPGA 虛擬化技術的發展歷史,目前比較全面的總結可以參考 2018 年由 Manchester 大學學生發表的一篇 IEEE 論文《A Survey on FPGA Virtualization》,文中提到早在 2004 年由 Plessl 和 Platzner 發表的一篇論文《Virtualization of Hardware Introduction and Survey》中提到過 FPGA 虛擬化技術的概念,將 FPGA 虛擬化技術分為 時域劃分(Temporal Partitioning
)、虛擬化執行(Virtualized Execution
)和 虛擬機(Virtual Machines
)三種。
- 時域劃分 早期主要解決設備容量問題,是將大規模的應用設計拆分為幾個小設計,然后將每個設計燒寫在單個 FPGA 上順序執行。時域劃分技術如下圖所示,主要包括 網表劃分、數據流圖劃分 和 CDFG 劃分。隨著數據量和計算復雜度的增加,單片 FPGA 已經無法滿足一個應用的需求,需要多片 FPGA 并行完成,虛擬化技術逐漸打破了時間和空間維度的限制,就像大型數據中心的應用場景:多片 FPGA 并行執行同一個任務,并可以及時切換到下一個任務。
-
虛擬化執行 是把一個應用分成幾個有關聯的任務,并通過一個抽象層來管理和調度它們,其目的是在一定程度上實現 設備無關性(
Device Independence
),從而解決資源管理和安全隔離問題,還可以提高開發效率,比較典型的例子是 PipeRench 項目,此項目成功研發了 Kilocore 芯片,它內置了一個 PowerPC 處理器,實現了硬件虛擬化,并可以動態配置,從而解決 FPGA 的資源限制問題。 -
虛擬機 通過一個抽象架構來描述應用從而徹底實現設備無關性。起初,虛擬機的概念用來表示 FPGA 的靜態架構,譬如 Shell 或者 vFPGA 的 Hypervisor,并不是我們現在理解的虛擬機概念。現在的 FPGA Overlay 技術是應用比較廣泛的 FPGA 虛擬化方法之一,它是位于 FPGA 硬件層之上、并連接頂層應用的虛擬可編程架構,實現了對 FPGA 底層硬件資源的抽象化和虛擬化。FPGA Overlay 的具體實現方式有很多種,這里不詳細介紹,其主要目的是為上層用戶提供他們熟悉的編程架構與接口,比如通過 C 語言等高層語言對 Overlay 中的通用處理器等進行編程,而無須擔心具體的硬件電路實現,這點類似 HLS。Overlay 實現了 FPGA 的硬件無關性,便于應用設計在不同 FPGA 架構間移植。另外,用戶可以選擇只編譯自己改動的邏輯部分,在很大程度上縮短了 FPGA 的編譯時間,也方便對應用進行調試和修改。但是在實際開發中,由于其引入的 Overlay 層并不能完全隱藏 FPGA 結構,而且此技術沒有業界統一標準,所以會來帶額外的開發難度和成本。
按照資源的抽象級別,FPGA 虛擬化技術分為三類,如下圖所示。
- 資源級別(
Resource Level
):FPGA 上的資源可分為兩種,一種是可配置的,一種是不可配置的,所以資源級別的虛擬化主要指架構虛擬化(增加一個抽象層)和I/O 虛擬化,比較典型的技術就是 FPGA Overlay 技術,I/O 虛擬化技術本質上跟 CPU/GPU 實現類似,比如 FPGA 云主機用到的設備透傳功能。 - 單節點級別(
Node Level
):單節點指單片 FPGA,主要指具備資源管理功能的抽象層,包括 VMM(Virtual Machine Monitors,也叫 Hypervisor),Shell(FPGA OS或 Hypervisor-vFPGA)和調度管理,主要用于多租戶場景,即 FPGA 云主機。 - 多節點級別(
Multi-Node Level
):多節點指由兩片以上 FPGA 組成的 FPGA 集群,虛擬化的目的是在多片 FPGA 上完成同一個加速任務。其實現依賴 FPGA 互聯功能,常見的有三種互聯方式,如下圖所示。
🚀 將加速器擴展到多片 FPGA 上的架構集合。此處
- a) 代表 FPGA 到 FPGA 通信;
- b) 展示了一種服務器-客戶機架構,在這種架構中 FPGA 直接和服務器通信;
- c) 表示在服務器-客戶機架構中,FPGA 作為客戶機 CPU 的一個特殊設備。
FPGA 虛擬化技術比較典型的應用場景包括基于 OpenCL 實現的 MapReduce 框架和微軟的 Catapult 項目。
從 FPGA 云主機的實現方式來說,FPGA 虛擬化指 I/O(PCIe 設備)虛擬化技術。
I/O 虛擬化技術,有些地方也叫 I/O 設備虛擬化技術,目前主流的模型實現方式有以下幾種:
- 全模擬:純軟件實現,通常由虛擬化層(QEMU)完全模擬一個設備給虛擬機用,其優點是不需要修改操作系統內核和驅動,因此它是可移植性與兼容性最好的 I/O 設備虛擬模型。但是,這種實現模型性能不高,主要原因是:第一,軟件模擬本身就無法具有很高的性能 ;第二,在這種實現方式中,I/O 請求的完成需要虛擬機與監視程序多次的交互,產生大量的上下文切換,開銷巨大。
- Virtio 驅動半虛擬化:將設備虛擬的工作一拆為二,一部分在虛擬機內核中作為前端驅動,一部分放到虛擬化層上(通常是 QEMU)作為后端,前后端共享 Virtio 環協同完成任務。Virtio 前后端的技術只是減少了 VM Exit 和 VM Entry(Guest 和 Host 的上下文切換),并且使 Guest 和 Host 能通過并行處理 I/O 來提高吞吐量并減少延遲。但是,I/O 的路徑并不比全虛擬化技術少。
- 硬件輔助虛擬化:借助硬件技術,如 Intel 的 VT-d 技術實現 PCI 設備直接掛載給虛擬機,常見的有設備直通和 SR-IOV。
縱觀各大云服務提供商,FPGA 云服務器采用的都是 設備直通(Device Passthrough
),主要因為以下三點 :
- 一是 FPGA 的性能,客戶考慮業務搬遷上云首先要做的就是對比,跟本地物理機比、跟競品(如 GPU/ASIC)比。虛擬化必然導致部分的硬件性能損耗,1% 的性能損失都會增大客戶拒絕使用 FPGA 云服務器的可能性 ;
- 二是應用場景,FPGA 比較適用于計算密集型和通信密集型任務。在大數據爆發的時代,很多應用都需要調度多片 FPGA 才能滿足需求,將同一片 FPGA 共享給多個客戶的需求并不強烈 ;
- 三是實現難度,分片 FPGA(
vFPGA
)的多租戶場景,在安全和隔離的實現上,雖然可以復用 vGPU 方案,但是硬件邏輯開發的難度非常大。綜合考慮,各大云服務提供商在FPGA 設備虛擬化時選擇的都是性能損耗最小的設備直通方案。
設備直通技術:是將宿主機上的 PCIe 設備直接分配給客戶機使用,虛擬機獨占這個設備,在客戶機進行對應的 I/O 操作時,不需要通過 VMM 或被 VMM 截獲,所以設備性能幾乎無損耗。設備直通技術的實現依賴 IOMMU 功能(隔離虛擬機對內存資源的訪問),需要硬件支持,比如 Intel 平臺的VT-d 技術。
說到 VT-d 技術,首先要解釋下 DMA(直接內存讀取),它是一種硬件機制,允許外圍設備和主內存之間直接傳輸數據,不需要 CPU 參與,由此可以大大提高設備的吞吐量。I/O 虛擬化的關鍵在于解決 I/O 設備與虛擬機的數據交換問題,而這部分主要指 DMA 和中斷請求(IRQ
)。只要解決好這兩個方面的隔離、保護及性能問題,就是成功的 I/O 虛擬化。VT-d 通過重新設計 IOMMU 架構,在 CPU、內存和 I/O 設備之間增加了一個硬件設備,其主要功能是將 I/O 設備的 DMA 訪問請求和中斷請求重定向到 VMM 設定好的 VM 中,最終實現了 DMA 虛擬化,這項技術也叫 DMA 重映射。
阿里云 FPGA 云主機的設備直通方式采用的是 VFIO,這是一套用戶驅動框架,通俗來講就是一個設備驅動。在虛擬化情景下,VFIO 主要用來在用戶實現設備直通,充分利用了 VT-d 技術提供的 DMA 重映射和中斷重映射特性,在保證直通設備的DMA 安全性的同時其 I/O 性能接近物理設備。
總體來說,FPGA 板卡(PCIe 設備)的透傳方式跟 GPU/NIC 等 PCIe 設備并無差別,鑒于 FPGA 本身的硬件特性和安全隔離要求,阿里云 FPGA 云服務器雖然采用了設備直通方式,但是并沒有把 FPGA 設備功能完全暴露給虛擬機,而是將 PCIe 從功能角度劃分為兩個 PF(Physical Function):即 管理 PF(Management PF
)和 用戶 PF(UserPF
),如下圖所示。
- 管理 PF:提供 FPGA 各種控制功能,如 FPGA 鏡像加載、狀態監控等。例如,在 FPGA 云主機上,只有先發送加載請求,后臺系統認證身份后,通過宿主機驅動才能發起加載操作。
- 用戶 PF:對應的是邏輯功能接口,此功能會通過設備直通方式透傳給虛擬機,用戶可以使用官方提供的驅動訪問設備,也可以自己開發。
PCIe 功能雙 PF 的劃分,在一定程度上保護了 FPGA 板卡不會被用戶惡意燒寫,從而降低了宿主機的停機風險,也保證了 FPGA as a Service
的可靠性。此方案的實現基于 FPGA 特殊的硬件特性(部分可重配置),主流云服務提供商的做法基本類似。
部分可重配置(Partial Reconfiguration
):在前面介紹 FPGA 虛擬化技術的時候提到過,其實現原理是將 FPGA 內部劃分出多個區域,在 FPGA 運行時單獨對這些區域進行編程和配置,以改變區域內電路的邏輯,但并不影響 FPGA 其他電路的正常運行。它可以實現時間域和空間域兩個維度的任務切換,很多大型應用的邏輯都是利用 FPGA 這一特性實現的,如微軟的 Catapult 項目同時提出了 Shell(不可配置區域)和 Role(可重配的邏輯單元)的概念。也有將這一特性應用在多租戶場景下的,提出了vFPGA 的概念,即將一個 FPGA 共享給多個用戶使用,如 IBM 的 CloudFPGA 項目。
各云服務提供商的 FPGA 云服務器也抓住了這一特性,將 FPGA 在邏輯上劃分為 Shell(靜態區)和用戶邏輯(動態區)。
- 靜態區:FPGA 的靜態區主要包括 PCIe、DRAM、DMA 及中斷等接口邏輯,一般由云服務提供商提供,主要負責 FPGA 管理功能。
- 用戶邏輯:FPGA 的動態可重配置區域屬于用戶數據,即用戶的知識產權(
IP
)。
阿里云 FPGA 云主機在 F3 實例設計時也提出了 Role 的概念,它是和 Shell 類似的封裝,跟用戶邏輯一樣處于動態區域,其目的是簡化 Shell 功能,以盡可能減少 Shell 升級。另外,通過 Role 實現了同一個 Shell 既可以支持 OpenCL 開發,也可以支持 RTL 開發的功能,同時降低了用戶對 FPGA 的開發門檻。