Skip to content

Commit f3548e1

Browse files
ezrasilveraadibarracquil11
authored
feat(constants): add llm-d-vllm framework label (#524)
* feat(constants): add llm-d-vllm framework label Register the llm-d-vllm framework in FW_REGISTRY with display label "llm-d vLLM" so the InferenceX GB200 DeepSeek-V4-Pro disaggregated benchmark series is recognized as a canonical framework (FRAMEWORK_KEYS) and rendered with a proper label instead of the uppercased slug. Add a matching FRAMEWORK_LABELS assertion. Signed-off-by: Ezra Silvera <ezra@il.ibm.com> * fix(latest-images): classify llm-d as disaggregated * fix(constants): match llmd-vllm artifact key 中文:修正框架注册键,使其与产物中的 llmd-vllm 标识一致。 --------- Signed-off-by: Ezra Silvera <ezra@il.ibm.com> Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com> Co-authored-by: Cameron Quilici <cjquilici@gmail.com>
1 parent eeae452 commit f3548e1

8 files changed

Lines changed: 48 additions & 28 deletions

File tree

packages/app/src/app/api/v1/latest-images/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { cachedJson, cachedQuery } from '@/lib/api-cache';
77

88
export const dynamic = 'force-dynamic';
99

10-
const getCachedLatestImages = cachedQuery(() => getLatestImages(getDb()), 'latest-images', {
10+
const getCachedLatestImages = cachedQuery(() => getLatestImages(getDb()), 'latest-images-v2', {
1111
blobOnly: true,
1212
});
1313

packages/app/src/components/latest-image/latest-image-content.tsx

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
AGE_MAX_RED_DAYS,
2525
ageColorStyle,
2626
ageRowStyle,
27+
baseFramework,
2728
daysSince,
2829
getActualLatestTag,
2930
isOutdated,
@@ -48,14 +49,14 @@ const STRINGS = {
4849
tooltipGpuSku: 'Filter by GPU model (e.g. H200, MI300X, B200).',
4950
labelNodeType: 'Node Type',
5051
tooltipNodeType:
51-
'Single node = vLLM/SGLang/TRTLLM. Disagg = NVIDIA Dynamo or AMD Mori with separate prefill/decode pools.',
52+
'Single node = non-disaggregated serving. Disaggregated = separate prefill/decode pools, including Dynamo, Mori, and llm-d.',
5253
labelFramework: 'Framework',
5354
tooltipFramework:
54-
'Filter by inference engine (sglang, vllm, TensorRT, atom). Disagg variants (dynamo-*, mori-*) collapse into their base engine. Empty = all frameworks.',
55+
'Filter by inference engine (sglang, vllm, TensorRT, atom). Disaggregated framework variants collapse into their base engine. Empty = all frameworks.',
5556
allModels: 'All Models',
5657
all: 'All',
5758
singleNode: 'Single Node',
58-
disagg: 'Disagg (Dynamo / Mori)',
59+
disagg: 'Disaggregated',
5960
allFrameworks: 'All frameworks',
6061
thModel: 'Model',
6162
thPrecision: 'Precision',
@@ -83,14 +84,14 @@ const STRINGS = {
8384
tooltipGpuSku: '按 GPU 型号筛选(如 H200、MI300X、B200)。',
8485
labelNodeType: '节点类型',
8586
tooltipNodeType:
86-
'单节点 = vLLM/SGLang/TRTLLM。分离式 = NVIDIA Dynamo 或 AMD Mori,分开的预填充/解码池。',
87+
'单节点 = 非分离式服务。分离式 = 使用独立预填充/解码池,包括 Dynamo、Mori 和 llm-d。',
8788
labelFramework: '框架',
8889
tooltipFramework:
89-
'按推理引擎筛选(sglang、vllm、TensorRT、atom)。分离式变体(dynamo-*、mori-*)归入基础引擎。留空 = 全部框架。',
90+
'按推理引擎筛选(sglang、vllm、TensorRT、atom)。分离式框架变体归入基础引擎。留空 = 全部框架。',
9091
allModels: '全部模型',
9192
all: '全部',
9293
singleNode: '单节点',
93-
disagg: '分离式(Dynamo / Mori)',
94+
disagg: '分离式',
9495
allFrameworks: '全部框架',
9596
thModel: '模型',
9697
thPrecision: '精度',
@@ -102,26 +103,6 @@ const STRINGS = {
102103
},
103104
} as const;
104105

105-
/**
106-
* Disaggregated frameworks pair a separate prefill/decode pool — identified by
107-
* `dynamo-*` (NVIDIA Dynamo) or `mori-*` (AMD Mori) prefix on the framework key.
108-
*/
109-
function isDisaggFramework(framework: string): boolean {
110-
return framework.startsWith('dynamo-') || framework.startsWith('mori-');
111-
}
112-
113-
/**
114-
* Strip the disagg prefix to get the base engine ID. `dynamo-trt` → `trt`,
115-
* `mori-sglang` → `sglang`, plain `vllm` stays `vllm`. Used by the framework
116-
* multi-select so users pick engines (sglang / vllm / trt / atom) without
117-
* having to think about whether they're disagg variants.
118-
*/
119-
function baseFramework(framework: string): string {
120-
if (framework.startsWith('dynamo-')) return framework.slice('dynamo-'.length);
121-
if (framework.startsWith('mori-')) return framework.slice('mori-'.length);
122-
return framework;
123-
}
124-
125106
type NodeType = 'single' | 'disagg' | 'all';
126107

127108
function deriveOptions(data: LatestImageRow[]) {
@@ -192,7 +173,7 @@ export function CurrentImageContent() {
192173
if (selectedSpecMethod !== 'all' && row.spec_method !== selectedSpecMethod) return false;
193174
if (selectedHardware !== 'all' && row.hardware !== selectedHardware) return false;
194175
if (selectedNodeType !== 'all') {
195-
const disagg = isDisaggFramework(row.framework);
176+
const disagg = row.disagg;
196177
if (selectedNodeType === 'single' && disagg) return false;
197178
if (selectedNodeType === 'disagg' && !disagg) return false;
198179
}

packages/app/src/components/latest-image/latest-image-utils.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
AGE_MAX_RED_DAYS,
55
ageColorStyle,
66
ageRowStyle,
7+
baseFramework,
78
daysSince,
89
getActualLatestTag,
910
isOutdated,
@@ -111,6 +112,21 @@ describe('isOutdated', () => {
111112
});
112113
});
113114

115+
describe('baseFramework', () => {
116+
it('collapses llmd-vllm into the vLLM engine family', () => {
117+
expect(baseFramework('llmd-vllm')).toBe('vllm');
118+
});
119+
120+
it.each([
121+
['dynamo-vllm', 'vllm'],
122+
['mori-sglang', 'sglang'],
123+
['atom', 'atom'],
124+
['vllm', 'vllm'],
125+
])('maps %s to the %s engine family', (framework, expected) => {
126+
expect(baseFramework(framework)).toBe(expected);
127+
});
128+
});
129+
114130
describe('getActualLatestTag', () => {
115131
it('looks up the base framework from FRAMEWORK_TO_BASE and returns its release', () => {
116132
const releases = { vllm: 'v0.21.0', sglang: 'v0.5.12' };
@@ -120,6 +136,11 @@ describe('getActualLatestTag', () => {
120136
expect(getActualLatestTag('mori-sglang', releases)).toBe('v0.5.12');
121137
});
122138

139+
it('uses the vLLM release stream for llmd-vllm', () => {
140+
const releases = { vllm: 'v0.21.0', sglang: 'v0.5.12' };
141+
expect(getActualLatestTag('llmd-vllm', releases)).toBe('v0.21.0');
142+
});
143+
123144
it('returns null when releases is undefined (API still loading)', () => {
124145
expect(getActualLatestTag('vllm', undefined)).toBeNull();
125146
});

packages/app/src/components/latest-image/latest-image-utils.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,19 @@ export const FRAMEWORK_TO_BASE: Record<string, string> = {
77
vllm: 'vllm',
88
sglang: 'sglang',
99
'dynamo-sglang': 'sglang',
10+
'llmd-vllm': 'vllm',
1011
'mori-sglang': 'sglang',
1112
};
1213

14+
/** Collapse framework variants into the engine family used by the UI filter. */
15+
export function baseFramework(framework: string): string {
16+
const mapped = FRAMEWORK_TO_BASE[framework];
17+
if (mapped) return mapped;
18+
if (framework.startsWith('dynamo-')) return framework.slice('dynamo-'.length);
19+
if (framework.startsWith('mori-')) return framework.slice('mori-'.length);
20+
return framework;
21+
}
22+
1323
/**
1424
* Substrings that mark an image tag as unstable / pre-release. Lowercased
1525
* comparison — kept here (not inlined) so tests can re-import and stay in

packages/app/src/lib/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ export interface LatestImageRow {
320320
framework: string;
321321
precision: string;
322322
spec_method: string;
323+
disagg: boolean;
323324
isl: number;
324325
osl: number;
325326
image: string;

packages/constants/src/framework-aliases.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ describe('FRAMEWORK_LABELS', () => {
1717
it('labels the atom-disagg alias with its canonical label', () => {
1818
expect(FRAMEWORK_LABELS['atom-disagg']).toBe('Mooncake ATOMesh¹');
1919
});
20+
21+
it('labels the canonical llmd-vllm framework "llm-d vLLM"', () => {
22+
expect(FRAMEWORK_LABELS['llmd-vllm']).toBe('llm-d vLLM');
23+
});
2024
});
2125

2226
describe('MODEL_SPEC_METHOD_LABELS', () => {

packages/constants/src/framework-aliases.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const FW_REGISTRY: Record<string, FwEntry> = {
99
'dynamo-sglang': { label: 'Dynamo SGLang' },
1010
'dynamo-trt': { label: 'Dynamo TRTLLM' },
1111
'dynamo-vllm': { label: 'Dynamo vLLM' },
12+
'llmd-vllm': { label: 'llm-d vLLM' },
1213
'mooncake-atom': { label: 'Mooncake ATOMesh¹' },
1314
'mori-sglang': { label: 'MoRI SGLang' },
1415
sglang: { label: 'SGLang' },

packages/db/src/queries/latest-images.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface LatestImageRow {
66
framework: string;
77
precision: string;
88
spec_method: string;
9+
disagg: boolean;
910
isl: number;
1011
osl: number;
1112
image: string;
@@ -24,6 +25,7 @@ export async function getLatestImages(sql: DbClient): Promise<LatestImageRow[]>
2425
c.framework,
2526
c.precision,
2627
c.spec_method,
28+
c.disagg,
2729
lb.isl,
2830
lb.osl,
2931
lb.image,

0 commit comments

Comments
 (0)