Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Request: 请求添加类似 forward() 的API 以支持更灵活的推理和模型移植,例如 Deepseek Janus Pro #161

Open
happyme531 opened this issue Feb 2, 2025 · 1 comment

Comments

@happyme531
Copy link

我在移植Deepseek的Janus Pro 1B 多模态大模型到RK3588, ONNX CPU已经可以跑通 (https://gist.github.com/happyme531/fa6123078399e8c721f7233b205be030)
这个模型是llama架构, 可以转换, 但是有自定义的Embedding和Head层, 按道理rkllm支持输入embedding输出last hidden state其实是可以推理的, 但是还有个大问题, 目前的API只能自动运行推理, 没办法手动逐个token的运行推理来控制每次推理的输入.
希望可以加一个类似 forward() 的API解决这一问题.

(以下内容由Gemini 2.0 Flash Thinking Experimental 0121生成)
好的,没问题。为了让你的 GitHub issue 更有效,我们需要强调 forward() API 的重要性和它能解决的实际问题,以及为什么这对 rknn-llm 框架本身是有益的。

以下是一个 GitHub issue 的模板,你可以根据你的具体情况进行修改和润色:

Issue Title: Feature Request: 请求添加 forward() API 以支持更灵活的推理和模型移植,例如 Deepseek Janus

Issue Body:

尊敬的 rknn-llm 团队,

我是一名 rknn-llm 的用户,目前正在尝试将 Deepseek 的 Janus 模型移植到 rknn-llm 框架上进行推理。在移植过程中,我遇到了一个重要的功能缺失,希望能得到团队的重视和支持,并考虑添加到未来的版本中。

问题描述:

当前 rknn-llm 框架主要提供了类似 generate() 这样的高层 API,这对于快速部署和简单的文本生成任务非常方便。然而,对于一些需要更精细控制推理过程的模型,例如 Deepseek Janus,以及需要进行自定义采样策略、中间层特征提取等高级操作的场景,现有的 API 就显得不够灵活。

具体来说,Deepseek Janus 模型采用了外部的 head 和 embedding 层来处理输入输出。为了正确地移植和运行 Janus 模型,我需要能够:

  1. 获取模型中间层的输出: 在模型核心层(例如 Transformer block)推理完成后,需要拿到模型输出的 hidden states 或者 logits,以便接入外部的 head 层进行最终的输出预测。
  2. 自定义输入处理: 某些模型可能需要特殊的 embedding 处理方式,或者在输入模型之前需要进行一些预处理操作。现有的 generate() API 无法提供这种灵活性。
  3. 自定义采样策略: generate() API 通常内置了固定的采样方法(例如 greedy decoding, beam search)。在研究和实验中,我们可能需要尝试各种自定义的采样策略,例如 nucleus sampling, top-k sampling 的变体,甚至更复杂的基于强化学习的采样方法。这些都需要能够直接访问模型的原始输出,并在其基础上进行自定义操作。

建议的解决方案:

为了解决上述问题,我强烈建议 rknn-llm 框架添加一个类似 forward() 的底层 APIforward() API 的功能应该类似于 PyTorch 和 TensorFlow 等深度学习框架中的 forward 函数,即:

  • 输入: 接受模型的输入 tensor,例如 token IDs。
  • 输出: 返回模型核心层的输出 tensor,例如 hidden states 或 logits。注意,这里应该是不包含最终 head 层的原始输出。

有了 forward() API,用户就可以:

  1. 实现自定义的 head 层和 embedding 层: 可以方便地将外部定义的 head 和 embedding 层接入到 rknn-llm 推理的模型中,从而支持像 Janus 这样架构的模型。
  2. 进行中间层特征提取: 可以获取模型中间层的输出,用于模型分析、知识蒸馏、或者多模态融合等任务。
  3. 实现自定义采样策略: 可以基于 forward() API 返回的原始输出,自由地实现各种自定义的采样算法,进行更灵活的文本生成控制。
  4. 进行更细粒度的性能分析和调试: forward() API 可以帮助用户更深入地了解模型在 rknn 硬件上的运行细节,方便进行性能优化和问题排查。

为什么这个功能很重要?

添加 forward() API 对于 rknn-llm 框架来说,具有以下重要的意义:

  • 扩展模型兼容性: 能够支持更多种类的模型架构,特别是那些需要外部 head 或 embedding 层的模型,例如 Deepseek Janus 这样的混合专家模型,以及其他一些具有特殊结构的创新模型。这将显著提升 rknn-llm 的模型兼容性和应用范围。
  • 提升框架的灵活性和专业性: 从只提供高层 generate() API,到同时提供底层 forward() API,体现了 rknn-llm 框架从易用性向易用性和专业性并重的转变。这将吸引更多有经验的开发者和研究人员使用 rknn-llm 进行更高级的应用开发和研究工作。
  • 促进更广泛的生态系统发展: 更灵活的 API 将鼓励社区用户基于 rknn-llm 开发更多样化的工具和应用,例如模型分析工具、自定义推理流程、特定任务的优化库等,从而促进 rknn-llm 生态系统的繁荣发展。
  • 满足日益增长的自定义推理需求: 随着大模型技术的不断发展,用户对于推理过程的自定义需求也越来越强烈。forward() API 正是满足这种需求的必要功能,它能够帮助用户更好地驾驭大模型,发挥其更大的潜力。

总结:

我深信,添加 forward() API 将极大地增强 rknn-llm 框架的实用性和竞争力,使其能够更好地适应快速发展的大模型领域,并服务更广泛的用户群体。 我希望 rknn-llm 团队能够认真考虑这个 feature request,并尽快将其加入到开发计划中。

非常感谢 rknn-llm 团队的辛勤工作和持续付出!期待您的回复和进一步的讨论。

此致,

[你的 GitHub 用户名]

Issue 标签建议:

  • feature request
  • api
  • inference
  • customization
  • deepseek-janus (可选,如果希望更具体地关联到你的用例)

提交 Issue 前的建议:

  • 搜索已有的 Issue: 先搜索一下 rknn-llm 的 GitHub issue 列表,看看是否已经有人提出过类似的需求,避免重复提交。
  • 清晰简洁: 尽量使用清晰简洁的语言描述问题和建议,避免冗长和模糊不清的描述。
  • 礼貌和建设性: 保持礼貌和建设性的态度,感谢开发团队的工作,并强调你的建议是希望帮助框架变得更好。
  • 提供具体例子: 像你这样提到 Deepseek Janus 模型作为具体例子,能够更清晰地说明问题的场景和重要性。

希望这个模板能帮助你写出一个更有说服力的 GitHub issue,祝你的请求能够得到 rknn-llm 团队的积极响应!

@waydong
Copy link
Collaborator

waydong commented Feb 12, 2025

你好,感谢建议,后续版本会考虑。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants