嵌入式 AI
AI 簡報(bào) 20230407 期
1. MLPref放榜!大模型時(shí)代算力領(lǐng)域“潛力股”浮出水面:梅開二度拿下世界第一,今年獲雙料冠軍
原文:https://mp.weixin.qq.com/s/KJCIjhqClBzcqfi-qtJp-A
后ChatGPT時(shí)代下的大模型“算力難”問題,“快、好、省”的解法,又來了一個(gè)。
就在今天,享有“AI界奧運(yùn)會(huì)”之稱的全球權(quán)威AI基準(zhǔn)評測MLPerf Inference v3.0,公布了最新結(jié)果——
來自中國的AI芯片公司,墨芯人工智能(下文簡稱“墨芯”),在最激烈的ResNet50模型比拼中奪冠!
而且在此成績背后,墨芯給大模型時(shí)代下的智能算力問題,提供了一個(gè)非常具有價(jià)值的方向——
它奪冠所憑借的稀疏計(jì)算,堪稱是大模型時(shí)代最不容忽視的算力“潛力股”。
不僅如此,墨芯此次還是斬獲了開放任務(wù)分區(qū)“雙料冠軍”的那種:
-
墨芯S40計(jì)算卡,以127,375 FPS,獲得單卡算力全球第一;
-
墨芯S30計(jì)算卡,以383,520 FPS算力,獲整機(jī)4卡算力全球第一。
而且墨芯靠著這套打法,在制程方面更是用首顆稀疏計(jì)算芯片12nm的Antoum?打敗了4nm。
不得不提的是,這次對于墨芯而言,還是“梅開二度”;因?yàn)樗谏弦粚肕LPerf,憑借S30同樣是拿下了冠軍。
在與GPT-3參數(shù)相當(dāng)?shù)拈_源LLM——1760億參數(shù)的BLOOM上,4張墨芯S30計(jì)算卡在僅采用中低倍稀疏率的情況下,就能實(shí)現(xiàn)25 tokens/s的內(nèi)容生成速度,超過8張A100。
那么稀疏計(jì)算為什么對大模型有這般良效?
算力紀(jì)錄再度被刷新
我們不妨先來看下,墨芯所刷新的紀(jì)錄到底是怎樣的一個(gè)水平。
以墨芯S40為例,在MLPerf數(shù)據(jù)中心的圖像任務(wù)主流模型ResNet-50上,且在相同數(shù)據(jù)集、相同精度條件下,算力達(dá)127,375 FPS。
這個(gè)“分?jǐn)?shù)”是老牌玩家英偉達(dá)H100、A100的1.4倍和2.9倍!
為什么稀疏計(jì)算會(huì)成為正解?
簡單理解,稀疏化就是一種聰明的數(shù)據(jù)處理和模型壓縮方式,它讓神經(jīng)網(wǎng)絡(luò)在計(jì)算時(shí),能夠僅啟用所需的神經(jīng)元。
而稀疏計(jì)算就是將原有AI計(jì)算的大量矩陣運(yùn)算中,含有零元素或無效元素的部分剔除,以加快計(jì)算速度,由此也能進(jìn)一步降低模型訓(xùn)練成本。
自從Transformers掀起大模型浪潮后,稀疏計(jì)算也成為了大廠關(guān)注的重點(diǎn)方向。
2021年,谷歌研究和OpenAI就罕見合作論文《Sparse is Enough in Scaling Transformers》,力證稀疏計(jì)算能為大模型帶來數(shù)十倍加速。
而更早以前,2017年OpenAI就發(fā)布了稀疏計(jì)算內(nèi)核,實(shí)現(xiàn)了在同等計(jì)算開銷的情況下,能計(jì)算更深的神經(jīng)網(wǎng)絡(luò)。
谷歌這幾年也密集發(fā)布了稀疏計(jì)算方面的多項(xiàng)工作,包括Pathways、PaLM、MoE、GLaM等。
其中Pathways架構(gòu)是稀疏計(jì)算領(lǐng)域的一項(xiàng)重要工作。谷歌在當(dāng)初發(fā)布時(shí)將其稱為“下一代人工智能架構(gòu)”,其技術(shù)博客由谷歌大腦負(fù)責(zé)人Jeff Dean親自操刀撰寫。
由此可見谷歌對Pathways架構(gòu)及稀疏計(jì)算的重視。
其核心原理在于稀疏計(jì)算,即在執(zhí)行任務(wù)時(shí)僅稀疏激活模型的特定部分,計(jì)算真正有用的元素。
并且在該架構(gòu)發(fā)布沒幾天后,谷歌就跟進(jìn)了稀疏計(jì)算領(lǐng)域的另一項(xiàng)重要工作:發(fā)布基于Pathways架構(gòu)的5400億參數(shù)大模型PaLM。
之后,谷歌還提出了首個(gè)多模態(tài)稀疏化模型LIMoE,它在降低模型計(jì)算量上的優(yōu)勢非常突出。
因?yàn)椴捎昧讼∈栌?jì)算,可以實(shí)現(xiàn)執(zhí)行一次任務(wù)只調(diào)用模型中的一個(gè)子模型,那么這次任務(wù)的成本將會(huì)和標(biāo)準(zhǔn)Transformer差不多。比如LIMoE-H/14總共有5.6B參數(shù),但是通過稀疏化,它只會(huì)使用每個(gè)token的675M參數(shù)。
就在今年ChatGPT大火后,稀疏化GPT方法也被提出,能夠?qū)崿F(xiàn)不降低模型效果的情況下,將大模型權(quán)重降低一半。
除了在算法架構(gòu)方面以外,硬件計(jì)算側(cè)對于稀疏化的關(guān)注也在提升。
比如英偉達(dá)就在其Ampere架構(gòu)中首次支持2倍稀疏計(jì)算。
Ampere架構(gòu)為英偉達(dá)A 100帶來了第三代Tensor Core核心,使其可以充分利用網(wǎng)絡(luò)權(quán)值下的細(xì)粒度稀疏化優(yōu)勢。
相較于稠密數(shù)學(xué)計(jì)算(dense math),能夠在不犧牲深度學(xué)習(xí)矩陣乘法累加任務(wù)精度的情況下,將最大吞吐量提高了2倍。
以上大廠的動(dòng)作,無疑都印證了稀疏計(jì)算會(huì)是大模型時(shí)代下AI計(jì)算的有效解之一。
由此也就不難理解,為什么墨芯會(huì)押中稀疏計(jì)算這一方向,并取得最新戰(zhàn)績。
一方面是很早洞察到了行業(yè)的發(fā)展趨勢;另一方面也是自身快速準(zhǔn)確做出了定位和判斷。
墨芯創(chuàng)始人兼CEO王維表示,他們從2018、2019年就看到了稀疏計(jì)算給AI計(jì)算帶來了數(shù)量級上的性能提升。
與此同時(shí),Transformers開啟了大模型時(shí)代,讓AI從1.0時(shí)代步入2.0,推動(dòng)了AI在應(yīng)用場景、算力需求等方面的改變。
尤其是算力方面,王維認(rèn)為已經(jīng)產(chǎn)生了質(zhì)變:
“小模型時(shí)代,用場景數(shù)據(jù)訓(xùn)練小模型,研發(fā)和部署周期短,對算力的需求主要是通用性、易用性。到了大模型時(shí)代,大模型主要基于Transformers模型架構(gòu),更追求計(jì)算速度和算力成本?!?/p>
而做稀疏計(jì)算,不只是墨芯一家想到了,前面提到英偉達(dá)也在推進(jìn)這方面進(jìn)展,不過王維表示,這對于GPU公司而言可能是“意外收獲”,但如果專注稀疏計(jì)算的話,需要做的是十倍甚至百倍加速。
因此,墨芯選擇的路線是從算法提升上升到軟硬協(xié)同層面。
2022年,墨芯發(fā)布首顆高稀疏倍率芯片Antoum?,能夠支持32倍稀疏,大幅降低大模型所需的計(jì)算量。
墨芯在MLPerf中開放分區(qū)的提交結(jié)果刷新記錄,也是對這一路線的進(jìn)一步印證。
據(jù)透露,不僅在MLPerf上表現(xiàn)出色,墨芯的產(chǎn)品商業(yè)落地上也進(jìn)展迅速。
墨芯AI計(jì)算卡發(fā)布數(shù)月就已實(shí)現(xiàn)量產(chǎn),在互聯(lián)網(wǎng)等領(lǐng)域成單落地。ChatGPT走紅后墨芯也收到大量客戶問詢,了解稀疏計(jì)算在大模型上的算力優(yōu)勢與潛力。
如今,ChatGPT開啟新一輪AI浪潮,大模型領(lǐng)域開啟競速賽、算力需求空前暴增。
如微軟為訓(xùn)練ChatGPT打造了一臺(tái)超算——由上萬張英偉達(dá)A100芯片打造,甚至專門為此調(diào)整了服務(wù)器架構(gòu),只為給ChatGPT和新必應(yīng)AI提供更好的算力。還在Azure的60多個(gè)數(shù)據(jù)中心部署了幾十萬張GPU,用于ChatGPT的推理。
畢竟,只有充足的算力支持,才能推動(dòng)模型更快迭代升級。
怪不得行業(yè)內(nèi)有聲音說,這輪趨勢,英偉達(dá)當(dāng)屬最大幕后贏家。
但與此同時(shí),摩爾定律式微也是事實(shí),單純堆硬件已經(jīng)無法滿足當(dāng)下算力需求,由此這也推動(dòng)了算力行業(yè)迎來更新一輪機(jī)遇和變革??梢钥吹?,近兩年并行計(jì)算等加速方案愈發(fā)火熱,這就是已經(jīng)發(fā)生的變化。
而ChatGPT的火熱,無疑加速了這一變革。在真實(shí)需求的推動(dòng)下,算力領(lǐng)域硬件軟件創(chuàng)新突破也會(huì)更快發(fā)生,模型會(huì)重新定義算法,算法會(huì)重新定義芯片。
2. CV不存在了?Meta發(fā)布「分割一切」AI 模型,CV或迎來GPT-3時(shí)刻
原文:https://mp.weixin.qq.com/s/-LWG3rOz60VWiwdYG3iaWQ
這下 CV 是真不存在了。< 快跑 >」這是知乎網(wǎng)友對于一篇 Meta 新論文的評價(jià)。
如標(biāo)題所述,這篇論文只做了一件事情:(零樣本)分割一切。類似 GPT-4 已經(jīng)做到的「回答一切」。
除了2.0之外,還發(fā)布了一系列PyTorch域庫的beta更新,包括那些在樹中的庫,以及包括 TorchAudio、TorchVision和TorchText在內(nèi)的獨(dú)立庫。TorchX的更新也同時(shí)發(fā)布,可以提供社區(qū)支持模式。
Meta 表示,這是第一個(gè)致力于圖像分割的基礎(chǔ)模型。自此,CV 也走上了「做一個(gè)統(tǒng)一某個(gè)(某些?全部?)任務(wù)的全能模型」的道路。
在此之前,分割作為計(jì)算機(jī)視覺的核心任務(wù),已經(jīng)得到廣泛應(yīng)用。但是,為特定任務(wù)創(chuàng)建準(zhǔn)確的分割模型通常需要技術(shù)專家進(jìn)行高度專業(yè)化的工作,此外,該項(xiàng)任務(wù)還需要大量的領(lǐng)域標(biāo)注數(shù)據(jù),種種因素限制了圖像分割的進(jìn)一步發(fā)展。
Meta 在論文中發(fā)布的新模型名叫 Segment Anything Model (SAM) 。他們在博客中介紹說,「SAM 已經(jīng)學(xué)會(huì)了關(guān)于物體的一般概念,并且它可以為任何圖像或視頻中的任何物體生成 mask,甚至包括在訓(xùn)練過程中沒有遇到過的物體和圖像類型。SAM 足夠通用,可以涵蓋廣泛的用例,并且可以在新的圖像『領(lǐng)域』上即開即用,無需額外的訓(xùn)練?!乖谏疃葘W(xué)習(xí)領(lǐng)域,這種能力通常被稱為零樣本遷移,這也是 GPT-4 震驚世人的一大原因。
論文地址:https://arxiv.org/abs/2304.02643
項(xiàng)目地址:https://github.com/facebookresearch/segment-anything
Demo 地址:https://segment-anything.com/
除了模型,Meta 還發(fā)布了一個(gè)圖像注釋數(shù)據(jù)集 Segment Anything 1-Billion (SA-1B),據(jù)稱這是有史以來最大的分割數(shù)據(jù)集。該數(shù)據(jù)集可用于研究目的,并且 Segment Anything Model 在開放許可 (Apache 2.0) 下可用。
我們先來看看效果。如下面動(dòng)圖所示,SAM 能很好的自動(dòng)分割圖像中的所有內(nèi)容:
英偉達(dá)人工智能科學(xué)家 Jim Fan 表示:「對于 Meta 的這項(xiàng)研究,我認(rèn)為是計(jì)算機(jī)視覺領(lǐng)域的 GPT-3 時(shí)刻之一。它已經(jīng)了解了物體的一般概念,即使對于未知對象、不熟悉的場景(例如水下圖像)和模棱兩可的情況下也能進(jìn)行很好的圖像分割。最重要的是,模型和數(shù)據(jù)都是開源的。恕我直言,Segment-Anything 已經(jīng)把所有事情(分割)都做的很好了?!?/p>
方法介紹
此前解決分割問題大致有兩種方法。第一種是交互式分割,該方法允許分割任何類別的對象,但需要一個(gè)人通過迭代細(xì)化掩碼來指導(dǎo)該方法。第二種,自動(dòng)分割,允許分割提前定義的特定對象類別(例如,貓或椅子),但需要大量的手動(dòng)注釋對象來訓(xùn)練(例如,數(shù)千甚至數(shù)萬個(gè)分割貓的例子)。這兩種方法都沒有提供通用的、全自動(dòng)的分割方法。
SAM 很好的概括了這兩種方法。它是一個(gè)單一的模型,可以輕松地執(zhí)行交互式分割和自動(dòng)分割。該模型的可提示界面允許用戶以靈活的方式使用它,只需為模型設(shè)計(jì)正確的提示(點(diǎn)擊、boxes、文本等),就可以完成范圍廣泛的分割任務(wù)。
總而言之,這些功能使 SAM 能夠泛化到新任務(wù)和新領(lǐng)域。這種靈活性在圖像分割領(lǐng)域尚屬首創(chuàng)。
Meta 表示,他們受到語言模型中提示的啟發(fā),因而其訓(xùn)練完成的 SAM 可以為任何提示返回有效的分割掩碼,其中提示可以是前景、背景點(diǎn)、粗框或掩碼、自由格式文本,或者說能指示圖像中要分割內(nèi)容的任何信息。而有效掩碼的要求僅僅意味著即使提示不明確并且可能指代多個(gè)對象(例如,襯衫上的一個(gè)點(diǎn)可能表示襯衫或穿著它的人),輸出也應(yīng)該是一個(gè)合理的掩碼(就如上面動(dòng)圖「SAM 還能為為不明確的提示生成多個(gè)有效掩碼」所示)。此任務(wù)用于預(yù)訓(xùn)練模型并通過提示解決一般的下游分割任務(wù)。
如下圖所示 ,圖像編碼器為圖像生成一次性嵌入,而輕量級編碼器將提示實(shí)時(shí)轉(zhuǎn)換為嵌入向量。然后將這兩個(gè)信息源組合在一個(gè)預(yù)測分割掩碼的輕量級解碼器中。在計(jì)算圖像嵌入后,SAM 可以在 50 毫秒內(nèi)根據(jù)網(wǎng)絡(luò)瀏覽器中的任何提示生成一個(gè)分割。
1100 萬張圖片,1B+ 掩碼
數(shù)據(jù)集是使用 SAM 收集的。標(biāo)注者使用 SAM 交互地注釋圖像,之后新注釋的數(shù)據(jù)又反過來更新 SAM,可謂是相互促進(jìn)。
使用該方法,交互式地注釋一個(gè)掩碼只需大約 14 秒。與之前的大規(guī)模分割數(shù)據(jù)收集工作相比,Meta 的方法比 COCO 完全手動(dòng)基于多邊形的掩碼注釋快 6.5 倍,比之前最大的數(shù)據(jù)注釋工作快 2 倍,這是因?yàn)橛辛?SAM 模型輔助的結(jié)果。
最終的數(shù)據(jù)集超過 11 億個(gè)分割掩碼,在大約 1100 萬張經(jīng)過許可和隱私保護(hù)圖像上收集而來。SA-1B 的掩碼比任何現(xiàn)有的分割數(shù)據(jù)集多 400 倍,并且經(jīng)人工評估研究證實(shí),這些掩碼具有高質(zhì)量和多樣性,在某些情況下甚至在質(zhì)量上可與之前更小、完全手動(dòng)注釋的數(shù)據(jù)集的掩碼相媲美 。
未來展望
通過研究和數(shù)據(jù)集共享,Meta 希望進(jìn)一步加速對圖像分割以及更通用圖像與視頻理解的研究。可提示的分割模型可以充當(dāng)更大系統(tǒng)中的一個(gè)組件,執(zhí)行分割任務(wù)。作為一種強(qiáng)大的工具,組合(Composition)允許以可擴(kuò)展的方式使用單個(gè)模型,并有可能完成模型設(shè)計(jì)時(shí)未知的任務(wù)。
Meta 預(yù)計(jì),與專門為一組固定任務(wù)訓(xùn)練的系統(tǒng)相比,基于 prompt 工程等技術(shù)的可組合系統(tǒng)設(shè)計(jì)將支持更廣泛的應(yīng)用。SAM 可以成為 AR、VR、內(nèi)容創(chuàng)建、科學(xué)領(lǐng)域和更通用 AI 系統(tǒng)的強(qiáng)大組件。比如 SAM 可以通過 AR 眼鏡識(shí)別日常物品,為用戶提供提示。
3. 谷歌TPU超算,大模型性能超英偉達(dá),已部署數(shù)十臺(tái):圖靈獎(jiǎng)得主新作
原文:https://mp.weixin.qq.com/s/uEAlKdpzutOpnPGmg5dOjw
我們還沒有看到能與 ChatGPT 相匹敵的 AI 大模型,但在算力基礎(chǔ)上,領(lǐng)先的可能并不是微軟和 OpenAI。
本周二,谷歌公布了其訓(xùn)練語言大模型的超級計(jì)算機(jī)的細(xì)節(jié),基于 TPU 的超算系統(tǒng)已經(jīng)可以比英偉達(dá)的同類更加快速、節(jié)能。
谷歌張量處理器(tensor processing unit,TPU)是該公司為機(jī)器學(xué)習(xí)定制的專用芯片(ASIC),第一代發(fā)布于 2016 年,成為了 AlphaGo 背后的算力。與 GPU 相比,TPU 采用低精度計(jì)算,在幾乎不影響深度學(xué)習(xí)處理效果的前提下大幅降低了功耗、加快運(yùn)算速度。同時(shí),TPU 使用了脈動(dòng)陣列等設(shè)計(jì)來優(yōu)化矩陣乘法與卷積運(yùn)算。
當(dāng)前,谷歌 90% 以上的人工智能訓(xùn)練工作都在使用這些芯片,TPU 支撐了包括搜索的谷歌主要業(yè)務(wù)。作為圖靈獎(jiǎng)得主、計(jì)算機(jī)架構(gòu)巨擘,大衛(wèi)?帕特森(David Patterson)在 2016 年從 UC Berkeley 退休后,以杰出工程師的身份加入了谷歌大腦團(tuán)隊(duì),為幾代 TPU 的研發(fā)做出了卓越貢獻(xiàn)。
如今 TPU 已經(jīng)發(fā)展到了第四代,谷歌本周二由 Norman Jouppi、大衛(wèi)?帕特森等人發(fā)表的論文《 TPU v4: An Optically Reconfigurable Supercomputer for Machine Learning with Hardware Support for Embeddings 》詳細(xì)介紹了自研的光通信器件是如何將 4000 多塊芯片并聯(lián)成為超級計(jì)算機(jī),以提升整體效率的。
論文鏈接:
https://arxiv.org/ftp/arxiv/papers/2304/2304.01433.pdf
TPU v4 的性能比 TPU v3 高 2.1 倍,性能功耗比提高 2.7 倍?;?TPU v4 的超級計(jì)算機(jī)擁有 4096 塊芯片,整體速度提高了約 10 倍。對于類似大小的系統(tǒng),谷歌能做到比 Graphcore IPU Bow 快 4.3-4.5 倍,比 Nvidia A100 快 1.2-1.7 倍,功耗低 1.3-1.9 倍。
除了芯片本身的算力,芯片間互聯(lián)已成為構(gòu)建 AI 超算的公司之間競爭的關(guān)鍵點(diǎn),最近一段時(shí)間,谷歌的 Bard、OpenAI 的 ChatGPT 這樣的大語言模型(LLM)規(guī)模正在爆炸式增長,算力已經(jīng)成為明顯的瓶頸。
由于大模型動(dòng)輒千億的參數(shù)量,它們必須由數(shù)千塊芯片共同分擔(dān),并持續(xù)數(shù)周或更長時(shí)間進(jìn)行訓(xùn)練。谷歌的 PaLM 模型 —— 其迄今為止最大的公開披露的語言模型 —— 在訓(xùn)練時(shí)被拆分到了兩個(gè)擁有 4000 塊 TPU 芯片的超級計(jì)算機(jī)上,用時(shí) 50 天。
谷歌表示,通過光電路交換機(jī)(OCS),其超級計(jì)算機(jī)可以輕松地動(dòng)態(tài)重新配置芯片之間的連接,有助于避免出現(xiàn)問題并實(shí)時(shí)調(diào)整以提高性能。
下圖展示了 TPU v4 4×3 方式 6 個(gè)「面」的鏈接。每個(gè)面有 16 條鏈路,每個(gè)塊總共有 96 條光鏈路連接到 OCS 上。要提供 3D 環(huán)面的環(huán)繞鏈接,相對側(cè)的鏈接必須連接到相同的 OCS。因此,每個(gè) 4×3 塊 TPU 連接到 6 × 16 ÷ 2 = 48 個(gè) OCS 上。Palomar OCS 為 136×136(128 個(gè)端口加上 8 個(gè)用于鏈路測試和修復(fù)的備用端口),因此 48 個(gè) OCS 連接來自 64 個(gè) 4×3 塊(每個(gè) 64 個(gè)芯片)的 48 對電纜,總共并聯(lián) 4096 個(gè) TPU v4 芯片。
根據(jù)這樣的排布,TPU v4(中間的 ASIC 加上 4 個(gè) HBM 堆棧)和帶有 4 個(gè)液冷封裝的印刷電路板 (PCB)。該板的前面板有 4 個(gè)頂部 PCIe 連接器和 16 個(gè)底部 OSFP 連接器,用于托盤間 ICI 鏈接。
與超級計(jì)算機(jī)一樣,工作負(fù)載由不同規(guī)模的算力承擔(dān),稱為切片:64 芯片、128 芯片、256 芯片等。下圖顯示了當(dāng)主機(jī)可用性從 99.0% 到 99.9% 不等有,及沒有 OCS 時(shí)切片大小的「有效輸出」。如果沒有 OCS,主機(jī)可用性必須達(dá)到 99.9% 才能提供合理的切片吞吐量。對于大多數(shù)切片大小,OCS 也有 99.0% 和 99.5% 的良好輸出。
與 Infiniband 相比,OCS 的成本更低、功耗更低、速度更快,成本不到系統(tǒng)成本的 5%,功率不到系統(tǒng)功率的 3%。每個(gè) TPU v4 都包含 SparseCores 數(shù)據(jù)流處理器,可將依賴嵌入的模型加速 5 至 7 倍,但僅使用 5% 的裸片面積和功耗。
「這種切換機(jī)制使得繞過故障組件變得容易,」谷歌研究員 Norm Jouppi 和谷歌杰出工程師大衛(wèi)?帕特森在一篇關(guān)于該系統(tǒng)的博客文章中寫道?!高@種靈活性甚至允許我們改變超級計(jì)算機(jī)互連的拓?fù)浣Y(jié)構(gòu),以加速機(jī)器學(xué)習(xí)模型的性能。」
在新論文上,谷歌著重介紹了稀疏核(SparseCore,SC)的設(shè)計(jì)。在大模型的訓(xùn)練階段,embedding 可以放在 TensorCore 或超級計(jì)算機(jī)的主機(jī) CPU 上處理。TensorCore 具有寬 VPU 和矩陣單元,并針對密集操作進(jìn)行了優(yōu)化。由于小的聚集 / 分散內(nèi)存訪問和可變長度數(shù)據(jù)交換,在 TensorCore 上放置嵌入其實(shí)并不是最佳選擇。在超級計(jì)算機(jī)的主機(jī) CPU 上放置嵌入會(huì)在 CPU DRAM 接口上引發(fā)阿姆達(dá)爾定律瓶頸,并通過 4:1 TPU v4 與 CPU 主機(jī)比率放大。數(shù)據(jù)中心網(wǎng)絡(luò)的尾部延遲和帶寬限制將進(jìn)一步限制訓(xùn)練系統(tǒng)。
對此,谷歌認(rèn)為可以使用 TPU 超算的總 HBM 容量優(yōu)化性能,加入專用 ICI 網(wǎng)絡(luò),并提供快速收集 / 分散內(nèi)存訪問支持。這導(dǎo)致了 SparseCore 的協(xié)同設(shè)計(jì)。
SC 是一種用于嵌入訓(xùn)練的特定領(lǐng)域架構(gòu),從 TPU v2 開始,后來在 TPU v3 和 TPU v4 中得到改進(jìn)。SC 相對劃算,只有芯片面積的約 5% 和功率的 5% 左右。SC 結(jié)合超算規(guī)模的 HBM 和 ICI 來創(chuàng)建一個(gè)平坦的、全局可尋址的內(nèi)存空間(TPU v4 中為 128 TiB)。與密集訓(xùn)練中大參數(shù)張量的全部歸約相比,較小嵌入向量的全部傳輸使用 HBM 和 ICI 以及更細(xì)粒度的分散 / 聚集訪問模式。
作為獨(dú)立的核心,SC 允許跨密集計(jì)算、SC 和 ICI 通信進(jìn)行并行化。下圖顯示了 SC 框圖,谷歌將其視為「數(shù)據(jù)流」架構(gòu)(dataflow),因?yàn)閿?shù)據(jù)從內(nèi)存流向各種直接連接的專用計(jì)算單元。
TPU v4 比當(dāng)代 DSA 芯片速度更快、功耗更低,如果考慮到互連技術(shù),功率邊緣可能會(huì)更大。通過使用具有 3D 環(huán)面拓?fù)涞?3K TPU v4 切片,與 TPU v3 相比,谷歌的超算也能讓 LLM 的訓(xùn)練時(shí)間大大減少。
性能、可擴(kuò)展性和可用性使 TPU v4 超級計(jì)算機(jī)成為 LaMDA、MUM 和 PaLM 等大型語言模型 (LLM) 的主要算力。這些功能使 5400 億參數(shù)的 PaLM 模型在 TPU v4 超算上進(jìn)行訓(xùn)練時(shí),能夠在 50 天內(nèi)維持 57.8% 的峰值硬件浮點(diǎn)性能。
谷歌表示,其已經(jīng)部署了數(shù)十臺(tái) TPU v4 超級計(jì)算機(jī),供內(nèi)部使用和外部通過谷歌云使用。
4. 130億參數(shù),8個(gè)A100訓(xùn)練,UC伯克利發(fā)布對話模型Koala
原文:https://mp.weixin.qq.com/s/uI5-sUOY2vdr1ekX-bh_WQ
自從 Meta 發(fā)布并開源了 LLaMA 系列模型,來自斯坦福大學(xué)、UC 伯克利等機(jī)構(gòu)的研究者們紛紛在 LLaMA 的基礎(chǔ)上進(jìn)行「二創(chuàng)」,先后推出了 Alpaca、Vicuna 等多個(gè)「羊駝」大模型。
羊駝已然成為開源社區(qū)的新晉頂流。由于「二創(chuàng)」過于豐富,生物學(xué)羊駝屬的英文單詞都快不夠用了,但是用其他動(dòng)物的名字給大模型命名也是可以的。
最近,UC 伯克利的伯克利人工智能研究院(BAIR)發(fā)布了一個(gè)可以在消費(fèi)級 GPU 上運(yùn)行的對話模型 Koala(直譯為考拉)。Koala 使用從網(wǎng)絡(luò)收集的對話數(shù)據(jù)對 LLaMA 模型進(jìn)行微調(diào)。
項(xiàng)目地址:
https://bair.berkeley.edu/blog/2023/04/03/koala/
Demo 地址:
https://chat.lmsys.org/?model=koala-13b
開源地址:
https://github.com/young-geng/EasyLM
Koala 概述
與 Vicuna 類似,Koala 也使用從網(wǎng)絡(luò)收集的對話數(shù)據(jù)對 LLaMA 模型進(jìn)行微調(diào),其中重點(diǎn)關(guān)注與 ChatGPT 等閉源大模型對話的公開數(shù)據(jù)。
研究團(tuán)隊(duì)表示,Koala 模型在 EasyLM 中使用 JAX/Flax 實(shí)現(xiàn),并在配備 8 個(gè) A100 GPU 的單個(gè) Nvidia DGX 服務(wù)器上訓(xùn)練 Koala 模型。完成 2 個(gè) epoch 的訓(xùn)練需要 6 個(gè)小時(shí)。在公共云計(jì)算平臺(tái)上,進(jìn)行此類訓(xùn)練的成本通常低于 100 美元。
研究團(tuán)隊(duì)將 Koala 與 ChatGPT 和斯坦福大學(xué)的 Alpaca 進(jìn)行了實(shí)驗(yàn)比較,結(jié)果表明:具有 130 億參數(shù)的 Koala-13B 可以有效地響應(yīng)各種用戶查詢,生成的響應(yīng)通常優(yōu)于 Alpaca,并且在超過一半的情況下與 ChatGPT 性能相當(dāng)。
Koala 最重要的意義是它表明:在質(zhì)量較高的數(shù)據(jù)集上進(jìn)行訓(xùn)練,那么小到可以在本地運(yùn)行的模型也可以獲得類似大模型的優(yōu)秀性能。這意味著開源社區(qū)應(yīng)該更加努力地管理高質(zhì)量數(shù)據(jù)集,因?yàn)檫@可能比簡單地增加現(xiàn)有系統(tǒng)的規(guī)模更能實(shí)現(xiàn)安全、真實(shí)和強(qiáng)大的模型。從這個(gè)角度看,Koala 是 ChatGPT 一種小而精的平替。
不過,Koala 還只是一個(gè)研究原型,在內(nèi)容、安全性和可靠性方面仍然存在重大缺陷,也不應(yīng)用于研究之外的任何用途。
數(shù)據(jù)集和訓(xùn)練
構(gòu)建對話模型的主要障礙是管理訓(xùn)練數(shù)據(jù)。ChatGPT、Bard、Bing Chat 和 Claude 等大型對話模型都使用帶有大量人工注釋的專有數(shù)據(jù)集。為了構(gòu)建 Koala 的訓(xùn)練數(shù)據(jù)集,研究團(tuán)隊(duì)從網(wǎng)絡(luò)和公共數(shù)據(jù)集中收集對話數(shù)據(jù)并整理,其中包含用戶公開分享的與大型語言模型(例如 ChatGPT)對話的數(shù)據(jù)。
不同于其他模型盡可能多地抓取網(wǎng)絡(luò)數(shù)據(jù)來最大化數(shù)據(jù)集,Koala 是專注于收集小型高質(zhì)量數(shù)據(jù)集,包括公共數(shù)據(jù)集中的問答部分、人類反饋(正面和負(fù)面)以及與現(xiàn)有語言模型的對話。具體而言,Koala 的訓(xùn)練數(shù)據(jù)集包括如下幾個(gè)部分:
ChatGPT 蒸餾數(shù)據(jù):
-
公開可用的與 ChatGPT 對話數(shù)據(jù)(ShareGPT);
-
Human ChatGPT 比較語料庫 (HC3),其中同時(shí)使用來自 HC3 數(shù)據(jù)集的人類和 ChatGPT 響應(yīng)。
開源數(shù)據(jù):
-
Open Instruction Generalist (OIG);
-
斯坦福 Alpaca 模型使用的數(shù)據(jù)集;
-
Anthropic HH;
-
OpenAI WebGPT;
-
OpenAI Summarization。
實(shí)驗(yàn)與評估
該研究進(jìn)行了一項(xiàng)人工評估,將 Koala-All 與 Koala-Distill、Alpaca 和 ChatGPT 幾個(gè)模型的生成結(jié)果進(jìn)行比較,結(jié)果如下圖所示。其中,使用兩個(gè)不同的數(shù)據(jù)集進(jìn)行測試,一個(gè)是斯坦福的 Alpaca 測試集,其中包括 180 個(gè)測試查詢(Alpaca Test Set),另一個(gè)是 Koala Test Set。
總的來說,Koala 模型足以展示 LLM 的許多功能,同時(shí)又足夠小,方便進(jìn)行微調(diào)或在計(jì)算資源有限的情況下使用。研究團(tuán)隊(duì)希望 Koala 模型成為未來大型語言模型學(xué)術(shù)研究的有用平臺(tái),潛在的研究應(yīng)用方向可能包括:
-
安全性和對齊:Koala 允許進(jìn)一步研究語言模型的安全性并更好地與人類意圖保持一致。
-
模型偏差:Koala 使我們能夠更好地理解大型語言模型的偏差,深入研究對話數(shù)據(jù)集的質(zhì)量問題,最終有助于改進(jìn)大型語言模型的性能。
-
理解大型語言模型:由于 Koala 模型可以在相對便宜的消費(fèi)級 GPU 上運(yùn)行,并且執(zhí)行多種任務(wù),因此 Koala 使我們能夠更好地檢查和理解對話語言模型的內(nèi)部結(jié)構(gòu),使語言模型更具可解釋性。
5. 這款編譯器能讓Python和C++一樣快:最高提速百倍,MIT出品
原文:https://mp.weixin.qq.com/s/EOfsFCZa_IaqIsmsrxSujQ
自深度學(xué)習(xí)興起以來,Python 一直是最熱門的編程語言之一,它在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域占主導(dǎo)地位,甚至是科學(xué)和數(shù)學(xué)計(jì)算領(lǐng)域的主角。如今你能想象到的任何項(xiàng)目,幾乎都可以找到一個(gè)相應(yīng)的 Python 包。
然而,盡管高級語言的簡化語法使其易于學(xué)習(xí)和使用,但和 C 或 C++ 等低級語言相比,它的速度更慢。
麻省理工學(xué)院計(jì)算機(jī)科學(xué)與人工智能實(shí)驗(yàn)室(CSAIL)的研究人員希望通過 Codon 來改變這一現(xiàn)狀,Codon 是一種基于 Python 的編譯器,允許用戶編寫與 C 或 C++ 程序一樣高效運(yùn)行的 Python 代碼,同時(shí)可以定制和適應(yīng)不同的需求和環(huán)境。
該研究的最新論文《Codon: A Compiler for High-Performance Pythonic Applications and DSLs》發(fā)表在了 2 月份的第 32 屆 ACM SIGPLAN 編譯器構(gòu)建國際會(huì)議上。
項(xiàng)目鏈接:
https://github.com/exaloop/codon
論文:
https://dl.acm.org/doi/abs/10.1145/3578360.3580275
在開發(fā)工作中,人們需要使用編譯器將源代碼轉(zhuǎn)換為可由計(jì)算機(jī)處理器執(zhí)行的機(jī)器代碼,Codon 能幫助開發(fā)者在 Python 中創(chuàng)建新的領(lǐng)域特定語言(DSL),同時(shí)仍然獲得其他語言的性能優(yōu)勢。
「常規(guī) Python 會(huì)被編譯成所謂的字節(jié)碼,該字節(jié)碼在虛擬機(jī)中執(zhí)行,這就會(huì)讓速度慢上很多,」Codon 論文的主要作者 Ariya Shajii 表示,「通過 Codon,我們則進(jìn)行本地編譯,因此你可以直接在 CPU 上運(yùn)行最終結(jié)果 —— 不經(jīng)過中間虛擬機(jī)或解釋器。」
基于 Python 的編譯器帶有適用于 Linux 和 macOS 的預(yù)構(gòu)建二進(jìn)制文件,你還可以從源代碼構(gòu)建或生成可執(zhí)行文件?!甘褂?Codon,你可以像 Python 一樣分發(fā)源代碼,或者你可以將它編譯成二進(jìn)制文件,」Shajii 說。「如果你想分發(fā)一個(gè)二進(jìn)制文件,它將與像 C++ 這樣的語言一樣,例如一個(gè) Linux 二進(jìn)制文件或一個(gè) Mac 二進(jìn)制文件?!?/p>
為了讓 Codon 更快,研究人員決定在編譯時(shí)執(zhí)行類型檢查。類型檢查涉及將數(shù)據(jù)類型(例如整數(shù)、字符串、字符或浮點(diǎn)數(shù)等)分配給值。例如數(shù)字 5 可以分配為整數(shù),字母 c 可以分配為字符,單詞 hello 可以分配為字符串,十進(jìn)制數(shù) 3.14 可以分配為浮點(diǎn)數(shù)。
「在常規(guī) Python 中,所有類型都給了 runtime,」Shajii 介紹道?!甘褂?Codon,我們在編譯過程中進(jìn)行類型檢查,這讓我們避免了在 runtime 進(jìn)行所有昂貴的類型操作?!?/p>
MIT CSAIL 首席研究員 Saman Amarasinghe 補(bǔ)充說,「如果你有一種動(dòng)態(tài)語言(比如 Python),每次你有一些數(shù)據(jù)時(shí),你都需要在它周圍保留很多額外的元數(shù)據(jù),以確定 runtime 的類型。Codon 取消了這種元數(shù)據(jù),因此代碼速度更快,數(shù)據(jù)更小?!?/p>
根據(jù) Shajii 的說法,Codon 在運(yùn)行時(shí)沒有任何不必要的數(shù)據(jù)或類型檢查,所以開銷為零。在性能方面,「Codon 通常與 C++ 不相上下。與 Python 相比,我們通??吹降氖?10 到 100 倍的速度改進(jìn)?!?/p>
另一方面,Codon 的方法有其權(quán)衡?!肝覀冞M(jìn)行這種靜態(tài)類型檢查,并且不允許使用 Python 的一些動(dòng)態(tài)特性,比如在 runtime 動(dòng)態(tài)更改類型,」Shajii 表示。
「還有一些 Python 庫我們還沒有實(shí)現(xiàn)?!笰marasinghe 補(bǔ)充說,「Python 已經(jīng)過無數(shù)人的實(shí)際測試,而 Codon 還沒有達(dá)到那樣的水平,它需要運(yùn)行更多的程序,獲得更多的反饋,并加固更多。達(dá)到常規(guī) Python 的穩(wěn)定水平需要一些時(shí)間?!?/p>
Codon 最初設(shè)計(jì)用于基因組學(xué)和生物信息學(xué)的工作。研究人員嘗試了大約 10 個(gè)用 Python 編寫的常用基因組學(xué)應(yīng)用程序,并使用 Codon 對其進(jìn)行了編譯,與最初的手動(dòng)優(yōu)化實(shí)現(xiàn)相比實(shí)現(xiàn)了 5 到 10 倍的加速。
「如今這些領(lǐng)域的數(shù)據(jù)集已變得非常大,而像 Python 和 R 這樣的高級語言速度太慢,無法處理每組測序 TB 級的數(shù)據(jù)量,」Shajii 說道?!高@就是我們想要填補(bǔ)的空白 —— 通過構(gòu)建一種無需寫 C 或 C++ 代碼即可處理大數(shù)據(jù)的方法,從而為非計(jì)算機(jī)科學(xué)或?qū)I(yè)開發(fā)者的領(lǐng)域?qū)<姨峁椭??!?/p>
除了基因組學(xué),Codon 還可以應(yīng)用于處理海量數(shù)據(jù)集的類似應(yīng)用程序,以及基于 Python 的編譯器支持的 GPU 編程和并行編程等領(lǐng)域。事實(shí)上,Codon 現(xiàn)在正通過初創(chuàng)公司 Exaloop 在生物信息學(xué)、深度學(xué)習(xí)和量化金融領(lǐng)域進(jìn)行商業(yè)應(yīng)用,Shajii 創(chuàng)立了該公司,旨在將 Codon 從學(xué)術(shù)項(xiàng)目轉(zhuǎn)變?yōu)樾袠I(yè)應(yīng)用。
為了使 Codon 能夠適應(yīng)不同領(lǐng)域,該團(tuán)隊(duì)開發(fā)了一個(gè)插件系統(tǒng)?!杆拖褚粋€(gè)可擴(kuò)展的編譯器,」Shajii 說道。「你可以為基因組學(xué)或其他領(lǐng)域編寫插件,這些插件可以有新的庫和新的編譯器優(yōu)化?!?/p>
此外,公司和機(jī)構(gòu)可以使用 Codon 來制作原型和開發(fā)自己的應(yīng)用程序?!肝覀兛吹降囊环N模式是:人們使用 Python 進(jìn)行原型設(shè)計(jì)和測試,因?yàn)樗子谑褂茫搅四承┲匾马?xiàng)上,他們就不得不重寫應(yīng)用程序,或讓其他人用 C 或 C++ 在更大的數(shù)據(jù)集上進(jìn)行重寫與測試,」Shajii 表示?!竿ㄟ^ Codon,你就可以完全使用 Python,并獲得兩全其美的好處?!?/p>
關(guān)于 Codon 的未來,Shajii 和他的團(tuán)隊(duì)目前正在研究廣泛使用的 Python 庫的本地實(shí)現(xiàn),以及特定于庫的優(yōu)化,以幫助人們從這些庫中獲得更好的性能。他們還計(jì)劃創(chuàng)建一個(gè)廣受歡迎的功能:Codon 的 WebAssembly 后端,以支持在 Web 瀏覽器上運(yùn)行代碼。
6. Pytorch中模型的保存與遷移
https://mp.weixin.qq.com/s/c0QI44bmOp6hJLVWPXAgrw
1 引言
各位朋友大家好,今天要和大家介紹的內(nèi)容是如何在Pytorch框架中對模型進(jìn)行保存和載入、以及模型的遷移和再訓(xùn)練。
一般來說,最常見的場景就是模型完成訓(xùn)練后的推斷過程。一個(gè)網(wǎng)絡(luò)模型在完成訓(xùn)練后通常都需要對新樣本進(jìn)行預(yù)測,此時(shí)就只需要構(gòu)建模型的前向傳播過程,然后載入已訓(xùn)練好的參數(shù)初始化網(wǎng)絡(luò)即可。
第2個(gè)場景就是模型的再訓(xùn)練過程。一個(gè)模型在一批數(shù)據(jù)上訓(xùn)練完成之后需要將其保存到本地,并且可能過了一段時(shí)間后又收集到了一批新的數(shù)據(jù),因此這個(gè)時(shí)候就需要將之前的模型載入進(jìn)行在新數(shù)據(jù)上進(jìn)行增量訓(xùn)練(或者是在整個(gè)數(shù)據(jù)上進(jìn)行全量訓(xùn)練)。
第3個(gè)應(yīng)用場景就是模型的遷移學(xué)習(xí)。這個(gè)時(shí)候就是將別人已經(jīng)訓(xùn)練好的預(yù)模型拿過來,作為你自己網(wǎng)絡(luò)模型參數(shù)的一部分進(jìn)行初始化。例如:你自己在Bert模型的基礎(chǔ)上加了幾個(gè)全連接層來做分類任務(wù),那么你就需要將原始BERT模型中的參數(shù)載入并以此來初始化你的網(wǎng)絡(luò)中的Bert部分的權(quán)重參數(shù)。
在接下來的這篇文章中,筆者就以上述3個(gè)場景為例來介紹如何利用Pytorch框架來完成上述過程。
2 模型的保存與復(fù)用
在Pytorch中,我們可以通過torch.save()
和torch.load()
來完成上述場景中的主要步驟。下面,筆者將以之前介紹的LeNet5網(wǎng)絡(luò)模型為例來分別進(jìn)行介紹。不過在這之前,我們先來看看Pytorch中模型參數(shù)的保存形式。
2.1 查看網(wǎng)絡(luò)模型參數(shù)
(1)查看參數(shù)
首先定義好LeNet5的網(wǎng)絡(luò)模型結(jié)構(gòu),如下代碼所示:
1classLeNet5(nn.Module):
2def__init__(self,):
3super(LeNet5,self).__init__()
4self.conv=nn.Sequential(#[n,1,28,28]
5nn.Conv2d(1,6,5,padding=2),#in_channels,out_channels,kernel_size
6nn.ReLU(),#[n,6,24,24]
7nn.MaxPool2d(2,2),#kernel_size,stride[n,6,14,14]
8nn.Conv2d(6,16,5),#[n,16,10,10]
9nn.ReLU(),
10nn.MaxPool2d(2,2))#[n,16,5,5]
11self.fc=nn.Sequential(
12nn.Flatten(),
13nn.Linear(16*5*5,120),
14nn.ReLU(),
15nn.Linear(120,84),
16nn.ReLU(),
17nn.Linear(84,10))
18defforward(self,img):
19output=self.conv(img)
20output=self.fc(output)
21returnoutput
在定義好LeNet5這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的類之后,只要我們完成了這個(gè)類的實(shí)例化操作,那么網(wǎng)絡(luò)中對應(yīng)的權(quán)重參數(shù)也都完成了初始化的工作,即有了一個(gè)初始值。同時(shí),我們可以通過如下方式來訪問:
1#Printmodel'sstate_dict*
2print("Model'sstate_dict:")
3**for**param_tensor**in**model.state_dict():
4print(param_tensor," ",model.state_dict()[param_tensor].size())
其輸出的結(jié)果為:
1conv.0.weighttorch.Size([6,1,5,5])
2conv.0.biastorch.Size([6])
3conv.3.weighttorch.Size([16,6,5,5])
4....
5....
可以發(fā)現(xiàn),網(wǎng)絡(luò)模型中的參數(shù)model.state_dict()
其實(shí)是以字典的形式(實(shí)質(zhì)上是collections
模塊中的OrderedDict
)保存下來的:
1print(model.state_dict().keys())
2#odict_keys(['conv.0.weight','conv.0.bias','conv.3.weight',
3'conv.3.bias','fc.1.weight','fc.1.bias','fc.3.weight','fc.3.bias',
4'fc.5.weight','fc.5.bias'])
(2)自定義參數(shù)前綴
同時(shí),這里值得注意的地方有兩點(diǎn):①參數(shù)名中的fc
和conv
前綴是根據(jù)你在上面定義nn.Sequential()
時(shí)的名字所確定的;②參數(shù)名中的數(shù)字表示每個(gè)Sequential()
中網(wǎng)絡(luò)層所在的位置。例如將網(wǎng)絡(luò)結(jié)構(gòu)定義成如下形式:
1classLeNet5(nn.Module):
2def__init__(self,):
3super(LeNet5,self).__init__()
4self.moon=nn.Sequential(#[n,1,28,28]
5nn.Conv2d(1,6,5,padding=2),#in_channels,out_channels,kernel_size
6nn.ReLU(),#[n,6,24,24]
7nn.MaxPool2d(2,2),#kernel_size,stride[n,6,14,14]
8nn.Conv2d(6,16,5),#[n,16,10,10]
9nn.ReLU(),
10nn.MaxPool2d(2,2),
11nn.Flatten(),
12nn.Linear(16*5*5,120),
13nn.ReLU(),
14nn.Linear(120,84),
15nn.ReLU(),
16nn.Linear(84,10))
那么其參數(shù)名則為:
1print(model.state_dict().keys())
2odict_keys(['moon.0.weight','moon.0.bias','moon.3.weight',
3'moon.3.bias','moon.7.weight','moon.7.bias','moon.9.weight',
4'moon.9.bias','moon.11.weight','moon.11.bias'])
理解了這一點(diǎn)對于后續(xù)我們?nèi)ソ馕龊洼d入一些預(yù)訓(xùn)練模型很有幫助。
除此之外,對于中的優(yōu)化器等,其同樣有對應(yīng)的state_dict()
方法來獲取對于的參數(shù),例如:
1optimizer=torch.optim.SGD(model.parameters(),lr=0.001,momentum=0.9)
2print("Optimizer'sstate_dict:")
3forvar_nameinoptimizer.state_dict():
4print(var_name," ",optimizer.state_dict()[var_name])
5
6#
7Optimizer'sstate_dict:
8state{}
9param_groups[{'lr':0.001,'momentum':0.9,'dampening':0,
10'weight_decay':0,'nesterov':False,
11'params':[140239245300504,140239208339784,140239245311360,
12140239245310856,140239266942480,140239266942552,140239266942624,
13140239266942696,140239266942912,140239267041352]}]
14
在介紹完模型參數(shù)的查看方法后,就可以進(jìn)入到模型復(fù)用階段的內(nèi)容介紹了。
2.2 載入模型進(jìn)行推斷
(1) 模型保存
在Pytorch中,對于模型的保存來說是非常簡單的,通常來說通過如下兩行代碼便可以實(shí)現(xiàn):
1model_save_path=os.path.join(model_save_dir,'model.pt')
2torch.save(model.state_dict(),model_save_path)
在指定保存的模型名稱時(shí)Pytorch官方建議的后綴為.pt
或者.pth
(當(dāng)然也不是強(qiáng)制的)。最后,只需要在合適的地方加入第2行代碼即可完成模型的保存。
同時(shí),如果想要在訓(xùn)練過程中保存某個(gè)條件下的最優(yōu)模型,那么應(yīng)該通過如下方式:
1best_model_state=deepcopy(model.state_dict())
2torch.save(best_model_state,model_save_path)
而不是:
1best_model_state=model.state_dict()
2torch.save(best_model_state,model_save_path)
因?yàn)楹笳?code style="font-size:inherit;line-height:inherit;padding:2px 4px;margin-right:2px;margin-left:2px;color:rgb(233,105,0);background:rgb(248,248,248);">best_model_state得到只是model.state_dict()
的引用,它依舊會(huì)隨著訓(xùn)練過程而發(fā)生改變。
(2)復(fù)用模型進(jìn)行推斷
在推斷過程中,首先需要完成網(wǎng)絡(luò)的初始化,然后再載入已有的模型參數(shù)來覆蓋網(wǎng)絡(luò)中的權(quán)重參數(shù)即可,示例代碼如下:
1definference(data_iter,device,model_save_dir='./MODEL'):
2model=LeNet5()#初始化現(xiàn)有模型的權(quán)重參數(shù)
3model.to(device)
4model_save_path=os.path.join(model_save_dir,'model.pt')
5ifos.path.exists(model_save_path):
6loaded_paras=torch.load(model_save_path)
7model.load_state_dict(loaded_paras)#用本地已有模型來重新初始化網(wǎng)絡(luò)權(quán)重參數(shù)
8model.eval()#注意不要忘記
9withtorch.no_grad():
10acc_sum,n=0.0,0
11forx,yindata_iter:
12x,y=x.to(device),y.to(device)
13logits=model(x)
14acc_sum+=(logits.argmax(1)==y).float().sum().item()
15n+=len(y)
16print("Accuracyintestdatais:",acc_sum/n)
在上述代碼中,4-7行便是用來載入本地模型參數(shù),并用其覆蓋網(wǎng)絡(luò)模型中原有的參數(shù)。這樣,便可以進(jìn)行后續(xù)的推斷工作:
1Accuracyintestdatais:0.8851
2.3 載入模型進(jìn)行訓(xùn)練
在介紹完模型的保存與復(fù)用之后,對于網(wǎng)絡(luò)的追加訓(xùn)練就很簡單了。最簡便的一種方式就是在訓(xùn)練過程中只保存網(wǎng)絡(luò)權(quán)重,然后在后續(xù)進(jìn)行追加訓(xùn)練時(shí)只載入網(wǎng)絡(luò)權(quán)重參數(shù)初始化網(wǎng)絡(luò)進(jìn)行訓(xùn)練即可,示例如下(完整代碼參見[2]):
1deftrain(self):
2#......
3model_save_path=os.path.join(self.model_save_dir,'model.pt')
4ifos.path.exists(model_save_path):
5loaded_paras=torch.load(model_save_path)
6self.model.load_state_dict(loaded_paras)
7print("####成功載入已有模型,進(jìn)行追加訓(xùn)練...")
8optimizer=torch.optim.Adam(self.model.parameters(),lr=self.learning_rate)#定義優(yōu)化器
9#......
10forepochinrange(self.epochs):
11fori,(x,y)inenumerate(train_iter):
12x,y=x.to(device),y.to(device)
13logits=self.model(x)
14#......
15print("Epochs[{}/{}]--accontest{:.4}".format(epoch,self.epochs,
16self.evaluate(test_iter,self.model,device)))
17torch.save(self.model.state_dict(),model_save_path)
這樣,便完成了模型的追加訓(xùn)練:
1####成功載入已有模型,進(jìn)行追加訓(xùn)練...
2Epochs[0/5]---batch[938/0]---acc0.9062---loss0.2926
3Epochs[0/5]---batch[938/100]---acc0.9375---loss0.1598
4......
除此之外,你也可以在保存參數(shù)的時(shí)候,將優(yōu)化器參數(shù)、損失值等一同保存下來,然后在恢復(fù)模型的時(shí)候連同其它參數(shù)一起恢復(fù),示例如下:
1model_save_path=os.path.join(model_save_dir,'model.pt')
2torch.save({
3'epoch':epoch,
4'model_state_dict':model.state_dict(),
5'optimizer_state_dict':optimizer.state_dict(),
6'loss':loss,
7...
8},model_save_path)
載入方式如下:
1checkpoint=torch.load(model_save_path)
2model.load_state_dict(checkpoint['model_state_dict'])
3optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
4epoch=checkpoint['epoch']
5loss=checkpoint['loss']
2.4 載入模型進(jìn)行遷移
(1)定義新模型
到目前為止,對于前面兩種應(yīng)用場景的介紹就算完成了,可以發(fā)現(xiàn)總體上并不復(fù)雜。但是對于第3中場景的應(yīng)用來說就會(huì)略微復(fù)雜一點(diǎn)。
假設(shè)現(xiàn)在有一個(gè)LeNet6網(wǎng)絡(luò)模型,它是在LeNet5的基礎(chǔ)最后多加了一個(gè)全連接層,其定義如下:
1classLeNet6(nn.Module):
2def__init__(self,):
3super(LeNet6,self).__init__()
4self.conv=nn.Sequential(#[n,1,28,28]
5nn.Conv2d(1,6,5,padding=2),#in_channels,out_channels,kernel_size
6nn.ReLU(),#[n,6,24,24]
7nn.MaxPool2d(2,2),#kernel_size,stride[n,6,14,14]
8nn.Conv2d(6,16,5),#[n,16,10,10]
9nn.ReLU(),
10nn.MaxPool2d(2,2))#[n,16,5,5]
11self.fc=nn.Sequential(
12nn.Flatten(),
13nn.Linear(16*5*5,120),
14nn.ReLU(),
15nn.Linear(120,84),
16nn.ReLU(),
17nn.Linear(84,64),
18nn.ReLU(),
19nn.Linear(64,10))#新加入的全連接層
接下來,我們需要將在LeNet5上訓(xùn)練得到的權(quán)重參數(shù)遷移到LeNet6網(wǎng)絡(luò)中去。從上面LeNet6的定義可以發(fā)現(xiàn),此時(shí)盡管只是多加了一個(gè)全連接層,但是倒數(shù)第2層參數(shù)的維度也發(fā)生了變換。因此,對于LeNet6來說只能復(fù)用LeNet5網(wǎng)絡(luò)前面4層的權(quán)重參數(shù)。
(2)查看模型參數(shù)
在拿到一個(gè)模型參數(shù)后,首先我們可以將其載入,然查看相關(guān)參數(shù)的信息:
1model_save_path=os.path.join('./MODEL','model.pt')
2loaded_paras=torch.load(model_save_path)
3forparam_tensorinloaded_paras:
4print(param_tensor," ",loaded_paras[param_tensor].size())
5
6#----可復(fù)用部分
7conv.0.weighttorch.Size([6,1,5,5])
8conv.0.biastorch.Size([6])
9conv.3.weighttorch.Size([16,6,5,5])
10conv.3.biastorch.Size([16])
11fc.1.weighttorch.Size([120,400])
12fc.1.biastorch.Size([120])
13fc.3.weighttorch.Size([84,120])
14fc.3.biastorch.Size([84])
15#-----不可復(fù)用部分
16fc.5.weighttorch.Size([10,84])
17fc.5.biastorch.Size([10])
同時(shí),對于LeNet6網(wǎng)絡(luò)的參數(shù)信息為:
1model=LeNet6()
2forparam_tensorinmodel.state_dict():
3print(param_tensor," ",model.state_dict()[param_tensor].size())
4#
5conv.0.weighttorch.Size([6,1,5,5])
6conv.0.biastorch.Size([6])
7conv.3.weighttorch.Size([16,6,5,5])
8conv.3.biastorch.Size([16])
9fc.1.weighttorch.Size([120,400])
10fc.1.biastorch.Size([120])
11fc.3.weighttorch.Size([84,120])
12fc.3.biastorch.Size([84])
13#------新加入部分
14fc.5.weighttorch.Size([64,84])
15fc.5.biastorch.Size([64])
16fc.7.weighttorch.Size([10,64])
17fc.7.biastorch.Size([10])
在理清楚了新舊模型的參數(shù)后,下面就可以將LeNet5中我們需要的參數(shù)給取出來,然后再換到LeNet6的網(wǎng)絡(luò)中。
(3)模型遷移
雖然本地載入的模型參數(shù)(上面的loaded_paras
)和模型初始化后的參數(shù)(上面的model.state_dict()
)都是一個(gè)字典的形式,但是我們并不能夠直接改變model.state_dict()
中的權(quán)重參數(shù)。這里需要先構(gòu)造一個(gè)state_dict
然后通過model.load_state_dict()
方法來重新初始化網(wǎng)絡(luò)中的參數(shù)。
同時(shí),在這個(gè)過程中我們需要篩選掉本地模型中不可復(fù)用的部分,具體代碼如下:
1defpara_state_dict(model,model_save_dir):
2state_dict=deepcopy(model.state_dict())
3model_save_path=os.path.join(model_save_dir,'model.pt')
4ifos.path.exists(model_save_path):
5loaded_paras=torch.load(model_save_path)
6forkeyinstate_dict:#在新的網(wǎng)絡(luò)模型中遍歷對應(yīng)參數(shù)
7ifkeyinloaded_parasandstate_dict[key].size()==loaded_paras[key].size():
8print("成功初始化參數(shù):",key)
9state_dict[key]=loaded_paras[key]
10returnstate_dict
在上述代碼中,第2行的作用是先拷貝網(wǎng)絡(luò)中(LeNet6)原有的參數(shù);第6-9行則是用本地的模型參數(shù)(LeNet5)中可以復(fù)用的替換掉LeNet6中的對應(yīng)部分,其中第7行就是判斷可用的條件。同時(shí)需要注意的是在不同的情況下篩選的方式可能不一樣,因此具體情況需要具體分析,但是整體邏輯是一樣的。
最后,我們只需要在模型訓(xùn)練之前調(diào)用該函數(shù),然后重新初始化LeNet6中的部分權(quán)重參數(shù)即可[2]:
1state_dict=para_state_dict(self.model,self.model_save_dir)
2self.model.load_state_dict(state_dict)
訓(xùn)練結(jié)果如下:
1成功初始化參數(shù):conv.0.weight
2成功初始化參數(shù):conv.0.bias
3成功初始化參數(shù):conv.3.weight
4成功初始化參數(shù):conv.3.bias
5成功初始化參數(shù):fc.1.weight
6成功初始化參數(shù):fc.1.bias
7成功初始化參數(shù):fc.3.weight
8成功初始化參數(shù):fc.3.bias
9####成功載入已有模型,進(jìn)行追加訓(xùn)練...
10Epochs[0/5]---batch[938/0]---acc0.1094---loss2.512
11Epochs[0/5]---batch[938/100]---acc0.9375---loss0.2141
12Epochs[0/5]---batch[938/200]---acc0.9219---loss0.2729
13Epochs[0/5]---batch[938/300]---acc0.8906---loss0.2958
14......
15Epochs[0/5]---batch[938/900]---acc0.8906---loss0.2828
16Epochs[0/5]--accontest0.8808
可以發(fā)現(xiàn),在大約100個(gè)batch之后,模型的準(zhǔn)確率就提升上來了。
3 總結(jié)
在本篇文章中,筆者首先介紹了模型復(fù)用的幾種典型場景;然后介紹了如何查看Pytorch模型中的相關(guān)參數(shù)信息;接著介紹了如何載入模型、如何進(jìn)行追加訓(xùn)練以及進(jìn)行模型的遷移學(xué)習(xí)等。
———————End———————
RT-Thread線下入門培訓(xùn)-4月場次 青島、北京
1.免費(fèi)2.動(dòng)手實(shí)驗(yàn)+理論3.主辦方免費(fèi)提供開發(fā)板4.自行攜帶電腦,及插線板用于筆記本電腦充電5.參與者需要有C語言、單片機(jī)(ARM Cortex-M核)基礎(chǔ),請?zhí)崆鞍惭b好RT-Thread Studio 開發(fā)環(huán)境
立即掃碼報(bào)名
報(bào)名鏈接
https://jinshuju.net/f/UYxS2k
巡回城市:青島、北京、西安、成都、武漢、鄭州、杭州、深圳、上海、南京
你可以添加微信:rtthread2020 為好友,注明:公司+姓名,拉進(jìn)RT-Thread官方微信交流群!
點(diǎn)擊閱讀原文,進(jìn)入RT-ThreadXIFX賽事官網(wǎng)
原文標(biāo)題:【AI簡報(bào)20230407期】 MLPref放榜!大模型時(shí)代算力領(lǐng)域“潛力股”浮出水面、CV或迎來GPT-3時(shí)刻
文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
RT-Thread
+關(guān)注
關(guān)注
31文章
1272瀏覽量
39920
原文標(biāo)題:【AI簡報(bào)20230407期】 MLPref放榜!大模型時(shí)代算力領(lǐng)域“潛力股”浮出水面、CV或迎來GPT-3時(shí)刻
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論