xLlama是一個獨立的Python/C++/CUDA實現的GPT模型推理框架,旨在提供高效且內存友好的大模型推理方案。
ExLlama支持4-bit GPTQ量化訓練后的模型,可以減少模型大小,降低內存占用。該項目由turboderp在GitHub上開源,目前仍在積極開發中。
性能測試顯示,在RTX 4090單GPU上,ExLlama可以實現很不錯的速度。例如33B參數規模的模型,平均生成速度可達2959 tokens/s,最差情況下也有47 tokens/s,每億參數能達到約90萬tokens/s的速度。內存占用控制在21GB左右,保證桌面應用仍有空間運行。
雙GPU測試使用4090+3090 Ti,65B參數模型也可以達到1000多個tokens/s,但存在一些優化空間。整體而言,ExLlama使大模型也可以部署在消費級GPU上運作,提供出色的速度表現。
ExLlama計劃繼續提升性能,降低VRAM占用,增加更多模型的兼容性,豐富Python API功能等。ExLlama為消費級單機部署超大規模語言模型提供了可能,相信未來可以被更多研究者和開發者使用,豐富NLP應用生態。
從總體上來說,Windows 10是一個好系統,雖然我們天天戲稱它為“Bug 10”,但不可否認的是,從立項以來,開發團隊就一直在努力為它加入新的功能,其中有不少是相當實用的,比如說,他們在1709這個大版本中,為任務管理器加入了GPU性能監控單元,用戶可以通過任務管理器直觀地看到目前的GPU占用率,比以往要開GPU-Z等程序方便了不少。但很多用戶在實際使用的時候也發現了,這個針對GPU的性能監控好像不太準,我顯卡在全力計算的時候,任務管理器里面的GPU占用率怎么這么低?
比如我開個挖礦程序,顯卡的占用其實是滿的,但左邊GPU窗格中顯示的占用率只有3%
為了找出答案,我們找到了當時引入這項新功能時,開發者的講解Blog,由于是與圖形相關的內容,這篇Blog被歸入DirectX Developer Blog中。
首先開發者給我們講述了任務管理器是怎么得知GPU的占用情況的。在Windows 10上面,GPU通過Windows Display Driver Model(WDDM,Windows顯示驅動模型)抽象,它的核心——圖形內核——負責抽象、管理和在所有進程分配GPU資源。它含有一個GPU事務器(VidSch)和一個視頻內存管理器(VidMem),前者負責將GPU的各種引擎分配給想要使用它們的進程,并對訪問進行仲裁和優先級排序,后者則是負責管理GPU可調用的內存——包括專用的顯存和共享的系統內存。
任務管理器就是通過VidSch和VidMem回報的數據來計算GPU的使用情況的,這樣一來,不管程序使用了什么API(DX、OpenGL、OpenCL,甚至CUDA、Mantle這種專有API都可以監控),它都能準確地收集GPU的占用情況,另外由于兩者是實際負責分配GPU資源的,位于驅動層面,它們回報數據的精準度也要比很多第三方工具要高,使得任務管理器有很高的精度。
既然有很高的精度,那它為什么還是報不準我的GPU占用率呢?這就牽扯到另一個問題,GPU引擎。
現代GPU上除了有主要用于圖形、通用計算的統一計算單元外,還會集成一些其他的電路,比如說,用于視頻編解碼的專用模塊。它們之間的關系一般是并行的,GPU可以同時運行圖形計算和視頻編碼任務,在驅動層面,這些不同的模塊就被抽象為不同的Engine,也就是引擎,比如說一個典型的GPU可以有以下這些引擎:
在具體執行任務的時候,不同的任務會在不同的引擎上面執行,比如說我打游戲,就用到3D引擎;我用顯卡加速Premiere Pro,就用到CUDA引擎;我用NVENC編碼視頻,就用到視頻編碼引擎。
一張RTX 2060顯卡被系統抽象出的引擎
由于部分引擎之間有復用的關系,比如說3D引擎和CUDA引擎復用CUDA Cores進行計算,那么如果通過簡單加法來計算占用率,那這個占用率就有可能會超過100%。開發團隊也考慮過使用平均利用率來表示,但也不靠譜。那3D引擎不是被用的最多嗎,就用它怎么樣?也不太行,比如在視頻引擎滿載而3D引擎空載的情況下,它將會顯示0%的占用率,也是不準確的。最終,開發團隊選擇將當前最為繁忙的引擎占用率作為GPU整體占用率的代表。
恩……博文說的很好,那么到今天為止這個功能上線也有一段時間了,其具體表現是怎樣的呢?讓我們看回頂上的那張圖,在GPU的CUDA引擎滿載的情況下,其左邊的整體占用率仍然很低,顯然是沒有達到開發團隊所說的。
我們又測試了一下別的情況,這里使用NVENC對視頻進行編碼,此時可以看到左邊窗格中的GPU占用率又跑到了滿載。
而在跑典型的3D應用程序的時候,它也很正常。
最后,我們嘗試了OpenCL負載,這次任務管理器又能反映出CUDA引擎的占用率了。
如此看來,任務管理器GPU占用率的薛定諤情況可能是Windows 10的一個Bug所導致的,在大部分情況下,它都會反映負載最大引擎的占用率,但在某些情況下,它并不能夠正確地顯示當前最繁忙引擎的占用情況。