-
Notifications
You must be signed in to change notification settings - Fork 741
Add a generic multimodal runner #13166
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
Conversation
🔗 Helpful Links🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/13166
Note: Links to docs will display an error until the docs builds have been completed. ❌ 1 New Failure, 2 PendingAs of commit 5c0ad9b with merge base d757709 ( NEW FAILURE - The following job has failed:
This comment was automatically generated by Dr. CI and updates every 15 minutes. |
|
This pull request was exported from Phabricator. Differential Revision: D79231625 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pr not synced with internal diff so ignore these PR comments, made some comments to address internally. Otherwise looks good
Summary:
This diff adds a generic multimodal runner for Executorch. It includes changes to the `multimodal_prefiller.h` file, which adds a `prefill` method that takes an `MultimodalInput` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `MultimodalRunner` class to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop.
See diagram:
```
┌─────────────────┐
│ IRunner │
│ <<interface>> │
│ │
│ + is_loaded() │
│ + load() │
│ + generate() │
│ + stop() │
└─────────────────┘
△
│
│ implements
│
│
│
│
┌──────┴──────────┐ ┌─────────────────┐
│ TextLLMRunner │ │MultimodalRunner │
│ │ │ │
│ - tokenizer_ │ │ - tokenizer_ │
┌─────┼ - module_ │ │ - module_ ┼─────┐
│ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │
│ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │
│ │ │ │ - temperature_ │ │ - pos_ │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │
│ │ │ │TextTokenGenerat-│ │ │ │
│ │ │ │or │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ - tokenizer_* │ │ │ │
│ │ │ consists │ - text_decoder_ │ consists │ │ │
│ │ └──────────────►│ runner_ │◄───────────────┘ │ │
│ │ │ - eos_ids_ │ │ │
│ │ │ - use_kv_cache_ │ │ │
│ │ │ - stats_* │ │ │
│ │ │ │ │ │
│ │consists │ + generate() │ consists │ │
│ │ └────────┬────────┘ │ │
│ │ ┌──────────────┴───────────────┐ │ │
│ │ ▼ uses ▼ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │TextDecoderRunner│ │MultimodalDecode-│ │ │
│ │ │ │ │rRunner │ │ │
│ │ │ - module_* │ extends │ - module_* │ │ │
│ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │
│ │ │ │ │ │
│ │ + step() │ │ + step() │ │
│ │ + logits_to_ │ │ + logits_to_ │ │
│ │ token() │ │ token() │ │
│ └─────────────────┘ └─────────────────┘ │
│ ▲ ▲ │
│ │ uses │ │
│consists ├─────────────────────────────┤ │
│ ┌───────┴─────────┐ │ │
│ │ TextPrefiller │ │ consists│
│ │ │ ┌────────┴────────┐ │
│ │ - text_decoder_ │ │ MultimodalPrefi-│ │
│ │ runner_ │ │ller │ │
└────►│ - use_kv_cache_ │ │ - module_* │ │
│ - enable_ │ │ │◄────┘
│ parallel_ │ │ + prefill() │
│ prefill_ │ │ + logits_to_ │
│ │ │ token() │
│ + prefill() │ └─────────────────┘
├─────────────────┘
```
Reviewed By: jackzhxng
Differential Revision: D79231625
7508ccb to
69e5c40
Compare
|
This pull request was exported from Phabricator. Differential Revision: D79231625 |
Summary:
This diff adds a generic multimodal runner for Executorch. It includes changes to the `multimodal_prefiller.h` file, which adds a `prefill` method that takes an `MultimodalInput` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `MultimodalRunner` class to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop.
See diagram:
```
┌─────────────────┐
│ IRunner │
│ <<interface>> │
│ │
│ + is_loaded() │
│ + load() │
│ + generate() │
│ + stop() │
└─────────────────┘
△
│
│ implements
│
│
│
│
┌──────┴──────────┐ ┌─────────────────┐
│ TextLLMRunner │ │MultimodalRunner │
│ │ │ │
│ - tokenizer_ │ │ - tokenizer_ │
┌─────┼ - module_ │ │ - module_ ┼─────┐
│ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │
│ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │
│ │ │ │ - temperature_ │ │ - pos_ │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │
│ │ │ │TextTokenGenerat-│ │ │ │
│ │ │ │or │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ - tokenizer_* │ │ │ │
│ │ │ consists │ - text_decoder_ │ consists │ │ │
│ │ └──────────────►│ runner_ │◄───────────────┘ │ │
│ │ │ - eos_ids_ │ │ │
│ │ │ - use_kv_cache_ │ │ │
│ │ │ - stats_* │ │ │
│ │ │ │ │ │
│ │consists │ + generate() │ consists │ │
│ │ └────────┬────────┘ │ │
│ │ ┌──────────────┴───────────────┐ │ │
│ │ ▼ uses ▼ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │TextDecoderRunner│ │MultimodalDecode-│ │ │
│ │ │ │ │rRunner │ │ │
│ │ │ - module_* │ extends │ - module_* │ │ │
│ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │
│ │ │ │ │ │
│ │ + step() │ │ + step() │ │
│ │ + logits_to_ │ │ + logits_to_ │ │
│ │ token() │ │ token() │ │
│ └─────────────────┘ └─────────────────┘ │
│ ▲ ▲ │
│ │ uses │ │
│consists ├─────────────────────────────┤ │
│ ┌───────┴─────────┐ │ │
│ │ TextPrefiller │ │ consists│
│ │ │ ┌────────┴────────┐ │
│ │ - text_decoder_ │ │ MultimodalPrefi-│ │
│ │ runner_ │ │ller │ │
└────►│ - use_kv_cache_ │ │ - module_* │ │
│ - enable_ │ │ │◄────┘
│ parallel_ │ │ + prefill() │
│ prefill_ │ │ + logits_to_ │
│ │ │ token() │
│ + prefill() │ └─────────────────┘
├─────────────────┘
```
Differential Revision: D79231625
69e5c40 to
d7c4ad3
Compare
|
This pull request was exported from Phabricator. Differential Revision: D79231625 |
Summary: Pull Request resolved: #13166 This diff adds a generic multimodal runner for Executorch. It includes changes to the `multimodal_prefiller.h` file, which adds a `prefill` method that takes an `MultimodalInput` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `MultimodalRunner` class to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop. See diagram: ``` ┌─────────────────┐ │ IRunner │ │ <<interface>> │ │ │ │ + is_loaded() │ │ + load() │ │ + generate() │ │ + stop() │ └─────────────────┘ △ │ │ implements │ │ │ │ ┌──────┴──────────┐ ┌─────────────────┐ │ TextLLMRunner │ │MultimodalRunner │ │ │ │ │ │ - tokenizer_ │ │ - tokenizer_ │ ┌─────┼ - module_ │ │ - module_ ┼─────┐ │ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │ │ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │ │ │ │ │ - temperature_ │ │ - pos_ │ │ │ │ │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌─────────────────┐ │ │ │ │ │ │ │TextTokenGenerat-│ │ │ │ │ │ │ │or │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - tokenizer_* │ │ │ │ │ │ │ consists │ - text_decoder_ │ consists │ │ │ │ │ └──────────────►│ runner_ │◄───────────────┘ │ │ │ │ │ - eos_ids_ │ │ │ │ │ │ - use_kv_cache_ │ │ │ │ │ │ - stats_* │ │ │ │ │ │ │ │ │ │ │consists │ + generate() │ consists │ │ │ │ └────────┬────────┘ │ │ │ │ ┌──────────────┴───────────────┐ │ │ │ │ ▼ uses ▼ │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ │ │TextDecoderRunner│ │MultimodalDecode-│ │ │ │ │ │ │ │rRunner │ │ │ │ │ │ - module_* │ extends │ - module_* │ │ │ │ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │ │ │ │ │ │ │ │ │ + step() │ │ + step() │ │ │ │ + logits_to_ │ │ + logits_to_ │ │ │ │ token() │ │ token() │ │ │ └─────────────────┘ └─────────────────┘ │ │ ▲ ▲ │ │ │ uses │ │ │consists ├─────────────────────────────┤ │ │ ┌───────┴─────────┐ │ │ │ │ TextPrefiller │ │ consists│ │ │ │ ┌────────┴────────┐ │ │ │ - text_decoder_ │ │ MultimodalPrefi-│ │ │ │ runner_ │ │ller │ │ └────►│ - use_kv_cache_ │ │ - module_* │ │ │ - enable_ │ │ │◄────┘ │ parallel_ │ │ + prefill() │ │ prefill_ │ │ + logits_to_ │ │ │ │ token() │ │ + prefill() │ └─────────────────┘ ├─────────────────┘ ``` Differential Revision: D79231625
d7c4ad3 to
bf0be56
Compare
Summary:
This diff adds a generic multimodal runner for Executorch. It includes changes to the `multimodal_prefiller.h` file, which adds a `prefill` method that takes an `MultimodalInput` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `MultimodalRunner` class to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop.
See diagram:
```
┌─────────────────┐
│ IRunner │
│ <<interface>> │
│ │
│ + is_loaded() │
│ + load() │
│ + generate() │
│ + stop() │
└─────────────────┘
△
│
│ implements
│
│
│
│
┌──────┴──────────┐ ┌─────────────────┐
│ TextLLMRunner │ │MultimodalRunner │
│ │ │ │
│ - tokenizer_ │ │ - tokenizer_ │
┌─────┼ - module_ │ │ - module_ ┼─────┐
│ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │
│ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │
│ │ │ │ - temperature_ │ │ - pos_ │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │
│ │ │ │TextTokenGenerat-│ │ │ │
│ │ │ │or │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ - tokenizer_* │ │ │ │
│ │ │ consists │ - text_decoder_ │ consists │ │ │
│ │ └──────────────►│ runner_ │◄───────────────┘ │ │
│ │ │ - eos_ids_ │ │ │
│ │ │ - use_kv_cache_ │ │ │
│ │ │ - stats_* │ │ │
│ │ │ │ │ │
│ │consists │ + generate() │ consists │ │
│ │ └────────┬────────┘ │ │
│ │ ┌──────────────┴───────────────┐ │ │
│ │ ▼ uses ▼ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │TextDecoderRunner│ │MultimodalDecode-│ │ │
│ │ │ │ │rRunner │ │ │
│ │ │ - module_* │ extends │ - module_* │ │ │
│ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │
│ │ │ │ │ │
│ │ + step() │ │ + step() │ │
│ │ + logits_to_ │ │ + logits_to_ │ │
│ │ token() │ │ token() │ │
│ └─────────────────┘ └─────────────────┘ │
│ ▲ ▲ │
│ │ uses │ │
│consists ├─────────────────────────────┤ │
│ ┌───────┴─────────┐ │ │
│ │ TextPrefiller │ │ consists│
│ │ │ ┌────────┴────────┐ │
│ │ - text_decoder_ │ │ MultimodalPrefi-│ │
│ │ runner_ │ │ller │ │
└────►│ - use_kv_cache_ │ │ - module_* │ │
│ - enable_ │ │ │◄────┘
│ parallel_ │ │ + prefill() │
│ prefill_ │ │ + logits_to_ │
│ │ │ token() │
│ + prefill() │ └─────────────────┘
├─────────────────┘
```
Differential Revision: D79231625
bf0be56 to
35f273b
Compare
|
This pull request was exported from Phabricator. Differential Revision: D79231625 |
1 similar comment
|
This pull request was exported from Phabricator. Differential Revision: D79231625 |
Summary: Pull Request resolved: #13166 This diff adds a generic multimodal runner for Executorch. It includes changes to the `multimodal_prefiller.h` file, which adds a `prefill` method that takes an `MultimodalInput` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `MultimodalRunner` class to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop. See diagram: ``` ┌─────────────────┐ │ IRunner │ │ <<interface>> │ │ │ │ + is_loaded() │ │ + load() │ │ + generate() │ │ + stop() │ └─────────────────┘ △ │ │ implements │ │ │ │ ┌──────┴──────────┐ ┌─────────────────┐ │ TextLLMRunner │ │MultimodalRunner │ │ │ │ │ │ - tokenizer_ │ │ - tokenizer_ │ ┌─────┼ - module_ │ │ - module_ ┼─────┐ │ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │ │ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │ │ │ │ │ - temperature_ │ │ - pos_ │ │ │ │ │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌─────────────────┐ │ │ │ │ │ │ │TextTokenGenerat-│ │ │ │ │ │ │ │or │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - tokenizer_* │ │ │ │ │ │ │ consists │ - text_decoder_ │ consists │ │ │ │ │ └──────────────►│ runner_ │◄───────────────┘ │ │ │ │ │ - eos_ids_ │ │ │ │ │ │ - use_kv_cache_ │ │ │ │ │ │ - stats_* │ │ │ │ │ │ │ │ │ │ │consists │ + generate() │ consists │ │ │ │ └────────┬────────┘ │ │ │ │ ┌──────────────┴───────────────┐ │ │ │ │ ▼ uses ▼ │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ │ │TextDecoderRunner│ │MultimodalDecode-│ │ │ │ │ │ │ │rRunner │ │ │ │ │ │ - module_* │ extends │ - module_* │ │ │ │ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │ │ │ │ │ │ │ │ │ + step() │ │ + step() │ │ │ │ + logits_to_ │ │ + logits_to_ │ │ │ │ token() │ │ token() │ │ │ └─────────────────┘ └─────────────────┘ │ │ ▲ ▲ │ │ │ uses │ │ │consists ├─────────────────────────────┤ │ │ ┌───────┴─────────┐ │ │ │ │ TextPrefiller │ │ consists│ │ │ │ ┌────────┴────────┐ │ │ │ - text_decoder_ │ │ MultimodalPrefi-│ │ │ │ runner_ │ │ller │ │ └────►│ - use_kv_cache_ │ │ - module_* │ │ │ - enable_ │ │ │◄────┘ │ parallel_ │ │ + prefill() │ │ prefill_ │ │ + logits_to_ │ │ │ │ token() │ │ + prefill() │ └─────────────────┘ ├─────────────────┘ ``` Differential Revision: D79231625
35f273b to
990bbfb
Compare
|
This pull request was exported from Phabricator. Differential Revision: D79231625 |
Summary: Pull Request resolved: #13166 This diff adds a generic multimodal runner for Executorch. It includes changes to the `multimodal_prefiller.h` file, which adds a `prefill` method that takes an `MultimodalInput` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `MultimodalRunner` class to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop. See diagram: ``` ┌─────────────────┐ │ IRunner │ │ <<interface>> │ │ │ │ + is_loaded() │ │ + load() │ │ + generate() │ │ + stop() │ └─────────────────┘ △ │ │ implements │ │ │ │ ┌──────┴──────────┐ ┌─────────────────┐ │ TextLLMRunner │ │MultimodalRunner │ │ │ │ │ │ - tokenizer_ │ │ - tokenizer_ │ ┌─────┼ - module_ │ │ - module_ ┼─────┐ │ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │ │ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │ │ │ │ │ - temperature_ │ │ - pos_ │ │ │ │ │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌─────────────────┐ │ │ │ │ │ │ │TextTokenGenerat-│ │ │ │ │ │ │ │or │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - tokenizer_* │ │ │ │ │ │ │ consists │ - text_decoder_ │ consists │ │ │ │ │ └──────────────►│ runner_ │◄───────────────┘ │ │ │ │ │ - eos_ids_ │ │ │ │ │ │ - use_kv_cache_ │ │ │ │ │ │ - stats_* │ │ │ │ │ │ │ │ │ │ │consists │ + generate() │ consists │ │ │ │ └────────┬────────┘ │ │ │ │ ┌──────────────┴───────────────┐ │ │ │ │ ▼ uses ▼ │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ │ │TextDecoderRunner│ │MultimodalDecode-│ │ │ │ │ │ │ │rRunner │ │ │ │ │ │ - module_* │ extends │ - module_* │ │ │ │ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │ │ │ │ │ │ │ │ │ + step() │ │ + step() │ │ │ │ + logits_to_ │ │ + logits_to_ │ │ │ │ token() │ │ token() │ │ │ └─────────────────┘ └─────────────────┘ │ │ ▲ ▲ │ │ │ uses │ │ │consists ├─────────────────────────────┤ │ │ ┌───────┴─────────┐ │ │ │ │ TextPrefiller │ │ consists│ │ │ │ ┌────────┴────────┐ │ │ │ - text_decoder_ │ │ MultimodalPrefi-│ │ │ │ runner_ │ │ller │ │ └────►│ - use_kv_cache_ │ │ - module_* │ │ │ - enable_ │ │ │◄────┘ │ parallel_ │ │ + prefill() │ │ prefill_ │ │ + logits_to_ │ │ │ │ token() │ │ + prefill() │ └─────────────────┘ ├─────────────────┘ ``` Differential Revision: D79231625
168ca09 to
93f1e3d
Compare
mergennachin
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very nice!
|
We should make Llava runner use this new API as next step https://github.com/pytorch/executorch/tree/main/examples/models/llava/runner |
|
@larryliu0820 has imported this pull request. If you are a Meta employee, you can view this in D79231625. |
Summary:
This diff adds a generic multimodal runner for Executorch. It includes changes to the `image_prefiller.h` file, which adds a `prefill` method that takes an `Image` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `ImagePrefiller`, `TextPrefiller` classes to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop.
See diagram:
```
┌─────────────────┐
│ IRunner │
│ <<interface>> │
│ │
│ + is_loaded() │
│ + load() │
│ + generate() │
│ + stop() │
└─────────────────┘
△
│
│ implements
│
│
│
│
┌──────┴──────────┐ ┌─────────────────┐
│ TextLLMRunner │ │MultimodalRunner │
│ │ │ │
│ - tokenizer_ │ │ - tokenizer_ ┼───────┐
┌─────┼ - module_ │ │ - module_ ┼─────┐ │
│ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │ │
│ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │ │
│ │ │ │ - temperature_ │ │ - pos_ │ │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │ │
│ │ │ │TextTokenGenerat-│ │ │ │ │
│ │ │ │or │ │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ - tokenizer_* │ │ │ │ │
│ │ │ consists │ - text_decoder_ │ consists │ │ │ │
│ │ └──────────────►│ runner_ │◄───────────────┘ │ │ │
│ │ │ - eos_ids_ │ │ │ │
│ │ │ - use_kv_cache_ │ │ │ │
│ │ │ - stats_* │ │ │ │
│ │ │ │ │ │ │
│ │consists │ + generate() │ consists │ │ │
│ │ └────────┬────────┘ │ │ │
│ │ ┌──────────────┴───────────────┐ │ │ │
│ │ ▼ uses ▼ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │
│ │ │TextDecoderRunner│ │MultimodalTextDe-│ │ │ │
│ │ │ │ │coderRunner │ │ │ │
│ │ │ - module_* │ extends │ - module_* │ │ │ │
│ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │ │
│ │ │ │ │ │ │
│ │ + step() │ │ + step() │ │ │
│ │ + logits_to_ │ │ + logits_to_ │ │ │
│ │ token() │ │ token() │ │ │
│ └─────────────────┘ └─────────────────┘ │ │
│ ▲ ▲ │ │
│ │ uses │ │ │
│ └──────────────┬──────────────┘ │ │
│ ┌───────┴─────────┐ │ │
│ │ TextPrefiller │ │ │
│ │ │ │ │
│ │ - text_decoder_ │ │ │
│ consists │ runner_ │ consists │ │
└───────────────────►│ - use_kv_cache_ │◄──────────────────┘ │
│ - enable_ │ │
│ parallel_ │ │
│ prefill_ │ │
│ │ │
│ + prefill() │ │
└─────────────────┘ consists │
│
│
┌─────────────────┐ │
│ ImagePrefiller │ │
│ │ │
│ - module_* │ │
│ │◄──────┘
│ + prefill() │
│ + logits_to_ │
│ token() │
└─────────────────┘
```
Test Plan:
Imported from GitHub, without a `Test Plan:` line.
Rollback Plan:
Reviewed By: mergennachin
Differential Revision: D79231625
Pulled By: larryliu0820
93f1e3d to
80a87b8
Compare
Summary:
This diff adds a generic multimodal runner for Executorch. It includes changes to the `image_prefiller.h` file, which adds a `prefill` method that takes an `Image` object and returns the next token of the LLM module after prefill. It also includes changes to the `multimodal_runner.cpp` file, which implements the `MultimodalRunner` class for multimodal input and text output LLMs. The `MultimodalRunner` class uses the `ImagePrefiller`, `TextPrefiller` classes to prefill the KV cache of the model, then uses `TextTokenGenerator` to run the autoregressive generation loop.
See diagram:
```
┌─────────────────┐
│ IRunner │
│ <<interface>> │
│ │
│ + is_loaded() │
│ + load() │
│ + generate() │
│ + stop() │
└─────────────────┘
△
│
│ implements
│
│
│
│
┌──────┴──────────┐ ┌─────────────────┐
│ TextLLMRunner │ │MultimodalRunner │
│ │ │ │
│ - tokenizer_ │ │ - tokenizer_ ┼───────┐
┌─────┼ - module_ │ │ - module_ ┼─────┐ │
│ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │ │
│ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │ │
│ │ │ │ - temperature_ │ │ - pos_ │ │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │ │
│ │ │ │TextTokenGenerat-│ │ │ │ │
│ │ │ │or │ │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ - tokenizer_* │ │ │ │ │
│ │ │ consists │ - text_decoder_ │ consists │ │ │ │
│ │ └──────────────►│ runner_ │◄───────────────┘ │ │ │
│ │ │ - eos_ids_ │ │ │ │
│ │ │ - use_kv_cache_ │ │ │ │
│ │ │ - stats_* │ │ │ │
│ │ │ │ │ │ │
│ │consists │ + generate() │ consists │ │ │
│ │ └────────┬────────┘ │ │ │
│ │ ┌──────────────┴───────────────┐ │ │ │
│ │ ▼ uses ▼ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │
│ │ │TextDecoderRunner│ │MultimodalTextDe-│ │ │ │
│ │ │ │ │coderRunner │ │ │ │
│ │ │ - module_* │ extends │ - module_* │ │ │ │
│ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │ │
│ │ │ │ │ │ │
│ │ + step() │ │ + step() │ │ │
│ │ + logits_to_ │ │ + logits_to_ │ │ │
│ │ token() │ │ token() │ │ │
│ └─────────────────┘ └─────────────────┘ │ │
│ ▲ ▲ │ │
│ │ uses │ │ │
│ └──────────────┬──────────────┘ │ │
│ ┌───────┴─────────┐ │ │
│ │ TextPrefiller │ │ │
│ │ │ │ │
│ │ - text_decoder_ │ │ │
│ consists │ runner_ │ consists │ │
└───────────────────►│ - use_kv_cache_ │◄──────────────────┘ │
│ - enable_ │ │
│ parallel_ │ │
│ prefill_ │ │
│ │ │
│ + prefill() │ │
└─────────────────┘ consists │
│
│
┌─────────────────┐ │
│ ImagePrefiller │ │
│ │ │
│ - module_* │ │
│ │◄──────┘
│ + prefill() │
│ + logits_to_ │
│ token() │
└─────────────────┘
```
Pull Request resolved: #13166
Test Plan:
Imported from GitHub, without a `Test Plan:` line.
Rollback Plan:
Reviewed By: mergennachin
Differential Revision: D79231625
Pulled By: larryliu0820
|
This pull request was exported from Phabricator. Differential Revision: D79231625 |
80a87b8 to
5c0ad9b
Compare
Summary:
This diff adds a generic multimodal runner for Executorch. It includes
changes to the `image_prefiller.h` file, which adds a `prefill` method
that takes an `Image` object and returns the next token of the LLM
module after prefill. It also includes changes to the
`multimodal_runner.cpp` file, which implements the `MultimodalRunner`
class for multimodal input and text output LLMs. The `MultimodalRunner`
class uses the `ImagePrefiller`, `TextPrefiller` classes to prefill the
KV cache of the model, then uses `TextTokenGenerator` to run the
autoregressive generation loop.
See diagram:
```
┌─────────────────┐
│ IRunner │
│ <<interface>> │
│ │
│ + is_loaded() │
│ + load() │
│ + generate() │
│ + stop() │
└─────────────────┘
△
│
│ implements
│
│
│
│
┌──────┴──────────┐ ┌─────────────────┐
│ TextLLMRunner │ │MultimodalRunner │
│ │ │ │
│ - tokenizer_ │ │ - tokenizer_ ┼───────┐
┌─────┼ - module_ │ │ - module_ ┼─────┐ │
│ ┌───┼ - stats_ │ │ - stats_ ┼───┐ │ │
│ │ ┌─┼ - metadata_ │ │ - metadata_ ┼─┐ │ │ │
│ │ │ │ - temperature_ │ │ - pos_ │ │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │ │
│ │ │ │TextTokenGenerat-│ │ │ │ │
│ │ │ │or │ │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ - tokenizer_* │ │ │ │ │
│ │ │ consists │ - text_decoder_ │ consists │ │ │ │
│ │ └──────────────►│ runner_ │◄───────────────┘ │ │ │
│ │ │ - eos_ids_ │ │ │ │
│ │ │ - use_kv_cache_ │ │ │ │
│ │ │ - stats_* │ │ │ │
│ │ │ │ │ │ │
│ │consists │ + generate() │ consists │ │ │
│ │ └────────┬────────┘ │ │ │
│ │ ┌──────────────┴───────────────┐ │ │ │
│ │ ▼ uses ▼ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │
│ │ │TextDecoderRunner│ │MultimodalTextDe-│ │ │ │
│ │ │ │ │coderRunner │ │ │ │
│ │ │ - module_* │ extends │ - module_* │ │ │ │
│ └──►│ - should_stop_ │◄─────────┼ - should_stop_ │◄──┘ │ │
│ │ │ │ │ │ │
│ │ + step() │ │ + step() │ │ │
│ │ + logits_to_ │ │ + logits_to_ │ │ │
│ │ token() │ │ token() │ │ │
│ └─────────────────┘ └─────────────────┘ │ │
│ ▲ ▲ │ │
│ │ uses │ │ │
│ └──────────────┬──────────────┘ │ │
│ ┌───────┴─────────┐ │ │
│ │ TextPrefiller │ │ │
│ │ │ │ │
│ │ - text_decoder_ │ │ │
│ consists │ runner_ │ consists │ │
└───────────────────►│ - use_kv_cache_ │◄──────────────────┘ │
│ - enable_ │ │
│ parallel_ │ │
│ prefill_ │ │
│ │ │
│ + prefill() │ │
└─────────────────┘ consists │
│
│
┌─────────────────┐ │
│ ImagePrefiller │ │
│ │ │
│ - module_* │ │
│ │◄──────┘
│ + prefill() │
│ + logits_to_ │
│ token() │
└─────────────────┘
```
Differential Revision: D79231625
Summary:
This diff adds a generic multimodal runner for Executorch. It includes changes to the
image_prefiller.hfile, which adds aprefillmethod that takes anImageobject and returns the next token of the LLM module after prefill. It also includes changes to themultimodal_runner.cppfile, which implements theMultimodalRunnerclass for multimodal input and text output LLMs. TheMultimodalRunnerclass uses theImagePrefiller,TextPrefillerclasses to prefill the KV cache of the model, then usesTextTokenGeneratorto run the autoregressive generation loop.See diagram:
Differential Revision: D79231625