經(jīng)過(guò)最近一段時(shí)間的調(diào)研學(xué)習(xí),我對(duì)人工智能計(jì)算平臺(tái)有了新的認(rèn)識(shí),它的本質(zhì)就是要通過(guò)數(shù)據(jù)+建模算法訓(xùn)練出一個(gè)可以預(yù)知未來(lái)的模型,那么一個(gè)好的計(jì)算平臺(tái)需要為用戶在數(shù)據(jù)以及建模算法這兩個(gè)核心要素上提供極大的便利。
那么我們?nèi)绾尾拍茏龅竭@一點(diǎn)呢?
1. 完整的建模流程
下圖是我猜想的一個(gè)完整的建模流程:

下面做一個(gè)描述:
- 創(chuàng)建工程:即為了某一個(gè)業(yè)務(wù)方向而創(chuàng)建的一個(gè)工程,工程內(nèi)部系統(tǒng)會(huì)規(guī)劃出不同的目錄結(jié)構(gòu)。
- 獲取數(shù)據(jù)集:這個(gè)數(shù)據(jù)集有可能是網(wǎng)上現(xiàn)成的,也有可能是自己造的,也有可能是自己通過(guò)網(wǎng)絡(luò)爬蟲自己爬的,總之什么都有可能
- 數(shù)據(jù)處理和特征工程:要將現(xiàn)實(shí)中采集到的數(shù)據(jù)進(jìn)行數(shù)據(jù)加工、清洗、特征提取、向量化、變成數(shù)據(jù)公式能識(shí)別的數(shù)字特征
- 正式數(shù)據(jù)集:即可以向量化的數(shù)據(jù)集,這些數(shù)據(jù)可以保存在文件中,也可以保存在數(shù)據(jù)庫(kù)中。(像mnist,cifar10這種數(shù)據(jù)集,都是別人處理好的數(shù)據(jù)集,現(xiàn)實(shí)中一個(gè)數(shù)據(jù)集的生成是需要經(jīng)過(guò)大量的加工處理的)
- 建模:理論上,我可以對(duì)一個(gè)數(shù)據(jù)集,采用多種建模算法,這個(gè)算法可以是
機(jī)器學(xué)習(xí)中的各種算法,也可以是深度學(xué)習(xí)中的各種算法。即我可以建多個(gè)算法模型,最后通過(guò)實(shí)際訓(xùn)練及評(píng)估來(lái)確定哪個(gè)算法產(chǎn)生的模型是最好的。 - 訓(xùn)練、調(diào)參、評(píng)估:與上面是配套的
- 生產(chǎn)模型:將最后評(píng)估出來(lái)最好的模型,保存到模型庫(kù)中。
所以我們以前的系統(tǒng)是很狹隘的:
- 不能對(duì)數(shù)據(jù)集做任何處理
- 只能做
深度學(xué)習(xí)
2. 平臺(tái)設(shè)計(jì)思路
2.1 功能角度
前面提到我們要在數(shù)據(jù)與建模算法兩方面為用戶提供便利,那么首先我們系統(tǒng)必須要包含這兩個(gè)功能:
- 數(shù)據(jù):獲取數(shù)據(jù)集、數(shù)據(jù)加工、特征提取等
- 建模算法:系統(tǒng)要能支持多種建模算法,深度學(xué)習(xí)只是其中的一部分
2.2 用戶角度
再?gòu)挠脩艚嵌瓤纯?,我們系統(tǒng)核心用戶是數(shù)據(jù)科學(xué)家,這些號(hào)稱科學(xué)家的科學(xué)家們,又可能要分為兩類人:一類是會(huì)敲代碼的;一類是不會(huì)敲代碼的。結(jié)合這段時(shí)間研究h2o以及kaggle,我決定讓系統(tǒng)提供兩條建模途徑:編碼式建模和可視化建模。
2.3 架構(gòu)角度
如果提供了兩條路,這兩條路是相互隔離的,還是有交叉的,還是完全互通的呢?理想情況下,肯定是兩條路完全互通是最好的。
再回到問(wèn)題的源頭,一個(gè)完整的建模流程中,涉及到哪些實(shí)實(shí)在在的東西?
- 數(shù)據(jù)是實(shí)實(shí)在在的
- 模型算法是實(shí)實(shí)在在的
- 保存的模型文件是實(shí)實(shí)在在的
如果要兩條路基本互通,我們需要讓上面提到的三點(diǎn)實(shí)實(shí)在在的東西,相互都能認(rèn)識(shí)。即數(shù)據(jù)、模型算法、模型文件必須在兩條路中是兼容的。在來(lái)分別看看這三者:
- 數(shù)據(jù):這個(gè)沒(méi)有任何問(wèn)題,就是文件或者是數(shù)據(jù)庫(kù)表,只要保存下來(lái),大家都能認(rèn)識(shí)
- 模型算法:這個(gè)就有問(wèn)題了,外部世界中有無(wú)數(shù)的機(jī)器學(xué)習(xí)框架,也有無(wú)數(shù)的深度學(xué)習(xí)框架,不同的框架,寫出的算法模型都不相同;而我們通過(guò)可視化界面所支持的模型算法肯定是有限的(悲觀估計(jì),以我們的能力,頂多能支持一兩個(gè)框架就了不得了)
- 模型文件:同上面的問(wèn)題一樣,不同的計(jì)算框架,貌似生成的模型文件格式都不一樣,比如
tensorflow生成的是什么pb格式的serving模型,而像h2o平臺(tái)生成的模型,其實(shí)是一個(gè)jar包,還有像spark ml生成的模型,也是其特有的格式
我總結(jié)出的結(jié)論是,我們?cè)?code>數(shù)據(jù)上是可以完全互通的,在
模型算法以及模型文件上能做到相對(duì)互通。即以可視化平臺(tái)所支持的計(jì)算框架為基準(zhǔn),提供對(duì)這些模型算法以及模型文件的共享和互通!
2.4 結(jié)論
升級(jí)后的系統(tǒng),我想達(dá)到以下幾點(diǎn)效果:
- 系統(tǒng)業(yè)務(wù)功能,能按照上面梳理的建模流程來(lái)
- 全面調(diào)整之前的深度學(xué)習(xí)結(jié)構(gòu),將其定位為系統(tǒng)中一個(gè)普通的算法
- 提供建模的兩條路,
可視化建模和編碼式建模 - 提供數(shù)據(jù)層面的完全共享,提供模型算法及模型文件層面上的部分共享
以下是平臺(tái)建設(shè)示意圖:

這張圖是本次系統(tǒng)升級(jí)的核心!
因?yàn)槲覀円龅綌?shù)據(jù)共享,所以兩條路的各種結(jié)果文件必須是底層統(tǒng)一處理的,這就要求我們?cè)诰幋a式建模方向上,為用戶提供一些系統(tǒng)內(nèi)置函數(shù)支持。
需要底層提供哪些函數(shù)支持呢?我對(duì)代碼實(shí)現(xiàn)不是很了解,初步猜測(cè)需要這些:
- 創(chuàng)建工程的函數(shù)
- 保存數(shù)據(jù)集的函數(shù):保存到文件中,保存到數(shù)據(jù)庫(kù)中
- 訓(xùn)練過(guò)程中,監(jiān)控指標(biāo)的函數(shù)
- 保存模型的函數(shù)
3. 原型設(shè)計(jì)結(jié)果
3.1 模型工程修改
這更多是底層實(shí)現(xiàn)的修改,之前一個(gè)工程是關(guān)聯(lián)了計(jì)算框架的,現(xiàn)在需要把這個(gè)關(guān)聯(lián)拿掉,計(jì)算框架只體現(xiàn)在具體的建模及訓(xùn)練環(huán)節(jié),而不是整個(gè)工程級(jí)的。
3.2 數(shù)據(jù)處理
在交互界面中,增加數(shù)據(jù)處理可視化操作功能,它包含的功能有:
- 上傳數(shù)據(jù)集
- 解析數(shù)據(jù)集
- 特征列數(shù)據(jù)轉(zhuǎn)換
- 特征列數(shù)據(jù)補(bǔ)全
- 特征列數(shù)據(jù)分布圖表展示
- 特征列關(guān)聯(lián)性總覽圖表(熱力圖、矩陣圖)
- 自定義特征列統(tǒng)計(jì)圖表
- 保存數(shù)據(jù)集
3.3 jupyter notebook
原先做的jupyter太簡(jiǎn)單了,基本不能用?,F(xiàn)在要正式將jupyter notebook提高到一個(gè)核心級(jí)的功能。我們需要在最大程度上做到對(duì)jupyter notebook的定制化,以達(dá)到以下要求:
- 用戶可以選擇自己不同容器中的
jupyter服務(wù) - 用戶可以通過(guò)我們系統(tǒng)界面來(lái)創(chuàng)建可執(zhí)行腳本
- 我們?yōu)橛脩籼峁┑溺R像中,需要默認(rèn)安裝大部分主流計(jì)算框架,這其中需要包含深度學(xué)習(xí)框架,也需要包含機(jī)器學(xué)習(xí)框架
- 最后再明確一下,我們的
jupyter是運(yùn)行在用戶容器中的,不是運(yùn)行中計(jì)算環(huán)境中的
3.4 訓(xùn)練界面調(diào)整
這個(gè)功能調(diào)整非常大,以前創(chuàng)建的一個(gè)訓(xùn)練,只能做來(lái)做深度學(xué)習(xí),現(xiàn)在要做到既能做深度學(xué)習(xí),也能做機(jī)器學(xué)習(xí)。所以在創(chuàng)建任務(wù)界面和任務(wù)執(zhí)行結(jié)果界面,都需要做比較大的調(diào)整,界面需要根據(jù)不同的算法,渲染出不同的界面要素及圖表。
首頁(yè)是創(chuàng)建任務(wù)界面,我規(guī)劃為四欄:
- 第一欄(算法選擇):任務(wù)名稱自動(dòng)生成、選擇計(jì)算框架、算法、訓(xùn)練集、測(cè)試集、驗(yàn)證集
- 第二欄(基本參數(shù)欄):根據(jù)不同的算法,展示不同的參數(shù);如執(zhí)行輪次、比大小、腳本、優(yōu)化器等不作為超參的參數(shù)
- 第三欄(超參數(shù)欄):根據(jù)不同的算法,展示不同的超參數(shù)
- 第四欄(自定義參數(shù)):通用參數(shù)欄
其次是任務(wù)執(zhí)行結(jié)果頁(yè)面,需要根據(jù)不同的算法,展示不同的結(jié)果頁(yè)面,這個(gè)暫時(shí)還沒(méi)有想清楚。
4. 系統(tǒng)改動(dòng)量
4.1 現(xiàn)有功能調(diào)整
模型工程
這個(gè)上面提到了,需要把工程與計(jì)算框架的關(guān)聯(lián)關(guān)系去掉
模型訓(xùn)練
這是現(xiàn)有功能最大的調(diào)整,創(chuàng)建任務(wù)的界面,以及任務(wù)執(zhí)行界面,需要根據(jù)不同的算法,完全做到自定義配置及展示。不同的算法會(huì)涉及到不同的前端界面展示,以及后臺(tái)與微服務(wù)的調(diào)用等等。
模型評(píng)估
這次我們需要做一個(gè)完整的模型評(píng)估功能,因?yàn)楝F(xiàn)實(shí)情況下,針對(duì)不同的問(wèn)題,我們需要選擇不同的評(píng)估算法,遠(yuǎn)不是之前做的那一種topk。
模型格式
這個(gè)主要是算法架構(gòu)考慮,但后臺(tái)系統(tǒng)也需要做調(diào)整,因?yàn)槲覀円С植煌哪P透袷剑ゲ渴稹?br>
支持?jǐn)?shù)據(jù)庫(kù)數(shù)據(jù)集
我希望能在我們的界面上選擇一個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)集
4.2 新增的功能
數(shù)據(jù)處理
這是一個(gè)比較獨(dú)立的功能,具體需要做哪些事,上面已經(jīng)提到了。
jupyter
之所以把它也當(dāng)成一個(gè)新的功能,是因?yàn)橹白龅奶?jiǎn)單了,這次要完全重新做。
4.3 算法架構(gòu)的調(diào)整
算法架構(gòu)這塊其實(shí)是最大的變化:
- 算法架構(gòu)需要提供所有主流算法(機(jī)器學(xué)習(xí)、深度學(xué)習(xí))的支持
- 算法架構(gòu)需要明確底層實(shí)現(xiàn)框架,明確系統(tǒng)支持哪幾種計(jì)算框架及組件
- 需要明確統(tǒng)一的建模算法,做一定的抽象
- 需要提供保存數(shù)據(jù)集、讀取數(shù)據(jù)集(有可能是數(shù)據(jù)庫(kù))、保存模型、記錄指標(biāo)等等通用的內(nèi)置函數(shù)支持
- 需要統(tǒng)一模型文件格式
- 最重要的,需要考慮兩條路線下,會(huì)有哪些坑是我沒(méi)有考慮到的
最后提一點(diǎn)大家可能沒(méi)有注意到的,就是現(xiàn)在將
數(shù)據(jù)處理單獨(dú)剝離出來(lái),就將數(shù)據(jù)與建模過(guò)程解耦了,這是很好的。以前的mnist示例中,其實(shí)是將數(shù)據(jù)處理也一并寫在訓(xùn)練的腳本中,這個(gè)并不合理,也不利于腳本抽象!