论文分享 - Reasoning with Memory Augmented Neural Networks for Language Comprehension

针对多轮次推理中固定推理步数的问题,本文提出一种能够动态调整推理跳数的模型。该模型通过假设检验的方式,使得推理步数可以根据文档与查询的具体情况自适应地调整。

关键词

Memory, reasoning

来源

arXiv 2016.10.20

问题

在此之前,所有 multi-turn 模型都为多跳推断预先设定了固定的跳数。但是并不是所有的 document-query 对都需要同样的推理步数,有的只需要词或者句子级别的匹配,有的需要复杂的语义理解和深度推理。基于此,本文提出了动态调整跳数的模型。


文章思路

Memory Initialization

首先通过 Bi-LSTM 对 document、query 中每个词分别编码,将前向后向隐层状态拼接分别组成 document、query 词的 memory 初始值。如下:

Mq0=BiLSTMq(Q)Md=BiLSTMd(D)

Hypothesis Testing

query 和 document 的 memory 都要经过假设检验循环这样一个迭代过程来处理。每次循环中,query meomory 都要利用 document memory 的内容来更新来形成新的 query (也就是 hypothesis formulation)。新的 query 利用 document 事实来检验并且用来做答案预测 (也就是 hypothesis testing)
这一部分由 Neural Semantic Encoder (NSE) 控制,分为三个模块:read、compose、write。

Read 模块

这一模块把前一时刻 document 和 query 的状态作为输入,初始状态为 Bi-LSTM 的最终状态。作如下计算

rt=readLSTM([sqt1;sdt1])lqt=rTtMqt1sqt=softmax(lqt)TMqt1zqt=sigmoid(lqt)ldt=sqtTMdsdt=softmax(ldt)TMd

Compose 模块

将当前的 document、query 和 read 模块当前隐层状态组合起来

ct=composeMLP(sdt,sdt,rt)

这一模块可以看做从当前的 document、query 对抽取特征的过程;通过接受 rt,也就把 read 的当前决策告诉了 write 模块。

Write 模块

这一模块接收 read 模块,并更新 query memory

Mqt=Mqt1(1zqt)+sdtzqt

其中 1 表示全 1 矩阵。同时 write 模块也负责检验新的假设。文中提出了两种策略:query gating、adaptive computation。下图给出两种策略的图像化描述
两种策略
Query Gating
这种策略并不对是否终止循环做出硬性决策,而是在词的级别上做 query memory gating
wt=writeLSTM(ct)gqt=sigmoid(wTtMqt1)Mqt=Mqt(1gqt)+Mqt1gqt

在这种策略下,期望 write 模块能够在假设正确时锁住 query 状态。假设检验的步数 T 是模型中的一个超参。
Adaptive Computation
这种策略拥有终止机制,每步上,write 模块都会输出一个终止得分 et,计算方式如下
wt=writeLSTM(ct)et=sigmoid(oTwt)

其中 o 是一个可训练的量。然后 t 步后的终止概率按如下公式计算:
pt=eti=1t1(1ei)

这里也用 T 表示最大允许步数。如果 T 步后,模型仍然没有终止,就强迫模型输出结果。在这种情况下,终止阅读的概率如下
pT=1i=1T1pi

Answer Prediction

在 t 步,采用 query-to-document 对齐打分 ldt

来计算概率

Pi(a|Q,D)=vTsoftmax(ldt)

对于 query gating 模型,使用最后一步的概率 PT(a|Q,D) 选择结果;
对于 adaptive computation 模型,使用如下公式计算正确答案
P(a|Q,D)=i=1T(piPi(a|Q,D))

注:在实验中,read 和 write 模块都采用了单层 LSTM 网络,compose 模块采用了单层 MLP。

资源

论文地址:https://arxiv.org/abs/1610.06454
代码地址:近期会放出

相关工作

EpiReader 这一模型做两个阶段的计算。首先利用 Attention Sum Reader 选出最可能的 K 个答案填到原始问题 placeholder 中形成新的问题。然后利用 EpiReader 在 document 和新的 query 之间做一个 entailment estimation 来预测答案。但是 entailment estimation 为它的应用带来了限制。

这里写图片描述

简评

最终实验证明在 T = 12 时,adaptive computation 方法在 CBT 和 WDW 两个数据集上都取得了最佳效果。本文受人脑中的假设检验过程启发,从而提出这样一个模型,解决了推理网络的跳数自适应问题。

转载: https://blog.youkuaiyun.com/u014300008/article/details/53097201
<think>我们正在尝试在指定的GPU(设备3)上启动vLLM服务来运行Qwen3-Embedding-0.6B模型。命令如下: ``` CUDA_VISIBLE_DEVICES=3 vllm serve Qwen3-Embedding-0.6B --host 0.0.0.0 --port 8080 --gpu-memory-utilization 0.4 --max-model-len 32768 --enable-reasoning --reasoning-parser deepseek_r1 ``` 但是,请注意,vLLM(Versatile Large Language Model serving)主要设计用于大型语言模型(LLM)的推理服务,特别是自回归模型(如GPT系列)。而Qwen3-Embedding是一个嵌入模型(Embedding Model),通常用于生成文本的向量表示,而不是用于生成文本。因此,使用vLLM来服务嵌入模型可能并不合适,因为vLLM的优化主要是针对自回归生成任务的。 目前,vLLM的官方文档和示例主要支持生成式模型(如GPT、Llama等)。对于嵌入模型,通常我们会使用其他框架(如Hugging Face Transformers、Sentence Transformers等)来部署。 不过,我们也可以尝试使用vLLM来服务嵌入模型,但需要确认以下几点: 1. vLLM是否支持该嵌入模型?根据vLLM的文档,它主要支持的是因果语言模型(Causal LM)和序列到序列模型(Seq2Seq LM)。对于嵌入模型,可能没有内置支持。 2. 即使vLLM支持,也可能需要特定的配置。 在您提供的命令中,使用了`--enable-reasoning`和`--reasoning-parser`参数,这些参数可能是用于推理增强的,但通常嵌入模型不需要这些参数。 因此,建议: - 如果确实想用vLLM服务嵌入模型,需要查看vLLM是否支持该模型结构(如是否在vLLM的模型支持列表中,或者是否可以通过自定义模型加载)。 - 或者,使用其他更适合嵌入模型的部署方式,例如使用FastAPI封装Hugging Face的模型。 但是,为了解答您的问题,我们先尝试运行这个命令,并分析可能遇到的问题。 ### 可能的问题及解决方案 1. **模型名称问题**:确保模型名称`Qwen3-Embedding-0.6B`在vLLM中是可识别的。通常,vLLM通过Hugging Face模型库加载模型,所以需要确认该模型在Hugging Face上的名称,并且确保该模型是vLLM支持的架构(如Transformer)。如果模型不在本地,vLLM会自动下载。 2. **参数不匹配**:`--enable-reasoning`和`--reasoning-parser`这些参数可能是特定于某些版本的vLLM或某些扩展功能。目前标准的vLLM(截至2024年5月)可能不支持这些参数。请检查您使用的vLLM版本是否支持这些参数。如果不支持,则需要移除这些参数。 3. **嵌入模型的服务方式**:即使vLLM能够加载模型,它默认的API接口可能是为文本生成设计的(即输入一段文本,输出生成的文本)。而嵌入模型需要的是输入文本,输出向量。因此,可能需要自定义API端点。 ### 替代方案:使用Hugging Face Transformers部署嵌入模型 如果您需要部署嵌入模型,推荐使用Hugging Face Transformers库,并结合FastAPI或Flask构建API服务。以下是一个简单的示例: 1. 安装必要的库: ```bash pip install transformers uvicorn fastapi ``` 2. 创建一个Python文件(例如`embedding_service.py`): ```python from fastapi import FastAPI from pydantic import BaseModel from transformers import AutoModel, AutoTokenizer import torch app = FastAPI() # 加载模型和分词器 model_name = "Qwen/Qwen3-Embedding-0.6B" # 请根据实际模型名称修改 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name).cuda() # 如果使用GPU class Request(BaseModel): text: str @app.post("/embed") async def get_embedding(request: Request): inputs = tokenizer(request.text, padding=True, truncation=True, return_tensors="pt", max_length=512) inputs = {k: v.cuda() for k, v in inputs.items()} # 如果使用GPU with torch.no_grad(): outputs = model(**inputs) # 获取嵌入向量(通常使用[CLS]标记的隐藏状态或平均池化) # 这里以平均池化为例 embeddings = outputs.last_hidden_state.mean(dim=1).squeeze().tolist() return {"embedding": embeddings} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8080) ``` 然后,您可以通过设置环境变量`CUDA_VISIBLE_DEVICES=3`来指定GPU,然后运行这个脚本。 ### 回到vLLM命令 如果您仍然希望尝试使用vLLM来服务嵌入模型,我们可以尝试简化命令,移除可能不支持的参数: ```bash CUDA_VISIBLE_DEVICES=3 vllm serve Qwen3-Embedding-0.6B --host 0.0.0.0 --port 8080 --gpu-memory-utilization 0.4 --max-model-len 32768 ``` 但是,请注意,vLLM默认的API接口是用于文本生成的,所以即使服务启动成功,它提供的API也是生成文本的,而不是获取嵌入向量。 ### 结论 根据您的需求(运行嵌入模型),建议使用Hugging Face Transformers和FastAPI来构建服务。如果坚持使用vLLM,需要确认: - vLLM是否支持该模型(架构是否兼容) - 是否能够通过自定义代码来提供嵌入向量(可能需要修改vLLM的代码) ### 相关问题 1. 如何确认一个模型是否与vLLM兼容? 2. 使用FastAPI部署嵌入模型时,如何处理多个并发请求? 3. 在部署嵌入模型时,如何优化性能(如批处理)?</think>根据您的需求,我将指导您在指定 GPU 上部署 Qwen3-Embedding 模型使用 vLLM 服务,并分析命令参数: ### 部署命令解析 ```bash CUDA_VISIBLE_DEVICES=3 vllm serve Qwen3-Embedding-0.6B \ --host 0.0.0.0 \ --port 8080 \ --gpu-memory-utilization 0.4 \ --max-model-len 32768 \ --enable-reasoning \ --reasoning-parser deepseek_r1 ``` #### 参数说明: 1. **`CUDA_VISIBLE_DEVICES=3`** - 指定使用第 3 号 GPU 设备 - 验证设备存在:`nvidia-smi -L` 2. **模型加载** - `Qwen3-Embedding-0.6B`:需确保模型路径正确 - 首次运行会自动下载 HuggingFace 模型 - 本地路径示例:`--model /path/to/Qwen3-Embedding-0.6B` 3. **网络配置** - `--host 0.0.0.0`:允许所有 IP 访问 - `--port 8080`:服务监听端口 - 验证:`curl http://localhost:8080/v1/models` 4. **显存优化** - `--gpu-memory-utilization 0.4`:限制显存使用率为 40% - 计算公式:$$ \text{可用显存} = \text{总显存} \times 0.4 $$ - 查看显存:`nvidia-smi -i 3` 5. **上下文长度** - `--max-model-len 32768`:支持最大 32K tokens 上下文 - 需确认模型原生支持该长度 6. **推理增强** - `--enable-reasoning`:启用推理优化 - `--reasoning-parser deepseek_r1`:使用 DeepSeek 的解析器 - 注意:需 vLLM ≥ 0.4.0 支持[^1] ### 常见问题排查 1. **模型加载失败** ```bash # 手动下载模型 huggingface-cli download Qwen/Qwen3-Embedding-0.6B --local-dir ./Qwen3-Embedding-0.6B ``` 2. **端口冲突** ```bash # 查看端口占用 sudo lsof -i :8080 ``` 3. **显存不足** ```bash # 调整利用率系数 --gpu-memory-utilization 0.3 ``` ### 服务调用示例 ```python from openai import OpenAI client = OpenAI(base_url="http://localhost:8080/v1", api_key="EMPTY") # 获取嵌入向量 response = client.embeddings.create( model="Qwen3-Embedding-0.6B", input="大模型部署指南", encoding_format="float" ) print(response.data[0].embedding[:5]) # 输出前5维向量 ``` ### 性能优化建议 1. 启用连续批处理:添加 `--enforce-eager` 减少内存碎片 2. 量化部署:使用 AWQ 量化降低显存需求 ```bash --quantization awq --dtype half ``` 3. 监控 GPU 使用:`watch -n 1 nvidia-smi -i 3` > 注:`--enable-reasoning` 参数需要 vLLM 0.4.0+ 支持增强推理功能,如遇报错请升级 vLLM:`pip install -U vllm`[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值