forked from Karylab-cklius/vllm
Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1a763558c | ||
|
|
84aeec9f22 | ||
|
|
82a770ddbd | ||
|
|
a09a9bace1 | ||
|
|
6c20d467a2 | ||
|
|
cb59d0a351 | ||
|
|
0ab1bded36 |
@@ -29,6 +29,7 @@ PYO3_PYTHON_VERSION="${PYO3_PYTHON_VERSION:-3.12}"
|
|||||||
CARGO_SORT_VERSION_REQ="${CARGO_SORT_VERSION_REQ:-2}"
|
CARGO_SORT_VERSION_REQ="${CARGO_SORT_VERSION_REQ:-2}"
|
||||||
CARGO_DENY_VERSION_REQ="${CARGO_DENY_VERSION_REQ:-0.20}"
|
CARGO_DENY_VERSION_REQ="${CARGO_DENY_VERSION_REQ:-0.20}"
|
||||||
CARGO_NEXTEST_VERSION_REQ="${CARGO_NEXTEST_VERSION_REQ:-0.9}"
|
CARGO_NEXTEST_VERSION_REQ="${CARGO_NEXTEST_VERSION_REQ:-0.9}"
|
||||||
|
CARGO_LLVM_COV_VERSION="${CARGO_LLVM_COV_VERSION:-0.8.7}"
|
||||||
|
|
||||||
log_section() {
|
log_section() {
|
||||||
echo "--- $*"
|
echo "--- $*"
|
||||||
@@ -106,6 +107,18 @@ install_cargo_nextest() {
|
|||||||
"cargo-nextest@${CARGO_NEXTEST_VERSION_REQ}"
|
"cargo-nextest@${CARGO_NEXTEST_VERSION_REQ}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
install_cargo_llvm_cov() {
|
||||||
|
log_section "Installing cargo-llvm-cov ${CARGO_LLVM_COV_VERSION}"
|
||||||
|
local toolchain
|
||||||
|
toolchain="$(rust_toolchain)"
|
||||||
|
rustup component add --toolchain "$toolchain" llvm-tools-preview
|
||||||
|
cargo binstall \
|
||||||
|
--no-confirm \
|
||||||
|
--force \
|
||||||
|
--secure \
|
||||||
|
"cargo-llvm-cov@${CARGO_LLVM_COV_VERSION}"
|
||||||
|
}
|
||||||
|
|
||||||
install_uv() {
|
install_uv() {
|
||||||
log_section "Installing uv ${UV_VERSION}"
|
log_section "Installing uv ${UV_VERSION}"
|
||||||
curl -L --proto '=https' --tlsv1.2 -sSf \
|
curl -L --proto '=https' --tlsv1.2 -sSf \
|
||||||
@@ -176,14 +189,41 @@ run_tests() {
|
|||||||
setup_pyo3_python
|
setup_pyo3_python
|
||||||
install_cargo_binstall
|
install_cargo_binstall
|
||||||
install_cargo_nextest
|
install_cargo_nextest
|
||||||
|
install_cargo_llvm_cov
|
||||||
|
|
||||||
log_section "Running cargo nextest"
|
log_section "Running cargo nextest with Rust coverage"
|
||||||
cargo nextest run \
|
mkdir -p artifacts
|
||||||
|
export LLVM_PROFILE_FILE_NAME="vllm-rust-unit-%4m.profraw"
|
||||||
|
cargo llvm-cov clean \
|
||||||
|
--manifest-path rust/Cargo.toml \
|
||||||
|
--profraw-only
|
||||||
|
|
||||||
|
set +e
|
||||||
|
cargo llvm-cov nextest \
|
||||||
--manifest-path rust/Cargo.toml \
|
--manifest-path rust/Cargo.toml \
|
||||||
--workspace \
|
--workspace \
|
||||||
--all-features \
|
--all-features \
|
||||||
--locked \
|
--locked \
|
||||||
--no-fail-fast
|
--no-fail-fast \
|
||||||
|
--no-clean \
|
||||||
|
--lcov \
|
||||||
|
--output-path artifacts/rust-unit.lcov \
|
||||||
|
--ignore-filename-regex='/\.cargo/(registry|git)/|/rustc/|/target/'
|
||||||
|
local coverage_rc=$?
|
||||||
|
|
||||||
|
local upload_rc=0
|
||||||
|
if [[ $coverage_rc -eq 0 ]]; then
|
||||||
|
# shellcheck source=.buildkite/scripts/rust-coverage.sh
|
||||||
|
source .buildkite/scripts/rust-coverage.sh
|
||||||
|
rust_coverage_upload artifacts/rust-unit.lcov rust-unit
|
||||||
|
upload_rc=$?
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [[ $coverage_rc -ne 0 ]]; then
|
||||||
|
return "$coverage_rc"
|
||||||
|
fi
|
||||||
|
return "$upload_rc"
|
||||||
}
|
}
|
||||||
|
|
||||||
install_protoc
|
install_protoc
|
||||||
|
|||||||
@@ -0,0 +1,182 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
RUST_CODECOV_VERSION="v11.3.1"
|
||||||
|
RUST_CODECOV_SHA256="ca1d64196d2d34771084afe76ea657d581bf628e31d993ff8e52ea09cc88a56d"
|
||||||
|
|
||||||
|
rust_coverage_repo_root() {
|
||||||
|
if [ -f /vllm-workspace/.buildkite/scripts/rust-coverage.sh ]; then
|
||||||
|
printf '%s\n' /vllm-workspace
|
||||||
|
elif [ -n "${BUILDKITE_BUILD_CHECKOUT_PATH:-}" ] \
|
||||||
|
&& [ -d "$BUILDKITE_BUILD_CHECKOUT_PATH" ]; then
|
||||||
|
printf '%s\n' "$BUILDKITE_BUILD_CHECKOUT_PATH"
|
||||||
|
else
|
||||||
|
git rev-parse --show-toplevel
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
rust_coverage_start() {
|
||||||
|
RUST_COVERAGE_FLAG=${1:?coverage flag is required}
|
||||||
|
RUST_COVERAGE_DIR="/tmp/vllm-rust-coverage/${BUILDKITE_JOB_ID:-local}"
|
||||||
|
export RUST_COVERAGE_FLAG RUST_COVERAGE_DIR
|
||||||
|
mkdir -p "$RUST_COVERAGE_DIR"
|
||||||
|
LLVM_PROFILE_FILE="$RUST_COVERAGE_DIR/rust-%4m.profraw"
|
||||||
|
export LLVM_PROFILE_FILE
|
||||||
|
trap rust_coverage_finalize 0
|
||||||
|
}
|
||||||
|
|
||||||
|
rust_coverage_objects() {
|
||||||
|
rust_cov_objects_manifest="$(dirname "$(command -v llvm-cov)")/../objects"
|
||||||
|
python3 - "$rust_cov_objects_manifest" <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
import sys
|
||||||
|
|
||||||
|
for relative in Path(sys.argv[1]).read_text().splitlines():
|
||||||
|
for entry in sys.path:
|
||||||
|
path = Path(entry or ".").resolve() / relative
|
||||||
|
if path.is_file():
|
||||||
|
print(path)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise RuntimeError(f"installed Rust coverage object was not found: {relative}")
|
||||||
|
PY
|
||||||
|
}
|
||||||
|
|
||||||
|
rust_coverage_collect() {
|
||||||
|
rust_cov_collect_flag=${1:?coverage flag is required}
|
||||||
|
rust_cov_collect_lcov="$RUST_COVERAGE_DIR/$rust_cov_collect_flag.lcov"
|
||||||
|
|
||||||
|
rust_cov_collect_objects=$(rust_coverage_objects) || return 1
|
||||||
|
rust_cov_collect_primary=
|
||||||
|
set --
|
||||||
|
while IFS= read -r rust_cov_collect_object; do
|
||||||
|
if [ -z "$rust_cov_collect_primary" ]; then
|
||||||
|
rust_cov_collect_primary=$rust_cov_collect_object
|
||||||
|
else
|
||||||
|
set -- "$@" "--object=$rust_cov_collect_object"
|
||||||
|
fi
|
||||||
|
done <<EOF
|
||||||
|
$rust_cov_collect_objects
|
||||||
|
EOF
|
||||||
|
|
||||||
|
llvm-profdata merge \
|
||||||
|
-sparse \
|
||||||
|
"$RUST_COVERAGE_DIR"/*.profraw \
|
||||||
|
-o "$RUST_COVERAGE_DIR/merged.profdata" || return 1
|
||||||
|
llvm-cov export \
|
||||||
|
"$rust_cov_collect_primary" \
|
||||||
|
"$@" \
|
||||||
|
--format=lcov \
|
||||||
|
--instr-profile="$RUST_COVERAGE_DIR/merged.profdata" \
|
||||||
|
--ignore-filename-regex='/\.cargo/(registry|git)/|/rustc/|/target/' \
|
||||||
|
> "$rust_cov_collect_lcov" || return 1
|
||||||
|
RUST_COVERAGE_LCOV=$rust_cov_collect_lcov
|
||||||
|
export RUST_COVERAGE_LCOV
|
||||||
|
}
|
||||||
|
|
||||||
|
rust_coverage_upload() {
|
||||||
|
rust_cov_upload_lcov=${1:?LCOV path is required}
|
||||||
|
rust_cov_upload_flag=${2:?coverage flag is required}
|
||||||
|
rust_cov_upload_repo_root=$(rust_coverage_repo_root) || return 1
|
||||||
|
|
||||||
|
if [ "$(uname -m)" != "x86_64" ]; then
|
||||||
|
echo "Rust coverage upload currently supports x86_64 CI agents" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
rust_cov_upload_codecov_dir=$(mktemp -d /tmp/codecov-bin.XXXXXX) \
|
||||||
|
|| return 1
|
||||||
|
curl -fsSL \
|
||||||
|
"https://github.com/codecov/codecov-cli/releases/download/${RUST_CODECOV_VERSION}/codecovcli_linux" \
|
||||||
|
-o "$rust_cov_upload_codecov_dir/codecov" || return 1
|
||||||
|
echo "$RUST_CODECOV_SHA256 $rust_cov_upload_codecov_dir/codecov" \
|
||||||
|
| sha256sum -c - || return 1
|
||||||
|
chmod +x "$rust_cov_upload_codecov_dir/codecov" || return 1
|
||||||
|
|
||||||
|
rust_cov_upload_slug="vllm-project/vllm"
|
||||||
|
if [ -n "${BUILDKITE_PULL_REQUEST:-}" ] \
|
||||||
|
&& [ "${BUILDKITE_PULL_REQUEST}" != "false" ] \
|
||||||
|
&& [ -n "${BUILDKITE_PULL_REQUEST_REPO:-}" ]; then
|
||||||
|
rust_cov_upload_slug=$(echo "$BUILDKITE_PULL_REQUEST_REPO" \
|
||||||
|
| sed -E 's#(git@|https?://)([^/:]+)[:/]([^/]+/[^/.]+)(\.git)?$#\3#')
|
||||||
|
case "$rust_cov_upload_slug" in
|
||||||
|
*/*) ;;
|
||||||
|
*) rust_cov_upload_slug="vllm-project/vllm" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
rust_cov_upload_branch=${BUILDKITE_BRANCH:?BUILDKITE_BRANCH is required}
|
||||||
|
if [ -z "${CODECOV_TOKEN:-}" ]; then
|
||||||
|
# Codecov accepts tokenless public uploads on unprotected branch names.
|
||||||
|
# A colon-separated prefix keeps feature-branch and fork uploads from
|
||||||
|
# requiring a repository secret.
|
||||||
|
if [ -n "${BUILDKITE_PULL_REQUEST:-}" ] \
|
||||||
|
&& [ "${BUILDKITE_PULL_REQUEST}" != "false" ]; then
|
||||||
|
rust_cov_upload_branch="pr${BUILDKITE_PULL_REQUEST}:$rust_cov_upload_branch"
|
||||||
|
else
|
||||||
|
rust_cov_upload_branch="buildkite:$rust_cov_upload_branch"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
set --
|
||||||
|
set -- "$@" upload-process
|
||||||
|
set -- "$@" --file "$rust_cov_upload_lcov"
|
||||||
|
# LCOV paths are mapped server-side by codecov.yml. Skip the CLI's local
|
||||||
|
# source-line fix scanning, which is unrelated to path mapping.
|
||||||
|
set -- "$@" --disable-search --disable-file-fixes
|
||||||
|
set -- "$@" --fail-on-error --git-service github
|
||||||
|
set -- "$@" --build "${BUILDKITE_BUILD_NUMBER:?BUILDKITE_BUILD_NUMBER is required}"
|
||||||
|
set -- "$@" --branch "$rust_cov_upload_branch"
|
||||||
|
set -- "$@" --sha "${BUILDKITE_COMMIT:?BUILDKITE_COMMIT is required}"
|
||||||
|
set -- "$@" --slug "$rust_cov_upload_slug"
|
||||||
|
set -- "$@" --flag "$rust_cov_upload_flag"
|
||||||
|
set -- "$@" --name "${rust_cov_upload_flag}-${BUILDKITE_JOB_ID:?BUILDKITE_JOB_ID is required}"
|
||||||
|
set -- "$@" --dir "$rust_cov_upload_repo_root"
|
||||||
|
set -- "$@" --network-root-folder "$rust_cov_upload_repo_root"
|
||||||
|
if [ -n "${BUILDKITE_PULL_REQUEST:-}" ] \
|
||||||
|
&& [ "${BUILDKITE_PULL_REQUEST}" != "false" ]; then
|
||||||
|
set -- "$@" --pr "$BUILDKITE_PULL_REQUEST"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rust_cov_upload_log="$rust_cov_upload_codecov_dir/codecov.log"
|
||||||
|
# E2E steps run from tests/, so execute from the repository root to resolve
|
||||||
|
# codecov.yml and repository paths consistently.
|
||||||
|
(
|
||||||
|
cd "$rust_cov_upload_repo_root" || exit 1
|
||||||
|
"$rust_cov_upload_codecov_dir/codecov" "$@"
|
||||||
|
) >"$rust_cov_upload_log" 2>&1
|
||||||
|
rust_cov_upload_rc=$?
|
||||||
|
cat "$rust_cov_upload_log"
|
||||||
|
# v11.3.1 can log API failures while returning zero even with
|
||||||
|
# --fail-on-error. Preserve the strict CI contract explicitly.
|
||||||
|
if grep -aEq 'error.* -- ' "$rust_cov_upload_log"; then
|
||||||
|
echo "Codecov CLI reported an upload error" >&2
|
||||||
|
rust_cov_upload_rc=1
|
||||||
|
fi
|
||||||
|
rm -rf "$rust_cov_upload_codecov_dir"
|
||||||
|
return "$rust_cov_upload_rc"
|
||||||
|
}
|
||||||
|
|
||||||
|
rust_coverage_finalize() {
|
||||||
|
rust_cov_finalize_test_rc=$?
|
||||||
|
trap - 0
|
||||||
|
set +e
|
||||||
|
|
||||||
|
rust_coverage_collect "$RUST_COVERAGE_FLAG"
|
||||||
|
rust_cov_finalize_collect_rc=$?
|
||||||
|
|
||||||
|
rust_cov_finalize_upload_rc=0
|
||||||
|
if [ "$rust_cov_finalize_collect_rc" -eq 0 ]; then
|
||||||
|
rust_coverage_upload "$RUST_COVERAGE_LCOV" "$RUST_COVERAGE_FLAG"
|
||||||
|
rust_cov_finalize_upload_rc=$?
|
||||||
|
fi
|
||||||
|
|
||||||
|
find "$RUST_COVERAGE_DIR" -type f -name '*.profraw' -delete
|
||||||
|
|
||||||
|
if [ "$rust_cov_finalize_test_rc" -ne 0 ]; then
|
||||||
|
exit "$rust_cov_finalize_test_rc"
|
||||||
|
fi
|
||||||
|
if [ "$rust_cov_finalize_collect_rc" -ne 0 ]; then
|
||||||
|
exit "$rust_cov_finalize_collect_rc"
|
||||||
|
fi
|
||||||
|
exit "$rust_cov_finalize_upload_rc"
|
||||||
|
}
|
||||||
@@ -8,6 +8,11 @@ steps:
|
|||||||
working_dir: "/vllm-workspace/tests"
|
working_dir: "/vllm-workspace/tests"
|
||||||
source_file_dependencies:
|
source_file_dependencies:
|
||||||
- rust/
|
- rust/
|
||||||
|
- build_rust.sh
|
||||||
|
- tools/build_rust.py
|
||||||
|
- rust-toolchain.toml
|
||||||
|
- .buildkite/scripts/rust-coverage.sh
|
||||||
|
- codecov.yml
|
||||||
- vllm/benchmarks/
|
- vllm/benchmarks/
|
||||||
- vllm/entrypoints/openai/
|
- vllm/entrypoints/openai/
|
||||||
- vllm/entrypoints/serve/
|
- vllm/entrypoints/serve/
|
||||||
@@ -23,6 +28,7 @@ steps:
|
|||||||
- tests/entrypoints/openai/test_uds.py
|
- tests/entrypoints/openai/test_uds.py
|
||||||
- tests/v1/sample/test_logprobs_e2e.py
|
- tests/v1/sample/test_logprobs_e2e.py
|
||||||
commands:
|
commands:
|
||||||
|
- . /vllm-workspace/.buildkite/scripts/rust-coverage.sh && rust_coverage_start rust-e2e
|
||||||
- export VLLM_USE_RUST_FRONTEND=1
|
- export VLLM_USE_RUST_FRONTEND=1
|
||||||
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
||||||
- pytest -v -s benchmarks/test_serve_cli.py -k "not insecure and not (test_bench_serve and not test_bench_serve_chat)"
|
- pytest -v -s benchmarks/test_serve_cli.py -k "not insecure and not (test_bench_serve and not test_bench_serve_chat)"
|
||||||
@@ -43,6 +49,11 @@ steps:
|
|||||||
working_dir: "/vllm-workspace/tests"
|
working_dir: "/vllm-workspace/tests"
|
||||||
source_file_dependencies:
|
source_file_dependencies:
|
||||||
- rust/
|
- rust/
|
||||||
|
- build_rust.sh
|
||||||
|
- tools/build_rust.py
|
||||||
|
- rust-toolchain.toml
|
||||||
|
- .buildkite/scripts/rust-coverage.sh
|
||||||
|
- codecov.yml
|
||||||
- vllm/entrypoints/openai/
|
- vllm/entrypoints/openai/
|
||||||
- vllm/entrypoints/serve/
|
- vllm/entrypoints/serve/
|
||||||
- vllm/v1/engine/
|
- vllm/v1/engine/
|
||||||
@@ -54,6 +65,7 @@ steps:
|
|||||||
# - tests/entrypoints/serve/dev/test_sleep.py
|
# - tests/entrypoints/serve/dev/test_sleep.py
|
||||||
- tests/entrypoints/serve/tokenize/test_tokenization.py
|
- tests/entrypoints/serve/tokenize/test_tokenization.py
|
||||||
commands:
|
commands:
|
||||||
|
- . /vllm-workspace/.buildkite/scripts/rust-coverage.sh && rust_coverage_start rust-e2e
|
||||||
- export VLLM_USE_RUST_FRONTEND=1
|
- export VLLM_USE_RUST_FRONTEND=1
|
||||||
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
||||||
- PYTHONPATH=/vllm-workspace pytest -v -s entrypoints/serve/dev/rpc/test_collective_rpc.py
|
- PYTHONPATH=/vllm-workspace pytest -v -s entrypoints/serve/dev/rpc/test_collective_rpc.py
|
||||||
@@ -72,10 +84,16 @@ steps:
|
|||||||
working_dir: "/vllm-workspace/tests"
|
working_dir: "/vllm-workspace/tests"
|
||||||
source_file_dependencies:
|
source_file_dependencies:
|
||||||
- rust/
|
- rust/
|
||||||
|
- build_rust.sh
|
||||||
|
- tools/build_rust.py
|
||||||
|
- rust-toolchain.toml
|
||||||
|
- .buildkite/scripts/rust-coverage.sh
|
||||||
|
- codecov.yml
|
||||||
- vllm/entrypoints/openai/
|
- vllm/entrypoints/openai/
|
||||||
- tests/utils.py
|
- tests/utils.py
|
||||||
- tests/entrypoints/openai/correctness/test_lmeval.py
|
- tests/entrypoints/openai/correctness/test_lmeval.py
|
||||||
commands:
|
commands:
|
||||||
|
- . /vllm-workspace/.buildkite/scripts/rust-coverage.sh && rust_coverage_start rust-e2e
|
||||||
- export VLLM_USE_RUST_FRONTEND=1
|
- export VLLM_USE_RUST_FRONTEND=1
|
||||||
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
||||||
- pytest -s entrypoints/openai/correctness/test_lmeval.py::test_lm_eval_accuracy_v1_engine
|
- pytest -s entrypoints/openai/correctness/test_lmeval.py::test_lm_eval_accuracy_v1_engine
|
||||||
@@ -86,11 +104,17 @@ steps:
|
|||||||
working_dir: "/vllm-workspace/tests"
|
working_dir: "/vllm-workspace/tests"
|
||||||
source_file_dependencies:
|
source_file_dependencies:
|
||||||
- rust/
|
- rust/
|
||||||
|
- build_rust.sh
|
||||||
|
- tools/build_rust.py
|
||||||
|
- rust-toolchain.toml
|
||||||
|
- .buildkite/scripts/rust-coverage.sh
|
||||||
|
- codecov.yml
|
||||||
- vllm/entrypoints/openai/
|
- vllm/entrypoints/openai/
|
||||||
- vllm/tool_parsers/
|
- vllm/tool_parsers/
|
||||||
- tests/utils.py
|
- tests/utils.py
|
||||||
- tests/tool_use/
|
- tests/tool_use/
|
||||||
commands:
|
commands:
|
||||||
|
- . /vllm-workspace/.buildkite/scripts/rust-coverage.sh && rust_coverage_start rust-e2e
|
||||||
- export VLLM_USE_RUST_FRONTEND=1
|
- export VLLM_USE_RUST_FRONTEND=1
|
||||||
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
||||||
- pytest -v -s tool_use --ignore=tool_use/mistral --models llama3.2 -k "not test_response_format_with_tool_choice_required and not test_parallel_tool_calls_false and not test_tool_call_and_choice"
|
- pytest -v -s tool_use --ignore=tool_use/mistral --models llama3.2 -k "not test_response_format_with_tool_choice_required and not test_parallel_tool_calls_false and not test_tool_call_and_choice"
|
||||||
@@ -101,6 +125,11 @@ steps:
|
|||||||
working_dir: "/vllm-workspace/tests"
|
working_dir: "/vllm-workspace/tests"
|
||||||
source_file_dependencies:
|
source_file_dependencies:
|
||||||
- rust/
|
- rust/
|
||||||
|
- build_rust.sh
|
||||||
|
- tools/build_rust.py
|
||||||
|
- rust-toolchain.toml
|
||||||
|
- .buildkite/scripts/rust-coverage.sh
|
||||||
|
- codecov.yml
|
||||||
- vllm/distributed/
|
- vllm/distributed/
|
||||||
- vllm/engine/
|
- vllm/engine/
|
||||||
- vllm/executor/
|
- vllm/executor/
|
||||||
@@ -111,6 +140,7 @@ steps:
|
|||||||
- tests/v1/distributed/test_hybrid_lb_dp.py
|
- tests/v1/distributed/test_hybrid_lb_dp.py
|
||||||
- tests/v1/distributed/test_internal_lb_dp.py
|
- tests/v1/distributed/test_internal_lb_dp.py
|
||||||
commands:
|
commands:
|
||||||
|
- . /vllm-workspace/.buildkite/scripts/rust-coverage.sh && rust_coverage_start rust-e2e
|
||||||
- export VLLM_USE_RUST_FRONTEND=1
|
- export VLLM_USE_RUST_FRONTEND=1
|
||||||
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
||||||
- export NCCL_CUMEM_HOST_ENABLE=0
|
- export NCCL_CUMEM_HOST_ENABLE=0
|
||||||
|
|||||||
@@ -26,5 +26,7 @@ steps:
|
|||||||
- rust-toolchain.toml
|
- rust-toolchain.toml
|
||||||
- .buildkite/test_areas/rust_frontend_cargo.yaml
|
- .buildkite/test_areas/rust_frontend_cargo.yaml
|
||||||
- .buildkite/scripts/run-rust-frontend-cargo-ci.sh
|
- .buildkite/scripts/run-rust-frontend-cargo-ci.sh
|
||||||
|
- .buildkite/scripts/rust-coverage.sh
|
||||||
|
- codecov.yml
|
||||||
commands:
|
commands:
|
||||||
- .buildkite/scripts/run-rust-frontend-cargo-ci.sh test
|
- .buildkite/scripts/run-rust-frontend-cargo-ci.sh test
|
||||||
|
|||||||
@@ -257,3 +257,4 @@ vllm/grpc/vllm_engine_pb2.pyi
|
|||||||
|
|
||||||
# Ignore generated cpu headers
|
# Ignore generated cpu headers
|
||||||
csrc/cpu/cpu_attn_dispatch_generated.h
|
csrc/cpu/cpu_attn_dispatch_generated.h
|
||||||
|
rust-coverage-tools/
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
REPO_ROOT="$(cd "$(dirname "$0")" && pwd)"
|
REPO_ROOT="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
CARGO_LLVM_COV_VERSION="0.8.7"
|
||||||
|
COVERAGE_TOOLS_DIR="$REPO_ROOT/rust-coverage-tools"
|
||||||
|
|
||||||
# Read the required toolchain from rust-toolchain.toml.
|
# Read the required toolchain from rust-toolchain.toml.
|
||||||
TOOLCHAIN=$(grep '^channel' "$REPO_ROOT/rust-toolchain.toml" | sed 's/.*= *"\(.*\)"/\1/')
|
TOOLCHAIN=$(grep '^channel' "$REPO_ROOT/rust-toolchain.toml" | sed 's/.*= *"\(.*\)"/\1/')
|
||||||
@@ -30,4 +32,39 @@ else
|
|||||||
PROFILE_ARG="--release"
|
PROFILE_ARG="--release"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
rm -rf "$COVERAGE_TOOLS_DIR"
|
||||||
|
mkdir -p "$COVERAGE_TOOLS_DIR/bin" "$COVERAGE_TOOLS_DIR/lib"
|
||||||
|
|
||||||
|
if [[ "${VLLM_RUST_COVERAGE:-0}" == "1" ]]; then
|
||||||
|
# rustc wrapper flags are invisible to Cargo's normal fingerprinting.
|
||||||
|
# Keep instrumented intermediates isolated when local builds switch modes.
|
||||||
|
export CARGO_TARGET_DIR="$REPO_ROOT/rust/target/coverage"
|
||||||
|
rustup component add --toolchain "$TOOLCHAIN" llvm-tools-preview
|
||||||
|
cargo +"$TOOLCHAIN" install \
|
||||||
|
--locked \
|
||||||
|
--version "$CARGO_LLVM_COV_VERSION" \
|
||||||
|
cargo-llvm-cov
|
||||||
|
|
||||||
|
eval "$(
|
||||||
|
cargo +"$TOOLCHAIN" llvm-cov show-env \
|
||||||
|
--manifest-path "$REPO_ROOT/rust/Cargo.toml" \
|
||||||
|
--sh
|
||||||
|
)"
|
||||||
|
|
||||||
|
# Build scripts and proc macros can run during compilation. Their profiles
|
||||||
|
# are unrelated to runtime coverage and would otherwise pollute the tree.
|
||||||
|
export LLVM_PROFILE_FILE=/dev/null
|
||||||
|
export VLLM_RUST_COVERAGE_OBJECTS="$COVERAGE_TOOLS_DIR/objects"
|
||||||
|
fi
|
||||||
|
|
||||||
python3 "$REPO_ROOT/tools/build_rust.py" "$PROFILE_ARG"
|
python3 "$REPO_ROOT/tools/build_rust.py" "$PROFILE_ARG"
|
||||||
|
|
||||||
|
if [[ "${VLLM_RUST_COVERAGE:-0}" == "1" ]]; then
|
||||||
|
LLVM_BIN_DIR="$(dirname "$(rustup run "$TOOLCHAIN" rustc \
|
||||||
|
--print target-libdir)")/bin"
|
||||||
|
|
||||||
|
cp "$LLVM_BIN_DIR"/{llvm-cov,llvm-profdata} "$COVERAGE_TOOLS_DIR/bin/"
|
||||||
|
chmod 0755 "$COVERAGE_TOOLS_DIR/bin/"*
|
||||||
|
cp -L "$LLVM_BIN_DIR"/../lib/libLLVM.so* "$COVERAGE_TOOLS_DIR/lib/"
|
||||||
|
chmod 0644 "$COVERAGE_TOOLS_DIR/lib/"*
|
||||||
|
fi
|
||||||
|
|||||||
+13
@@ -10,3 +10,16 @@ fixes:
|
|||||||
- "/usr/local/lib/python3.*/site-packages/vllm/::vllm/"
|
- "/usr/local/lib/python3.*/site-packages/vllm/::vllm/"
|
||||||
- "/usr/lib/python3.*/dist-packages/vllm/::vllm/"
|
- "/usr/lib/python3.*/dist-packages/vllm/::vllm/"
|
||||||
- "/usr/lib/python3.*/site-packages/vllm/::vllm/"
|
- "/usr/lib/python3.*/site-packages/vllm/::vllm/"
|
||||||
|
# Map Rust sources built in the E2E image and on Buildkite agents.
|
||||||
|
- "/workspace/rust/::rust/"
|
||||||
|
- "/var/lib/buildkite-agent/.*/rust/::rust/"
|
||||||
|
|
||||||
|
flags:
|
||||||
|
rust-unit:
|
||||||
|
paths:
|
||||||
|
- rust/
|
||||||
|
carryforward: false
|
||||||
|
rust-e2e:
|
||||||
|
paths:
|
||||||
|
- rust/
|
||||||
|
carryforward: false
|
||||||
|
|||||||
@@ -294,6 +294,9 @@ FROM base AS rust-build
|
|||||||
ARG BUILD_OS
|
ARG BUILD_OS
|
||||||
ARG USE_SCCACHE
|
ARG USE_SCCACHE
|
||||||
ARG SCCACHE_ENDPOINT
|
ARG SCCACHE_ENDPOINT
|
||||||
|
# Temporary default for the initial CI validation. Set this back to 0 when
|
||||||
|
# ci-infra passes VLLM_RUST_COVERAGE=1 explicitly.
|
||||||
|
ARG VLLM_RUST_COVERAGE=1
|
||||||
|
|
||||||
# Install native tools needed only for Rust/protoc builds.
|
# Install native tools needed only for Rust/protoc builds.
|
||||||
RUN if [ "${BUILD_OS}" = "manylinux" ]; then \
|
RUN if [ "${BUILD_OS}" = "manylinux" ]; then \
|
||||||
@@ -902,6 +905,14 @@ COPY ./vllm/collect_env.py .
|
|||||||
# note that this uses vllm installed by `pip`
|
# note that this uses vllm installed by `pip`
|
||||||
FROM vllm-base AS test
|
FROM vllm-base AS test
|
||||||
|
|
||||||
|
COPY --from=rust-build \
|
||||||
|
/workspace/rust-coverage-tools/ \
|
||||||
|
/opt/vllm-rust-coverage/
|
||||||
|
|
||||||
|
ENV PATH=/opt/vllm-rust-coverage/bin:${PATH}
|
||||||
|
ENV LD_LIBRARY_PATH=/opt/vllm-rust-coverage/lib:${LD_LIBRARY_PATH}
|
||||||
|
ENV LLVM_PROFILE_FILE=/dev/null
|
||||||
|
|
||||||
ADD . /vllm-workspace/
|
ADD . /vllm-workspace/
|
||||||
|
|
||||||
ARG PYTHON_VERSION
|
ARG PYTHON_VERSION
|
||||||
|
|||||||
@@ -46,6 +46,9 @@
|
|||||||
"TORCH_CUDA_ARCH_LIST": {
|
"TORCH_CUDA_ARCH_LIST": {
|
||||||
"default": "7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0"
|
"default": "7.5 8.0 8.6 8.9 9.0 10.0 11.0 12.0"
|
||||||
},
|
},
|
||||||
|
"VLLM_RUST_COVERAGE": {
|
||||||
|
"default": "1"
|
||||||
|
},
|
||||||
"MAX_JOBS": {
|
"MAX_JOBS": {
|
||||||
"default": "2"
|
"default": "2"
|
||||||
},
|
},
|
||||||
|
|||||||
+20
-1
@@ -36,6 +36,22 @@ def rust_extensions(*, optional: bool = False) -> list[RustExtension]:
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def write_coverage_objects(extensions: list[RustExtension], output: Path) -> None:
|
||||||
|
artifacts = []
|
||||||
|
for extension in extensions:
|
||||||
|
for target in sorted(set(extension.target.values())):
|
||||||
|
target_path = ROOT_DIR.joinpath(*target.split("."))
|
||||||
|
if extension.binding == Binding.Exec:
|
||||||
|
matches = [target_path]
|
||||||
|
else:
|
||||||
|
matches = sorted(target_path.parent.glob(f"{target_path.name}*.so"))
|
||||||
|
if len(matches) != 1 or not matches[0].is_file():
|
||||||
|
raise RuntimeError(f"unable to locate Rust artifact for {target}")
|
||||||
|
artifacts.append(matches[0].relative_to(ROOT_DIR).as_posix())
|
||||||
|
|
||||||
|
output.write_text("\n".join(artifacts) + "\n")
|
||||||
|
|
||||||
|
|
||||||
def rust_py_extension_module_names() -> list[str]:
|
def rust_py_extension_module_names() -> list[str]:
|
||||||
module_names = []
|
module_names = []
|
||||||
for extension in rust_extensions():
|
for extension in rust_extensions():
|
||||||
@@ -52,12 +68,15 @@ def rust_py_extension_module_names() -> list[str]:
|
|||||||
def build_binary(build_rust_args: list[str]) -> None:
|
def build_binary(build_rust_args: list[str]) -> None:
|
||||||
os.chdir(ROOT_DIR)
|
os.chdir(ROOT_DIR)
|
||||||
(ROOT_DIR / "vllm").mkdir(exist_ok=True)
|
(ROOT_DIR / "vllm").mkdir(exist_ok=True)
|
||||||
|
extensions = rust_extensions(optional=False)
|
||||||
setup(
|
setup(
|
||||||
name="vllm-rust-frontend-build",
|
name="vllm-rust-frontend-build",
|
||||||
packages=[],
|
packages=[],
|
||||||
rust_extensions=rust_extensions(optional=False),
|
rust_extensions=extensions,
|
||||||
script_args=["build_rust", "--quiet", "--inplace", *build_rust_args],
|
script_args=["build_rust", "--quiet", "--inplace", *build_rust_args],
|
||||||
)
|
)
|
||||||
|
if output := os.getenv("VLLM_RUST_COVERAGE_OBJECTS"):
|
||||||
|
write_coverage_objects(extensions, Path(output))
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user