Skip to content

Commit f4a206c

Browse files
committed
Merge branch 'luka/lora-passing' into blockwise-quant-rms-norm
2 parents b2e2251 + 06579f9 commit f4a206c

File tree

185 files changed

+4167
-5197
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

185 files changed

+4167
-5197
lines changed

.buildkite/lm-eval-harness/configs/Meta-Llama-4-Maverick-17B-128E-Instruct-FP8.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ tasks:
88
value: 0.80
99
limit: 250 # will run on 250 * 14 subjects = 3500 samples
1010
num_fewshot: 5
11+
rtol: 0.05
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Meta-Llama-4-Maverick-17B-128E-Instruct-FP8.yaml

.buildkite/lm-eval-harness/test_lm_eval_correctness.py

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,40 @@
99
--tp-size=1
1010
"""
1111

12+
import os
13+
from contextlib import contextmanager
14+
1215
import lm_eval
1316
import numpy as np
1417
import yaml
1518

16-
RTOL = 0.08
19+
DEFAULT_RTOL = 0.08
20+
21+
22+
@contextmanager
23+
def scoped_env_vars(new_env: dict[str, str]):
24+
if not new_env:
25+
# Fast path: nothing to do
26+
yield
27+
return
28+
29+
old_values = {}
30+
new_keys = []
31+
32+
try:
33+
for key, value in new_env.items():
34+
if key in os.environ:
35+
old_values[key] = os.environ[key]
36+
else:
37+
new_keys.append(key)
38+
os.environ[key] = str(value)
39+
yield
40+
finally:
41+
# Restore / clean up
42+
for key, value in old_values.items():
43+
os.environ[key] = value
44+
for key in new_keys:
45+
os.environ.pop(key, None)
1746

1847

1948
def launch_lm_eval(eval_config, tp_size):
@@ -32,23 +61,26 @@ def launch_lm_eval(eval_config, tp_size):
3261
f"trust_remote_code={trust_remote_code},"
3362
f"max_model_len={max_model_len},"
3463
)
35-
results = lm_eval.simple_evaluate(
36-
model=backend,
37-
model_args=model_args,
38-
tasks=[task["name"] for task in eval_config["tasks"]],
39-
num_fewshot=eval_config["num_fewshot"],
40-
limit=eval_config["limit"],
41-
# TODO(yeq): using chat template w/ fewshot_as_multiturn is supposed help
42-
# text models. however, this is regressing measured strict-match for
43-
# existing text models in CI, so only apply it for mm, or explicitly set
44-
apply_chat_template=eval_config.get(
45-
"apply_chat_template", backend == "vllm-vlm"
46-
),
47-
fewshot_as_multiturn=eval_config.get("fewshot_as_multiturn", False),
48-
# Forward decoding and early-stop controls (e.g., max_gen_toks, until=...)
49-
gen_kwargs=eval_config.get("gen_kwargs"),
50-
batch_size=batch_size,
51-
)
64+
65+
env_vars = eval_config.get("env_vars", None)
66+
with scoped_env_vars(env_vars):
67+
results = lm_eval.simple_evaluate(
68+
model=backend,
69+
model_args=model_args,
70+
tasks=[task["name"] for task in eval_config["tasks"]],
71+
num_fewshot=eval_config["num_fewshot"],
72+
limit=eval_config["limit"],
73+
# TODO(yeq): using chat template w/ fewshot_as_multiturn is supposed help
74+
# text models. however, this is regressing measured strict-match for
75+
# existing text models in CI, so only apply it for mm, or explicitly set
76+
apply_chat_template=eval_config.get(
77+
"apply_chat_template", backend == "vllm-vlm"
78+
),
79+
fewshot_as_multiturn=eval_config.get("fewshot_as_multiturn", False),
80+
# Forward decoding and early-stop controls (e.g., max_gen_toks, until=...)
81+
gen_kwargs=eval_config.get("gen_kwargs"),
82+
batch_size=batch_size,
83+
)
5284
return results
5385

5486

@@ -57,15 +89,18 @@ def test_lm_eval_correctness_param(config_filename, tp_size):
5789

5890
results = launch_lm_eval(eval_config, tp_size)
5991

92+
rtol = eval_config.get("rtol", DEFAULT_RTOL)
93+
6094
success = True
6195
for task in eval_config["tasks"]:
6296
for metric in task["metrics"]:
6397
ground_truth = metric["value"]
6498
measured_value = results["results"][task["name"]][metric["name"]]
6599
print(
66100
f"{task['name']} | {metric['name']}: "
67-
f"ground_truth={ground_truth} | measured={measured_value}"
101+
f"ground_truth={ground_truth:.3f} | "
102+
f"measured={measured_value:.3f} | rtol={rtol}"
68103
)
69-
success = success and np.isclose(ground_truth, measured_value, rtol=RTOL)
104+
success = success and np.isclose(ground_truth, measured_value, rtol=rtol)
70105

71106
assert success

.buildkite/scripts/generate-nightly-index.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import json
1010
import sys
1111
from dataclasses import asdict, dataclass
12+
from datetime import datetime
1213
from pathlib import Path
1314
from typing import Any
1415
from urllib.parse import quote
@@ -20,6 +21,7 @@
2021

2122
INDEX_HTML_TEMPLATE = """<!DOCTYPE html>
2223
<html>
24+
<!-- {comment} -->
2325
<meta name="pypi:repository-version" content="1.0">
2426
<body>
2527
{items}
@@ -90,19 +92,22 @@ def parse_from_filename(file: str) -> WheelFileInfo:
9092
)
9193

9294

93-
def generate_project_list(subdir_names: list[str]) -> str:
95+
def generate_project_list(subdir_names: list[str], comment: str = "") -> str:
9496
"""
9597
Generate project list HTML content linking to each project & variant sub-directory.
9698
"""
9799
href_tags = []
98100
for name in sorted(subdir_names):
99101
name = name.strip("/").strip(".")
100102
href_tags.append(f' <a href="{name}/">{name}/</a><br/>')
101-
return INDEX_HTML_TEMPLATE.format(items="\n".join(href_tags))
103+
return INDEX_HTML_TEMPLATE.format(items="\n".join(href_tags), comment=comment)
102104

103105

104106
def generate_package_index_and_metadata(
105-
wheel_files: list[WheelFileInfo], wheel_base_dir: Path, index_base_dir: Path
107+
wheel_files: list[WheelFileInfo],
108+
wheel_base_dir: Path,
109+
index_base_dir: Path,
110+
comment: str = "",
106111
) -> tuple[str, str]:
107112
"""
108113
Generate package index HTML content for a specific package, linking to actual wheel files.
@@ -120,7 +125,7 @@ def generate_package_index_and_metadata(
120125
file_meta = asdict(file)
121126
file_meta["path"] = file_path_quoted
122127
metadata.append(file_meta)
123-
index_str = INDEX_HTML_TEMPLATE.format(items="\n".join(href_tags))
128+
index_str = INDEX_HTML_TEMPLATE.format(items="\n".join(href_tags), comment=comment)
124129
metadata_str = json.dumps(metadata, indent=2)
125130
return index_str, metadata_str
126131

@@ -131,6 +136,7 @@ def generate_index_and_metadata(
131136
index_base_dir: Path,
132137
default_variant: str | None = None,
133138
alias_to_default: str | None = None,
139+
comment: str = "",
134140
):
135141
"""
136142
Generate index for all wheel files.
@@ -141,6 +147,7 @@ def generate_index_and_metadata(
141147
index_base_dir (Path): Base directory to store index files.
142148
default_variant (str | None): The default variant name, if any.
143149
alias_to_default (str | None): Alias variant name for the default variant, if any.
150+
comment (str | None): Optional comment to include in the generated HTML files.
144151
145152
First, parse all wheel files to extract metadata.
146153
We need to collect all wheel files for each variant, and generate an index for it (in a sub-directory).
@@ -234,6 +241,10 @@ def generate_index_and_metadata(
234241
variant_to_files[alias_to_default] = variant_to_files["default"].copy()
235242
print(f"Alias variant '{alias_to_default}' created for default variant.")
236243

244+
# Generate comment in HTML header
245+
comment_str = f" ({comment})" if comment else ""
246+
comment_tmpl = f"Generated on {datetime.now().isoformat()}{comment_str}"
247+
237248
# Generate index for each variant
238249
subdir_names = set()
239250
for variant, files in variant_to_files.items():
@@ -253,7 +264,7 @@ def generate_index_and_metadata(
253264
subdir_names = subdir_names.union(packages)
254265
else:
255266
# generate project list for this variant directly
256-
project_list_str = generate_project_list(sorted(packages))
267+
project_list_str = generate_project_list(sorted(packages), comment_tmpl)
257268
with open(variant_dir / "index.html", "w") as f:
258269
f.write(project_list_str)
259270

@@ -263,15 +274,15 @@ def generate_index_and_metadata(
263274
package_dir = variant_dir / package
264275
package_dir.mkdir(parents=True, exist_ok=True)
265276
index_str, metadata_str = generate_package_index_and_metadata(
266-
package_files, wheel_base_dir, package_dir
277+
package_files, wheel_base_dir, package_dir, comment
267278
)
268279
with open(package_dir / "index.html", "w") as f:
269280
f.write(index_str)
270281
with open(package_dir / "metadata.json", "w") as f:
271282
f.write(metadata_str)
272283

273284
# Generate top-level project list index
274-
project_list_str = generate_project_list(sorted(subdir_names))
285+
project_list_str = generate_project_list(sorted(subdir_names), comment_tmpl)
275286
with open(index_base_dir / "index.html", "w") as f:
276287
f.write(project_list_str)
277288

@@ -283,6 +294,7 @@ def generate_index_and_metadata(
283294
--current-objects <path_to_json> : path to JSON file containing current S3 objects listing in this version directory
284295
--output-dir <output_directory> : directory to store generated index files
285296
--alias-to-default <alias_variant_name> : (optional) alias variant name for the default variant
297+
--comment <comment_string> : (optional) comment string to include in generated HTML files
286298
"""
287299

288300
parser = argparse.ArgumentParser(
@@ -312,6 +324,12 @@ def generate_index_and_metadata(
312324
default=None,
313325
help="Alias variant name for the default variant",
314326
)
327+
parser.add_argument(
328+
"--comment",
329+
type=str,
330+
default="",
331+
help="Optional comment string to include in generated HTML files",
332+
)
315333

316334
args = parser.parse_args()
317335

@@ -366,5 +384,6 @@ def generate_index_and_metadata(
366384
index_base_dir=index_base_dir,
367385
default_variant=None,
368386
alias_to_default=args.alias_to_default,
387+
comment=args.comment.strip(),
369388
)
370389
print(f"Successfully generated index and metadata in {output_dir}")

.buildkite/scripts/hardware_ci/run-npu-test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ FROM ${BASE_IMAGE_NAME}
7474
7575
# Define environments
7676
ENV DEBIAN_FRONTEND=noninteractive
77+
ENV SOC_VERSION="ascend910b1"
7778
7879
RUN pip config set global.index-url http://cache-service-vllm.nginx-pypi-cache.svc.cluster.local:${PYPI_CACHE_PORT}/pypi/simple && \
7980
pip config set global.trusted-host cache-service-vllm.nginx-pypi-cache.svc.cluster.local && \

.buildkite/scripts/upload-wheels.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ else
8181
alias_arg=""
8282
fi
8383

84-
$PYTHON .buildkite/scripts/generate-nightly-index.py --version "$SUBPATH" --current-objects "$obj_json" --output-dir "$INDICES_OUTPUT_DIR" $alias_arg
84+
# HACK: we do not need regex module here, but it is required by pre-commit hook
85+
# To avoid any external dependency, we simply replace it back to the stdlib re module
86+
sed -i 's/import regex as re/import re/g' .buildkite/scripts/generate-nightly-index.py
87+
$PYTHON .buildkite/scripts/generate-nightly-index.py --version "$SUBPATH" --current-objects "$obj_json" --output-dir "$INDICES_OUTPUT_DIR" --comment "commit $BUILDKITE_COMMIT" $alias_arg
8588

8689
# copy indices to /<commit>/ unconditionally
8790
echo "Uploading indices to $S3_COMMIT_PREFIX"

0 commit comments

Comments
 (0)