广度优先搜索(Breadth-First Search, BFS) 是一种基于队列实现的层次遍历算法,适用于最短路径、状态转移、连通性等问题。其核心思想是“层层扩展”,从起点出发,逐层访问所有可达节点。
本文从基础概念到经典题型进行系统分类与解析,涵盖从入门到进阶的所有常见问题。
深度优先搜索(Depth-First Search, DFS) 是算法中解决树/图遍历、路径搜索、排列组合等问题的核心方法之一。其核心思想是“一条路走到底”的搜索策略,通常通过递归或显式栈实现。
本文从基础概念到经典题型进行系统分类与解析,涵盖从入门到进阶的所有常见问题。
递归终止条件:何时结束当前分支的搜索
示例:越界、找到目标、访问过
当前层处理:对当前节点或状态的修改
示例:标记已访问、加入路径
向子问题递归:进入下一层搜索
示例:遍历相邻节点、选择下一个数字
动态规划(Dynamic Programming, DP) 是算法中解决最优化问题的核心方法之一。其核心思想是将原问题分解为多个重叠子问题,并通过记忆化存储避免重复计算。
本文从基础概念到经典题型进行系统分类与解析,涵盖从入门到进阶的所有常见问题。
仓库:https://huggingface.co/google/siglip-so400m-patch14-384
下载仓库:
展开代码./hfd.sh google/siglip-so400m-patch14-384 --local-dir ./google/siglip-so400m-patch14-384
懒得装环境,直接docker:
展开代码docker run -it \ --gpus '"device=0"' \ -v ./google/siglip-so400m-patch14-384:/google/siglip-so400m-patch14-384 \ -p 8033:8033 \ --shm-size 32g \ kevinchina/deeplearning:llamafactory20250311-3 bash
【训练】Qwen2.5VL 多机多卡 Grounding Box定位(1):http://101.126.150.28:7878/post/2067
【训练】Qwen2.5VL 多机多卡 Grounding Box定位(2):http://101.126.150.28:7878/post/2094
之前的相关文章:
【深度学习】LLaMA-Factory微调sft Qwen2-VL进行印章识别
https://www.dong-blog.fun/post/1661
使用LLaMA-Factory微调sft Qwen2-VL-7B-Instruct
https://www.dong-blog.fun/post/1762
构建最新的LLaMA-Factory镜像
https://www.dong-blog.fun/post/1799
看了一些帖子:
所以有一些关于 Qwen2.5VL Grounding 的结论:
json展开代码[
{"bbox_2d": [x1, y1, x2, y2], "label": "obj_name/description"},
{"bbox_2d": [x1, y1, x2, y2], "label": "obj_name/description"},
{"bbox_2d": [x1, y1, x2, y2], "label": "obj_name/description"},
]
官方还是这么做了,因为底层对28的切割性质,所以要这么做,不然真会偏一点: 在 Qwen2.5-VL 中,我们首先调整输入图像的大小,以确保其宽高为 28*n,然后使用调整后图像上的绝对坐标作为最终目标。
使用 (左, 上), (右, 下) 坐标,不用归一化到0-1000.
您好,根据您的描述,我怀疑问题出在 Qwen2-VL 和 Qwen2.5-VL 中 bbox 坐标的处理方式不同。具体来说,我们在 Qwen2.5-VL-7B 中现在使用的是绝对坐标,而不是 Qwen2-VL 中使用的相对坐标(后者被缩放到 [0,1000])。 例如,在 Qwen2-VL 中,640x640 图像中 [0, 0, 320, 320] 的边界框用 (0, 0), (500, 500) 表示。但在 Qwen2.5-VL 中,我们直接使用 [0, 0, 320, 320] 或 (0,0),(320,320)。此外,如果在图像增强过程中将图像尺寸调整为 1280x1280,则坐标现在应相应地扩展为 [0, 0, 640, 640]。
由于 Qwen2.5-VL 使用绝对坐标进行训练,我建议在微调时也使用相同的绝对坐标系。如果您出于某种原因坚持使用相对坐标,可以延长训练时间,看看偏差问题是否会随着训练时间的延长而消失。
供大家参考,详细坐标流程如下:
调整图像大小,使高度和宽度为 28*n resized_w, resized_h = smart_resize(img_w, img_h) 相应地改变绝对坐标 new_bbox = bbox / np.array([img_w, img_h, img_w, img_h]) * np.array([resized_w, resized_h, resized_w, resized_h])) 如果使用绝对坐标后仍然观察到明显的 grounding 偏差,则另一个可能的问题在于图像的大小。如果图像非常大或非常小(例如,> 4k 4k 或 < 320 320),则模型很可能会输出有偏差的 bbox 结果。
新版本的transformers才没有rope问题,安装: pip install git+https://github.com/huggingface/transformers
在 VS Code 的扩展市场中,最核心的 Python 开发扩展是由 Microsoft 官方维护的 ms-python.python
(名称直接叫 "Python")。以下是关键扩展的区分和推荐:
1. 必装的核心扩展
✅ Python
• 发布者: ms-python
(Microsoft 官方)
• 功能:
• Python 语言基础支持(语法高亮、代码补全、调试等)。
• 集成 Python 解释器管理(切换虚拟环境、conda 等)。
• 提供 Jupyter Notebook
支持。
• 标识:扩展列表中直接显示为 "Python",且作者是 ms-python
。
项目地址:
https://github.com/hiyouga/EasyR1?tab=readme-ov-file#custom-dataset
拉取镜像:
展开代码docker pull hiyouga/verl:ngc-th2.6.0-cu126-vllm0.8.4-flashinfer0.2.2-cxx11abi0
做一个镜像:
展开代码FROM hiyouga/verl:ngc-th2.6.0-cu126-vllm0.8.4-flashinfer0.2.2-cxx11abi0 WORKDIR /workplace RUN git clone https://github.com/hiyouga/EasyR1.git WORKDIR /workplace/EasyR1 RUN pip install -e . -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple RUN pip install swanlab -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
grpo_config.py
dict[str, Any]
或 None
,默认值 None
transformers.AutoModelForCausalLM.from_pretrained
的关键字参数,当GRPOTrainer
的model
参数提供为字符串时使用。remove_unused_columns: bool
,默认值 False
False
。max_prompt_length: int
或 None
,默认值 512
num_generations: int
或 None
,默认值 8
temperature: float
,默认值 0.9
max_completion_length: int
或 None
,默认值 256
ds3_gather_for_generation: bool
,默认值 True
在使用 vLLM 部署大型语言模型(LLM)时,我们经常会接触到模型目录下的各种配置文件。其中,tokenizer_config.json
是一个至关重要的文件,它像一座桥梁,连接着人类可读的文本与模型内部能理解的数字表示。本文将以部署 Qwen3-30B-A3B 模型为例,深入探讨 tokenizer_config.json
在 vLLM 中的作用以及其内部各项配置的含义。
旋转位置嵌入(RoPE)已被证明可以在基于 Transformer 的语言模型中有效编码位置信息。然而,这些模型无法泛化到超出其训练时所使用的序列长度。我们提出了 YaRN(Yet another RoPE extensioN method),一种计算高效的方法来扩展这类模型的上下文窗口,所需 token 数量比先前方法少 10 倍,训练步数少 2.5 倍。使用 YaRN,我们展示了 LLaMA 模型可以有效地利用并外推到远超其原始预训练所允许的上下文长度,同时在上下文窗口扩展方面也超越了先前的最先进水平。此外,我们证明了 YaRN 具有超越微调数据集有限上下文的外推能力。使用 YaRN 微调的模型已在 https://github.com/jquesnelle/yarn 上公开并可在线复现,上下文长度最高可达 128k。
基于 Transformer 的大型语言模型[40](LLMs)已成为许多自然语言处理(NLP)任务近乎无处不在的选择,在这些任务中,上下文学习(ICL)等长距离能力至关重要。在执行 NLP 任务时,由其训练过程决定的序列最大长度(上下文窗口)已成为预训练 LLM 的主要限制之一。通过少量微调(或无需微调)动态扩展上下文窗口的能力变得越来越重要。为此,Transformer 的位置编码成为讨论的中心。
最初的 Transformer 架构使用绝对正弦位置编码,后来改进为可学习的绝对位置编码[15]。此后,相对位置编码方案[32]进一步提高了 Transformer 的性能。目前,最流行的相对位置编码是 T5 相对偏置[30]、RoPE[34]、XPos[35]和 ALiBi[27]。
位置编码的一个反复出现的局限性是无法泛化到训练期间看到的上下文窗口之外。虽然像 ALiBi 这样的一些方法能够进行有限的泛化,但没有一种方法能够泛化到明显长于其预训练长度的序列[22]。
为了克服这一限制,已经进行了一些工作。[9]和同期[21]提出通过位置插值(PI)轻微修改 RoPE 并使用少量数据进行微调来扩展上下文长度。作为替代方案,[6]提出了"NTK-aware"插值法,考虑了高频信息的损失。此后,针对"NTK-aware"插值法提出了两种改进,各有侧重:
"NTK-aware"插值法和"Dynamic NTK"插值法已经在开源模型中得到应用,例如 Code Llama[31](使用"NTK-aware"插值法)和 Qwen 7B[2](使用"Dynamic NTK")。 在本文中,除了全面介绍先前未发表的关于"NTK-aware"、"Dynamic NTK"和"NTK-by-part"插值法的工作外,我们还提出了 YaRN(Yet another RoPE extensioN method),这是一种改进的方法,可以有效地扩展使用旋转位置嵌入(RoPE)训练的模型的上下文窗口,包括 LLaMA[38]、GPTNeoX[5]和 PaLM[10]系列模型。 YaRN 在仅使用约原始预训练数据 0.1% 的情况下进行微调后,在上下文窗口扩展方面达到了最先进的性能。同时,通过结合称为动态缩放(Dynamic Scaling)的推理时技术,Dynamic-YaRN 可以在没有任何微调的情况下实现超过 2 倍的上下文窗口扩展。
https://modelscope.cn/models/Qwen/Qwen3-30B-A3B
部署时,您可以使用 sglang>=0.4.6.post1 或 vllm>=0.8.4 或创建一个与 OpenAI 兼容的 API 端点:
展开代码SGLANG_USE_MODELSCOPE=1 python -m sglang.launch_server --model-path Qwen/Qwen3-30B-A3B --reasoning-parser qwen3
展开代码VLLM_USE_MODELSCOPE=1 vllm serve Qwen/Qwen3-30B-A3B --enable-reasoning --reasoning-parser deepseek_r1
我爱用VLLM+Docker+不要reasoning:
展开代码# 下载镜像 docker pull vllm/vllm-openai:latest # 下载模型 modelscope download Qwen/Qwen3-30B-A3B --local-dir ./Qwen/Qwen3-30B-A3B # 启动服务 docker run -d --gpus '"device=2,3"' \ -v /data/xiedong/Qwen/Qwen3-30B-A3B:/model \ -p 8027:8000 \ vllm/vllm-openai:latest \ --model /model --gpu_memory_utilization=0.9 \ --tensor-parallel-size 1 \ --data_parallel_size 2 \ --pipeline-parallel-size 1 \ --served-model-name Qwen3-30B-A3B \ --enable-auto-tool-choice --tool-call-parser hermes \ --enable-reasoning --reasoning-parser deepseek_r1 \ --api_key "YOUR_API_KEY"
要reasoning的话,run 要加入--enable-reasoning --reasoning-parser deepseek_r1
要工具解析的话,run 要加入--enable-auto-tool-choice --tool-call-parser hermes
限制tokens的话,run 要加入--max-model-len 10000
请求:
展开代码curl -X POST "http://10.136.19.27:8027/v1/chat/completions" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen3-30B-A3B", "messages": [ { "role": "user", "content": "你是谁?" } ], "temperature": 0.7, "top_p": 0.8, "top_k": 20, "max_tokens": 4096, "presence_penalty": 1.5 }'
对应回复:
展开代码{ "id": "chatcmpl-978124635f614b4f8b1a1e24c36e9fb0", "object": "chat.completion", "created": 1745979458, "model": "Qwen3-30B-A3B", "choices": [ { "index": 0, "message": { "role": "assistant", "reasoning_content": "\n好的,用户问“你是谁?”,我需要回答我的身份。首先,我要明确自己的角色是通义千问,由阿里巴巴集团旗下的通义实验室研发。接下来,我应该简要说明我的功能和用途,比如回答问题、创作文字、逻辑推理、编程等等。同时,要保持口语化,避免使用专业术语,让用户容易理解。另外,可能需要加入一些友好的语气,比如用“你好呀!”来开头,让对话更亲切。还要注意不要包含任何格式,比如不用Markdown,保持自然的中文表达。最后,确保回答简洁明了,不超过两句话,同时涵盖主要信息。现在把这些点组织成一个自然的回复。\n", "content": "\n\n你好呀!我是通义千问,是阿里巴巴集团自主研发的超大规模语言模型,可以回答问题、创作文字、逻辑推理、编程等等。有什么我可以帮你的吗?😊", "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": null } ], "usage": { "prompt_tokens": 11, "total_tokens": 198, "completion_tokens": 187, "prompt_tokens_details": null }, "prompt_logprobs": null }
请求:
展开代码curl -X POST "http://10.136.19.27:8027/v1/chat/completions" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen3-30B-A3B", "messages": [ { "role": "user", "content": "今天天气如何?请调用天气查询工具获取信息。" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "根据城市名称返回该城市的实时天气情况。", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "需要查询天气的城市名称" } }, "required": ["city"] } } } ], "temperature": 0.7, "top_p": 0.8, "top_k": 20, "max_tokens": 4096, "presence_penalty": 1.5 }'
模型回复是:
展开代码{ "id": "chatcmpl-16af1ddb5f0d418e8669d2189ee07c8b", "object": "chat.completion", "created": 1745980126, "model": "Qwen3-30B-A3B", "choices": [ { "index": 0, "message": { "role": "assistant", "reasoning_content": "\n好的,用户问今天天气如何,并且要求调用天气查询工具。首先,我需要确定用户所在的城市,因为不同的城市天气不同。但用户没有提到具体是哪个城市,可能需要进一步询问。不过根据提供的工具,get_weather函数需要城市名称作为参数。这时候可能需要假设用户默认的城市,或者提示用户提供城市信息。但根据提供的工具示例,这里假设城市为北京。\n", "content": "\n\n", "tool_calls": [ { "id": "chatcmpl-tool-7cd273bfadf6475aa0c308fc08234885", "type": "function", "function": { "name": "get_weather", "arguments": "{\"city\": \"北京\"}" } } ] }, "logprobs": null, "finish_reason": "tool_calls", "stop_reason": null } ], "usage": { "prompt_tokens": 174, "total_tokens": 404, "completion_tokens": 230, "prompt_tokens_details": null }, "prompt_logprobs": null }
考虑效率,不需要思考就加上"chat_template_kwargs": {"enable_thinking": false}
展开代码curl -X POST "http://10.136.19.27:8027/v1/chat/completions" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen3-30B-A3B", "messages": [ { "role": "user", "content": "你是谁?" } ], "temperature": 0.7, "top_p": 0.8, "top_k": 20, "max_tokens": 4096, "presence_penalty": 1.5, "chat_template_kwargs": {"enable_thinking": false} }'
大模型回复如下,看起来内容到reasoning_content里了,这有问题:
展开代码{ "id": "chatcmpl-0e9e560155564b07870b9474c37288ac", "object": "chat.completion", "created": 1745980349, "model": "Qwen3-30B-A3B", "choices": [ { "index": 0, "message": { "role": "assistant", "reasoning_content": "我是通义千问,是阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我的中文名是通义千问,英文名是Qwen。我被设计用来回答各种问题、创作文字、逻辑推理、编程等,可以支持多语言交流。如果你有任何问题或需要帮助,欢迎随时告诉我!", "content": null, "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": null } ], "usage": { "prompt_tokens": 15, "total_tokens": 85, "completion_tokens": 70, "prompt_tokens_details": null }, "prompt_logprobs": null }
一开始启动就不要think的话:
展开代码# 启动服务 docker run -d --gpus '"device=2,3"' \ -v /data/xiedong/Qwen/Qwen3-30B-A3B:/model \ -p 8027:8000 \ vllm/vllm-openai:latest \ --model /model --gpu_memory_utilization=0.9 \ --tensor-parallel-size 1 \ --data_parallel_size 2 \ --pipeline-parallel-size 1 \ --served-model-name Qwen3-30B-A3B \ --enable-auto-tool-choice --tool-call-parser hermes \ --api_key "YOUR_API_KEY"
正常了:
展开代码{ "id": "chatcmpl-19b25b7f103b44f0803fa33708aad95a", "object": "chat.completion", "created": 1745980850, "model": "Qwen3-30B-A3B", "choices": [ { "index": 0, "message": { "role": "assistant", "reasoning_content": null, "content": "我是通义千问,是阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我能够回答问题、创作文字、逻辑推理、编程等多种任务。你可以叫我Qwen或者通义千问。有什么我可以帮你的吗?", "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": null } ], "usage": { "prompt_tokens": 15, "total_tokens": 67, "completion_tokens": 52, "prompt_tokens_details": null }, "prompt_logprobs": null }
https://modelscope.cn/models/Qwen/Qwen3-32B
部署时,您可以使用 sglang>=0.4.6.post1 或 vllm>=0.8.4 或创建一个与 OpenAI 兼容的 API 端点:
展开代码SGLANG_USE_MODELSCOPE=1 python -m sglang.launch_server --model-path Qwen/Qwen3-32B --reasoning-parser qwen3
展开代码VLLM_USE_MODELSCOPE=1 vllm serve Qwen/Qwen3-32B --enable-reasoning --reasoning-parser deepseek_r1
我爱用VLLM+Docker+不要reasoning:
展开代码# 下载镜像 docker pull vllm/vllm-openai:latest # 下载模型 modelscope download Qwen/Qwen3-32B --local_dir ./Qwen/Qwen3-32B # 启动服务 docker run -d --gpus '"device=0,1,2,3"' \ -v /data/xiedong/Qwen/Qwen3-32B:/model \ -p 8028:8000 \ vllm/vllm-openai:latest \ --model /model --gpu_memory_utilization=0.9 --tensor-parallel-size 2 --data_parallel_size 2 --pipeline-parallel-size 1 --max-model-len 10000 --served-model-name gpt # 启动服务2 docker run -d --gpus '"device=4,5,6,7"' \ -v /data/xiedong/Qwen/Qwen3-32B:/model \ -p 8028:8000 \ vllm/vllm-openai:latest \ --model /model --gpu_memory_utilization=0.9 --tensor-parallel-size 1 --data_parallel_size 4 --pipeline-parallel-size 1 --max-model-len 10000 --served-model-name gpt # 启动服务3 docker run -d --gpus '"device=2,3"' \ -v /ssd/xiedong/Qwen/Qwen3-32B:/model \ -p 8077:8000 \ vllm/vllm-openai:latest \ --model /model --gpu_memory_utilization=0.9 --tensor-parallel-size 1 --data_parallel_size 2 --pipeline-parallel-size 1 --max-model-len 10000 --served-model-name gpt
要reasoning的话,run 要加入--enable-reasoning --reasoning-parser deepseek_r1
请求:
展开代码curl -X POST "http://10.136.19.27:8028/v1/chat/completions" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt", "messages": [ { "role": "user", "content": "你是谁?" } ], "temperature": 0.7, "top_p": 0.8, "top_k": 20, "max_tokens": 4096, "presence_penalty": 1.5 }'
考虑效率,不需要思考就加上"chat_template_kwargs": {"enable_thinking": false}
展开代码curl -X POST "http://10.136.19.27:8028/v1/chat/completions" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt", "messages": [ { "role": "user", "content": "你是谁?" } ], "temperature": 0.7, "top_p": 0.8, "top_k": 20, "max_tokens": 4096, "presence_penalty": 1.5, "chat_template_kwargs": {"enable_thinking": false} }'