為了insightface和mxnet較勁的一天
mxnet環境:
官網下載pyhton2.7版本的anaconda,隨便找個安裝教程
sh Anacondaxxxx.sh #一路默認即可,第二個回車符后修改自己想要安裝的路徑 #安裝完畢后重啟命令行,再次打開切換成了(base) conda create -n mxnet python=2.7 #等待配置,完成以后繼續: conda activate mxnet cat /usr/local/cuda/version.txt #輸出9.0.xxx pip install mxnet-cu90
按insightface readme操作,每次加載完數據開始執行時報錯out of memory, batchsize改成1也不行,issue#32有關於這個報錯的討論,結合其他資源各種瞎試,目測是mxnet-cu90的鍋。
conda清華源不支持的解決:
conda info
刪除.condarc里跟清華源有關的網址並保存就可以了
或者也可以一條一條刪除:
conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
有些環境配不上可能是源的問題,半年沒用,機器默認鏡像被改成阿里源了, scikit-image就一直裝不上,要求python2裝0.15以下版本,按報錯提示還是裝不成,靈機一動加上-i清華源就好了:
pip install 'scikit-image<0.15' -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
----------2019.05.02 還真不是,后來同事說剛好那台機器有塊卡壞了,今天在另外一台也是cu90的機器上裝了,沒啥問題......----------
錯誤信息:
[14:15:31] src/storage/./pooled_storage_manager.h:143: cudaMalloc failed: out of memory
未果的嘗試如下:
1. 強制安裝mxnet-cu92 - 跑不了,cuda版本和mxnet不一致;
在一個有cuda9.2版本的機器上好不容易裝好了mxnet-cu92,報錯如下:
OSError: libcudart.so.9.2: cannot open shared object file: No such file or directory
解決方案:
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64
然后各種環境配齊,還是錯:
Check failed: e == cudaSuccess || e == cudaErrorCudartUnloading CUDA: CUDA driver version is insufficient for CUDA runtime version
cuda有個對應版本,顯卡太老不支持9.2
2. 直接pip install mxnet - 就是裝了cpu版本,跑不了,程序會強烈要求設置cuda=1;
3. 執行如下指令:
- 一樣的out of memory問題
4. 用conda create -n mxnet python=3.6搭建python3環境,運行時各種版本不對導致的xrange ascii錯誤
最后找了一個cuda版本7.5的,重復上述步驟改為pip install mxnet-cu75就可以跑了,K80的卡resnet50網絡batchsize=32顯存也就用了一半。
實際訓練batchsize=32會導致lossval=Nan,改成128*8塊卡,每塊卡占8319MB,loss比較穩定的開始下降了
5. (2019.10.29)在cuda-9.0的機器上裝了1.2.1版本的mxnet,用triplet finetune結果很詭異,loss在第一個bag不降,然后驟降,測試結果還不如原始模型。不太確定當時怎么配的環境了,pip install mxnet-cu90換成1.5.1就正常
--->
其他環境:
1. No module named memonger
git clone https://github.com/dmlc/mxnet-memonger.git
export PYTHONPATH=$PYTHONPATH:/clone下來的memonger路徑
2. pip install sklearn pillow opencv-python等,如果出現 Read timed out. 后加--default-timeout
pip install mxnet-cu80 --default-timeout=1000
3. 安裝Anaconda后推出shell也不自動進入conda環境:
vi ~/.bashrc export PATH=$PATH:/home/xxx/anaconda2/bin #輸入以后保存退出 source ~/.bashrc
再次退出shell再進入就好了。
4. openBlas安裝
運行insightface:
訓練
可以用src/train_softmax.py r100網絡K80的卡要設batchsize=64
config.py里面的num_classed要和數據里面的id數匹配(不匹配的症狀是lossvalue到4000個batch會慢慢變大,最后nan)
CUDA_VISIBLE_DEVICES是一種臨時環境變量,用來指示mxnet哪些gpu是可用的。
數據准備
mxnet生成rec的正確姿勢:
python im2rec.py /xxx/data/celeb /ddd/FR/celebrity --list --recursive
python im2rec.py --num-thread 28 /xxx/data/celeb.lst /ddd/FR/celebrit
prefix和root放在前邊,list和recursive如果顯示指定就是True,否則作為False,應有如下打印信息和輸出:
lst格式如下,Label從0開始需要連續:
其他問題
bind報錯,"RuntimeError: softmax_label is not presented"
參考這里:
provide_data = test_dataiter.provide_data provide_label = test_dataiter.provide_label model.bind( data_shapes=provide_data, \ label_shapes=provide_label, for_training=False ) model.set_params(arg_params, aux_params, allow_missing=True) #加上allow_missing=True就可以了
資源:
本來是要趁着五一小長假擼一遍論文系統整理一下的,發現資源已經很豐富了:
最開始的幾篇經典整理如下:
測試指標:
先看1再看2,竊以為,把相同id做為P;不同id作為N,TAR相當於TPR;FAR相當於FPR,人臉識別領域的TAR和分類的TPR以及檢測的Recall是同一個指標。
測試時如果在萬分之一之前都正常,到某個量級突然閾值變得很大,TPR驟降,多半是測試數據集標注錯誤比例過高(相對於測試量級),如果測試id本身不夠多,比如只有2000個id,負例對只有約400萬個,要測百萬分之一,就要取分數的倒數第4個作為閾值,而測試樣本里有幾個明明是同一個人被標成了不同人,取到的閾值就會很大,導致正例對中大量閾值稍小的樣本對被誤判為不同人。
經查是切圖代碼bug,有的id對應的原始圖像是壞的,try except里沒有continue,導致保存了上一次處理的圖像作為這個id。
tricks:
蘇寧:只微調最后一層特征,在調整到一定程度之后,才會放開所有的參數,微調整個模型。
-------------------------
paddlepaddle的環境,懶得建新文檔,就放這里吧,按照官方的來,不管復雜的安裝手續,直接執行:
pip install paddlepaddle-gpu==1.7.1.post97 -i https://mirror.baidu.com/pypi/simple
傻瓜式安裝,不知道百度給裝了什么依賴庫,裝好以后服務器的消息都是中文的了,暫未發現其他影響,然后按官方提供方式驗證:
import paddle.fluid paddle.fluid.install_check.run_check()
果然報錯了,libcublas找不到
locate libcublas.so #找到本地地址
根據找到的地址,執行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH://usr/local/cuda-9.0/targets/x86_64-linux/lib/
就可以了。