以下是整理好的 CSDN 博客内容:
标题:【踩坑实录】在远程 GPU 服务器上安装 flash-attn:从环境配置到百度网盘下载的完整解决方案
markdown
# 【踩坑实录】在远程 GPU 服务器上安装 flash-attn:从环境配置到百度网盘下载的完整解决方案
## 环境信息
| 项目 | 版本 |
|------|------|
| 系统 | Ubuntu 22.04.5 LTS |
| Python | 3.10 |
| Conda 环境 | 1genos |
| PyTorch | 2.7.1+cu128 |
| CUDA | 12.8 |
---
## 一、批量安装依赖包(过滤已安装)
拿到 requirements 列表后,先查询环境中已安装的包,避免重复安装:
```bash
pip list --format=freeze
对比后将未安装的包写入 req.txt,用 Python 写文件避免终端乱码:
python
content = """transformers>=4.52.4,<5.0.0
accelerate>=1.7.0,<2.0.0
# ... 其余包
"""
with open('req.txt', 'w') as f:
f.write(content)
安装时用 screen 保持后台运行:
bash
screen -dmS pip_install bash -c "pip install -r req.txt > pip_install.log 2>&1; echo DONE >> pip_install.log"
二、安装 flash-attn 踩坑全记录
坑1:隔离构建环境找不到 torch
报错:
ModuleNotFoundError: No module named 'torch'
原因: pip 默认在隔离环境中构建,隔离环境里没有主环境的 torch。
解决:
bash
pip install flash-attn --no-build-isolation
坑2:CUDA_HOME 未设置
报错:
OSError: CUDA_HOME environment variable is not set.
原因: 系统只有驱动,没有安装 CUDA Toolkit(nvcc 不存在)。
解决: 通过 conda 安装 cuda-nvcc:
bash
conda install -y -n 1genos -c "nvidia/label/cuda-12.8.1" cuda-nvcc cuda-libraries-dev
⚠️ 注意:libcublas(449MB)、libcusolver(156MB)等大包下载较慢,耐心等待即可,不要中断。
安装完成后设置 CUDA_HOME:
bash
export CUDA_HOME=/home/wangyuxuan/miniconda3/envs/1genos
坑3:ninja 未安装导致编译极慢
警告:
we could not find ninja.. Falling back to using the slow distutils backend.
原因: 没有 ninja,MAX_JOBS=64 完全无效,只能单线程串行编译。
解决:先安装 ninja 再编译:
bash
pip install ninja
export CUDA_HOME=/home/wangyuxuan/miniconda3/envs/1genos
MAX_JOBS=64 pip install flash-attn --no-build-isolation
验证编译是否在运行:
bash
ps aux | grep nvcc | grep -v grep | wc -l # 数字 > 0 即正在编译
坑4:编译耗时过长,改用预编译 wheel
flash-attn 需编译 150+ 个 .cu 文件,针对 sm_80/sm_90/sm_100/sm_120 四种架构,即使并行也需 15-30 分钟。
更好的方案:直接下载预编译 wheel。
wheel 文件命名规则:
flash_attn-{版本}+cu{CUDA版本}torch{torch版本}cxx11abi{TRUE/FALSE}-cp{Python版本}-cp{Python版本}-linux_x86_64.whl
本例对应文件:
flash_attn-2.8.3+cu12torch2.7cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
从 GitHub Releases 下载,但服务器直连 GitHub 速度仅 10KB/s。
三、通过 bypy 从百度网盘下载 wheel(终极方案)
3.1 安装 bypy
bash
# 先取消代理(若设置了 ALL_PROXY 会导致安装失败)
unset ALL_PROXY
pip install PySocks
pip install bypy
⚠️ 坑:若环境变量
ALL_PROXY=socks5h://127.0.0.1:1080存在但本机无 SOCKS 服务,pip 会报OSError: Missing dependencies for SOCKS support,必须先unset ALL_PROXY。
3.2 授权百度网盘
bash
bypy info
按提示在浏览器打开授权链接 → 登录百度账号 → 复制 Authorization Code → 粘贴到终端。
授权成功显示:
Quota: 20.000GB
Used: 18.103GB
3.3 查看文件列表
bash
bypy list
3.4 下载并显示进度条
用 Python 脚本包装 bypy,实现实时进度条显示:
python
#!/usr/bin/env python3
import subprocess, time, os
FILE = "/path/to/flash_attn-2.8.3.whl"
TOTAL = 256007396 # 244.1 MB
REMOTE = "flash_attn-2.8.3+cu12torch2.7cxx11abiFALSE-cp310-cp310-linux_x86_64.whl"
def get_size(p):
try: return os.path.getsize(p)
except: return 0
def bar(pct, w=45):
f = int(w * pct)
return '[' + '=' * f + ('>' if f < w else '') + '_' * max(0, w - f - 1) + ']'
proc = subprocess.Popen(['bypy', 'downfile', REMOTE, FILE],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
start = time.time()
last_size, last_t = get_size(FILE), start
print("开始下载 flash-attn wheel (244.1 MB)")
while proc.poll() is None:
time.sleep(2)
now = time.time()
size = get_size(FILE)
speed = (size - last_size) / max(0.1, now - last_t)
pct = min(size / TOTAL, 1.0)
eta = (TOTAL - size) / speed if speed > 1 else float('inf')
eta_s = f"{int(eta//60)}m{int(eta%60)}s" if eta < 1e6 else "--"
spd_s = f"{speed/1024:.0f} KB/s" if speed < 1024*1024 else f"{speed/1024/1024:.2f} MB/s"
elapsed = f"{int((now-start)//60)}m{int((now-start)%60)}s"
print(f"\r{bar(pct)} {pct*100:5.1f}% {size/1024/1024:6.1f}/{TOTAL/1024/1024:.1f} MB"
f" {spd_s} ETA:{eta_s} 已用:{elapsed} ", end='', flush=True)
last_size, last_t = size, now
rc = proc.wait()
size = get_size(FILE)
print(f"\n\n{'✓ 下载完成!' if rc == 0 else f'✗ bypy 退出码: {rc}'}")
if rc == 0 and size >= TOTAL * 0.99:
print("\n下一步: pip install", FILE, "--no-build-isolation")
bash
python3 /tmp/dl_progress.py
效果:
[===>_________________________________________] 8.2% 20.0/244.1 MB 78 KB/s ETA:49m2s 已用:4m44s
3.5 安装 wheel
下载完成后:
bash
pip install /path/to/flash_attn-2.8.3.whl --no-build-isolation
3.6 验证安装
bash
python -c "import flash_attn; print(flash_attn.__version__)"
四、总结
| 问题 | 解决方案 |
|---|---|
| pip 隔离环境找不到 torch | --no-build-isolation |
| CUDA_HOME 未设置 | conda install cuda-nvcc + export CUDA_HOME=... |
| ninja 未安装,编译极慢 | pip install ninja 后再编译 |
| GitHub 下载速度慢 | bypy 从百度网盘下载预编译 wheel |
| ALL_PROXY 导致 pip 报错 | unset ALL_PROXY |
| bypy token 失效 | bypy -c 清除后重新 bypy info 授权 |
💡 最佳实践:优先寻找与自己环境匹配的预编译 wheel,避免漫长的本地编译过程。