Hi,
Two related questions about the Qwen3-VL-4B-Instruct Genie bundle and the Genie
runtime direction in general. Would appreciate any clarification.
Setup
- Model: Qwen3-VL-4B-Instruct (v0.58.0 release)
- Bundle: the official prebuilt for SA8775P from HF
(qwen3_vl_4b_instruct-genie-w4a16-qualcomm_sa8775p.zip)
- Runtime: QAIRT 2.45,
genie-app -s genie-app-script.txt
1. GENIE_NODE_WILDCARD warning - is deepstack actually connected?
The genie-app-script.txt shipped inside the SA8775P bundle contains:
pipeline connect GeniePipeline imageEncoder GENIE_NODE_IMAGE_ENCODER_EMBEDDING_OUTPUT textGenerator GENIE_NODE_TEXT_GENERATOR_EMBEDDING_INPUT
pipeline connect GeniePipeline lutEncoder GENIE_NODE_TEXT_ENCODER_EMBEDDING_OUTPUT textGenerator GENIE_NODE_TEXT_GENERATOR_EMBEDDING_INPUT
pipeline connect GeniePipeline imageEncoder GENIE_NODE_WILDCARD textGenerator GENIE_NODE_WILDCARD
The third line prints in red at runtime:
Invalid Node IO value passed: GENIE_NODE_WILDCARD
Root cause on our side is clear: GENIE_NODE_WILDCARD is not in the public
GenieNode_IOName_t enum in include/Genie/GenieNode.h for QAIRT 2.45, and
genie-app's stringToNodeIO map has no such key, so it throws
std::invalid_argument. The 2.45 genie-app catches this per-line and keeps
going (2.44 did not - it would abort the script), which is why the pipeline
still runs and we still get a coherent image description.
Meanwhile the decoder graphs really do expect deepstack inputs
(we can see them in our own compile logs, and it matches your architecture):
visual_pos_masks 1,128 (or 1,1 in token stage)
deepstack_visual_embeds_0 256,2560
deepstack_visual_embeds_1 256,2560
deepstack_visual_embeds_2 256,2560
So my question is: on QAIRT 2.45, are these 4 tensors auto-wired by name
inside libGenie (WILDCARD line is just informational and safe to ignore),
or are they left unfed and effectively zeroed, meaning the deepstack
re-injection at decoder layers 0-2 is silently disabled?
If it is the latter, will proper deepstack wiring (or a real
GENIE_NODE_WILDCARD / equivalent) be supported in an upcoming Genie release?
is there a canonical way to wire them on 2.45?
We would prefer to stay on the Genie path rather than move to GenieX (see
question 2 below), so knowing this is on the Genie roadmap would help a lot.
2. Why deprecate Genie for embedded targets?
The README notes that "Genie support will be deprecated soon" in favor of
GenieX. From our perspective this feels backwards for embedded / IoT use
cases, and I'd love to understand the reasoning.
Genie today is essentially a thin C++ wrapper over QNN (the qualla layer
plus dialog/pipeline orchestration). For an embedded stack that already
links libQnnHtp and manages its own I/O, this is close to ideal:
- No extra runtime dependencies beyond QAIRT
- Small, embeddable C/C++ API surface
- Source is available, so we can trace behavior and fork behavior when needed
- Fits directly into our own scheduler / power / memory policies
GenieX on the other hand is packaged as a user-facing runtime (CLI, Python,
Kotlin/Android, Docker, OpenAI-compatible server). Its QAIRT plugin is
BSD-3-Clause which is great, but the docs show it also removes control that
raw QNN gives us today (on Android for example nGpuLayers and nCtx are
rejected, precision / context / KV size are baked in the bundle, etc.).
For a system integrator wanting to build a controllable inference layer on
Snapdragon / Dragonwing platforms, Genie's shape (a lean C++ wrapper over
QNN) is a much better starting point than GenieX. Deprecating it seems to
push everyone either onto a higher-level runtime that gives us less control,
or back to hand-rolling everything directly against QNN.
Could you share:
- The rationale behind the Genie -> GenieX transition (support burden,
architectural direction, feature parity plan?)
- Whether the Genie C++ API (or something at that level of abstraction) will
continue to be maintained for embedded / OEM use cases
- Whether the deepstack / VLM pieces that are missing on Genie 2.45 will land
in a future Genie release
Thanks!
Chen
Hi,
Two related questions about the Qwen3-VL-4B-Instruct Genie bundle and the Genie
runtime direction in general. Would appreciate any clarification.
Setup
(
qwen3_vl_4b_instruct-genie-w4a16-qualcomm_sa8775p.zip)genie-app -s genie-app-script.txt1. GENIE_NODE_WILDCARD warning - is deepstack actually connected?
The
genie-app-script.txtshipped inside the SA8775P bundle contains:The third line prints in red at runtime:
Root cause on our side is clear:
GENIE_NODE_WILDCARDis not in the publicGenieNode_IOName_tenum ininclude/Genie/GenieNode.hfor QAIRT 2.45, andgenie-app'sstringToNodeIOmap has no such key, so it throwsstd::invalid_argument. The 2.45genie-appcatches this per-line and keepsgoing (2.44 did not - it would abort the script), which is why the pipeline
still runs and we still get a coherent image description.
Meanwhile the decoder graphs really do expect deepstack inputs
(we can see them in our own compile logs, and it matches your architecture):
So my question is: on QAIRT 2.45, are these 4 tensors auto-wired by name
inside libGenie (WILDCARD line is just informational and safe to ignore),
or are they left unfed and effectively zeroed, meaning the deepstack
re-injection at decoder layers 0-2 is silently disabled?
If it is the latter, will proper deepstack wiring (or a real
GENIE_NODE_WILDCARD/ equivalent) be supported in an upcoming Genie release?is there a canonical way to wire them on 2.45?
We would prefer to stay on the Genie path rather than move to GenieX (see
question 2 below), so knowing this is on the Genie roadmap would help a lot.
2. Why deprecate Genie for embedded targets?
The README notes that "Genie support will be deprecated soon" in favor of
GenieX. From our perspective this feels backwards for embedded / IoT use
cases, and I'd love to understand the reasoning.
Genie today is essentially a thin C++ wrapper over QNN (the qualla layer
plus dialog/pipeline orchestration). For an embedded stack that already
links libQnnHtp and manages its own I/O, this is close to ideal:
GenieX on the other hand is packaged as a user-facing runtime (CLI, Python,
Kotlin/Android, Docker, OpenAI-compatible server). Its QAIRT plugin is
BSD-3-Clause which is great, but the docs show it also removes control that
raw QNN gives us today (on Android for example nGpuLayers and nCtx are
rejected, precision / context / KV size are baked in the bundle, etc.).
For a system integrator wanting to build a controllable inference layer on
Snapdragon / Dragonwing platforms, Genie's shape (a lean C++ wrapper over
QNN) is a much better starting point than GenieX. Deprecating it seems to
push everyone either onto a higher-level runtime that gives us less control,
or back to hand-rolling everything directly against QNN.
Could you share:
architectural direction, feature parity plan?)
continue to be maintained for embedded / OEM use cases
in a future Genie release
Thanks!
Chen