CentOS部署Flask+Tensorflow记录
CentOS部署Flask+Tensorflow记录
第一次部署Flask项目,一番折腾下来,也总结了不少经验。
现将部署流程记录如下:
安装Anaconda
- 一定不要直接使用系统环境,坑很多,而且容易弄乱系统自带Python
- 使用环境管理器,能很好解决这一问题
-
选
64-Bit (x86) Installer (581 MB)
-
上传至服务器目录,任何位置都可以,和安装目录无关
-
终端切换至上传目录,执行安装命令:
sh Anaconda3-2021.11-Linux-x86_64.sh
-
用户条款一路回车,最后输入个yes
-
安装目录任意设置,可设置为
/usr/local/anaconda/
-
安装成功,重连SSH即可
-
如果未生效,可尝试修改环境变量
vim /root/.bashrc
在最后添加:export PATH="/usr/local/anaconda/bin:$PATH"
刷新环境变量:source ~/.bashrc
关于Anaconda和MiniConda的区别
Conda
包括但不限于Python
、R
、Ruby
语言的包、依赖以及环境的管理系统
-
可以创建多个不同
Python
环境的开发环境 -
可以管理
Python
包以及包依赖
MiniConda
- 拥有
conda
的所有功能 - 自带一个
Python
环境,基于你的安装版本(不可切换Python
版本) - 自带
pip
、zlib
和一部分Python
包
Anaconda
- 拥有
conda
的所有功能 - 可以创建多个不同版本的
Python
环境 - 附带大量
Python
包
Virtualenv
Python
环境管理工具
- 通过本地已有的
Python
环境,来创建一个隔离的Python环境
配置conda环境
-
查看已有环境:
conda env list
-
创建虚拟环境:
conda create -n [环境名称] [安装库包列表]
如:
conda create -n face python=3.8
-
激活虚拟环境:
conda activate [环境名称]
-
关闭虚拟环境:
conda deactivate
-
删除环境:
conda remove -n [环境名称] --all
更改Conda国内源
- 查看源:
conda config --show-sources
- 新增源:
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
安装所需包
大部分所需的包 直接安装即可
conda install flask -y
conda install tensorflow -y
conda install requests -y
conda install pymysql -y
conda install numpy -y
OpenCV For Python
直接conda install opencv-python
是查询不到的
正常应该使用这句命令,但是由于国外网络,可能会很卡:
conda install --channel https://conda.anaconda.org/menpo opencv3
所以考虑在conda对应环境中使用如下语句:
pip install opencv-python
安装Gunicorn(绿色独角兽)
conda install gunicorn -y
Gunicorn是一个HTTP服务器,相比于直接运行Flask项目,具有很多优点。
- Flask运行:单进程、没有负载均衡
- Gunicorn运行:进程挂了自动重启、支持多进程、负载均衡
上传python项目至一个文件夹下
-
无需上传整个Pycharm工程
-
上传py文件和模型文件,并将所需的“运行时文件 存放的(空)文件夹”建好就行
部署运行项目
# 进入项目目录
cd /www/wwwroot/face/
# 切换项目所用环境
conda activate face
# 运行项目
gunicorn -D -b 0.0.0.0:8090 --access-logfile ./log.txt main:app
-
参数说明:
-
原始运行:
gunicorn main:app
-
后台运行:
-D
-
指定IP和端口(务必在这里指定):
-b 0.0.0.0:8090
-
日志文件:
--access-logfile ./log
-
多进程运行(务必考虑自己服务器的性能!):
-w 3
“3”为进程数量
-
-
IP配置:使用0.0.0.0(通配符IP地址),可以自动运行在内、外网上
如果使用127.0.0.1,不一定能访问到
app.run(host="0.0.0.0", port=8090, debug=False)
-
注意使用Gunicorn运行时,如果不使用-b指定运行IP(Bind),会自动运行在8000端口上
代码内指定端口和IP的
app.run(host="0.0.0.0", port=8090)
不会生效!Flask运行则默认使用项目内指定的配置。
注意 Python 直接运行和 Gunicorn 运行的终端显示区别
- Python直接运行Flask:
Python main.py
(face) [root@VM-0-2-centos face]# python main.py
2022-05-01 23:07:09.046027: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: SSE4.1 SSE4.2 AVX AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-05-01 23:07:09.048953: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.
* Serving Flask app 'main_flask_run' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://172.21.0.2:8090/ (Press CTRL+C to quit)
- Gunicorn运行Flask:
gunicorn main:app
(face) [root@VM-0-2-centos face]# gunicorn main:app
[2022-05-01 23:14:18 +0800] [15493] [INFO] Starting gunicorn 20.1.0
[2022-05-01 23:14:18 +0800] [15493] [INFO] Listening at: http://127.0.0.1:8000 (15493)
[2022-05-01 23:14:18 +0800] [15493] [INFO] Using worker: sync
[2022-05-01 23:14:18 +0800] [15496] [INFO] Booting worker with pid: 15496
2022-05-01 23:14:24.076744: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: SSE4.1 SSE4.2 AVX AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-05-01 23:14:24.078272: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.
Gunicorn相比直接运行,IP、端口等信息会输出在最前面,
而直接用Python运行、和在Pycharm中开发,都是将IP、端口等信息显示在前面。
这是输出顺序的问题,不是卡了!(扶额)
所以使用Gunicorn,等到控制台不再输出了就可以。
后台运行,如何关闭项目?
- 查询进程树:
pstree -ap | grep gunicorn
kill -9 [pid]
其他不太相关的小记
- Typora 取消自动缩进:
Ctrl + [
- SSH终端 取消已输入的大量无用命令:
Ctrl+U
或者ESC+BackSpace