study-notes.md 4.8 KB

环境选择

git clone https://gitee.com/zhch158_admin/dots.ocr.git

git config --local user.name "zhch158_admin"
git config --local user.email "zhch158@sina.com"
# 自定义缓存时间(如7200秒)
git config --global credential.helper 'cache --timeout=7200'

conda create -n py312 python=3.12
# vllm目前最高支持到3.12

Linux安装

flash-attn 确实没有 macOS 的预编译包,因为 flash-attn 是专门为 NVIDIA GPU(CUDA)设计的,而 Mac 使用的是 Apple Silicon 或 Intel CPU,不支持 CUDA

cd dots.ocr

conda activate py312
uv pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 
uv pip install -e .
uv pip install vllm==0.9.1 --torch-backend=auto

# 解决vllm版本兼容问题,检查当前版本
pip list | grep -E "(vllm|transformers)"
# 使用最新兼容版本
pip install --upgrade vllm transformers torch

# 查看端口占用情况
sudo lsof -i:8101

# 显示所有监听的端口
sudo ss -tuln

# 显示特定端口
sudo ss -tulpn | grep :8101

# 显示进程信息
sudo ss -tulpn sport = :8101

设置launch.json

	"configurations": [
		{
			"name": "Python Debugger: Current File",
			"type": "debugpy",
			"request": "launch",
			"program": "${file}",
			"console": "integratedTerminal",
			"cwd": "${fileDirname}",
			"env": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"},
			"envFile": "${workspaceFolder}/.env",
			"justMyCode": false
		},
		{
			"name": "app",
			"type": "debugpy",
			"request": "launch",
			// "module": "paddlex.__main__",
			"program": "${workspaceFolder}/zhch/paddlex_cli.py",
			"console": "integratedTerminal",
			"cwd": "${workspaceFolder}/zhch",
			"env": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"},
			"envFile": "${workspaceFolder}/.env",
			"args": [
				// "-m", "paddlex.paddlex_cli",
				// "--get_pipeline_config", "${workspaceFolder}/zhch/PP-StructureV3-zhch.yaml"
				"--pipeline", "PP-StructureV3",
				"--use_doc_orientation_classify=True",
				"--use_doc_unwarping=True",
				"--input", "sample_data/300674-母公司现金流量表-扫描.png",
				"--save_path", "sample_data/output",
				"--device", "gpu",
			],
			"justMyCode": false
		}
	]

启动脚本

zhch/launch_model_vllm.sh 需要在/home/ubuntu/anaconda3/envs/py312/bin/vllm中加入DotsOCR

#!/home/ubuntu/anaconda3/envs/py312/bin/python3
# -*- coding: utf-8 -*-
import sys 
from vllm.entrypoints.cli.main import main
from DotsOCR import modeling_dots_ocr_vllm
if __name__ == "__main__":
    if sys.argv[0].endswith("-script.pyw"):
        sys.argv[0] = sys.argv[0][:-11]
    elif sys.argv[0].endswith(".exe"):
        sys.argv[0] = sys.argv[0][:-4]
    sys.exit(main())
# 监控内存使用情况
watch -n 1 nvidia-smi

# 启动应用
python demo_gradio.py

在线体验环境

https://dotsocr.xiaohongshu.com/

Flash Attention 详细介绍

Flash Attention 原理与优势

核心概念

Flash Attention 是一种高效的注意力机制实现,通过重新设计内存访问模式来显著提升性能:

  1. 分块计算 (Block-wise Computation)

    • 将大矩阵分解成小块逐块处理
    • 避免存储完整的注意力矩阵 (N×N)
  2. 内存层次优化

    • 减少 GPU 显存 (HBM) 和 SRAM 之间的数据传输
    • 利用 GPU 的内存层次结构提升效率
  3. 在线 Softmax

    • 采用数值稳定的在线算法
    • 避免中间结果的完整存储

性能优势

  • 内存效率: 从 O(N²) 降低到 O(N)
  • 计算速度: 长序列上可提速 2-4倍
  • 精度保持: 与标准注意力数值相同

项目中的 Flash Attention 使用

当前配置

# demo/demo_hf.py
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    attn_implementation="flash_attention_2",  # 启用 Flash Attention 2
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True
)

依赖要求

flash-attn==2.8.0.post2  # CUDA 专用,不支持 macOS

Apple Silicon 适配方案

问题分析

  1. 硬件限制: Flash Attention 专为 NVIDIA CUDA GPU 设计
  2. 架构差异: Apple Silicon 使用 Metal Performance Shaders (MPS)
  3. 软件兼容: flash-attn 库不支持 macOS/Metal

解决方案

方法1

  1. 移除 Flash Attention 依赖: 在 macOS 上不使用 flash-attn
  2. 修改weights/DotsOCR_CPU_bfloat16/config.json,修改"attn_implementation": "sdpa",
  3. 调用程序:zhch/demo_hf_macos_bfloat16.py

方法2

  1. 移除 Flash Attention 依赖: 在 macOS 上不使用 flash-attn
  2. 运行zhch/convert_model_float16.py,将模型转换为 float16 格式,weights/DotsOCR_float16
  3. 调用程序:zhch/demo_hf_macos_float16.py

方法3

  1. 移除 Flash Attention 依赖: 在 macOS 上不使用 flash-attn
  2. 运行zhch/convert_model_macos_float32.py,将模型转换为 float32 格式,weights/DotsOCR_float32
  3. 调用程序:zhch/demo_hf_macos_float32.py