【搭建屬於你的科研平臺】(一)基於flask的服務器端算法框架搭建

背景

在CS、EE相關的領域,我們往往會做一些實驗。比如smart health,近幾年學術界希望做到device free,即不需要任何的貼片傳感器貼在人體身上,通過手機自帶的傳感器,實現一個app獲取、分析、返回結果。

坦白說科研圈子的代碼功底無法與工業界的技術大佬們相比,因此如果基於android框架在手機端開發一套能夠手機本地處理的算法。一方面手機的運算能力較弱、另一方面需要考慮UI、事務線程的分層。往往算法部分用matlab、python是比較常見的。

此demo以手機端安卓應用爲例+後端算法(部署於服務器)基於flask-server搭建。旨在於搭建一套能夠將手機端的文件:*.csv / .wav / .txt/ .xlsx/ ……等科研結果傳輸到服務器,算法處理完結果後以http response的方式返回。手機端可自行編寫handler方法,進行toast等方式的UI顯示。

主要步驟

接下來講解如何從0開始搭建這個框架:

1. Python搭建虛擬環境:

原本打算使用docker的方式,這樣本地測試完畢基本上就docker一包上雲開始用。考慮到阿里雲服務器的存儲資源有限,就不裝鏡像佔硬盤了~還是一個項目一個虛擬環境吧。

修改conda 和 pip爲清華鏡像源

pip方法

  • 臨時使用: 可以在使用pip的時候加參數-i https://pypi.tuna.tsinghua.edu.cn/simple
    例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent,這樣就會從清華這邊的鏡像去安裝gevent庫。
  • 永久修改,一勞永逸:
  1. linux下,修改~/.pip/pip.conf(沒有就創建一個), 修改 index-url至tuna,內容如下:
[global]
 index-url = https://pypi.tuna.tsinghua.edu.cn/simple
  1. windows下,直接在user目錄中創建一個pip目錄,如:C:\Users\xx\pip,新建文件pip.ini,內容如下
 [global]
 index-url = https://pypi.tuna.tsinghua.edu.cn/simple

conda 方法anaconda清華源配置

channels:
  - defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

用pip的virtualenv創建虛擬環境

  • 安裝虛擬環境的第三方包 virtualenv : pip install virtualenv
  • 使用清華源安裝:pip install -i https://pypi.python.org/simple/ virtualenv

創建虛擬環境

cd 到存放虛擬環境的地址,比如cd ~/IT/algo-backend/
virtualenv venv 在當前目錄下創建名爲ENV的虛擬環境(如果第三方包virtualenv安裝在python3下面,此時創建的虛擬環境就是基於python3的)
virtualenv -p /usr/local/bin/python3.6 venv 參數 -p 指定python版本3.6創建虛擬環境venv
virtualenv --system-site-packages venv 參數 --system-site-packages 指定創建虛擬環境時繼承系統三方庫
note:由於flask推出初版時間爲2010年,更傾向於python3+,儘量使用python3.5以後的版本。

激活/退出虛擬環境

cd ~/algo-backend 跳轉到虛擬環境的文件夾
source venv/bin/activate 激活虛擬環境
pip list 查看當前虛擬環境下所安裝的第三方庫
deactivate 退出虛擬環境

基於conda創建虛擬環境

  • 創建虛擬環境 conda create -n Algo-One-Backend python==3.7

這樣就創建了一個名字爲ENV,基於python版本3.6的一個虛擬環境了。注意,這裏和pip建立的虛擬環境不同,pip建立的虛擬環境會直接在當前目錄下生成一個虛擬環境的目錄,激活虛擬環境也需要指定這個目錄才行。而conda安裝的虛擬環境,只會把虛擬環境的目錄生成在anaconda安裝目錄下的env目錄下。所以,conda創建的虛擬環境有一個很大的優點就是不用指定虛擬env的路徑,不過前提是你需要把conda的環境變量早早設置好。

  • 激活/退出虛擬環境
    source activate Algo-One-Backend 激活虛擬環境
    source deactivate 退出虛擬環境

  • 安裝所需的第三方庫
    conda install -n Algo-One-Backend [package] 其中-n代表 name: Algo-One-Backend 指定了該虛擬環境
    也可以在激活虛擬環境的狀態下運行pip install [package]

  • 查看conda環境下所有的虛擬環境
    conda info --envs

刪除虛擬環境

直接刪除虛擬環境所在目錄即可

2. 安裝依賴

  • 安裝requirements.txt,如下預提供一份,自行創建requirements.txt後,將以下內容複製即可
backcall==0.1.0
Click==7.0
decorator==4.4.1
Flask==1.1.1
Flask-SocketIO==4.2.1
gevent==1.4.0
greenlet==0.4.15
gunicorn==20.0.4
ipython==7.10.1
ipython-genutils==0.2.0
itsdangerous==1.1.0
jedi==0.15.1
Jinja2==2.10.3
joblib==0.14.1
MarkupSafe==1.1.1
numpy==1.17.4
pandas==0.25.3
parso==0.5.1
pexpect==4.7.0
pickleshare==0.7.5
prompt-toolkit==3.0.2
ptyprocess==0.6.0
Pygments==2.5.2
python-dateutil==2.8.1
python-engineio==3.11.2
python-socketio==4.4.0
pytz==2019.3
scikit-learn==0.22
scipy==1.3.3
six==1.13.0
sklearn==0.0
traitlets==4.3.3
wcwidth==0.1.7
Werkzeug==0.16.0
  • 安裝依賴文件,pip install -r requirements.txt
  • 使用過程中如果安裝了新的包,可以通過pip freeze > requirements.txt更新該依賴文件。

3. 本地運行flask後端

4. 部署到服務器(實驗室服務器or公有云)

  • 按照1.步驟中ssh到服務器,把虛擬環境搭建起來
  • 把本地測試完的文件通過ftp的方式傳輸到server
  • 把自己的文件正式部署完
  • gunicorn.conf.py裏面默認定義線程爲3個,提高響應能力。大家在裏面定義自己的程序端口,用之前先看一下系統中哪些端口已經被佔用了 netstat -ntulp一大段列表裏面找8888以後空餘的端口。
  • 依次使用端口8888\8889\8890\8891…… 然後發現8890還沒人用,就把gunicorn.conf.py的端口改掉
  • 由於想要讓程序一直在後臺運行,命令改爲nohup gunicorn demo.app:app -c gunicorn.conf.py 就可以了

5. 附錄

注意點:flask 包導入的問題:如果沒有寫過多層級的flask模塊,大家可能在文件分層管理會遇到一些困難。 Python在不同目錄下導入模塊的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章