机器学习环境配置

以前在学习线性回归算法的时候主要使用 Octave 作为主要编程语言,现在想来无论是画图还是矩阵运算不如Python的numpy、matplotlib等方便快捷,现主要记录下通过Anaconda与Jupyter NoteBook搭建机器学习环境的过程。

目前我只在 Ubuntu22.04 下搭建了 Python + Anaconda + Jupyter Notebook 的环境,首先下载这个:

1wget https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh

需要配置的环境变量,因为直接安装在root目录下的,如果需要其他目录在安装是可以选择的:

1export ANACONDA_HOME=/root/anaconda3
2export PATH=$ANACONDA_HOME/bin:$PATH

测试一下,安装已经完成:

1root@PC:~# conda --v
2conda 23.3.1

查看包括版本的更多信息:

1conda info

现在需要熟悉Anaconda的常用命令,因为要使用Anaconda来管理Python的依赖包,所以为了方便管理,Anaconda有了环境的概念,每个环境都是独立且相互隔离的。

安装 Anaconda

首先如果是SSH远程链接的话,因为使用的是虚拟终端,如果之前的某次ssh连接命令激活某个环境后忘记退出环境就关闭终端就会导致 CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’. 的错误,所以如果是远程虚拟终端先重新进入虚拟环境就没问题:

1source activate

下面是一些最常用的Anaconda关于环境管理的命令

创建环境:

1conda create --name env_name
2
3# 如果需要指定Python环境的版本为3.6
4conda create --name env_name python=3.6

激活/切换到该环境:

1conda activate env_name

退出该环境:

1conda deactivate

列出全部环境:

1conda env list

查看当前环境安装的包:

1conda list

查看别的环境安装的包:

1conda list -n env_name  

删除环境:

1conda remove --name env_name --all

克隆环境:

1conda create --name clone_env --clone env_name

导出环境配置:

1conda env export > my_environment.yml

导入环境配置:

1conda env create -f my_environment.yml

安装依赖包,比如 numpy:

1conda install numpy

也可以切换到对应环境后使用 pip install numpy。

安装 Jupyter Notebook

1conda install jupyter notebook

jupyter_notebook_config.py 是 Jupyter Notebook 的配置文件,NotebookApp.notebook_dir 定义了主目录文件夹。下面对 Jupyter Notebook 进行美化一下,谁不想拥有一个好看的工具呢,jupyterthemes 是专门用于Jupyter Notebook 的主题美化工具,下面是安装命令以及我的配置清单:

https://github.com/dunovank/jupyter-themes

 1# install jupyterthemes
 2pip install jupyterthemes -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
 3
 4# upgrade to latest version
 5pip install --upgrade jupyterthemes
 6
 7# 我的自定义配置1
 8jt -t grade3 -f fira -fs 16 -cellw 90% -ofs 11 -dfs 11 -T
 9
10# 我的自定义配置2
11jt -t onedork -f roboto -fs 14 -nfs 14 -tfs 14 -ofs 11

安装完之后生成配置文件:

1jupyter notebook --generate-config

默认生成的文件配置在 ~/.jupyter/jupyter_notebook_config.py 配置里常用修改的项目如下,无非就是IP、端口、默认工作目录之类的:

1c.NotebookApp.ip ='0.0.0.0'
2
3c.NotebookApp.port = 8888
4
5c.NotebookApp.notebook_dir = ''

安装完成之后启动服务即可:

1jupyter notebook --ip=0.0.0.0 --no-browser --allow-root

如果需要后台运行:

1nohup jupyter notebook --ip=0.0.0.0 --allow-root > jupyter.log 2>&1 &

Jupyter Notebook 快捷键

下面列出一些Jupyter Notebook常用操作的快捷键:

ESC(命令)模式下:

操作 快捷键
添加一行 B
删除一行 DD
剪贴 X
粘贴 V
复制 C
执行当前行 Ctrl + Enter / Command + Enter

安装常用库 —— pandas\numpy\matplotlib

scikit-learn 是 Python语言中专门针对机器学习应用而发展起来的一款开源框架(算法库),可以实现数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。

scikit-learn 特点:

集成了机器学习中各类成熟的算法,容易安装和使用,样例丰富,教程和文档也非常详细

不支持Python之外的语言,不支持深度学习和强化学习 https://scikit-learn.org/stable/index

1conda install pandas
2
3conda install numpy
4
5conda install matplotlib
6
7conda install scikit-learn

一切准备就绪,开始愉快Coding!

通过Frp外网访问

外网访问的主要途径还是通过FRP做内网穿透,虽然运营商提供了IPV6,但是有时候身处的环境并不支持IPV6,所以FRP成了首选。这样随时Coding的目的终于要实现了呀!在服务器上部署一个在线 Jupyter Notebook 服务,这样无论处在什么环境中,只需要一台可以上网,具有浏览器的设备,你都可以使用Jupyter Notebook 编辑并运行代码!是不是非常心动?

虽然很多FRP服务商就支持HTTPS,可以直接通过Frp Client的https插件来完成,但是却发现一个问题,那就是如果直接拿Frp Client的https插件来做这件事,内核会不断重启,根本无法使用,

 1[I 20:11:50.384 NotebookApp] Kernel started: d8d74f6b-d1bc-4d45-909e-6eef6e9608d6, name: python3
 2[I 20:11:50.916 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
 3[I 20:11:52.019 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
 4[I 20:11:52.020 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
 5[I 20:11:53.118 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
 6[I 20:11:53.119 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
 7[I 20:11:54.215 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
 8[I 20:11:54.216 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
 9[I 20:11:55.326 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
10[I 20:11:55.327 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
11[I 20:11:56.418 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
12[I 20:11:56.419 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
13[I 20:11:57.509 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
14[I 20:11:57.511 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
15[I 20:11:58.610 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
16[I 20:11:58.611 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
17[W 20:12:06.176 NotebookApp] Notebook Course_MachinaLearn/experiment01.ipynb is not trusted
18[W 20:12:06.177 NotebookApp] Trusting notebook /Course_MachinaLearn/experiment01.ipynb
19[I 20:12:06.540 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
20[I 20:12:06.541 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:a190232b48c1448294552727d7c27f81
21[I 20:12:07.528 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:51ed9123212c4bbcb7850248c3f9951b
22[I 20:12:08.858 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:51ed9123212c4bbcb7850248c3f9951b
23[I 20:12:08.859 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:51ed9123212c4bbcb7850248c3f9951b
24[I 20:12:09.144 NotebookApp] 302 GET /edit/cat (127.0.0.1) 0.670000ms
25[I 20:12:09.984 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:51ed9123212c4bbcb7850248c3f9951b
26[I 20:12:09.985 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:51ed9123212c4bbcb7850248c3f9951b
27[I 20:12:11.079 NotebookApp] Restoring connection for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:51ed9123212c4bbcb7850248c3f9951b
28[I 20:12:11.080 NotebookApp] Starting buffering for d8d74f6b-d1bc-4d45-909e-6eef6e9608d6:51ed9123212c4bbcb7850248c3f9951b

最终发现,还是使用Nginx吧,通过Nginx来完成反向代理服务和SSL校验,参考了这篇回答 《Jupyter notebook keeps reconnecting to kernel》 ,但是这篇回答并没有涉及到配置SSL的坑,所以呀,一定不要让FRP Client来做SSL校验,还是得上Nginx!下面贴出我的nginx.conf:

 1#user  nobody;
 2worker_processes  1;
 3
 4#error_log  logs/error.log;
 5#error_log  logs/error.log  notice;
 6#error_log  logs/error.log  info;
 7
 8#pid        logs/nginx.pid;
 9
10
11events {
12    worker_connections  1024;
13}
14
15http {
16    include       mime.types;
17    default_type  application/octet-stream;
18
19    sendfile        on;
20    #tcp_nopush     on;
21
22    #keepalive_timeout  0;
23    keepalive_timeout  65;
24
25    map $http_upgrade $connection_upgrade {
26    	default upgrade;
27    	'' close;
28    }
29
30    server {
31    	listen 10086 ssl;
32	server_name jypyter;
33
34        ssl_certificate      /xxxx/yyyy.crt;
35        ssl_certificate_key  /xxxx/yyyy.key;
36
37        ssl_session_cache    shared:SSL:1m;
38        ssl_session_timeout  5m;
39
40        ssl_ciphers  HIGH:!aNULL:!MD5;
41        ssl_prefer_server_ciphers  on;
42		
43	location / {
44    	    proxy_pass http://127.0.0.1:8888;
45	    proxy_set_header X-Real-IP $remote_addr;
46    	    proxy_set_header Host $host;
47	    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
48	    proxy_set_header X-NginX-Proxy true;
49	    auth_basic "Restricted Content";
50	
51	    proxy_http_version 1.1;
52	    proxy_set_header Upgrade $http_upgrade;
53	    proxy_set_header Connection $connection_upgrade;
54	    proxy_set_header Origin "";
55            proxy_read_timeout 86400;
56	}
57    }
58}

配置好以后使用Nginx重载一下配置文件就好:

1nginx -s reload