2019年3月,第六十八次AVS會議完成AVS3-P2基準檔次制定工作,AVS3作為新一代視頻壓縮標準,相比上一代標準AVS2和HEVC,可節省近30%碼率。會議之后,北京大學深圳研究生院數字媒體研究中心王榮剛老師團隊便開始著手AVS3解碼器開發,并于2019年12月同時在鵬城實驗室啟智開源平臺和Github開源,項目代號為“天璇”,又名“uAVS3d”。開源之時,uAVS3d已成雛形,解碼性能達業界領先水平,并覆蓋PC、手機等常用智能設備,開源之后至今(2021年1月13日),又迭代代碼60余次,性能、平臺適配和代碼魯棒性進一步提升。
uAVS3d支持Android/IOS/Windows/Linux/MacOS等常用系統平臺,并針對ARMv7/ARMv8/X86架構處理器做了深度優化,支持高位深(10bit)解碼,具備高效的并發性能。在PC端可以實現8K實時解碼,在移動端可支持4K 30fps視頻實時播放。不論是單線程的解碼速度還是解碼并行度,uavs3d均大幅領先AV1的開源解碼器dav1d和aomdec。
PC端uAVS3d與AV1和HEVC常用解碼器的解碼性能對比如下:
2. 開發心得
天璇項目于2019年3月啟動,5月底即輸出x86優化版本,可實現8K視頻實時解碼,之后又快速推出了Android和IOS版本,快節奏加之高性能引起了業內不少關注。華為在uAVS3d移動版本完成之后的第一時間(開源之前)便與我們接觸,針對華為手機做定制性優化;騰訊、百度、愛奇藝、Bigo等視頻服務商也在開源前后相繼測試跟進,部分廠商已上線應用;uAVS3d的接口文件也已集成至多媒體處理開源平臺FFmpeg的主分支,方便第三方集成驗證。
取得如今的成果,著實不易,技術層面,uAVS3d之所以能快速成型,與所在團隊多年的積累是分不開的,數字媒體研究中心曾先后研發AVS+/AVS2編解碼器,已積累大量優秀代碼和經驗。本人作為項目開發者之一,主要負責解碼器的關鍵模塊優化,具體貢獻為添加分像素插值、幀內預測、IDCT中DCT2部分、ALF、Deblock、SAO以及其它部分細節模塊的SIMD指令實現,SIMD指令覆蓋SSE/AVX2/ARMv7/ARMv8,并且bitdepth為8和10的兩個版本獨立優化;數據結構方面,調整UV分量存儲結構,以提升SIMD并行效率。本人是15屆北大深研院數字媒體研究中心畢業生,讀研期間曾參與AVS2解碼器的模塊優化,對各模塊的SIMD優化細節有一定了解,17年重新加入團隊,之后,因項目需要,曾負責AVS2解碼器移動端優化,對解碼器部分結構調整(UV分量重建像素交織存儲,熵解碼實現調整)、完善ARMv7/ARMv8匯編,使得AVS2解碼器性能追齊業內領先的HEVC解碼器。有了uAVS2d的開發經驗和代碼積累,uAVS3d的模塊優化就順利很多,AVS3的基本框架與AVS2一脈相承,多個模塊大同小異,只是AVS3的塊尺寸類型比AVS2要多不少,給匯編優化帶來一定挑戰。個人從uAVS3d項目開發中,收獲很多,加深了對編解碼框架的理解,移動端開發和匯編代碼編碼也更加得心應手。
關于項目社區的溝通協作和運營,本人也是受益很大。第一次負責開源項目的運營,項目說明、開源協議選擇、版本維護都趟過一些坑,好在選擇的開源平臺(啟智社區和Github)以及版本管理工具(git)功能完善,服務穩定易用,目前項目維護已走上正軌。
最后,給開源社區的開發同僚們分享些個人體會和建議:
認真對待每個開發細節,項目整體的效能是眾多細節實現的集中體現,細節實現水平可能就是項目脫穎而出的關鍵。
放平心態,開源意在分享,為后來者鋪路,減少重復工作,不宜太計較單個項目的得失。技術講究厚積薄發,認真寫下的每一份代碼終是個人積累的財富。
項目啟動之前做好調研分析,選擇合適的方向,了解現有工作,預估所能達到的效果,盡可能少做無用功。
2018年12月,我有幸參與了“數字音視頻編解碼技術標準工作組”(簡稱AVS工作組)在深圳鵬城實驗室進行的AVS3標準封閉開發。封閉開發初步完成了AVS3標準第一階段的制定工作以及參考軟件的開發和測試。2019年3月的AVS工作組第68次會議上,AVS3第一階段標準正式公布。當時,正是新一代視頻編碼標準制定的關鍵時刻。國際上,AV1標準正在大力推廣,VVC標準也處于緊張制定的過程中,并在壓縮效率上處于領先地位。與此同時,中美貿易戰和科技戰也正在火熱進行,我國的科技公司面臨越來越大的壓力。而視頻編碼標準是視頻數據傳輸和存儲的基礎技術之一,一個友善的視頻編碼標準對我國信息產業的發展和安全,具有非常重要的作用。
因此,在標準定稿的第一時間,我們課題組就啟動了AVS3編解碼庫的軟件開發工作,力爭盡快推出可商用的AVS3編解碼庫,加快AVS3標準的應用和推廣。
開源心得
在我們進行AVS3編解碼庫開發的最初階段,并未考慮以開源的形式發布,更多傾向于以可執行庫的形式發布,并期待后續進一步的商業合作。但在接觸了多個主要的互聯網廠商之后,我們意識到了AVS3標準面臨的困難。由于H.264、HEVC等標準具有非常成熟的開源編解碼器,國內外行業內的參與度很高,具有非常完整的技術生態。因此,AVS3如果不能建立起較好的生態,業內的各個廠商將始終會處于觀望態度,難以下決心投入使用。其次,業內的多數廠商對于各自的應用,都有不同的定制需求,同時對代碼的把控也具有一定的要求。因此,非開源的編解碼庫對于大家意義有限。
所以最后,為了AVS3標準的推廣,我們選擇了開源,一方面希望能夠吸引更多的參與者,包括參與編解碼庫的開發,以及參與標準相關生態的完善工作(例如各種系統層封裝的支持等)。另一方面,我們也希望開源的編解碼庫能提供各個廠商一個開發的基礎版本,大家可以在這個基礎上進行各種需要的私有的定制化開發,而省去基礎編解碼平臺的開發工作。當然,開源并不意味著生態就可以如預期一樣建立起來,但是我們希望能拋磚引玉,為AVS3標準的推廣開一個頭。
項目心得
在項目的開發過程中,我們也取得了很大的收獲。
首先,項目開源后,獲得了很多的關注,很多業內同行在不同的平臺上編譯、運行和測試AVS3編解碼庫。通過這些測試,我們積累了很多測試反饋,對編解碼庫的跨平臺支持、編解碼庫運行的魯棒性提升等,都有很大的幫助。
同時,除了我們自己項目組,還有其他一些廠商或個人開發者向我們的項目提交了代碼,包括多平臺的一些支持、編碼算法、以及一些底層優化代碼等,幫助項目進一步完善。
此外,項目的開源,對項目組的同學的工作也是一個認可。項目組的同學的工作可以得到更廣泛的了解,對同學們個人也是一種很好的激勵,能更好地調動大家的積極性。
最后,為了在開源過程中降低各參與者溝通和協調的代價,我們在代碼風格、框架設計、代碼文檔等方面,都做了很多的改進和完善,也進一步提升了我們團隊自身工程開發的能力。
作者:王振宇
]]>參與開發
第三代人工神經網絡脈沖神經網絡(Spiking Neural Network, SNN)具有事件驅動、低功耗、高仿生的特點,一直是神經科學領域的研究熱點。近年來機器學習方法逐漸應用于SNN并取得了突破性的性能提升,使用SNN進行深度學習成為新的前沿交叉研究熱點。我對于這一新興的研究方向充滿興趣,但在研究中發現:
傳統的深度學習框架并不直接支持SNN,因此許多研究者不得不從零開始實現所需的SNN模塊,造成了大量的重復勞動
SNN從生物神經元簡化而來,不同開發者對SNN的實現方式不同,造成了定義的混亂,代碼難以復用
絕大多數代碼都沒有配套的文檔,給學習和使用帶來了麻煩
這些問題是包括我在內的所有SNN深度學習的研究者面臨的難題。目前這個領域還沒有一個成熟的框架,如果有一個類似于ANN中Caffe、PyTorch那樣的深度學習框架則可以解決上述問題。為了我們自己研究的有序進行、實驗的順利開展,以及方便其他研究者的使用,避免重復勞動,實驗室的老師和博士生們討論后決定,自行開發一款全新的開源SNN深度學習框架,即驚蜇(SpikingJelly)。
我個人參與驚蜇的開發,主要原因是:
研究方向與框架的應用背景完全契合,在學習該領域的前沿知識時,可以同時在框架中進行代碼實現,理論和實際實驗可以順利結合,互為補充
一個完善的框架有助于我順利進行各種實驗、與他人分享我的研究成果,并確保我的研究成果的可復現性
希望能夠繼續為開源社區做出更多貢獻,減少開發者的重復勞動,提升科研效率
驚蟄框架的開發,在2019年11月正式開始,早期主要是由包括我在內的北京大學的幾位博士生,在老師們指導下進行開發。開發之初,我們就將此框架完全開源在GitHub上,希望能夠吸引其他感興趣的開發者參與貢獻、共同推進。
社區支持
驚蟄框架在開發過程中逐漸受到脈沖神經網絡領域研究者的關注,并得到了許多開發者和開源社區的支持,主要包括:
一些用戶通過issue的方式提供建議
開發者報告bug,或提交pull request來修復bug
鵬城實驗室的開發者提供了CUDA性能優化的建議、補充CUDA代碼、補充文檔教程翻譯
OpenI社區提供了鏡像服務器,在國內擁有更快的訪問速度;提供了無限存儲空間的公網存儲服務器,驚蟄框架據此建立了部分數據集的下載鏡像
鵬城云腦提供了強大的算力支持,驚蟄框架在云腦上進行了大量性能實驗和代碼調試
最后,驚蟄項目還成功申請成為首批啟智社區優秀開源項目,作為開發者之一,我也很榮幸地參加了2020年OpenI開發者大會,獲益匪淺。
開源心得
在開源社區的支持下,經過一年的開發,驚蟄框架已經頗具規模,開發者可以通過使用驚蟄框架迅速搭建起高性能脈沖神經網絡并進行深度學習。回顧這一年的開源經歷,我的總結如下:
積極擁抱開源。眾人拾柴火焰高,個人的能力終究有限,而開源社區的力量是無窮的。開源的項目可以吸引廣大開發者參與貢獻,共同開發;開源的代碼接受所有用戶的審查,有助于敦促開發者提升代碼質量;好的項目還能成為新項目的基石,衍生出更為豐富的功能
注重教程和文檔的編寫。好的開源項目要吸引用戶的使用和開發者的參與,就必須注重易用性,不能有太高的上手和開發門檻,因此需要注重教程和文檔的編寫。條理清晰、通俗易懂的教程和文檔是對用戶和開發者的尊重,只有真心尊重用戶和開發者,他們才會樂于使用并為項目做出貢獻
]]>
/snn_toolbox的項目。但是這個項目更多地是面向神經形態硬件的,代碼也沒有PyTorch版本,主框架是拿keras寫的。這就更加給了我開發的動力。其次,我覺得我們作為新一代研究者是有義務去推廣脈沖神經網絡的。人工神經網絡(ANN)就不用說了,大家都很熟悉。而SNN則是脈沖神經網絡(”所謂的第三代神經網絡”),在現在的人工智能語境中其實沒有那么受到重視。但是它有很多好的特性沒有被大家注意到,比如說脈沖神經網絡相比于GPU運行沒有那么耗能源,而且在理論上的性能也是能夠等同圖靈機的。
ANN轉換SNN的研究能夠給深度學習和脈沖神經網絡架起一座橋梁,我覺得這是一件特別有意思的東西。在師兄們開發好的框架上,我需要的就是利用現有的神經元模型,構建SNN,并且完成轉換的SNN的仿真工作。SpikingJelly中的神經元模型,其實特別好用,我一直都是用PyTorch的,SpikingJelly的神經元定義,就和在PyTorch中定義ReLU一樣,特別順滑。如果需要對神經元進行重置,也只需要調用resnet_net就好,特別方便。
盡管如此,開發過程中也走了挺多彎路。因為ANN-SNN轉換需要知道底層的PyTorch拓撲(類似ResNet這樣的),最重要的就是選擇一個合適的方式來處理PyTorch模型中的復雜拓撲。關于處理拓撲的方案其實選擇了很久。最終,選擇了基于另一個開源項目,ONNX。PyTorch中有實現接口可以無縫轉換到ONNX模型。而且ONNX作為一個通用公用的模型表示方式可以使得今后其他框架的模型通過轉換為onnx表示之后也可以通過我們的框架轉換。這就使得我們的代碼在未來可以發揮更加廣泛的作用。
自從框架開源后,我們的貢獻得到了更多人的關注。我想這就是開源的意義所在吧。尤其我們的定位是科研。這意味著更多研究脈沖神經網絡的科研院所可以通過我們的工作、通過ANN-SNN轉換的工作得到收獲。ANN-SNN轉換在SNN今后的研究中,可能更多地是一個baseline的存在,即便這樣,我想能夠做好這一件事情也是我們的榮幸。
作者:丁健豪
]]>個人開發者或者小團隊往往沒有“我的代碼是要給別人看的”的意識,而是習慣于自說自話。人們在網上聊天時尚且能夠注意言辭,但在將自己的代碼開源時往往忽略了別人的感受。就以往的經歷來看,許多團隊將開源變成了任務,為了開源而開源,一手復制粘貼就把自己那套沒什么注釋和說明文檔的代碼扔到開源平臺上。這些代碼作者對于有人提問代碼細節常常不予回復,而如果指出了代碼漏洞,有禮貌的尚且能感謝并修補,更多的是石沉大海,討論也就沉寂了。
因此開發者大抵需要意識到,開源一方面是為了讓他人更好的學習,另一方面也是為了吸收他人的合理意見而改進代碼。一個代碼量稍大的項目或多或少都存在bug,被指出了問題至少說明有人在認真閱讀代碼,這也是工作被認可的標志。
就SpikingJelly的開發經歷而言,早期的框架是非常不完善的,代碼倉庫也無人問津。這時候的框架還停留在僅依靠“托管代碼”來進行版本管理的階段。當時的框架定位在自用,完全忽略了社區的存在。使我們態度發生轉變的是,在開源一段時間后,我們注意到了另一個功能定位完全類似的框架,其開發者是同一科研領域的科研人員。他們的人手非常少,只有兩個來自不同國家的開發者主導開發,最初開源的時間也與我們很接近。不同的是,他們已經累積了一定量的用戶,這些用戶基本也是來自同一領域的科研人員,以及一部分正在觀望學習,想要進入這個研究領域的新生血液。這讓我們開始思考:開源框架是給誰看的?亦即目標用戶群體究竟是誰。一個基于科研用途的框架要求使用者至少擁有基本的領域知識,這樣的門檻實際上已經把目標用戶刻畫得十分清楚了。基于此,在開發時,代碼各個模塊的功能與科研中的研究對象必須有非常清晰的對應關系,不然本領域人員都無法理解的話,就不可能再有人來使用了。我們重構了代碼的層次,使得這個映射關系更清晰,同時也開始撰寫文檔,提供一些簡單的范例。
經過這次重構之后,的確出現了少數人來關注開源倉庫,不過也僅此而已。沒有人真正使用起來,同時我們也注意到,有不少研究者在關注我們的框架時,使用著國外的同期開發的框架。于是我們又提出了問題:我們的框架有什么優勢?就問問題提出的當時,我們無法作答。因此必須設法給框架制造一個亮點。這也是迄今為止我們一直在努力的方向。
對于基礎性的編程框架而言,不同的框架往往側重不同,框架功能的多寡往往也與領域自身的發展息息相關。回顧TensorFlow和PyTorch這兩個深度學習框架的發展史,我們能夠清晰的觀察到性能與編程友好性這兩個指標之間的權衡貫穿始終。深度學習社區中不少人也同時使用兩種框架并貢獻代碼,這使得兩者能夠互相借鑒,吸收對方的優秀功能。我們也大概會遵照類似的路線,在打造自身亮點的同時,吸收現有其它框架的成功經驗。
作為一個小規模團隊,我們的開源之路道阻且長,需要時間檢驗我們的路線是否正確并不斷修正。也期待能有同領域的科研工作者通過OpenI發現與試水,為科研領域傾注源源不斷的動力。
作者:陳彥騏
]]>毫無疑問,參加一個開源項目是非常令人激動的,看著開源項目一步一步完善直到上線,這花費了我不少時間。但我從中也學到很多。由于以前并沒有參加開源項目的經驗,因此總結了一些心得,作為一個開源開發和之前工作中的不同之處。
1、在編碼風格方面不需要太嚴格
編碼風格的問題,當項目中設計了過于復雜的規則將增加開發的成本,人們會實時關注空格縮進帶來的困擾,最好的方式是能用腳本自動化處理開發中的編碼風格問題,比如將常用的eslint,go fmt工具封裝為全局腳本。這樣項目合作中可以很方便的進行溝通,而不需要經常通過人工來修改。最終,代碼的提交以pull request的方式進行合并,最終我一點都不擔心編碼風格、測試會帶來問題。
2、代碼即文檔
在開發的過程中我經常感受到,相比于不知道何時更新的文檔,編寫有清晰結構的代碼和測試比文檔更有用處。我可以毫不夸張的說:好的代碼就是好的文檔。當需要給系統增加功能時,最好的熟悉現有功能的方式不是找開發文檔和尋找當時開發文檔的開發人員進行詢問,當項目足夠健康時候,最好的方式就是閱讀結構代碼和測試。此外,別忘了swagger,當我們采用swagger時能夠快速生成api的文檔,這都能很好的提升開發速度。最后也有例外,比如當需要和第三方系統對接時文檔的重要性就不言而喻。
3、有高效的溝通方式
在項目開發過程中,項目進度的控制時至關重要,我們在項目開發中溝通采用類似github的模式,由開發或測試人員在項目管理中添加任務,管理人員指派成員,盡量避免無意義的會議,如果溝通的越順暢,我們自己就會越信任自己的項目。
4、多接觸其他的開源項目
經常關注開源社區的項目以及他們的issuse和pr,特別是目前Golang社區里有很多優秀的項目。在他們的issue中和pr中很多人對項目的理解都很高,他們樂于分享在項目中遇到問題,經常閱讀別人已經合并的pr已經代碼能夠拓寬視野,在遇到問題的時候能從多個角度思考問題。
5.收獲
參加這次的開源項目帶給我了很多收獲:
第一是讓我完全參與到開源之中,之前只在有些項目中提過一些pr去解決小問題,這次明確了開發目的切身體會了一次開源的感受。
第二在工作中也獲得了很多啟發,包括處理分布式大文件時候的一些項目經驗,使得我可以更好地理解研究問題中的一些概念。
作者:嚴翔東
]]>在2013年的時候,很榮幸在初期就參與了啟智磐石初期版本的開發和維護,它讓我接觸了Linux,Ruby on Rails,也讓我結識了Git,讓我對開源,開源社區有了一個大概的了解和接觸。
2. 成為開源的受益者
畢業后的初始幾年,參與了很多不通的項目,各種開源的組件給不通的項目的不通需求帶來了很大便利性,去使用,閱讀開元組件的源代碼,查看實現邏輯,極大的提升了編碼能力。基于豐富的組件和成熟的框架,MVC已經簡化了大部分工作,我們慢慢的向前端轉移,JS是開源社區最為活躍的語言,沒有之一。從Jquery 一路到開源的React Native,雖然框架不在變化,解決問題的思路也在轉變,到虛擬dom 的廣泛應用,讓交互的操作也變得簡單,是各種各樣的開源,使得開發變得簡單和多樣化。
在這期間我也加入了各種開源社區,參與了不同的線下開發者大會。擴充了我對知識的了解,由于參與過不同的項目,也嘗試過TDD,CI。以及使用過各種敏捷開發工具如Slack以及Trello,他們為開源的交流提供了便利性。
3. 開源認識和收獲
這些年參與了很多項目,對于開源社區貢獻遠遠小于開源社區對我的幫助,這正是開源社區的力量,從微小的PR開始,從細小的功能出發,在自己的使用中總結并貢獻開源。最后感謝啟智磐石,引導我走進開源,參與開源,并最終貢獻開源。
作者:譚顯波
]]>
在鵬城實驗室實習的時候,主要的工作是開發AI算子標準參考實現。參考實現是對算子標準的補充,旨在提供代碼級別的語義的規范,因此正確性是它的最重要屬性。
開發一個新的算子接口是比較繁瑣的,雖然標準文檔中對算子接口已有比較明確的定義,但是為了給予標準實現者最大的優化空間,它沒有規定實現的細節,這也給參考實現的開發增加了一點難度,因為我在開發新算子的時候常常要對這個算子重新調研,找到它的具體實現邏輯,再開發對應的接口。為了滿足正確性的要求,在開發完一個新算子后,需要對它進行單元測試。這時候應盡可能給出不同情況的樣例,然后將參考實現的結果與tensorflow、pytorch等框架的結果進行對比。
開發了一些算子接口以后,我發現不同算子之間會存在大量重復代碼,經常有復雜算子包含了簡單算子代碼的情況出現,比如maxpool會重復max的代碼。為了減少代碼開發的工作量、降低代碼維護難度,我先開發簡單算子,然后讓復雜算子中重復了簡單算子的代碼的部分替換成直接調用簡單算子的方式。這種開發方式可能對性能要求高的算子庫不適用,但是參考實現追求的是正確性,不考慮性能,因此參考實現的所有算子都可以采取這種方法進行開發。后來,參考實現的維護難度也降低了不少。
除了參考實現,我們還開發了一套自動化測試框架。對于不同的算子庫來說,只要遵循了算子標準,那么它們對應的算子接口應該是差不多的:返回值是狀態碼,輸入輸出都在參數列表中,參數之間的前后順序也一致。對算子進行正確性測試的邏輯也是一致的,即生成輸入樣例、算子運算、對比結果。對于計算機來說,不同的地方在于數據結構(張量等)和函數名。那么,我們只要把測試樣例和測試流程代碼提前寫好,讓用戶把自行開發的算子的函數名和創建張量等數據結構的接口注冊到自動化測試框架中,框架就可以自動地對算子進行正確性測試了。所以,自動化測試框架的關鍵技術就是接口注冊機制。我們調研以后發現,Google Test的“類型參數化”機制可以讓用戶在觸發測試的時候才指定測試代碼中某些變量的數據類型。我們就把“類型參數化”作為接口注冊機制的原型,通過宏把用戶的接口封裝到一個類中,用戶的接口就“假扮”成了一種數據類型,然后我們在測試代碼中從對應的變量里提取出用戶的接口,就可以實現接口注冊了。
完成以上工作以后,我發現最大的工作量不是寫代碼,而是寫代碼之前的調研和設計。我也曾試過草草調研之后就著手寫代碼,短期內似乎是可行的,但是在后期只要遇到一個bug,我就得花大量時間去調試、調研,得不償失。運籌帷幄之中,決勝千里之外。
作者:黎子毅
]]>在過去一年的時間里,我有幸參與了“人工智能算子開發接口標準參考實現”在啟智社區的開源和研發工作。從項目有大致雛形、到順利開源在OpenI啟智社區、再到預期功能模塊不斷迭代完善,這段時間我們進行了大量的調研和開發,克服了很多困難。2020年12月,我們的項目成功獲得了社區評選的“優秀開源項目”榮譽,我個人也獲評首屆“優秀開發者”和“突出貢獻者”。這些榮譽對于團隊來說是巨大的肯定,而對于我個人來言更是一種別樣的經歷和收獲。
實際上,我從研一入學就開始接觸“人工智能算子開發接口標準參考實現”相關的工作了。為了盡早確定自己研究生期間的方向,我在完成本科畢業答辯之后,向研究生導師申請提前一個月來實驗室實習。那時組里“人工智能算子開發接口標準參考實現”的預研工作剛剛起步,項目中“國產化”、“人工智能”和“標準化”等標簽在中美貿易戰的背景下顯得十分不同尋常,也給我留下了非常深刻的印象,經過一番爭取,我順利的加入到項目中來。
本以為帶著本科積累的基礎進組,我能夠在項目中游刃有余,真正做起來才發現,標準參考實現的研發并不是一件容易的事。特別是在項目開源到啟智社區之后,我們更加意識到這事情的難度,以及把它做好的重要性。“人工智能算子開發接口標準參考實現”是“人工智能算子開發接口標準”中非常重要的一部分,它的目的是為標準提供一份基于特定語言的參考實現,從而能夠保證標準語義的完整性。由于同時涉及到上層AI計算框架和底層硬件實現,因此完成一個接口的標準化和實現,往往要對已有的計算框架和算子庫進行深入的調研和總結,必要時還需研讀算子對應的論文,嘗試對其進行復現和重構。從一個功能的吃力摸索,到逐漸上手熟練,再到下一個功能的艱難探索,這樣的認知循環從項目開始一直持續到現在。其中最讓我沉迷的環節,就是對一個功能模塊逐漸熟練之后再對其進行思考和重構,過程中我常常發現自己之前看過的一些的開源代碼思路竟然神奇的解決了現有代碼的關鍵問題,便忍不住為其拍案叫絕。
當然,項目并不總是順利的,我也遇到了很多阻礙。比如進行項目重構時因為對CMake一竅不通而花費數周時間啃下《CMake Cookbook》;比如閱讀Eigen和MShadow代碼時被其中出神入化的C++表達式模板技術數次勸退;再比如數據布局中的物理順序和邏輯順序之間的差異區分,這些問題的難度與本科接觸到的項目難度完全不可同日而語。非常幸運的是,我的導師楊超老師和師兄敖玉龍都十分盡心盡責,他們會在每次組會交流時從不同角度分析所遇到的問題,討論項目的發展方向,并給我鼓勵和肯定,讓我得以快速突破瓶頸,獲得成長。在這里我要特別感謝我的導師和師兄在整個項目過程中給我的鼓勵和幫助。除此之外,我還要感謝我的“戰友”黎子毅同學、李雨芮師妹以及范睿博師弟,他們做事情認真負責,項目中很多關鍵功能的實現都是我們一起經過無數次調研、討論和迭代的結果,“優秀開源項目”的榮譽與他們的努力息息相關。
除了榮譽,這個項目也給我帶來許多其他收獲。第一是讓我意識到,復雜的功能往往是從最簡單的樣例慢慢拓展迭代而來,一蹴而就是不現實的。我們的參考實現前后就經歷了好幾次大規模的重構,每次重構之后再回過頭對比上個版本,都簡直如云壤之別。第二是在項目中有許多機會與專家進行交流,這對于個人視野的拓展是大有裨益的。不管是線上社區互動,還是線下分享提問,將自己做的事情分享出去,在增強自信心的同時也學到了很多新的東西,幫助自己直面不足之處,進而有動力去做迭代和完善;最后是在這個過程中,我逐漸養成了從整個項目層面進行獨立思考和計劃的習慣,這也將為我畢業后參加工作打下了良好的職業基礎。
啟智開源社區作為國家面向新一代人工智能開源共性技術的平臺,為大家提供了同等的機會進行開源項目創作和交流。我很榮幸作為社區首批開發者,為社區建設貢獻一份力量并且獲得認可。衷心希望未來自己有更多機會參與進來,一起讓啟智社區越來越好,讓國內人工智能開源生態越來越好。
作者:李克森
]]>