百度 AI Studio 无 sudo 权限下运行 PaddleDetection SOLOv2 推理全过程记录
环境说明
- 平台:百度 AI Studio(Jupyter 容器环境)
- 用户:aistudio(无 sudo 权限)
- 项目:PaddleDetection SOLOv2
一、启动 Tailscale 实现远程 SSH 连接
无 sudo 权限下,使用 userspace 模式运行 Tailscale 守护进程:
bash
cd ~/.tail
./d --tun=userspace-networking --socks5-server=localhost:1055 \
--socket=$HOME/.local/share/.ts/d.sock \
--statedir=$HOME/.local/share/.ts &
启动后会看到大量日志,末尾出现 NeedsLogin 状态属于正常现象,执行登录命令:
bash
./ts --socket=$HOME/.local/share/.ts/d.sock up
点击终端输出的链接,用 GitHub 账号完成认证。
常见警告说明(无需处理):
TPM: error opening:容器无硬件 TPM,不影响功能failed to force-set UDP buffer size:无 root 权限,使用内核默认值,仅影响吞吐量Tailscale is stopped:登录前的正常初始状态
二、SSH 密钥配置(无法修改密码)
容器环境 /etc/shadow 只读,passwd 命令会报错:
passwd: Authentication token manipulation error
解决方案:使用 SSH 密钥免密登录
本地 Windows 生成密钥对:
powershell
ssh-keygen -t ed25519
将公钥写入远程机器:
bash
mkdir -p ~/.ssh
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
公钥文件位于本地 C:\Users\用户名\.ssh\id_ed25519.pub。
三、运行 SOLOv2 推理报错逐步排查
3.1 SyntaxError:Non-ASCII character
报错:
SyntaxError: Non-ASCII character '\xe8' in file tools/infer.py on line 201,
but no encoding declared
原因: 项目含有中文注释,Python 2 需要显式声明编码。
修复: 批量为所有 py 文件添加编码声明:
bash
grep -rl $'\xe6\|\xe8\|\xe7\|\xe9\|\xe5' /home/aistudio/work/ppdet/ \
--include="*.py" | while read f; do
head -1 "$f" | grep -q "coding" || \
sed -i '1s/^/# -*- coding: utf-8 -*-\n/' "$f"
done
3.2 ImportError:No module named numpy
报错:
ImportError: No module named numpy
原因: 当前 Python 环境未安装依赖,且 pip 命令不在 PATH 中。
排查:
bash
find / -name "pip*" -type f 2>/dev/null | grep bin
发现系统存在 conda 环境:
/opt/conda/envs/python35-paddle120-env/bin/pip
修复: 激活对应 conda 环境:
bash
source /opt/conda/etc/profile.d/conda.sh
conda activate python35-paddle120-env
3.3 ImportError:libpython3.7m.so.1.0 not found
报错:
ImportError: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory
修复: 设置动态库路径后再运行:
bash
export LD_LIBRARY_PATH=/opt/conda/envs/python35-paddle120-env/lib:$LD_LIBRARY_PATH
或直接通过 conda activate 激活环境,让 conda 自动处理库路径。
3.4 AssertionError:data() 仅支持静态图模式
报错:
AssertionError: In PaddlePaddle 2.x, we turn on dynamic graph mode by default,
and 'data()' is only supported in static graph mode.
So if you want to use this api, please call 'paddle.enable_static()' before this api.
原因: 项目基于 PaddlePaddle 1.x 静态图 API 编写,但环境安装的是 2.x 版本,默认开启动态图模式。
方案一(推荐): 在 tools/infer.py 中添加 paddle.enable_static():
bash
sed -i '/from paddle import fluid/i paddle.enable_static()' tools/infer.py
验证修改:
bash
head -50 tools/infer.py | grep -n "paddle"
方案二: 降级 PaddlePaddle 至 1.x:
bash
pip install paddlepaddle==1.8.5
四、完整运行命令
bash
source /opt/conda/etc/profile.d/conda.sh
conda activate python35-paddle120-env
export LD_LIBRARY_PATH=/opt/conda/envs/python35-paddle120-env/lib:$LD_LIBRARY_PATH
cd ~/work
python tools/infer.py -c configs/solov2/solov2_r50_fpn_8gpu_3x.yml \
--infer_dir=./test_imgs/
总结
| 问题 | 原因 | 解决方案 |
|---|---|---|
passwd 报错 |
容器 /etc/shadow 只读 |
改用 SSH 密钥认证 |
| Non-ASCII SyntaxError | Python 2 需声明编码 | sed 批量添加 # -*- coding: utf-8 -*- |
pip 找不到 |
PATH 未包含 conda bin | conda activate 激活环境 |
libpython3.7m.so 缺失 |
LD_LIBRARY_PATH 未设置 | export LD_LIBRARY_PATH=... |
data() 静态图报错 |
PaddlePaddle 1.x 项目跑在 2.x 上 | 添加 paddle.enable_static() |