Skip to content

Qwen3-VL-4B-Instruct on QAIRT 2.45: "Invalid Node IO value passed: GENIE_NODE_WILDCARD" - is deepstack actually wired? + question on Genie deprecation #335

Description

@korkland

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions