上篇主要介绍Pytorch转ONNX,由于业务需求暂时不在离线手机/车机端嵌入式,因此暂时对ONNX2NCNN不继续深入。既然ONNX model支持c,c++,java调用,那么serving的高效部署还是可行的。
这里选择了python简单调用的Flask部署ONNX模型。要注意的是本文的涉及的Flask仅供调试以保证模型转化和调用可行性,需要生产环境调用参考
Deploying a Flask server in production
既然是python调用,那么Torch模型不用转换也可以尝试Flask部署。只是在实际应用中我们不需要任何“训练”,简而言之,只需要inference过程。那么显然直接用pytorch模型的意义不大,并且会导致效率低下。因此,一般来说需要转torchscript或者ONNX,或者其他inference 引擎支持的格式。
这里选用了ONNX, 本文默认模型已经成功打包成.onnx格式。Torch2ONNX转换可以参考上文
Pytorch 模型部署I—Torch2ONNX
, 或者以下官方文档:
参考链接:
Pytorch 官方文档系列:
torch.onnx
,
Pytorch2onnx and using onnxruntime
ONNX 模型压缩和可视化:
onnx-simplifier
,
可视化 Netron
Flask调用pytorch模型官方文档:
Deplying Pytorch in Python via flask
完整代码:
Flask基于onnx模型调用
Read more »
深度学习框架部署中,TF1部署工具链最为成熟,而同样流行的Pytorch部署频频受挫,让本Pytorch忠实拥护者极度烦恼。Torch最近版本中更新了torchscript的用法,然而无论是jit还是trace,标准transformer模型都无法正确转换成torchscript。当然也有可能是我写的transformer有问题,但更多的原因,来自Pytorch本身的动态graph导致无法直接实现类似于keras/tf1 model的 model.summary()功能。
另外,嵌入式端口(如手机,车机等)深度学习模型的部署,一般可以用腾讯NCNN。而TF1转NCNN也并非那么简单。(扯远了
基于规范ONNX模型转化NCNN的工具较为成熟,Pytorch本身也有ONNX的转化工具,本文尝试简略写一下pytorch转onnx的步骤,包括写pytorch 模型时的注意事项。
正文开始之前说一件悲惨的事情:其实到现在还无法搞通Transformer模型部署。如果只想要网络部署,学习TF1的代价其实不算大。当然文中写模型的注意事项,对编写pytorch模型也深有益处~
参考链接:
Pytorch 官方文档系列:
torch.onnx
,
Pytorch2onnx and using onnxruntime
ONNX 模型压缩和可视化:
onnx-simplifier
,
可视化 Netron
Read more »
Hidden Markov Model (HMM) 和 Conditional Random Field (CRF)
是机器学习概率图模型中 有向图(Direced model) 和 无向图(Undirected model) 的经典结构。
这两个模型有本质区别,但是在图的结构上有相似之处,算法也有可以复用的地方。网上相关的文章很多,我写这篇单纯是为了自己总结……
代码:
DemoML/CRF/
本文中概率$p$表示随机变量概率分布,粗体小写表示单一数据的向量,下角标为样本编号,带括号上角标一般表示维度。变量表示规则和其他博文保持一致。
由于手写无法体现粗体,我一般选择变量加下横线表示一个向量。本文配图中,为了更清晰的展示,因此没有加下横线,实际都是向量。
Read more »
Variational AutoEncoder(VAE) 简单还是难?
理解优先,推导其次。
文末只有小段推导过程,其他的推导可以参考概率图模型相关文章,或通过其他网络资源获取。申明一下推导很重要,但有时候过于注重推导会陷入迷茫之中……
附代码(pytorch)
DemoML/VAE_NLG/
本文中概率$p$表示随机变量概率分布,粗体小写表示单一数据的向量,下角标为样本编号,带括号上角标一般表示维度。变量表示规则和其他博文保持一致。
由于手写无法体现粗体,我一般选择变量加下横线表示一个向量。本文配图中,为了更清晰的展示,因此没有加下横线,实际都是向量。
Read more »
我们希望通过机器学习方法得到一个对象的表示(Representations),这个表示可以用到特定的应用场景中。
学习表示的方法有很多,无论是传统的MF,PCA,SVM,或者深度学习模型的VGG,Elmo,BERT,ALbert…都希望能学习到数据中的特点,来表达数据的”含义“。
这些representation的方法其实都降维操作,也就是用低维度表示尽可能诠释高维空间中的含义。
本文想谈谈如何才能算得上一个
优秀
的表示。
以下内容均为个人浅显理解,也欢迎所有同学提出意见和看法。
Read more »
大家都知道K-mean是无监督学习的经典算法。那为什么K-mean是无监督学习呢?可能有人觉得:这也要证明?
其实这是一个值得思考的问题……仔细思考这个问题,你会觉得自己似乎不太懂K-mean了?
哈哈,不要多想,本文意在剖析K-mean算法的本质:
K-mean算法是一种隐变量模型;隐变量模型可以用EM算法计算参数;无监督EM算法的其他应用。
本文单纯分享我自己的理解,如有不准确的地方欢迎讨论,互相进步~
Read more »
理解观测数据,样本,未知分布之间的关系。
三种模型(Model)概念和实例:概率模型(Probabilistic model),统计模型(Statistical Model)和贝叶斯模型(Bayesian Model)。
两种学习方法的概念,区别和实例:最大似然估计(MLE, Maximum Likelihood estimation)和贝叶斯推断(Bayesian inference)
本文主要介绍dependency parsing,包括:dependency parsing和constituency parsing的区别与优点;实现dependency parsing的两种主要方法(trasition based 和 MST);用RNNs实现dependency parsing。
[1]
Jurafsky and Martin Ch. 14 (3rd edition)
[2]
Simple and Accurate Dependency Parsing Using Bidirectional LSTM Feature Representations(Eliyahu Kiperwasser, Yoav Goldberg, 2016)
正文为英文