目錄
- 模型序列化簡(jiǎn)介
- 序列化分類(lèi)
- Scikit-learn模型序列化方法
- XGBoost模型序列化方法
- LightGBM模型序列化方式
- Spark-ML模型序列化方式
- Keras模型序列化方法
- Pytorch模型序列化方法
- MXNet模型序列化方法
- 總結(jié)
模型序列化簡(jiǎn)介
模型序列化是模型部署的第一步臭觉,如何把訓(xùn)練好的模型存儲(chǔ)起來(lái),以供后續(xù)的模型預(yù)測(cè)使用式廷,是模型部署的首先要考慮的問(wèn)題余耽。本文主要羅列當(dāng)前流行開(kāi)源模型不同序列化方法泽裳,以供查閱參考笋额,歡迎添加和指正(Github)冯袍。
序列化分類(lèi)
-
跨平臺(tái)跨語(yǔ)言通用序列化方法犬钢,主要使用三種格式:XML苍鲜,JSON,和Protobuf玷犹,前兩種是文本格式混滔,人和機(jī)器都可以理解,后一種是二進(jìn)制格式歹颓,只有機(jī)器能理解坯屿,但在存儲(chǔ)傳輸解析上有很大的速度優(yōu)勢(shì)。
- PMML (Predictive Model Markup Language)巍扛,基于XML格式领跛。由數(shù)據(jù)挖掘組織DMG(Data Mining Group)開(kāi)發(fā)和維護(hù),是表示傳統(tǒng)機(jī)器學(xué)習(xí)模型的實(shí)際標(biāo)準(zhǔn)撤奸,具有廣泛的應(yīng)用吠昭。詳細(xì)參考文章《使用PMML部署機(jī)器學(xué)習(xí)模型》。
-
ONNX (Open Neural Network Exchange)胧瓜,基于Protobuf二進(jìn)制格式矢棚。初始由微軟和Facebook推出,后面得到了各大廠商和框架的支持府喳,已成為表示深度神經(jīng)網(wǎng)絡(luò)模型的不二標(biāo)準(zhǔn)蒲肋,通過(guò)
onnx-ml
也已經(jīng)可以支持傳統(tǒng)非深度神經(jīng)網(wǎng)絡(luò)模型。詳細(xì)參考文章《使用ONNX部署深度學(xué)習(xí)和傳統(tǒng)機(jī)器學(xué)習(xí)模型》。 - PFA (Portable Format for Analytics)兜粘,基于JSON格式申窘。PFA同樣由PMML的領(lǐng)導(dǎo)組織DMG開(kāi)發(fā),最新標(biāo)準(zhǔn)是2015發(fā)布的0.8.1妹沙,后續(xù)再?zèng)]有發(fā)布新版本偶洋。OpenDataGroup公司開(kāi)發(fā)了基于PFA的預(yù)測(cè)庫(kù)Hadrian,提供Java/Scala/Python/R等多語(yǔ)言接口距糖。
- MLeap玄窝,基于JSON或者Protobuf格式。開(kāi)源但非標(biāo)準(zhǔn)悍引,由初創(chuàng)公司Combust開(kāi)發(fā)恩脂,剛開(kāi)始主要提供對(duì)Spark Pipelines的支持,目前也可以支持Scikit-learn等模型趣斤。Combust同時(shí)提供了MLeap Runtime來(lái)支持MLeap格式模型俩块,基于Scala開(kāi)發(fā),實(shí)現(xiàn)了一個(gè)獨(dú)立的預(yù)測(cè)運(yùn)行引擎浓领,不依賴(lài)于Spark或者Scikit-learn等庫(kù)玉凯。
- Core ML,基于Protobuf二進(jìn)制格式联贩,由蘋(píng)果公司開(kāi)發(fā)漫仆,主要目標(biāo)為在移動(dòng)設(shè)備上使用AI模型。
-
模型本身提供的自定義序列化方法
- 文本或者二進(jìn)制格式
- 語(yǔ)言專(zhuān)有或者跨語(yǔ)言跨平臺(tái)自定義格式
-
語(yǔ)言級(jí)通用序列化方法
-
用戶自定義序列化方法
- 以上方法都無(wú)法達(dá)到要求,用戶可以使用自定義序列化格式祸泪,以滿足自己的特殊部署需求:部署性能吗浩、模型大小、環(huán)境要求等等没隘。但這種方法在模型升級(jí)維護(hù)以及版本兼容性上是一個(gè)大的挑戰(zhàn)懂扼。
如何選擇模型序列化方法,可以參考以下順序升略,優(yōu)先使用跨平臺(tái)跨語(yǔ)言通用序列化方法微王,最后再考慮使用自定義序列化方法:
ai-serialization-candidates.jpg在同一類(lèi)型格式選項(xiàng)中,可以參考以下篩選流程:
ai-serialization-flow.jpg
Scikit-learn模型序列化方法:
- PMML:Nyoka品嚣,SkLearn2PMML
- ONNX:sklearn-onnx, 或者ONNXMLTools包裝了sklearn-onnx
- MLeap
- Pickle 或者 Joblib
XGBoost模型序列化方法:
- XGBoost自定義二進(jìn)制格式炕倘,該格式是一種與語(yǔ)言和平臺(tái)無(wú)關(guān)的內(nèi)部通用格式。
- PMML:Nyoka翰撑,SkLearn2PMML
- ONNX:ONNXMLTools
- Pickle 或者 Joblib(使用Python API)
LightGBM模型序列化方式:
- LightGBM自定義格式:文本文件或者字符串罩旋。
- lightgbm.Booster.save_model
- lightgbm.Booster.model_to_string
- 構(gòu)造函數(shù)導(dǎo)入模型 lightgbm.Booster
- PMML:Nyoka啊央,SkLearn2PMML
- ONNX:ONNXMLTools
- Pickle 或者 Joblib(使用Python API)
Spark-ML模型序列化方式
- Spark-ML內(nèi)部存儲(chǔ)格式,PipelineModel提供save和load方法涨醋,輸入的是一個(gè)路徑瓜饥,而不是文件名,因?yàn)橐鎯?chǔ)到多個(gè)不同的文件中浴骂。Spark在大數(shù)據(jù)的分布式處理有很大優(yōu)勢(shì)乓土,比如適合批量預(yù)測(cè)和模型評(píng)估,但是對(duì)于實(shí)時(shí)預(yù)測(cè)來(lái)說(shuō)溯警,太重量級(jí)了趣苏,效率不高。提供Scala梯轻,Java和Python接口食磕,可以跨平臺(tái)和語(yǔ)言讀取。
- PMML:JPMML-SparkML
- ONNX:ONNXMLTools喳挑,還在實(shí)驗(yàn)階段彬伦。
- PFA:Aardpfark,支持還不完全伊诵。
- MLeap
Keras模型序列化方法
-
- HDF5:
# Save the model model.save('path_to_my_model.h5') # Recreate the exact same model purely from the file new_model = keras.models.load_model('path_to_my_model.h5')
- TensorFlow
SavedModel
格式单绑,該格式是TensorFlow對(duì)象的獨(dú)立序列化格式,由TensorFlow serving和TensorFlow(而不是Python)支持曹宴。
# Export the model to a SavedModel model.save('path_to_saved_model', save_format='tf') # Recreate the exact same model new_model = keras.models.load_model('path_to_saved_model')
PMML: Nyoka询张,導(dǎo)出的是擴(kuò)展的PMML模型,不屬于PMML標(biāo)準(zhǔn)浙炼。
ONNX:keras2onnx
Pytorch模型序列化方法
-
Pytorch內(nèi)部格式:只存儲(chǔ)已訓(xùn)練模型的狀態(tài)(包括weights and biases),因?yàn)閮H僅為了模型預(yù)測(cè)唯袄。
# Saving & Loading Model for Inference torch.save(model.state_dict(), PATH) model = TheModelClass(*args, **kwargs) model.load_state_dict(torch.load(PATH)) model.eval()
ONNX:內(nèi)部支持torch.onnx.export
MXNet模型序列化方法
-
- 只存儲(chǔ)模型參數(shù)弯屈,不包含模型結(jié)構(gòu),加載時(shí)需要建立模型結(jié)構(gòu)恋拷。
# Saving model parameters to file net = build_net(gluon.nn.Sequential()) train_model(net) net.save_parameters(file_name) # Loading model parameters from file new_net = build_net(gluon.nn.Sequential()) new_net.load_parameters(file_name, ctx=ctx)
- 存儲(chǔ)模型參數(shù)和結(jié)構(gòu)到JSON文件中资厉,該格式可以跨平臺(tái)和語(yǔ)言使用,可以在不同的語(yǔ)言中被加載蔬顾,比如C宴偿,C++或者Scala。
# Saving model parameters AND architecture to file net = build_net(gluon.nn.HybridSequential()) net.hybridize() train_model(net) # Two files path-symbol.json and path-xxxx.params will be created, where xxxx is the 4 digits epoch number. net.export(path) # Loading model parameters AND architecture from file gluon.nn.SymbolBlock.imports(symbol_file, input_names, param_file=None, ctx=None)
ONNX:內(nèi)部支持mxnet.contrib.onnx.export_model
總結(jié)
這并不是一個(gè)完整的列表诀豁,歡迎大家貢獻(xiàn)窄刘,標(biāo)星_。
Github地址:https://github.com/aipredict/ai-models-serialization