Skip to content

Commit a2687d2

Browse files
committed
chore: cleanups
Signed-off-by: Alexandre Milesi <milesial@users.noreply.github.com>
1 parent b0221bb commit a2687d2

File tree

7 files changed

+59
-22
lines changed

7 files changed

+59
-22
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/llm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ dialoguer = { version = "0.11", default-features = false, features = [
9898

9999
# block_manager
100100
aligned-vec = { version = "0.6.4", optional = true }
101-
nixl-sys = { version = "0.7", optional = true }
101+
nixl-sys = { version = "=0.7.0", optional = true }
102102
cudarc = { workspace = true, optional = true }
103103
nix = { version = "0.26", optional = true }
104104

lib/llm/src/mocker/engine.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ impl AsyncEngine<SingleIn<PreprocessedRequest>, ManyOut<LLMEngineOutput>, Error>
228228
input: SingleIn<PreprocessedRequest>,
229229
) -> Result<ManyOut<LLMEngineOutput>, Error> {
230230
let (request, ctx) = input.into_parts();
231-
println!("request: {request:?}");
232231

233232
// Extract dp_rank from request field (defaults to 0 if not set)
234233
let dp_rank = request.dp_rank.unwrap_or(0);

lib/llm/src/preprocessor.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use tracing;
2828

2929
use crate::model_card::{ModelDeploymentCard, ModelInfo};
3030
#[cfg(feature = "media-nixl")]
31-
use crate::preprocessor::media::{MediaDecoder, MediaLoader, MediaFetcher};
31+
use crate::preprocessor::media::{MediaDecoder, MediaFetcher, MediaLoader};
3232
use crate::preprocessor::prompt::OAIChatLikeRequest;
3333
use crate::protocols::common::preprocessor::{
3434
MultimodalData, MultimodalDataMap, PreprocessedRequestBuilder,
@@ -145,8 +145,13 @@ impl OpenAIPreprocessor {
145145

146146
// // Initialize runtime config from the ModelDeploymentCard
147147
let runtime_config = mdc.runtime_config.clone();
148+
148149
#[cfg(feature = "media-nixl")]
149-
let media_loader = Some(MediaLoader::new(MediaDecoder::default(), MediaFetcher::default())?);
150+
let media_loader = match mdc.media_decoder {
151+
Some(media_decoder) => Some(MediaLoader::new(media_decoder, mdc.media_fetcher)?),
152+
None => None,
153+
};
154+
150155
Ok(Arc::new(Self {
151156
formatter,
152157
tokenizer,
@@ -284,7 +289,8 @@ impl OpenAIPreprocessor {
284289
let message_count = messages.len().unwrap_or(0);
285290
let mut media_map: MultimodalDataMap = HashMap::new();
286291
#[cfg(feature = "media-nixl")]
287-
let mut fetch_tasks: Vec<(String, ChatCompletionRequestUserMessageContentPart)> = Vec::new();
292+
let mut fetch_tasks: Vec<(String, ChatCompletionRequestUserMessageContentPart)> =
293+
Vec::new();
288294

289295
for idx in 0..message_count {
290296
let msg = messages

lib/llm/src/preprocessor/media/README.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,39 @@
33

44
This component performs media download, base64 decoding, media decoding and NIXL registration. Today, this is used in the OpenAI preprocessor, to transform multimodal inputs (image_url, video_url, audio_url) into fully decoded data (pixel values, ...) accessible to the backends via NIXL.
55

6+
## Usage
7+
8+
Media decoding is enabled when registering the MDC:
9+
10+
Set HTTP download options:
11+
12+
```python
13+
from dynamo.llm import MediaFetcher
14+
fetcher = MediaFetcher()
15+
fetcher.user_agent("dynamo")
16+
fetcher.timeout_ms(15000)
17+
fetcher.allow_direct_ip(True)
18+
fetcher.allow_direct_port(False)
19+
fetcher.allowed_media_domains(["google.com"])
20+
```
21+
22+
Set media decoding options:
23+
24+
```python
25+
from dynamo.llm import MediaDecoder
26+
decoder = MediaDecoder()
27+
decoder.image_decoder({"max_image_width": 4096, "max_image_height": 4096, "max_alloc": 16*1024*1024})
28+
```
29+
30+
And register the LLM as usual, adding the media configuration:
31+
32+
```python
33+
register_llm(
34+
...,
35+
media_decoder=decoder,
36+
media_fetcher=fetcher,
37+
)
38+
```
639

740

841
## TODOs
@@ -25,5 +58,6 @@ This component performs media download, base64 decoding, media decoding and NIXL
2558
- [ ] Memory spilling to lower storage tiers
2659
- [ ] Early-free memory on client notifications
2760

28-
### Observability
61+
### Misc
2962
- [ ] Observability on performance, memory usage and input distributions
63+
- [ ] Per-request decoding options

lib/llm/src/preprocessor/media/loader.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,15 @@ use anyhow::Result;
88

99
use dynamo_async_openai::types::ChatCompletionRequestUserMessageContentPart;
1010

11-
use super::decoders::{MediaDecoder};
11+
use super::decoders::MediaDecoder;
1212
use super::rdma::RdmaMediaDataDescriptor;
1313

1414
#[cfg(feature = "media-nixl")]
1515
use {
16-
super::rdma::get_nixl_agent,
16+
super::common::EncodedMediaData, super::decoders::Decoder, super::rdma::get_nixl_agent,
1717
dynamo_memory::nixl::NixlAgent,
18-
super::common::EncodedMediaData,
19-
super::decoders::Decoder
2018
};
2119

22-
2320
const DEFAULT_HTTP_USER_AGENT: &str = "dynamo-ai/dynamo";
2421
const DEFAULT_HTTP_TIMEOUT: Duration = Duration::from_secs(30);
2522

@@ -55,8 +52,9 @@ pub struct MediaLoader {
5552
}
5653

5754
impl MediaLoader {
58-
pub fn new(media_decoder: MediaDecoder, media_fetcher: MediaFetcher) -> Result<Self> {
59-
let mut http_client_builder =
55+
pub fn new(media_decoder: MediaDecoder, media_fetcher: Option<MediaFetcher>) -> Result<Self> {
56+
let media_fetcher = media_fetcher.unwrap_or_default();
57+
let mut http_client_builder: reqwest::ClientBuilder =
6058
reqwest::Client::builder().user_agent(&media_fetcher.user_agent);
6159

6260
if let Some(timeout) = media_fetcher.timeout {
@@ -109,7 +107,9 @@ impl MediaLoader {
109107
// TODO: request-level options
110108
) -> Result<RdmaMediaDataDescriptor> {
111109
#[cfg(not(feature = "media-nixl"))]
112-
anyhow::bail!("NIXL is not supported, cannot decode and register media data {oai_content_part:?}");
110+
anyhow::bail!(
111+
"NIXL is not supported, cannot decode and register media data {oai_content_part:?}"
112+
);
113113

114114
#[cfg(feature = "media-nixl")]
115115
{
@@ -133,11 +133,9 @@ impl MediaLoader {
133133
_ => anyhow::bail!("Unsupported media type"),
134134
};
135135

136-
137136
let rdma_descriptor = decoded.into_rdma_descriptor(&self.nixl_agent)?;
138137
Ok(rdma_descriptor)
139138
}
140-
141139
}
142140
}
143141

@@ -225,7 +223,7 @@ mod tests_non_nixl {
225223
allow_direct_ip: false,
226224
..Default::default()
227225
};
228-
let loader = MediaLoader::new(MediaDecoder::default(), fetcher).unwrap();
226+
let loader = MediaLoader::new(MediaDecoder::default(), Some(fetcher)).unwrap();
229227

230228
let url = url::Url::parse("http://192.168.1.1/image.jpg").unwrap();
231229
let result = loader.check_if_url_allowed(&url);
@@ -245,7 +243,7 @@ mod tests_non_nixl {
245243
allow_direct_port: false,
246244
..Default::default()
247245
};
248-
let loader = MediaLoader::new(MediaDecoder::default(), fetcher).unwrap();
246+
let loader = MediaLoader::new(MediaDecoder::default(), Some(fetcher)).unwrap();
249247

250248
let url = url::Url::parse("http://example.com:8080/image.jpg").unwrap();
251249
let result = loader.check_if_url_allowed(&url);
@@ -269,7 +267,7 @@ mod tests_non_nixl {
269267
allowed_media_domains: Some(allowed_domains),
270268
..Default::default()
271269
};
272-
let loader = MediaLoader::new(MediaDecoder::default(), fetcher).unwrap();
270+
let loader = MediaLoader::new(MediaDecoder::default(), Some(fetcher)).unwrap();
273271

274272
// Allowed domain should pass
275273
let url = url::Url::parse("https://trusted.com/image.jpg").unwrap();

lib/llm/src/preprocessor/media/rdma.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ use serde::{Deserialize, Serialize};
77

88
#[cfg(feature = "media-nixl")]
99
use {
10+
base64::{Engine as _, engine::general_purpose},
1011
dynamo_memory::SystemStorage,
1112
dynamo_memory::nixl::{self, NixlAgent, NixlDescriptor, RegisteredView},
12-
base64::{Engine as _, engine::general_purpose},
1313
std::sync::Arc,
1414
};
1515

0 commit comments

Comments
 (0)