树莓派 - 01. 安装配置机器学习环境

在树莓派上进行机器学习系列之 - 01. 安装配置机器学习环境

这里有坑,请避让
   放弃使用 miniconda3 做虚拟环境,折腾一整天,仍然问题不断 @2023-04-24
   改用 pyenv 来配置虚拟环境 #todo @2023-04-25

基本信息

硬件环境

Raspberry PI 4B+ 4G 版本

操作系统

Ubuntu 20.04.5

概览

# neofetch
            .-/+oossssoo+/-.               robert@mlpi
        `:+ssssssssssssssssss+:`           -----------
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 20.04.5 LTS aarch64
    .ossssssssssssssssssdMMMNysssso.       Host: Raspberry Pi 4 Model B Rev 1.1
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Kernel: 5.4.0-1069-raspi
  +ssssssssshmydMMMMMMMNddddyssssssss+     Uptime: 5 hours, 58 mins
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Packages: 653 (dpkg), 4 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Shell: bash 5.0.17
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Terminal: /dev/pts/2
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   CPU: BCM2835 (4) @ 1.500GHz
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Memory: 174MiB / 3793MiB
+sssshhhyNMMNyssssssssssssyNMMMysssssss+
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
  +sssssssssdmydMMMMMMMMddddyssssssss+
   /ssssssssssshdmNNNNmyNMMMMhssssss/
    .ossssssssssssssssssdMMMNysssso.
      -+sssssssssssssssssyyyssss+-
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.

操作系统安装配置

卡刷系统

通过 树莓派 官方提供的刷卡工具,选择安装了 ubuntu 20.04.5 版本的 Linux 操作系统。选择的 tf 卡是 64G 的卡。

Tips: 在刷卡前,配置好一些基本参数,比如 主机名、用户名密码、开启 sshd 服务等。

配置静态 IP

刷卡成功后,进入系统,首选就是配置好 ip 地址,我这里通过 netplan 设置了一个静态 ipv4 的内网地址,方便通过 ssh 登录操作。

  1. 备份 /etc/netplan/50-cloud-init.yaml
cd /etc/netplan
cp 50-cloud-init.yaml 50-cloud-init.yaml.bak
# 清空原有的源配置 (可选, 根据自己的具体情况进行调整)
echo "" > 50-cloud-init.yaml
  1. 修改 vim /etc/netplan/50-cloud-init.yaml,并添加下面配置信息
network:
    version: 2
    renderer: networkd
    ethernets:
        eth0:
            dhcp4: no
            addresses: [192.168.1.81/24]
            gateway4: 192.168.1.1
            nameservers:
                addresses: [192.168.1.1,114.114.114.114,8.8.8.8]
  1. 测试网络配置是否正确
netplan try
  1. 没有异常的话,就可以应用配置了
netplan apply

配置国内源

  1. 备份 /etc/netplan/50-cloud-init.yaml
cd /etc/apt
cp source.list source.list.origin
# 清空原有的源配置
cat "" > source.list
  1. 编辑 vim /etc/apt/source.list,添加以下内容
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse
  1. 更新源配置数据库
apt update -y
  1. 安装常用的一些软件包
# 必选
apt install git wget curl
# pyenv 编译安装 python 源码使用的软件包
apt install make build-essential llvm libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl libncurses5-dev xz-utils libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev tk-dev
# 可选
apt install net-tools neovim neofetch zsh

配置免密登录

1. 客户端生成公私钥

本地客户端 (不是树莓派,是你正在使用的电脑,比如笔记本) 生成公私钥:(一路回车默认即可)

# 客户端执行
ssh-keygen

上面这个命令会在用户目录.ssh文件夹下创建公私钥

cd ~/.ssh
ls

下创建两个密钥:

id_rsa # 私钥
id_rsa.pub # 公钥

2. 上传公钥到服务器

这里的服务器 (树莓派) 地址为:192.168.1.81
用户为:robert

ssh-copy-id -i ~/.ssh/id_rsa.pub robert@192.168.1.81
# 这里需要输入一次登录密码

上面这条命令是写到服务器上的ssh目录下去了

# 在服务器上执行
cd ~/.ssh
cat authorized_keys

可以看到客户端写入到服务器的 id_rsa.pub 公钥内容。

3. 测试免密登录

客户端通过ssh连接远程服务器,就可以免密登录了。

ssh robert@192.168.1.81
# 或
alias ssh2rpi="ssh -i ~/.ssh/id_rsa robert@192.168.1.81"
ssh2rpi

4. 通过别名登录

# 客户端配置
vim ~/.ssh/config

还可以配置到 ~/.ssh/config 文件中

Host RPI4
	User robert
	HostName 192.168.1.81
	Port 22
	IdentityFile ~/.ssh/id_rsa

通过 ssh RPI4 即可登录

Python, Pyenv 安装配置

Ubuntu 20.04.5 中已经默认安装了 Python 3.8.10,在网上查阅了一些文档后,发现机器学机相关的库还是 Python 3.7 系列的适应性比较好,较多的库兼容性都被大家推荐,所以这里我也就避免踩坑,选用了 Pyenv 中 安装使用 Python 3.7.11 来进行下面的学习过程。

为 pip 配置国内源

mkdir -p ~/.pip
touch ~/.pip/pip.conf
echo "[global]" > ~/.pip/pip.conf
echo "timeout = 6000" >> ~/.pip/pip.conf
echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> ~/.pip/pip.conf
echo "trusted-host = pypi.tuna.tsinghua.edu.cn" >> ~/.pip/pip.conf
# 更新 pip 版本
pip3 install -U pip

其它可用的国内源参考:

http://mirrors.aliyun.com/pypi/simple    # 阿里源
http://pypi.douban.com/simple            # 豆瓣源
http://pypi.v2ex.com/simple              # v2ex 源
https://pypi.tuna.tsinghua.edu.cn/simple # 特别推荐, 清华大学

安装 Pyenv

通过源码直接安装

git clone --depth 1 https://github.com/pyenv/pyenv.git ~/.pyenv

配置环境变量

bash 配置

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec $SHELL -l

zsh 配置

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
exec $SHELL -l

查看 pyenv 是否安装成功

pyenv

输出

pyenv 2.3.17
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   activate    Activate virtual environment
   commands    List all available pyenv commands
   deactivate   Deactivate virtual environment
   exec        Run an executable with the selected Python version
   global      Set or show the global Python version(s)
   help        Display help for a command
   hooks       List hook scripts for a given pyenv command
   init        Configure the shell environment for pyenv
   install     Install a Python version using python-build
   latest      Print the latest installed or known version with the given prefix
   local       Set or show the local application-specific Python version(s)
   prefix      Display prefixes for Python versions
   rehash      Rehash pyenv shims (run this after installing executables)
   root        Display the root directory where versions and shims are kept
   shell       Set or show the shell-specific Python version
   shims       List existing pyenv shims
   uninstall   Uninstall Python versions
   --version   Display the version of pyenv
   version     Show the current Python version(s) and its origin
   version-file   Detect the file that sets the current pyenv version
   version-name   Show the current Python version
   version-origin   Explain how the current Python version is set
   versions    List all Python versions available to pyenv
   whence      List all Python versions that contain the given executable
   which       Display the full path to an executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

这里,我们发现,pyenv 并没有包含 virtualenv 命令

安装 pyenv 的 virtualenv 插件

virtualenv 用来创建独立的 Python 虚拟环境,可以将每个项目与其他项目独立开来,互不影响,解决了依赖包版本冲突的问题。

上面安装的 pyenv 中,没有提供 virtualenv 插件,通过下面方法安装

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

再确认一下

pyenv

输出

pyenv 2.3.17
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   activate    Activate virtual environment
   commands    List all available pyenv commands
   deactivate   Deactivate virtual environment
   exec        Run an executable with the selected Python version
   global      Set or show the global Python version(s)
   help        Display help for a command
   hooks       List hook scripts for a given pyenv command
   init        Configure the shell environment for pyenv
   install     Install a Python version using python-build
   latest      Print the latest installed or known version with the given prefix
   local       Set or show the local application-specific Python version(s)
   prefix      Display prefixes for Python versions
   rehash      Rehash pyenv shims (run this after installing executables)
   root        Display the root directory where versions and shims are kept
   shell       Set or show the shell-specific Python version
   shims       List existing pyenv shims
   uninstall   Uninstall Python versions
   --version   Display the version of pyenv
   version     Show the current Python version(s) and its origin
   version-file   Detect the file that sets the current pyenv version
   version-name   Show the current Python version
   version-origin   Explain how the current Python version is set
   versions    List all Python versions available to pyenv
   virtualenv   Create a Python virtualenv using the pyenv-virtualenv plugin
   virtualenv-delete   Uninstall a specific Python virtualenv
   virtualenv-init   Configure the shell environment for pyenv-virtualenv
   virtualenv-prefix   Display real_prefix for a Python virtualenv version
   virtualenvs   List all Python virtualenvs found in `$PYENV_ROOT/versions/*'.
   whence      List all Python versions that contain the given executable
   which       Display the full path to an executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

可以看到,pyenv 中的 virtualenv 已经安装好了。

pyenv 命令参考

显示所有已经安装的 python 版本

pyenv versions

显示可以安装的 python 版本

pyenv install --list
# 或
pyenv install -l

安装指定版本的 python

# pyenv install 版本号
pyenv install 3.7.11

设置全局状态的 python 版本

不会在当前目录中生成 .python-version 文件

pyenv global 3.7.11

用来指定当前目录下使用python的版本

会在当前目录中,生成 .python-version 文件

pyenv local 3.7.11

指定当前 shell 中使用的 python 版本

# pyenv shell 版本号
pyenv shell 3.7.11

更新 pyenv 数据库

更新本地数据库,安装指定版本的 python 后使用

pyenv rehash

创建虚拟环境

# pyenv virtualenv {python版本} {虚拟环境名称}
# 比如 创建一个 名字叫 jupyterlab 并使用 python 3.7.11 版本的虚拟环境
pyenv virtualenv 3.7.11 notebook

显示虚拟环境

pyenv virtualenvs

使用/激活指定虚拟环境

# pyenv activate {虚拟环境名称}
pyenv activate notebook

退出当前虚拟环境

pyenv deactivate

删除版本

# rm -rf .pyenv/versions/{python版本}
rm -rf .pyenv/versions/3.8.3

删除虚拟环境

# virtualenv-delete [-f] {虚拟环境名称}, -f 为强制删除
pyenv virtualenv-delete notebook
# 或
# rm -rf .pyenv/versions/{虚拟环境名称}
rm -rf .pyenv/versions/notebook

特别说明

关于 global, local 和 shell 三个命令的优先级

这 3 个命令的优先级是指同时设置了 global, local 和 shell 的版本,优先使用哪个设置

shell > local > global

即,优先使用 shell 指定的 python 版本,然后是看当前目录中是否设置了 python 版本,最后才是使用 global 中设置的 python 版本。

用 pyenv 安装 python 版本的时候,避免重复下载

用下面的一键安装脚本,通过国内 python 源码镜像安装

export v=3.7.11
wget https://npm.taobao.org/mirrors/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/
pyenv install $v

其中

  1. ~/.pyenv/cache 是pyenv 的缓存目录,如果不存在,可以自己手动创建一个
  2. https://npm.taobao.org/mirrors/python/ 是比较推荐的国内 python 源码源,比较遗憾的是,这个源中,没有其它 python 衍生版本的镜像,比如 pypy, cython 等。

自动激活和退出虚拟环境

在需要使用虚拟环境的目录(通常是项目目录)中:

  1. 建立一个 .python-version 的文本文件
  2. 将虚拟环境名称(如 notebook )写在里面

之后每次进/出该目录时,虚拟环境都将自动激活/退出。

使用 pyenv virtualenv 的一些技巧

  • 安装好的版本不做任何修改,我们只操作虚拟环境,如 notebook
  • 可以通过版本来多个虚拟环境,如 notebook_1notebook_2
  • 导出当前环境的依赖库: pip freeze > requirements.txt
  • 导入依赖库到当前环境: pip install -r requirements.txt

其它

喜欢像我一样瞎折腾的朋友,也可以按照下面的参考链接中

  • Oh My Zsh + Tmux + vim配置安装
  • 是时候提高工作效率了:oh-my-zsh 与 tmux 的组合
    这两篇文档,配置和优化 shell 环境中的工具集。

参考

如何在Ubuntu 20.04上安装Pyenv
Mac上pyenv的安装与使用
Pyenv 的安装配置与国内镜像加速
Python pyenv install 下载安装慢(失败)完美解决
Python 虚拟环境 Virtualenv 详解
理解Python虚拟环境
解决 MAC OS 使用 zsh 终端不能显示 virtualenv 相关提示的问题
ubuntu 20 换源
Oh My Zsh + Tmux + vim配置安装
是时候提高工作效率了:oh-my-zsh 与 tmux 的组合

赞赏