Skip to content

Commit f902c82

Browse files
SimonYansenZhaods-wookmiguelgfierroYinchaochenanargyri
authored
Merge fix on empty secrets to make it in effect (#2335)
* refactor: migrate vae pytorch Signed-off-by: ds-wook <leewook94@gmail.com> * refactor: optimize gpu calculation Signed-off-by: ds-wook <leewook94@gmail.com> * refactor: rebuild multi vae tensorflow to pytorch Signed-off-by: ds-wook <leewook94@gmail.com> * fix: rewrite multi vae Signed-off-by: ds-wook <leewook94@gmail.com> * Update doc for GitHub Actions runner setup (#2306) Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Translate NCF model from TensorFlow to PyTorch Rewrite ncf_singlenode.py from TF v1 (sessions, placeholders, tf_slim) to PyTorch (nn.Module). All weight initializations match TF defaults: truncated_normal(std=0.01) for embeddings, xavier_uniform for dense layers, no bias on output layer. Adam optimizer and BCELoss use identical defaults. Update unit tests, quickstart notebook, deep dive notebook and NNI notebook to use PyTorch imports. Dataset module (dataset.py) is unchanged as it has no TF dependency. Metrics on MovieLens 100k (seed=42, 50 epochs) are within ~4% of TF reference, explained entirely by different RNG sequences between frameworks. Training loss converges to the same value (0.2315 vs 0.2323). Signed-off-by: miguelgfierro <miguelgfierro@users.noreply.github.com> * refactor: change model parameter & arch Signed-off-by: ds-wook <leewook94@gmail.com> * Detect and re-download corrupt zip files in maybe_download A partial download that gets interrupted leaves a truncated zip file on disk. On retry, maybe_download sees the file exists and skips the download, causing BadZipFile errors that persist across all retries. Add is_valid_zip() to validate existing zip files before skipping the download. If the file is corrupt, delete it and re-download. Signed-off-by: miguelgfierro <miguelgfierro@users.noreply.github.com> * fix: switched both notebooks from map_at_k to map Signed-off-by: ds-wook <leewook94@gmail.com> * Fix by_threshold relevancy method to filter by score, not count The relevancy_method='by_threshold' branch in merge_ranking_true_pred was passing `threshold` as the `k` argument to get_top_k_items, so the threshold value silently became a top-N count instead of a score cutoff. Combined with metrics that divide by `k` (precision_at_k, ndcg_at_k, map, map_at_k, ...), this let the resulting metric exceed 1, which is mathematically impossible for these definitions. Now `by_threshold` filters predictions to rows with col_prediction >= threshold and then applies the standard top-k cutoff. Hits are bounded by k, so metrics stay in [0, 1]. Also clarifies the `threshold` docstring on every metric that exposes the parameter so users can tell it is a score cutoff rather than a count of items. Adds a regression test covering three cases: 1. Threshold above all scores -> every ranking metric is 0. 2. Threshold below all scores -> by_threshold collapses to top_k. 3. Mid threshold -> all metrics stay inside [0, 1]. Fixes #2154 Refs #2140 * Rewrite by_threshold test with concrete correctness assertions * fix: change map metric Signed-off-by: ds-wook <leewook94@gmail.com> * Add support for compshare vms Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct shell commands Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Declare COMPSHARE_SPEC_FILE Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Copy repo files to the VM to avoid git clone failure Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Retry curl upon failure Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * fix(gpu): use imported cuda namespace for gpu counting Signed-off-by: Yinchaochen <lisumchen@gmail.com> * Update docs Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Configure Docker registry mirror for speedup Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Retry image build upon failure Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct syntax errors Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add pip index arg Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Make scripts robuster Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Try DNS configs only, and remove P40 due to incompatibility with PyTorch Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Use map_at_k instead of map for ranking-metric reporting Issue #2309 points out that the dict returned by examples/06_benchmarks/benchmark_utils.py:ranking_metrics_python and :ranking_metrics_pyspark labels its first entry "MAP" but computes it with the Spark-style map() function, which normalizes by n_relevant rather than min(k, n_relevant). The other entries in the same dict are labeled "@k" and computed with the @k variants, so the first entry is inconsistent with its neighbours and can produce values that are mathematically valid for MAP but counter-intuitive when read alongside Precision@k / Recall@k / NDCG@k. Changes: * examples/06_benchmarks/benchmark_utils.py - swap map for map_at_k in both the Python and PySpark ranking-metrics helpers and rename the dict key "MAP" to "MAP@k" so the label matches the function used. * examples/06_benchmarks/movielens.ipynb - update the two source cells (the missing-row placeholder dict and the column-order list) that consume that dict so the benchmark table column header agrees with the upstream key. Cached cell outputs are left as-is; they will be regenerated on the next notebook run. * recommenders/evaluation/python_evaluation.py - cross-link the map() and map_at_k() docstrings so a reader landing on either function can see the normalizer difference and pick the right one. * recommenders/evaluation/spark_evaluation.py - same cross-link on SparkRankingEvaluation.map / .map_at_k. * tests/unit/recommenders/evaluation/test_python_evaluation.py - add test_python_map_vs_map_at_k that pins the invariant: map_at_k equals map when k >= n_relevant for every user (k=10 on the existing fixture) and strictly exceeds it when at least one user has more than k relevant items (k=5, where user 3 in the fixture has 10). * tests/test_groups.yml - register the new test in the pr_gate group. Notebook examples under examples/00_quick_start and examples/02_model_collaborative_filtering still import the bare map symbol; switching them is left to a follow-up because the tests/functional/examples/test_notebooks_*.py and tests/smoke/examples/test_notebooks_*.py expected values for the "map" key would need to be regenerated end-to-end. Refs #1702 #2004 Signed-off-by: Yinchao Chen <lisumchen@gmail.com> * test(gpu): shorten regression test name per review Rename test_get_number_gpus_falls_back_to_cuda_namespace_when_torch_is_missing to test_get_number_gpus_without_torch in test_gpu_utils.py and update its entry in tests/test_groups.yml. The shorter name still pairs the function under test with the scenario; the cuda-fallback detail is evident from the test body. Addresses review comment from @anargyri on #2314. Signed-off-by: Yinchao Chen <lisumchen@gmail.com> * refactor: modernize lightgbm utils Signed-off-by: ds-wook <leewook94@gmail.com> * Add support for Docker and PyPI mirrors Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Clean up code for retries and correct docker mirror url Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Update docs Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct docker build arg for pypi index url Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Combine test groups for gpu Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Fix asset URL in fm_deep_dive.ipynb path had `mains-team/resources` repeated muiltiple times this is corrected to value in https://github.com/recommenders-team/recommenders/blob/main/examples/00_quick_start/xdeepfm_criteo.ipynb * Install cuda driver from scratch Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Lock gpu version Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Update Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Remove install_container_toolkit.sh Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * refactor: migrate lightgcn pytorch Signed-off-by: ds-wook <leewook94@gmail.com> * fix: remove type_checking and change print to logging Signed-off-by: ds-wook <leewook94@gmail.com> * refactor: redesign architectural args Signed-off-by: ds-wook <leewook94@gmail.com> * fix: reorder logger Signed-off-by: ds-wook <leewook94@gmail.com> * Try CUDA 13.2.1 Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add 2080 for use Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Use the latest cuda driver Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Increase notebook execution timeout Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Remove 2080 due to insufficient gpu memory for nightly tests Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add support for http proxy for speed up Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Prepend "VM_" to env variables for cache Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Update map_at_k in notebooks * PR template typo * Remove Surprise and rerun benchmarks * Fix MLLib docs link * Fix docstring for MAP * Add support for https proxy Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add more retry on failure Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add support for installing gpu drivers for P40 Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct configure.sh Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add retries for ssh key setup Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Set apt and uv to bypass SSL verification Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Update spec.json Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Remove http/https proxy because of no apparent gains on speed Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Revert Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Remove yq installation in Dockerfile Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Update https proxy config for apt Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct apt operations Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Remove apt conf Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Remove P40 Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add more retries Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Move http(s) proxy config from config.json to CLI Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * fix: fixed lightgcn model and rerun notebook Signed-off-by: ds-wook <leewook94@gmail.com> * Add support to set vm requirements Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add by_threshold ranking metrics regression test Signed-off-by: benben951 <jie13383393540@163.com> * Set VM stop schedule Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Explicitly specify secrets to use (#2328) Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct secrets in calling workflows Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct docker args Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Resolve key unbound error Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct empty stop time error Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Reduce spec retrying times Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Lock CUDA version to 580 on V100S Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Refactor duplicate code Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add more GPU choices Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct delete_vm.sh Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct GPUType Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Try the spot chargetype Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct jq filter Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Alternate charge type for the same gputype Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Add more GPU options Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * fix: honor benchmark recommendation args Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com> * fix: address benchmark review suggestions Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com> * Resolve issue on empty secrets (#2334) * Use pull_request_target to pass secrets Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Correct paths Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Test before changing pull_request to pull_request_target Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Update docs Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * Use pull_request_target Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> --------- Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> * fix: set default timeout for dataset downloads Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com> * Correct git refs and working dir (#2338) Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> --------- Signed-off-by: ds-wook <leewook94@gmail.com> Signed-off-by: Simon Zhao <simonyansenzhao@gmail.com> Signed-off-by: miguelgfierro <miguelgfierro@users.noreply.github.com> Signed-off-by: Yinchaochen <lisumchen@gmail.com> Signed-off-by: Yinchao Chen <lisumchen@gmail.com> Signed-off-by: benben951 <jie13383393540@163.com> Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Co-authored-by: ds-wook <leewook94@gmail.com> Co-authored-by: miguelgfierro <miguelgfierro@users.noreply.github.com> Co-authored-by: Miguel Fierro <3491412+miguelgfierro@users.noreply.github.com> Co-authored-by: Yinchaochen <lisumchen@gmail.com> Co-authored-by: Andreas Argyriou <anargyri@users.noreply.github.com> Co-authored-by: seanv507 <sean.violante@gmail.com> Co-authored-by: benben951 <jie13383393540@163.com> Co-authored-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com>
1 parent 31d0ede commit f902c82

40 files changed

Lines changed: 8465 additions & 2355 deletions

.github/workflows/compshare-vm.yml

Lines changed: 90 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,25 @@ on:
3636
default: tests/test_groups.yml
3737
description: Path to test group configuration file relative
3838
to the repo root
39+
compshare_tools_dir:
40+
required: false
41+
type: string
42+
default: .github/workflows/tools/compshare
43+
description: Path to the CompShare tools
3944
dockerfile:
4045
required: false
4146
type: string
4247
default: tools/docker/Dockerfile
4348
description: Path to the Dockerfile used for building the
4449
test environment
50+
pr_code_dir:
51+
required: false
52+
type: string
53+
default: >
54+
${{ github.event_name == 'pull_request_target'
55+
&& format('pr_{0}', github.event.number)
56+
|| ''
57+
}}
4558
timeout-minutes:
4659
required: true
4760
type: number
@@ -54,10 +67,16 @@ on:
5467
required: true
5568
COMPSHARE_PUBLIC_KEY:
5669
required: true
57-
DOCKER_MIRROR_URL:
58-
required: true
59-
PIP_INDEX_URL:
60-
required: true
70+
VM_DOCKER_MIRROR_URL:
71+
required: false
72+
VM_HTTP_PROXY:
73+
required: false
74+
VM_HTTPS_PROXY:
75+
required: false
76+
VM_PIP_INDEX_URL:
77+
required: false
78+
VM_PROXY_CERTIFICATE:
79+
required: false
6180

6281
jobs:
6382
get-test-groups:
@@ -68,8 +87,14 @@ jobs:
6887
outputs:
6988
groups: ${{ steps.get-test-groups.outputs.groups }}
7089
steps:
71-
- name: Check out repository code
90+
- name: Check out repository code from PR
7291
uses: actions/checkout@v6
92+
with:
93+
ref: >
94+
${{ github.event_name == 'pull_request_target'
95+
&& format('refs/pull/{0}/merge', github.event.number)
96+
|| github.ref
97+
}}
7398
7499
- name: Get test group names
75100
id: get-test-groups
@@ -104,8 +129,9 @@ jobs:
104129
- '3.11'
105130
group: ${{ fromJSON(needs.get-test-groups.outputs.groups) }}
106131
steps:
107-
- name: Check out repository code
132+
- name: Check out repository code from main
108133
uses: actions/checkout@v6
134+
109135
- name: Setup VM
110136
# * GPU tests should run on GPUs.
111137
# * cpu-nightly needs to run on larger CPU runner.
@@ -117,26 +143,50 @@ jobs:
117143
env:
118144
COMPSHARE_PRIVATE_KEY: ${{ secrets.COMPSHARE_PRIVATE_KEY }}
119145
COMPSHARE_PUBLIC_KEY: ${{ secrets.COMPSHARE_PUBLIC_KEY }}
120-
DOCKER_MIRROR_URL: ${{ secrets.DOCKER_MIRROR_URL }}
146+
VM_DOCKER_MIRROR_URL: ${{ secrets.VM_DOCKER_MIRROR_URL }}
147+
VM_HTTP_PROXY: ${{ secrets.VM_HTTP_PROXY }}
148+
VM_HTTPS_PROXY: ${{ secrets.VM_HTTPS_PROXY }}
149+
VM_PROXY_CERTIFICATE: ${{ secrets.VM_PROXY_CERTIFICATE }}
121150
run: |
122151
echo "::add-mask::$COMPSHARE_PRIVATE_KEY"
123-
commit="$(echo ${{ github.sha }} | head -c 5)"
124-
vm_name="$(mktemp -u vm_${commit}_XXXXXX)"
152+
commit="$(echo ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.sha || github.sha }} | head -c 5)"
153+
vm_name="$(mktemp -u vm_${{ github.event_name == 'pull_request_target' && format('{0}_', github.event.number) || '' }}${commit}_XXXXXX)"
125154
echo "VM_NAME=${vm_name}" >> "$GITHUB_ENV"
126-
bash tools/ci/compshare/setup_vm.sh "${vm_name}"
155+
more_than_half_hour="${{ contains(inputs.type, 'nightly') && 'yes' || 'no' }}"
156+
gputype="${{ contains(inputs.type, 'nightly') && '!2080,P40' || '!P40' }}"
157+
gpumem="${{ contains(inputs.type, 'nightly') && '12' || '8' }}"
158+
requirements="{\"GPUType\":\"${gputype}\",\"Memory\":{\"GPU\":${gpumem},\"CPU\":32}}"
159+
bash '${{ inputs.compshare_tools_dir }}/setup_vm.sh' "${vm_name}" "${more_than_half_hour}" "${requirements}"
127160
128161
echo 'Exporting VM info for subsequent steps ...'
129-
COMPSHARE_SPEC_FILE='tools/ci/compshare/spec.json'
130-
source tools/ci/compshare/utils.sh
162+
COMPSHARE_SPEC_FILE='${{ inputs.compshare_tools_dir }}/spec.json'
163+
source '${{ inputs.compshare_tools_dir }}/utils.sh'
131164
mapfile -t vm_info < <(get_vm_info "${vm_name}")
132165
ssh_dest="${vm_info[1]}"
133166
echo "SSH_DEST=${ssh_dest}" >> "$GITHUB_ENV"
134167
168+
- name: Check out repository code from PR
169+
if: ${{ github.event_name == 'pull_request_target' }}
170+
uses: actions/checkout@v6
171+
with:
172+
ref: refs/pull/${{ github.event.number }}/merge
173+
path: ${{ inputs.pr_code_dir }}
174+
135175
- name: Build image
136176
env:
137-
PIP_INDEX_URL: ${{ secrets.PIP_INDEX_URL }}
177+
VM_HTTP_PROXY: ${{ secrets.VM_HTTP_PROXY }}
178+
VM_HTTPS_PROXY: ${{ secrets.VM_HTTPS_PROXY }}
179+
VM_PIP_INDEX_URL: ${{ secrets.VM_PIP_INDEX_URL }}
180+
VM_PROXY_CERTIFICATE: ${{ secrets.VM_PROXY_CERTIFICATE }}
181+
working-directory: >
182+
${{ github.event_name == 'pull_request_target'
183+
&& inputs.pr_code_dir
184+
|| github.workspace
185+
}}
138186
run: |
139-
image_tag="reco-${{ github.sha }}-${{ github.run_attempt }}"
187+
image_tag='reco-${{ github.sha }}-${{ github.run_attempt }}'
188+
189+
# Export IMAGE_TAG for subsequent steps
140190
echo "IMAGE_TAG=${image_tag}" >> "$GITHUB_ENV"
141191
142192
dockerfile="${{ inputs.dockerfile }}"
@@ -157,7 +207,19 @@ jobs:
157207
docker build . ${docker_args}
158208
else
159209
echo "Building Docker image on the VM ${VM_NAME} ..."
160-
docker_args="${docker_args} --build-arg PIP_INDEX_URL=${PIP_INDEX_URL}"
210+
pip_index_ip="$(echo "${VM_PIP_INDEX_URL:-}" | sed -e 's|^.*://||' -e 's|:.*$||')"
211+
pip_index_ip="${pip_index_ip:+,$pip_index_ip}"
212+
docker_no_proxy="developer.download.nvidia.com${pip_index_ip}"
213+
docker_args="${docker_args} \
214+
--build-arg HTTP_PROXY='${VM_HTTP_PROXY}' \
215+
--build-arg http_proxy='${VM_HTTP_PROXY}' \
216+
--build-arg HTTPS_PROXY='${VM_HTTPS_PROXY}' \
217+
--build-arg https_proxy='${VM_HTTPS_PROXY}' \
218+
--build-arg NO_PROXY='${docker_no_proxy}' \
219+
--build-arg no_proxy='${docker_no_proxy}' \
220+
--build-arg VM_PIP_INDEX_URL='${VM_PIP_INDEX_URL}' \
221+
--build-arg VM_PROXY_CERTIFICATE='${VM_PROXY_CERTIFICATE}' \
222+
--build-arg UV_INSECURE_HOST='github.com'"
161223
162224
echo '* Copying repo files to avoid git clone failure on the VM ...'
163225
tar cf ../recommenders.tar *
@@ -172,25 +234,6 @@ jobs:
172234
&& tar xf recommenders.tar -C recommenders \
173235
&& rm -rf recommenders.tar"
174236
175-
echo '* Building the base image ...'
176-
count=0
177-
until ssh -t -o StrictHostKeyChecking=no \
178-
-o UserKnownHostsFile=/dev/null \
179-
-o ServerAliveInterval=60 \
180-
-o ServerAliveCountMax=10 \
181-
"${SSH_DEST}" "\
182-
cd recommenders; \
183-
docker build . ${docker_args} --target deps"; do
184-
echo ' + Failed to build the base image.'
185-
count=$((count + 1))
186-
if [[ $count -lt 5 ]]; then
187-
sleep 5
188-
echo ' + Trying again ...'
189-
else
190-
exit 1
191-
fi
192-
done
193-
194237
echo '* Building the final image ...'
195238
count=0
196239
until ssh -t -o StrictHostKeyChecking=no \
@@ -213,29 +256,38 @@ jobs:
213256
214257
- name: Execute tests in container
215258
env:
259+
VM_HTTP_PROXY: ${{ secrets.VM_HTTP_PROXY }}
216260
RECO_VENV_DIR: /root/.venvs/Recommenders
261+
working-directory: >
262+
${{ github.event_name == 'pull_request_target'
263+
&& inputs.pr_code_dir
264+
|| github.workspace
265+
}}
217266
run: |
218267
test_list="$(yq \
219268
'.${{ inputs.type }}.${{ matrix.group }} | map(@sh) | join(" ")' \
220269
"${{ inputs.config-file }}")"
221270
test_cmd="source /root/.sdkman/bin/sdkman-init.sh \
222271
&& source ${{ env.RECO_VENV_DIR }}/bin/activate \
223272
&& pytest --durations 0 ${test_list}"
224-
gpu_arg="${{ contains(matrix.group, 'gpu') && '--gpus all' || '' }}"
225-
check_gpu="${{ contains(matrix.group, 'gpu') && 'nvidia-smi' || 'true' }}"
226273
227274
if [[ -z "${SSH_DEST}" ]]; then
228275
# Run on current GitHub-hosted runner directly
229276
docker run --rm ${IMAGE_TAG} bash -lc "${test_cmd}"
230277
else
231278
# Run on newly created self-hosted runner by SSH
279+
check_gpu="${{ contains(matrix.group, 'gpu') && 'nvidia-smi' || 'true' }}"
280+
gpu_arg="${{ contains(matrix.group, 'gpu') && '--gpus all' || '' }}"
281+
docker_args="${gpu_arg} \
282+
--env HTTP_PROXY='${VM_HTTP_PROXY}' \
283+
--env http_proxy='${VM_HTTP_PROXY}'"
232284
ssh -t -o StrictHostKeyChecking=no \
233285
-o UserKnownHostsFile=/dev/null \
234286
-o ServerAliveInterval=60 \
235287
-o ServerAliveCountMax=10 \
236288
"${SSH_DEST}" "\
237289
${check_gpu} \
238-
&& docker run --rm ${gpu_arg} ${IMAGE_TAG} bash -lc '${test_cmd}'"
290+
&& docker run --rm ${docker_args} ${IMAGE_TAG} bash -lc '${test_cmd}'"
239291
fi
240292
241293
- name: Clean up
@@ -245,5 +297,5 @@ jobs:
245297
COMPSHARE_PUBLIC_KEY: ${{ secrets.COMPSHARE_PUBLIC_KEY }}
246298
run: |
247299
if [[ -n "${VM_NAME}" ]]; then
248-
bash tools/ci/compshare/delete_vm.sh "${VM_NAME}"
300+
bash '${{ inputs.compshare_tools_dir }}/delete_vm.sh' "${VM_NAME}"
249301
fi

.github/workflows/cpu-nightly.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@ jobs:
4545
compute: cpu
4646
timeout-minutes: 240 # Timeout for all the processes, not each VMs (not all VMs are deployed at the same time)
4747
type: nightly
48-
secrets: inherit
48+
secrets:
49+
COMPSHARE_PRIVATE_KEY: ${{ secrets.COMPSHARE_PRIVATE_KEY }}
50+
COMPSHARE_PUBLIC_KEY: ${{ secrets.COMPSHARE_PUBLIC_KEY }}
51+
VM_DOCKER_MIRROR_URL: ${{ secrets.VM_DOCKER_MIRROR_URL }}
52+
VM_HTTP_PROXY: ${{ secrets.VM_HTTP_PROXY }}
53+
VM_HTTPS_PROXY: ${{ secrets.VM_HTTPS_PROXY }}
54+
VM_PIP_INDEX_URL: ${{ secrets.VM_PIP_INDEX_URL }}
55+
VM_PROXY_CERTIFICATE: ${{ secrets.VM_PROXY_CERTIFICATE }}

.github/workflows/gpu-nightly.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@ jobs:
4545
compute: gpu
4646
timeout-minutes: 240 # Timeout for all the processes, not each VMs (not all VMs are deployed at the same time)
4747
type: nightly
48-
secrets: inherit
48+
secrets:
49+
COMPSHARE_PRIVATE_KEY: ${{ secrets.COMPSHARE_PRIVATE_KEY }}
50+
COMPSHARE_PUBLIC_KEY: ${{ secrets.COMPSHARE_PUBLIC_KEY }}
51+
VM_DOCKER_MIRROR_URL: ${{ secrets.VM_DOCKER_MIRROR_URL }}
52+
VM_HTTP_PROXY: ${{ secrets.VM_HTTP_PROXY }}
53+
VM_HTTPS_PROXY: ${{ secrets.VM_HTTPS_PROXY }}
54+
VM_PIP_INDEX_URL: ${{ secrets.VM_PIP_INDEX_URL }}
55+
VM_PROXY_CERTIFICATE: ${{ secrets.VM_PROXY_CERTIFICATE }}

.github/workflows/self-hosted-runner.yml

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -105,49 +105,56 @@ jobs:
105105
- name: Check out repository code
106106
uses: actions/checkout@v6
107107
- name: Build image
108-
env:
109-
IMAGE_TAG: reco-${{ github.sha }}-${{ github.run_attempt }}-${{ matrix.group }}-${{ matrix.python-version }}
110108
run: |
111-
docker build . \
112-
-t ${IMAGE_TAG} \
113-
-f ${{ inputs.dockerfile }} \
114-
--build-arg COMPUTE=${{ contains(matrix.group, 'gpu') && 'gpu' || 'cpu' }} \
115-
--build-arg EXTRAS=[dev${{ contains(matrix.group, 'gpu') && ',gpu' || '' }}${{ contains(matrix.group, 'spark') && ',spark' || '' }}] \
116-
--build-arg GIT_REF= \
117-
--build-arg PYTHON_VERSION=${{ matrix.python-version }}
109+
image_tag='reco-${{ github.sha }}-${{ github.run_attempt }}-${{ matrix.group }}-${{ matrix.python-version }}'
110+
111+
# Export IMAGE_TAG for subsequent steps
112+
echo "IMAGE_TAG=${image_tag}" >> "$GITHUB_ENV"
113+
114+
dockerfile="${{ inputs.dockerfile }}"
115+
compute="${{ contains(matrix.group, 'gpu') && 'gpu' || 'cpu' }}"
116+
extras_gpu="${{ contains(matrix.group, 'gpu') && ',gpu' || '' }}"
117+
extras_spark="${{ contains(matrix.group, 'spark') && ',spark' || '' }}"
118+
extras="[dev${extras_gpu}${extras_spark}]"
119+
python_version="${{ matrix.python-version }}"
120+
docker_args="-t ${image_tag} \
121+
-f ${dockerfile} \
122+
--build-arg COMPUTE='${compute}' \
123+
--build-arg EXTRAS='${extras}' \
124+
--build-arg GIT_REF= \
125+
--build-arg PYTHON_VERSION='${python_version}'"
126+
docker build . ${docker_args}
118127
119128
- name: Execute tests in container
120129
env:
121-
IMAGE_TAG: reco-${{ github.sha }}-${{ github.run_attempt }}-${{ matrix.group }}-${{ matrix.python-version }}
122130
RECO_VENV_DIR: /root/.venvs/Recommenders
123131
run: |
124132
# Check hardware specs
125133
echo "CPU: $(nproc)"
126134
echo "Memory:"
127135
free -h
128136
137+
test_list="$(yq \
138+
'.${{ inputs.type }}.${{ matrix.group }} | map(@sh) | join(" ")' \
139+
"${{ inputs.config-file }}")"
140+
test_cmd="source /root/.sdkman/bin/sdkman-init.sh \
141+
&& source ${{ env.RECO_VENV_DIR }}/bin/activate \
142+
&& pytest --durations 0 ${test_list}"
143+
129144
# Run tests
130145
if [[ ${{ matrix.group }} =~ 'gpu' ]]; then
131146
nvidia-smi && \
132-
docker run --rm --gpus all ${IMAGE_TAG} \
133-
bash -lc 'source /root/.sdkman/bin/sdkman-init.sh && source ${{ env.RECO_VENV_DIR }}/bin/activate && \
134-
pytest --durations 0 \
135-
$(yq ".${{ inputs.type }}.${{ matrix.group }} | map(@sh) | join(\" \")" "${{ inputs.config-file }}")'
147+
docker run --rm --gpus all "${IMAGE_TAG}" bash -lc "${test_cmd}"
136148
else
137-
docker run --rm ${IMAGE_TAG} \
138-
bash -lc 'source /root/.sdkman/bin/sdkman-init.sh && source ${{ env.RECO_VENV_DIR }}/bin/activate && \
139-
pytest --durations 0 \
140-
$(yq ".${{ inputs.type }}.${{ matrix.group }} | map(@sh) | join(\" \")" "${{ inputs.config-file }}")'
149+
docker run --rm "${IMAGE_TAG}" bash -lc "${test_cmd}"
141150
fi
142151
143152
- name: Clean up
144153
if: always()
145-
env:
146-
IMAGE_TAG: reco-${{ github.sha }}-${{ github.run_attempt }}-${{ matrix.group }}-${{ matrix.python-version }}
147154
run: |
148-
if docker image ls | grep ${IMAGE_TAG} > /dev/null; then
149-
if docker container ls -a | grep ${IMAGE_TAG} > /dev/null; then
155+
if [[ -n "${IMAGE_TAG}" ]] && docker image ls | grep "${IMAGE_TAG}" > /dev/null; then
156+
if docker container ls -a | grep "${IMAGE_TAG}" > /dev/null; then
150157
docker container rm -f $(docker ps -a | grep "${IMAGE_TAG}" | awk '{print $1}')
151158
fi
152-
docker image rm ${IMAGE_TAG}
159+
docker image rm "${IMAGE_TAG}"
153160
fi

.github/workflows/spark-nightly.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@ jobs:
4545
compute: spark
4646
timeout-minutes: 240 # Timeout for all the processes, not each VMs (not all VMs are deployed at the same time)
4747
type: nightly
48-
secrets: inherit
48+
secrets:
49+
COMPSHARE_PRIVATE_KEY: ${{ secrets.COMPSHARE_PRIVATE_KEY }}
50+
COMPSHARE_PUBLIC_KEY: ${{ secrets.COMPSHARE_PUBLIC_KEY }}
51+
VM_DOCKER_MIRROR_URL: ${{ secrets.VM_DOCKER_MIRROR_URL }}
52+
VM_HTTP_PROXY: ${{ secrets.VM_HTTP_PROXY }}
53+
VM_HTTPS_PROXY: ${{ secrets.VM_HTTPS_PROXY }}
54+
VM_PIP_INDEX_URL: ${{ secrets.VM_PIP_INDEX_URL }}
55+
VM_PROXY_CERTIFICATE: ${{ secrets.VM_PROXY_CERTIFICATE }}

0 commit comments

Comments
 (0)