Copy攻城獅辛酸史:含淚“一分鐘”跑通MindSpore的LeNet模型
摘要:一個Cope 攻城獅用切身例項告訴你: Cope程式碼體驗一時爽,BUG修改花半天。
前言:此文為r0.7-beta的操作實踐,為什麼我的眼裡常含淚水,因為我對踩坑這件事愛得深沉。謹以此文獻給和我一樣踩坑的小夥伴,紀念踩坑時刻。
↑開局一張圖,故事全靠編。
有時候常常問自己:我一個前端開發,沒有python基礎,居然敢嘗試使用深度學習框架?誰給的勇氣,是梁靜茹嗎?有時候也常常暗示自己“技多不壓身”,活得像周樹人筆下的阿Q一樣灑脫,不過現實就像--我是鑽井工,鑽了一個又一個的井,因為沒有堅持,一次又一次地和寶藏擦肩而過最終空手而歸;有時候也常常告慰自己:“Just DO IT”,IT這麼吃香,不幹IT還能幹啥?不就是換個地兒搬磚嗎?定個小目標,先跑通MindSpore的LeNet模型!
安裝
優秀的全場景深度學習框架開源專案,應該提供Docker安裝映象;先康康我的執行環境:
- Ubuntu 18.04.5 LTS
- Docker version 18.09.6
這次安裝的是CPU版本的,命令:
docker pull mindspore/mindspore-cpu:0.7.0-betadocker run -it mindspore/mindspore-cpu:0.7.0-beta /bin/bash
一步到“胃”,直接進入到home目錄,接下來Copy攻城獅要開始表演粗劣的Copy***,跑通MindSpore的LeNet模型。
Fork程式碼
為啥要Fork程式碼呢?您指望一個毫無核心技術的Copy攻城獅手寫一個深度學習框架MindSpore?程式碼千千萬,Fork第一條!不囉嗦,先fork一下
git clone https://gitee.com/hu-qi/mindspore
因為碼雲是咱自己的,速度倍兒棒,稍等片刻,美味即將呈現。
翻車現場
ModuleNotFoundError: No module named 'mindspore.dataset.vision'.
習慣了瞎折騰,以為直接執行train.py就能一分鐘跑通,還是“too young,too simple”。一波錯誤的示範,然後就是圖中巨大的坑:
幸好前人已經踩過坑了:Windows系統下跑通華為MindSpore的Lenet網路,儘管是Windows系統的,看上去似乎是相同的問題。為了記錄本次踩坑歷程,我決定施展一下git技能!
checkout踩坑分支
為了印象更加深刻,我決定將分支命名為9-12,以此紀念"9·12踩坑事件"。
cd /home/mindspore
git checkout -b 9-12
然後參照前人的經驗教訓開始修改本地檔案。
修改檔案
本次修改的是兩個檔案--lenet/train.py和lenet/src/dataset.py。
- lenet/src/dataset.py
# ……
# line 20新增層級transforms
import mindspore.dataset.transforms.vision.c_transforms as CV
# line 22新增層級transforms
from mindspore.dataset.transforms.vision import Int
# ……
- lenet/train.py
# ……
# 註釋line 32和line34
# from mindspore.common import set_seed
# set_seed(1)
# line 55新增設定is_grad=false
net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean", is_grad=False)
# ……
在lenet目錄滿懷信心的執行命令:python train.py --device_target=CPU --dataset_sink_mode=False,結果又是一個錯誤:ValueError: The folder ./Data/train does not exist or permission denied!。
一開始以為是許可權的問題,經過一些嘗試,發現是沒有Data目錄。那就在lenet下新建一個Data目錄以及子目錄test和train吧。
cd /home/mindspore/model_zoo/official/cv/lenet
mkdir Data
mkdir Data/test && mkdir Data/train
然後依舊滿懷信心敲下執行訓練的命令:python train.py --device_target=CPU --dataset_sink_mode=False
結果又是一個坑:Unexpected error. There is no valid data matching the dataset API MnistDataset.Please check file path or dataset API validation first.。怎麼辦?意識到指令碼並沒有給我自動下載Mnist資料集,又不懂程式碼,只好手動去下載了。
下載Mnist資料集
Mnist資料集:http://yann.lecun.com/exdb/mnist/
資料目錄結構:
└─Data
├─test
│ t10k-images.idx3-ubyte
│ t10k-labels.idx1-ubyte
│
└─train
train-images.idx3-ubyte
train-labels.idx1-ubyte
既然是linux,二話不說,先來四個wget!
# 切換到Data目錄
cd Data
# 下載訓練圖片
wget
# 下載訓練標籤
wget
#下載測試圖片
wget
# 下載測試標籤
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
然後又是一波解壓操作,來四個gunzip:
gunzip train-images-idx3-ubyte.gz
gunzip train-labels-idx1-ubyte.gz
gunzip t10k-images-idx3-ubyte.gz
gunzip t10k-labels-idx1-ubyte.gz
最後,再來一波移動檔案操作壓壓驚。來四個mv:
mv train-images-idx3-ubyte ./train
mv train-labels-idx1-ubyte ./train
mv t10k-images-idx3-ubyte ./test/
mv t10k-labels-idx1-ubyte ./test/
此時此刻,感受到不懂程式碼真吃虧,明明幾行程式碼就解決了,我要這麼多套“切克鬧”才能獲取到資料集,我一定向明明學習,爭取早日擺脫Copy攻城獅的稱號,實現程式碼自由,贏取開源碩果,走向擼碼巔峰!咳咳,再來一盤花生米,我還能嘮嗑!
訓練及驗證
新司機再次上路,這回我總能愉快的訓練了吧?
cd /home/mindspore/model_zoo/official/cv/lenet
python train.py --device_target=CPU --dataset_sink_mode=False
然後終於看到了勝利的曙光,跑起來了!跑起來了!跑起來了! 看到一行行日誌不斷湧現,我的眼眶噙滿了淚水--“小胡,你在幹啥?你丫一前端上班在跑模型,不想幹了嗎?明天去財務領錢……” 還好隔壁王哥及時解圍--“他這是在深度學習,以後不會再把1畫素切成2畫素了”
接下還需要驗證一下:
cd /home/mindspore/model_zoo/official/cv/lenet
python eval.py --ckpt_path="ckpt/checkpoint_lenet-10_1875.ckpt" --device_target=CPU
執行結果:
============== Starting Testing ==============
============== {'Accuracy': 0.9847756410256411} ==============
勉強能接受吧,畢竟只整了10個epoch。
上傳到遠端倉庫
儘管我們已經跑通了MindSpore的LeNet,不過我還是希望能把踩的這些坑記錄下來,最後再使用一下git技能:
# 切換到本地倉庫目錄
cd /home/mindspore
# 設定git
git config --global user.email "[email protected]"
git config --global user.name "hu-qi"
# 檢視本地分支,確保我的9-12還在
git branch
# 檢視有哪些改變
git status
# 新增改變
git add .
# 提交改變到快取倉庫
git commit -m 'finish LeNet'
# 推送分支到遠端(按照提示登入)
git push origin 9-12
一頓操作猛如虎,一看程式碼原地杵,當然要切換到9-12這個分支才有的啦。
結語
所謂“一分鐘”的體驗,大概花了一個小時踩坑了,然後大概花了三個小時來記錄。不足之處,期待各位大佬多多指教!