🚀 DeepEyes:通過強化學習激勵“以圖思考”
DeepEyes是一個通過強化學習來激勵“以圖思考”的項目。它能夠將視覺信息直接融入推理鏈,在圖像文本處理任務中具有出色表現。
🚀 快速開始
環境搭建
pip install -e .
bash scripts/install_deepeyes.sh
開始訓練
我們使用 Qwen-2.5-VL-7B-Instruct 作為強化學習訓練的基礎模型,同時也支持 Qwen-2.5-VL-32B-Instruct。
對於7B模型的訓練,建議使用不少於32個GPU(4個節點 x 8個GPU);對於32B模型的訓練,建議使用不少於64個GPU(8個節點 x 8個GPU)。每個節點建議使用不少於1200GB的CPU內存,因為V*和ArxivQA數據集中的高分辨率圖像會佔用大量內存。
步驟1:啟動 Qwen-2.5-72B-Instruct 的vllm服務,用於大語言模型作為評判器的驗證。
huggingface-cli download --resume-download https://huggingface.co/Qwen/Qwen2.5-72B-Instruct --local-dir /path/to/your/local/filedir --local-dir-use-symlinks False
vllm serve /path/to/your/local/filedir \
--port 18901 \
--gpu-memory-utilization 0.8 \
--max-model-len 32768 \
--tensor-parallel-size 8 \
--served-model-name "judge" \
--trust-remote-code \
--disable-log-requests
步驟2:為所有訓練節點構建一個Ray集群。在開始訓練前準備好數據,我們的訓練數據集可以從 huggingface 下載。
步驟3:使用以下腳本之一開始訓練。
wandb login
export LLM_AS_A_JUDGE_BASE="http://your.vllm.machine.ip:18901/v1"
export WORLD_SIZE=8
bash examples/agent/final_merged_v1v8_thinklite.sh
bash examples/agent/final_merged_v1v8_thinklite_32b.sh
訓練腳本使用 wandb 和 RL Logging Board(很棒的項目)來可視化訓練動態。
✨ 主要特性
- DeepEyes“以圖思考”的能力是通過端到端強化學習習得的。它直接由結果獎勵信號引導,無需冷啟動或有監督的微調,也不依賴專門的外部模型。
- 儘管在中間步驟沒有直接的監督,但在強化學習訓練階段,定位IoU和工具調用準確率都有所提高。
- 端到端的強化學習訓練在高分辨率基準測試中帶來了顯著的性能提升,並且在視覺定位、幻覺緩解和數學問題解決任務中表現出強大的泛化能力。
- 在強化學習訓練過程中,我們觀察到了一些思考模式的出現,例如對小物體的視覺搜索、跨不同區域的視覺比較、使用
image_zoom_in_tools
進行答案驗證等。
📚 詳細文檔
代碼總體介紹
本倉庫中的代碼是一個基於 VeRL 的通用智能體強化學習訓練框架。除了DeepEyes,還可以使用我們的代碼實現進行任何形式的通用智能體強化學習(多輪強化學習)訓練。
代碼旨在滿足以下需求:
- 高效的智能體強化學習訓練:智能體在所有數據並行組中異步進行滾動更新。
- 允許智能體觀察中的動態多模態輸入:這是“以圖思考”能力強化學習訓練的關鍵。
- 允許對使用不同工具的智能體數據和非智能體數據進行混合訓練:工具的使用不是硬編碼在滾動更新循環中的,每個樣本可以通過
env_name
字段指定自己的工具使用約束。
- 支持算法:支持PPO、GRPO和reinforce++。我們修改了優勢估計、策略損失掩碼以及Qwen-VL模型的mrope,以使其與智能體多輪強化學習訓練的交錯結構兼容。
- 兼容最新的VeRL更新:智能體強化學習訓練作為VeRL的一個插件實現,便於與最新的VeRL更新合併。一旦關閉插件開關,其功能與原始版本的VeRL無異。
在自定義數據集上訓練
在你的數據parquet文件中添加一個額外的字段 env_name
。每個樣本的 env_name
應指定在進行智能體滾動更新時允許使用的工具。對於非智能體訓練數據,將 env_name
留空或設為None。
例如,對於DeepEyes風格的訓練,env_name
應指定為 visual_toolbox_v2
。
其餘部分與原始VeRL數據集格式相同,詳情請參考 VeRL官方文檔。
使用自定義工具訓練
在一個新的類中實現你的工具函數,該類繼承自 verl/workers/agent/tool_envs.py 中的 ToolBase
類。
子類必須包含 name
變量,其值對應於訓練數據parquet文件中的 env_name
字段。
實現 execute
和 reset
函數,以下是一個簡單的示例:
class CustomTool(ToolBase):
name = "custom_tool_v0"
def __init__(self, _name, _desc, _params, **kwargs):
super().__init__(name=self.name)
def execute(self, action_string: str, **kwargs) -> tuple:
"""
根據大語言模型生成的文本執行工具功能。
此函數在每次vllm.generate之後調用
參數:
action_string: 大語言模型通過vllm.generate生成的字符串。
返回:
observation: 處理後圖像的結構化觀察結果。
reward: 如果你想為中間步驟中的最後一個生成令牌分配獎勵,則設置一個非零值。
done: 該回合是否結束。
info: 額外信息。
"""
pass
def reset(self, raw_prompt, multi_modal_data, origin_multi_modal_data, **kwargs):
"""
此函數僅在初始化工具時調用一次
參數:
raw_prompt: 設置配置參數 `data.return_raw_chat=True` 以獲取原始提示輸入。
multi_modal_data: 詳情請參考vllm文檔 https://docs.vllm.ai/en/stable/features/multimodal_inputs.html
origin_multi_modal_data: VLM視覺處理器在圖像太小或太大時可能會修改原始圖像,通常是通過調整大小。如果你想訪問未修改的視覺輸入,請使用此參數。
"""
pass
參考 verl/workers/agent/envs/mm_process_engine/visual_toolbox_v2.py 中的 image_zoom_in_tool
示例。
重要提示:在 verl/workers/agent/init.py 中導入你的自定義工具。
from .envs.your_custom_tool import CustomTool
使用最新的VeRL代碼
如果你想使用最新的VeRL代碼進行訓練,可以執行以下操作:
git remote add official https://github.com/volcengine/verl.git
git pull official main
📄 許可證
本項目根據 Apache許可證 發佈。
引用
@article{zheng2025deepeyesincentivizingthinkingimages,
title={DeepEyes: Incentivizing "Thinking with Images" via Reinforcement Learning},
author={Ziwei Zheng, Michael Yang, Jack Hong, Chenxiao Zhao, Guohai Xu, Le Yang, Chao Shen, Xing Yu},
year={2025},
eprint={2505.14362},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2505.14362},
}
信息表格
屬性 |
詳情 |
基礎模型 |
Qwen/Qwen2.5-VL-7B-Instruct |
語言 |
英文 |
許可證 |
apache-2.0 |
任務類型 |
圖像文本到文本 |
庫名稱 |
transformers |
* 標誌靈感來源於甲骨文“目”字。
⚠️ 重要提示
訓練過程中需要注意GPU和內存的使用情況,確保資源充足。
💡 使用建議
在使用自定義數據集和工具時,仔細閱讀文檔並參考示例代碼,確保配置正確。