內(nèi)容概要
- cuda+cudnn+python環(huán)境安裝
- ubuntu18的開機(jī)自啟動(dòng)腳本
- screen服務(wù)開啟
以我個(gè)人的實(shí)踐來看,把python開發(fā)的算法封裝成webserver的服務(wù)供前端程序調(diào)用是個(gè)不錯(cuò)的方案,解決了不同語(yǔ)言直接做接口的復(fù)雜性,同時(shí)后期的運(yùn)營(yíng)、維護(hù)、監(jiān)控也比較方便。但是python的環(huán)境部署確實(shí)比較麻煩的,一兩臺(tái)機(jī)器還行,大規(guī)模部署的話幾十上百臺(tái)機(jī)器想想就頭大,正規(guī)的做法是用docker,這里先撇開不談。但其實(shí)條件允許的話,可以在一臺(tái)機(jī)器上部署環(huán)境,然后將系統(tǒng)鏡像用systemback打包,再安裝到其他機(jī)器,新環(huán)境的部署就簡(jiǎn)單了,裝完系統(tǒng),環(huán)境就ok了,再配上開機(jī)自啟動(dòng)的算法服務(wù),簡(jiǎn)直完美(ubuntu18親測(cè)有效)。
cuda+cudnn+python環(huán)境安裝
安裝文件自行下載,這里提供我的安裝包供參考鏈接:https://pan.baidu.com/s/1WShQSF94iQYPwNX4kwle6A
提取碼:slqs
安裝cuda環(huán)境網(wǎng)上教程非常多,這里不再贅述。需要注意cuda和cudnn版本匹配,顯卡驅(qū)動(dòng)版本、以及gcc版本需注意。下面以cuda10.1+cudnn7+nvidia驅(qū)動(dòng)440+Anaconda3-5.2.0為例,列舉下可能的操作:
- 卸載之前存在的cuda或驅(qū)動(dòng)
sudo /usr/bin/nvidia-uninstall
sudo apt-get purge nvidia*
- 安裝驅(qū)動(dòng)
編輯:
sudo nano /etc/modprobe.d/blacklist.conf
加入:
blacklist nouveau
options nouveau modeset=0
Ctrl+O保存,Ctrl+X退出
sudo update-initramfs -u
最好重啟下
lsmod | grep nouveau 無(wú)輸出即可
- gcc/g++降級(jí)
apt-get install gcc-7 g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
sudo update-alternatives --config gcc命令查看gcc的默認(rèn)版本
- 安裝cuda
chmod +x cuda_10.1.168_418.67_linux.run
sudo ./cuda_10.1.168_418.67_linux.run
進(jìn)入界面后 空格取消驅(qū)動(dòng)安裝選項(xiàng)
等待安裝完成
設(shè)置環(huán)境變量:
sudo nano ~/.bashrc
export CUDA_HOME=/usr/local/cuda-10.1
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
export PATH=${CUDA_HOME}/bin:${PATH}
Ctrl+O保存
source ~/.bashrc 使生效
輸入nvcc -V驗(yàn)證
-cudnn安裝
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
deb解壓安裝即可,壓縮包的話需要拷貝文件到對(duì)應(yīng)的cuda文件夾
- Anaconda安裝
這里需要注意,如果是安裝在用戶目錄下,打包鏡像安裝到其他機(jī)器上會(huì)導(dǎo)致python無(wú)法使用,因?yàn)橛脩裘菍懰涝诃h(huán)境變量中了。建議安裝在非用戶目錄,我這里安裝路徑是/usr/local/anaconda3 供參考。
sudo sh Anaconda3-5.2.0-Linux-x86_64.sh

ubuntu18的開機(jī)自啟動(dòng)腳本
這部分走了不少?gòu)澛罚饕窍胱詥?dòng)腳本里能實(shí)現(xiàn)在創(chuàng)建的screen下開啟算法服務(wù),這樣的話后期監(jiān)控,直接screen -r name進(jìn)入查看即可,而且是真后臺(tái)運(yùn)行,各種優(yōu)點(diǎn)吧。實(shí)現(xiàn)過程中遇到了不少問題,如conda虛擬環(huán)境無(wú)法進(jìn)入、環(huán)境變量未激活、啟動(dòng)腳本不執(zhí)行等。好在最終解決,這里直接給出可行方案:
- 編輯自啟動(dòng)服務(wù)
由于該系統(tǒng)沒有自帶其他linux版本自帶的rc.local文件的開機(jī)自啟動(dòng)方法,所以要自己生成rc.local文件。
先編輯rc-local.service:
sudo nano /etc/systemd/system/rc-local.service
寫入:
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
然后編輯rc.local:
sudo nano /etc/rc.local
寫入:
#!/bin/bash
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
source ~/.bashrc
sh /home/online_stagex/auto_start/start.sh > /dev/null 2>&1 &
exit 0
最后執(zhí)行:
sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
rc.local中sh無(wú)法執(zhí)行?
sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh


其中,start.sh是開機(jī)自啟動(dòng)腳本,前面的路徑是存放位置,記得加上可執(zhí)行權(quán)限。chmod +x
screen服務(wù)創(chuàng)建及服務(wù)的開啟
在自啟動(dòng)腳本start.sh中定義了,啟動(dòng)要干的事情,這里面寫的是創(chuàng)建screen并開啟服務(wù)的過程。

需要說明的是自啟動(dòng)腳本是root用戶下執(zhí)行的,創(chuàng)建的screen也是在root下面,查看需要sudo screen -ls指令。創(chuàng)建的screen在sh環(huán)境下,需要使能環(huán)境變量source ~/.bashrc否則無(wú)法使用py環(huán)境。發(fā)送到screen的指令太長(zhǎng)的話可以重新寫個(gè)腳本。

上面的腳本就是最終執(zhí)行python代碼的指令,在web_start_8381.py中封裝了算法服務(wù)。
重啟測(cè)試,服務(wù)開起來了,log里也有日志,進(jìn)入到screen有算法后臺(tái)輸出,完美!


2021.1.12 update:
在ubuntu20.04server版上部署開機(jī)自啟動(dòng)遇到一個(gè)問題,rc.local里sh命令貌似不執(zhí)行,后來發(fā)現(xiàn)其實(shí)執(zhí)行了在sudo screen里 source 環(huán)境變量不生效,在su下重新設(shè)置環(huán)境變量即可