Docker部署官方tensorflow版本EfficientDet
官方版本EfficientDet依賴環境爲tensorflow2.1.0,python版本爲3;而tensorflow2.1.0gpu版本又依賴於cuda10.1,爲了不對本機環境產生影響,所以採用docker部署
一、官方鏡像下載
在tensorflow官方鏡像地址copy下載命令,複製到host機器的終端運行
如果pull過程很慢,那就更換國內docker鏡像源
vim /etc/docker/daemon.json
編輯daemon.json文件
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
下載完成之後,查看鏡像
docker image ls
二、容器創建
NVIDIA Docker 支持
在docker裏面運行需要cuda的支持,所以先安裝nvidia的docker鏡像
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
檢查是否安裝成功
#### Test nvidia-smi with the latest official CUDA image
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi
# Start a GPU enabled container on two GPUs
docker run --gpus 2 nvidia/cuda:10.0-base nvidia-smi
# Starting a GPU enabled container on specific GPUs
docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smi
docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi
# Specifying a capability (graphics, compute, ...) for my container
# Note this is rarely if ever used this way
docker run --gpus all,capabilities=utility nvidia/cuda:10.0-base nvidia-smi
運行容器
下面兩種方式都可以,指定runtime是docker2的寫法
docker run -itd --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --restart=always --shm-size 1G -p 5522:22 -v /opt:/opt -v /home:/home -v /mnt:/mnt --name lcg_tf2.0.1 tensorflow/tensorflow:2.1.0-gpu-py3 /bin/bash
docker run -itd --gpus all --restart=always --shm-size 1G -p 5522:22 -v /opt:/opt -v /home:/home -v /mnt:/mnt --name lcg_tf2.0.1 tensorflow/tensorflow:2.1.0-gpu-py3 /bin/bash
5522是端口號,將docker的22端口映射到host的5522端口上
創建容器內服務
1、創建容器內部用戶
進入容器
docker attach <容器ID>
進入容器之後,默認的是root用戶
#創建用戶組lcg 制定組ID 1001
groupadd -g 1001 lcg
#添加一個用戶到lcg組並指定id爲1001
useradd lcg -g lcg -u 1001 -m -s /bin/bash
#修改用戶密碼
sudo passwd lcg
#安裝常用的軟件
apt-get update
apt-get install language-pack-zh-hans uuid-dev libtiff5-dev -y
apt-get install net-tools vim
給lcg用戶賦予root權限
apt-get install sudo
#編輯/etc/sudoers文件
vim /etc/sudoers
如下圖
2、創建SSH服務
apt-get update
apt-get install -y openssh-server
sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
$ echo "export VISIBLE=now" >> /etc/profile
然後建立一個配置文件夾並進行必要的配置:
mkdir /var/run/sshd
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
重啓SSH激活配置
service ssh restart
測試是否生效
#在host機上測試docker的端口轉發
docker port <container_name> 22
#如果配置生效了,會出現0.0.0.0:5522
使用ssh鏈接docker
ssh [email protected] -p 5022
Docker常用操作
#列舉出正在運行的容器
dokcer ps
#列舉出所有容器
docker ps -a
#獲取容器信息
docker container ls -a
#如果要刪除的容器還在運行狀態,那麼先停止容器
docker container stop <container ID>
#找到要刪除的容器的ID,進行刪除
docker container rm <container ID>
#刪除鏡像
docker image rm <image ID>
三、測試tensorflow環境
首先進入python環境
python
在python環境下
import tensorflow as tf
tf.test.gpu_device_name()
測試環境成功,則可以進入訓練代碼調試了
四、準備數據
將自己標註數據整理爲voc格式,EfficientDet中datasets下面有有create_pascal_tfrecord.py腳本,可以將pascal格式數據轉換爲tfrecord數據
voc2007格式爲
在create_pascal_tfrecord.py腳本中轉換數據的時候,會在xml文件中讀取folder,filename等字段
但是有個問題就是,標註圖片信息的時候,往往是很多人用labeImg一起標註,然後最後彙總的,所以導致folder和path跟真實存儲路徑是不一樣的,所以在腳本中需要進行一點修改。
PYTHONPATH=".:$PYTHONPATH"
python dataset/create_pascal_tfrecord.py --data_dir=VOCdevkit --year=VOC2012 --output_path=mytfrecord/pascal --set=trainval
運行完成之後,會在output_path路徑下生成100個tfrecord文件
五、訓練
直接在EfficientDet目錄下,運行mian.py文件即可,然後需要配置一些參數
python main.py \
--mode=train_and_eval \
--training_file_pattern=output_tfrecord/*.tfrecord \
--validation_file_pattern=output_tfrecord/*.tfrecord \
--val_json_file=output_tfrecord/json_output_tfrecord.json \
--model_name=efficientdet-d1 \
--model_dir=tmp/efficientdet-d1-scratch \
--ckpt=efficientdet-d1 \
--train_batch_size=4 \
--eval_batch_size=1 \
--eval_samples=512 \
--hparams="num_classes=5,moving_average_decay=0" \
--use_tpu=False
然後就開始訓練
目前EfficientDet的官方版本的代碼一直在更新,截止到目前(2020年5月19日),最近的一次push是20小時之前,所以每一次的命令執行顯示都會有所不一樣。
一個月前,代碼裏面的很多東西還是使用tensorflow1的API寫的,但是到現在很多tf1的寫法都逐漸被改成了tf2的寫法。
訓練的效果還算不錯,但是繼續訓練會需要一點trick
六、測試
1、導出模型
將ckpt文件導出爲pb文件,順便還可以生成tflite
python model_inspect.py \
--runmode=saved_model \
--model_name=efficientdet-d1 \
--ckpt_path=efficientdet-d1
--saved_model_dir=savedmodeldir \
--tflite_path=efficientdet-d1.tflite
命令運行完成之後,在savedmodeldir目錄下將會得到pb文件和tflite文件
2、時間測試
完成pb模型的導出之後,可以測試一下模型的latency,這裏網絡推理時間測試是指的是從第一個卷積到最後一個prediction output的計算時間,不包括前處理和後處理,例如圖像歸一化,NMS等都不包括
python model_inspect.py \
--runmode=bm \
--model_name=efficientdet-d1 \
如果需要end2end的測試時間,可以運行一下命令
python model_inspect.py \
--runmode=saved_model_benchmark \
--saved_model_dir=/path/ientdet-d1frozen.pb \
--model_name=efficientdet-d1 \
-input_image=testdata/img1.jpg \
--output_image_dir=/tmp/
下面是在V100上測試的結果
3、測試自己的圖片
python model_inspect.py --runmode=saved_model_infer \
--model_name=efficientdet-d0 \
--hparams="image_size=1920x1280" \
--saved_model_dir=/tmp/saved_model/efficientdet-d0_frozen.pb \
--input_image=img.png --output_image_dir=/tmp/