CentOS部署Flask+Tensorflow记录

第一次部署Flask项目,一番折腾下来,也总结了不少经验。

现将部署流程记录如下:

安装Anaconda

  • 一定不要直接使用系统环境,坑很多,而且容易弄乱系统自带Python
  • 使用环境管理器,能很好解决这一问题
  1. 下载地址: https://www.anaconda.com/distribution/

  2. 64-Bit (x86) Installer (581 MB)

  3. 上传至服务器目录,任何位置都可以,和安装目录无关

  4. 终端切换至上传目录,执行安装命令:

sh Anaconda3-2021.11-Linux-x86_64.sh
  1. 用户条款一路回车,最后输入个yes

  2. 安装目录任意设置,可设置为/usr/local/anaconda/

  3. 安装成功,重连SSH即可

  4. 如果未生效,可尝试修改环境变量

vim /root/.bashrc

在最后添加:export PATH="/usr/local/anaconda/bin:$PATH"

刷新环境变量:source ~/.bashrc

关于Anaconda和MiniConda的区别

Conda

包括但不限于PythonRRuby语言的包、依赖以及环境的管理系统

  • 可以创建多个不同Python环境的开发环境

  • 可以管理Python包以及包依赖

MiniConda

  • 拥有conda的所有功能
  • 自带一个Python环境,基于你的安装版本(不可切换Python版本)
  • 自带pipzlib和一部分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
  1. 参数说明:

    • 原始运行:gunicorn main:app

    • 后台运行:-D

    • 指定IP和端口(务必在这里指定):-b 0.0.0.0:8090

    • 日志文件:--access-logfile ./log

    • 多进程运行(务必考虑自己服务器的性能!):-w 3 “3”为进程数量

  2. IP配置:使用0.0.0.0(通配符IP地址),可以自动运行在内、外网上

    如果使用127.0.0.1,不一定能访问到

app.run(host="0.0.0.0", port=8090, debug=False)
  1. 注意使用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
文章作者: Jason_2k
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 极客卷毛——我的学习经验记录
Python
喜欢就支持一下吧