百度也推出了類似Kaggle的比賽平臺,每天免費(fèi)贈送10小時(shí)GPU訓(xùn)練算力,配備工業(yè)級NVIDIA Tesla V100 GPU資源。不過目前只支持百度自己的PaddlePaddle(飛槳)框架,不能運(yùn)行tensorflow、pytorch等其他框架。

百度AI Studio是針對AI學(xué)習(xí)者的在線一體化學(xué)習(xí)與實(shí)訓(xùn)社區(qū). 本平臺集合了AI教程, 深度學(xué)習(xí)樣例工程, 各領(lǐng)域的經(jīng)典數(shù)據(jù)集, 云端的超強(qiáng)運(yùn)算及存儲資源, 以及比賽平臺和社區(qū).
https://aistudio.baidu.com/aistudio/index

一、考慮將kaldi工具壓縮后上傳至數(shù)據(jù)集
kaldi工具編譯完成后大約占用15G,考慮暫時(shí)跳過stage 0、1、2步
二、將已抽取的fbank語音特征打包上傳至數(shù)據(jù)集
直接從調(diào)試stage 3步訓(xùn)練開始
github上發(fā)現(xiàn)一個(gè)轉(zhuǎn)換模塊paddle_torch,將其下載到/home/aistudio目錄,利用 pip install . 命令安裝。
%cd /home/aistudio/
!git clone https://github.com/zzz2010/paddle_torch.git
# 安裝 paddle_to
%cd /home/aistudio/
!mkdir paddle_to
%cd paddle_to
!unzip -oq /home/aistudio/paddle_to.zip
!pip install .
用paddorch替換掉py文件中關(guān)于torch的調(diào)用。

執(zhí)行.run.sh --stage 3 后發(fā)現(xiàn)錯(cuò)誤

data.py文件中增加from paddle.fluid.io import DataLoader
修改class AudioDataLoader(DataLoader):


上傳dump目錄壓縮包,新建數(shù)據(jù)集,添加標(biāo)簽時(shí)需要輸入一次回車,上傳完成后點(diǎn)擊確定。



出現(xiàn)錯(cuò)誤

替換成use_shared_memory

出現(xiàn)錯(cuò)誤

nn.LayerNorm 用 fluid.dygraph.LayerNorm 替代:
import paddle.fluid as fluid
...
self.layer_norm_in = fluid.dygraph.LayerNorm(d_model)
出現(xiàn)新錯(cuò)誤:

fluid.layers.exp 替代 paddorch.exp
fluid.layers.sin、fluid.layers.cos類似操作

又出現(xiàn)錯(cuò)誤:

fluid.dygraph.Layer替換掉nn.Module

仍然未能解決問題,改回nn.Module,通過修改paddorch目錄下nn/__ init __.py文件。并重新pip install paddorch

出現(xiàn)新錯(cuò)誤

將mean改為m

卡在下面這個(gè)錯(cuò)誤下好久

最終定位問題可能是LFRCollate類中的call,而內(nèi)部的paddle.to_tensor無法正確完成。(不清楚原因,但是在call外部執(zhí)行paddle.to_tensor正確。)

然后出現(xiàn)新問題

utils.py文件中size(0)改為shape[0]

轉(zhuǎn)換 Tensor 的 dtype
import paddle
pad_mask = paddle.cast(pad_mask, dtype='int32')
利用np.append實(shí)現(xiàn)for循環(huán)
ys = []
for y in padded_input:
ys.append(y.shape[0])
利用masked_select只選mask對應(yīng)的數(shù)據(jù)
x_data = [1,2,3,4]
x = paddle.to_tensor(x_data)
mask_data = [True, False, True, True]
mask = paddle.to_tensor(mask_data)
out = paddle.masked_select(x, mask)
# [1, 3, 4]
轉(zhuǎn)換為 Tensor 格式
x = [1, 2, 4, 7]
x = paddle.to_tensor(x)
當(dāng)tgt_emb_prj_weight_sharing = 1 時(shí)維度報(bào)錯(cuò),發(fā)現(xiàn)是paddle、pytorch兩者Linear()內(nèi)部創(chuàng)建weight的維度剛好相反導(dǎo)致。



decoder.py文件中新增create_parameter行,將tgt_word_emb.emb.weight轉(zhuǎn)置
if tgt_emb_prj_weight_sharing:
# Share the weight matrix between target word embedding & the final logit dense layer
self.tgt_word_emb.weight = paddle.static.create_parameter(shape=self.tgt_word_emb.weight.t().shape, dtype='float32')
self.tgt_word_prj.weight = self.tgt_word_emb.weight
self.x_logit_scale = (d_model ** 0.5)
else:
self.x_logit_scale = 1.
修改之后,仍報(bào)錯(cuò)誤,暫時(shí)將tgt_emb_prj_weight_sharing 設(shè)置為0訓(xùn)練:

發(fā)現(xiàn)solver.py初始化時(shí)出現(xiàn)問題,paddle.to_tensor

修改為以下代碼即可。
self.tr_loss = paddle.empty(shape=[self.epochs], dtype='float32')
self.cv_loss = paddle.empty(shape=[self.epochs], dtype='float32')
終于可以正常開始訓(xùn)練了!

結(jié)果保存出現(xiàn)問題,無法像pytorch那樣直接打包保存package的tar格式文件,改用paddle.save替代。
(只能保存Model或Optimizer的state_dict())
paddle.save(self.model.state_dict(), file_path)
# torch.save(self.model.serialize(self.model, self.optimizer, epoch + 1,
# self.LFR_m, self.LFR_n,
# tr_loss=self.tr_loss,
# cv_loss=self.cv_loss),
# file_path)
參考資料
https://blog.csdn.net/weixin_48733317/article/details/108176827
https://blog.csdn.net/qq_32097577/article/details/112383234
https://blog.csdn.net/qq_32097577/article/details/112383360
https://blog.csdn.net/qq_32097577/article/details/112384179
https://aistudio.baidu.com/aistudio/course/introduce/1340