Python版本需要3.7及以上。
安装Python依赖包和系统的OpenCV库
pip3 install -r requirements.txt
sudo apt update
sudo apt install python3-opencv
用如下命令安装Python依赖包,除torch和torchvision外都会安装成功。
cat requirements.txt | sed -e '/^\s*#.*$/d' -e '/^\s*$/d' | xargs -n 1 pip install
下载安装torch和torchvision的wheel
wget https://github.com/zsnjuts/pytorch-armv7l/archive/refs/tags/v1.0.zip
unzip v1.0.zip
pip3 install pytorch-armv7l-1.0/torch-1.7.0a0-cp37-cp37m-linux_armv7l.whl
pip3 install pytorch-armv7l-1.0/torchvision-0.8.0a0+45f960c-cp37-cp37m-linux_armv7l.whl
rm -rf pytorch-armv7l-1.0/ v1.0.zip
安装系统的依赖库
sudo apt update
sudo apt install libatlas-base-dev libopenblas-dev python3-opencv python3-numpy python3-scipy
要确保如下的设备访问路径可行,即client可以通过特定的IP端口号访问到相应的server。
设备(client) | 要访问的设备(server) |
---|---|
Master | 所有Worker,Trainer |
Worker i | Worker i+1 |
虽然Worker也会作为client请求Master,但是系统内部通过grpc的流式回复实现了这一功能,所以无需配置。
使用 cgroup 和 tc 对指定进程进行限速。基本原理就是,tc对指定cgroup的所有进程限制总带宽为一个特定值。这里我们只需要对一个进程限速,所以cgroup中只会有一个进程。
tc系统自带,只需安装cgroup工具,以便使用cgexec命令。
sudo apt install cgroup-tools
对网卡wlan0创建带宽上限为1MB/s的cgroup命令如下:
# 在net_cls下创建名为mylim的cgroup
cd /sys/fs/cgroup/net_cls/
sudo su
mkdir mylim
cd mylim/
echo 0x10010 > net_cls.classid
# 创建对于wlan0网卡的root规则,qdisc编号为1
tc qdisc add dev wlan0 root handle 1: htb
# 添加过滤器,使用cgroup号作为class
tc filter add dev wlan0 parent 1: handle 1: cgroup
# 添加class,cgroup号为1:10的进程网速限制为1MB/s
tc class add dev wlan0 parent 1: classid 1:10 htb rate 1mbps
上述命令已封装在tool/set_net_lim.sh里,使用方法:
bash tool/set_net_lim.sh <带宽上限, 单位MB/s>
如bash tool/set_net_lim.sh 4
表示创建一个名为mylim的cgroup,这个cgroup下面的进程带宽上限为4MB/s.
cgroup配置关机以后会失效。
因为树莓派经常开关机,所以可以把上述的cgroup配置脚本配置到开机启动项中。
以带宽上限为4MB/s为例,在/etc/rc.local文件的exit 0
前添加如下代码,相应的log文件会记录配置后的所有tc class。
bash /home/pi/cnn-video/tool/set_net_lim.sh 4 > /home/pi/cnn-video/tool/set_net_lim.log
查看设备wlan0上已有的规则(输出的Mbit表示Mbit/s,除以8为MB/s)
tc class ls dev wlan0
修改规则中的限速为4MB/s(把上面添加命令中的add改成change,1mbps改成4mbps)
sudo tc class change dev wlan0 parent 1: classid 1:10 htb rate 4mbps
以启动worker0为例,命令如下(即lim_net_start.sh)
sudo -E PATH=$PATH PYTHONPATH=$(python -c "import sys; print(':'.join(sys.path))") cgexec -g net_cls:mylim /usr/bin/python3.7 main.py worker -i 0
cgexec -g net_cls:mylim
指定后面的命令启动的进程运行在net_cls下的mylim这个cgroup中
cgexec需要sudo权限,但是因为Python的包都是安装在当前用户下而不是系统安装,所以root用户目录下运行python会找不到很多包。所以这里要设置PATH和PYTHONPATH(就是sys.path
)告诉解释器从哪里加载包。此外,sudo的E选项表示运行后面命令时保留当前的环境变量。
同样使用cgroup进行限制。比如限制mylim下的进程CPU占用率为40%,即只能使用一个核的40%(8个核总共可以用800%),使用如下代码
cd /sys/fs/cgroup/cpu,cpuacct
sudo mkdir mylim
cd mylim
# quota为时间周期长度内能使用的CPU时间,单位微秒(us)
echo 100000 > cpu.cfs_quota_us
# period为时间周期长度,单位微秒(us)
echo 250000 > cpu.cfs_period_us
类似地,在该cgroup中启动,命令如下(即lim_cpu_start.sh)
sudo -E PATH="$PATH" PYTHONPATH=$(python -c "import sys; print(':'.join(sys.path))") cgexec -g cpu,cpuacct:mylim /usr/bin/python3 main.py "$@"
网络就绪后,就可以运行实验了。
首先在rpc目录下运行脚本msg_compile.cmd,生成grpc文件。
然后在config.yml中填写相关配置。
启动Trainer
python3 main.py trainer
如果不限速直接启动各个Worker,如Worker0:
python3 main.py worker -i 0
如果已经按照之前所述的方法配置了cgroup和tc规则,并且要限制Worker0的出站速度,则通过lim_start.sh进行启动,命令如下:
/bin/bash lim_start.sh worker -i 0
最后启动Master(注意Master要在Worker和Trainer之后启动)
python3 main.py master
类似地,要限速的话,命令是:
/bin/bash lim_start.sh master
小tip:如果想把执行lim_start.sh配置到PyCharm的Run/Debug Configuration中的话,可以添加一个SSH的Python解释器,但是这个Python解释器的路径设置成/bin/bash。其他的都和远程执行Python脚本一样。