Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hide useless logs and add useful ones #31

Merged
merged 1 commit into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion experiment/builder_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,11 @@ def build_and_run(self, generated_project: str, target_path: str,
check=True,
cwd=oss_fuzz_checkout.OSS_FUZZ_DIR)
except sp.CalledProcessError as e:
print('Failed to evaluate target on cloud:', e.stdout, e.stderr)
print(f'Failed to evaluate {os.path.realpath(target_path)} on cloud:',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we migrate to logging.info,debug etc in a future PR?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!
Created #34.

e.stdout, e.stderr)
return build_result, None

print(f'Evaluated {os.path.realpath(target_path)} on cloud.')

storage_client = storage.Client()
bucket = storage_client.bucket(self.experiment_bucket)
Expand All @@ -367,19 +371,33 @@ def build_and_run(self, generated_project: str, target_path: str,
'wb') as f:
blob = bucket.blob(build_log_name)
if blob.exists():
print(f'Downloading cloud build log of {os.path.realpath(target_path)}:'
f' {build_log_name} to {f}')
blob.download_to_file(f)
else:
print(f'Cannot find cloud build log of {os.path.realpath(target_path)} '
f':{build_log_name}')

with open(self.work_dirs.run_logs_target(generated_target_name), 'wb') as f:
blob = bucket.blob(run_log_name)
if blob.exists():
build_result.succeeded = True
print(f'Downloading cloud run log of {os.path.realpath(target_path)}:'
f' {run_log_name} to {f}')
blob.download_to_file(f)
else:
print(f'Cannot find cloud run log of {os.path.realpath(target_path)} '
f':{run_log_name}')

if not build_result.succeeded:
errors = code_fixer.extract_error_message(
self.work_dirs.build_logs_target(generated_target_name, iteration))
build_result.errors = errors
print(f'Cloud evaluation of {os.path.realpath(target_path)} indicates a '
f'failure: {errors}')
return build_result, None
print(f'Cloud evaluation of {os.path.realpath(target_path)} indicates a '
'success.')

corpus_dir = self.work_dirs.corpus(generated_target_name)
with open(os.path.join(corpus_dir, 'corpus.zip'), 'wb') as f:
Expand Down
19 changes: 14 additions & 5 deletions report/docker_run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ RUN_TIMEOUT=$3
# When running on GCP this step is unnecessary.
if [[ $GOOGLE_APPLICATION_CREDENTIALS != '' ]]
then
gcloud auth activate-service-account LLM-EVAL@oss-fuzz.iam.gserviceaccount.com --key-file=${GOOGLE_APPLICATION_CREDENTIALS:?}
gcloud auth activate-service-account LLM-EVAL@oss-fuzz.iam.gserviceaccount.com --key-file="${GOOGLE_APPLICATION_CREDENTIALS:?}"
fi

if [[ $BENCHMARK_SET = '' ]]
Expand Down Expand Up @@ -69,17 +69,26 @@ EXPERIMENT_NAME="${DATE:?}-${FREQUENCY_LABEL:?}-${BENCHMARK_SET:?}"
GCS_REPORT_DIR=${EXPERIMENT_NAME:?}

# Generate a report and upload it to GCS
bash report/upload_report.sh ${LOCAL_RESULTS_DIR:?} ${GCS_REPORT_DIR:?} &
bash report/upload_report.sh "${LOCAL_RESULTS_DIR:?}" "${GCS_REPORT_DIR:?}" &
pid_report=$!

# Run the experiment
/venv/bin/python3 run_all_experiments.py \
--benchmarks-directory "benchmark-sets/${BENCHMARK_SET:?}" \
--run-timeout ${RUN_TIMEOUT:?} \
--cloud-experiment-name ${EXPERIMENT_NAME:?} \
--run-timeout "${RUN_TIMEOUT:?}" \
--cloud-experiment-name "${EXPERIMENT_NAME:?}" \
--cloud-experiment-bucket 'oss-fuzz-gcb-experiment-run-logs' \
--template-directory 'prompts/template_xml' \
--work-dir ${LOCAL_RESULTS_DIR:?} \
--num-samples 10 \
--mode 'vertex_ai_code-bison-32k'

echo 1 > /experiment_status
export ret_val=$?

touch /experiment_ended

# Wait for the report process to finish uploading.
wait $pid_report

# Exit with the return value of `./run_all_experiments`.
exit $ret_val
45 changes: 27 additions & 18 deletions report/upload_report.sh
Original file line number Diff line number Diff line change
Expand Up @@ -41,36 +41,45 @@ then
echo "GCS directory was not specified as the second argument. Defaulting to ${GCS_DIR:?}."
fi

# Spin up the web server generating the report (and bg the process)
PYTHONPATH=. /venv/bin/python3 report/web.py ${RESULTS_DIR:?} ${WEB_PORT:?} &
mkdir results-report

while true; do
mkdir results-report
cd results-report
# Spin up the web server generating the report (and bg the process).
PYTHONPATH=. /venv/bin/python3 report/web.py "${RESULTS_DIR:?}" "${WEB_PORT:?}" &
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can be for another PR: Can we replace the PYTHONPATH invocation here?

Also one other thing, it's hard to use this script locally because the local venv path may be different. Can we instead just have this invoke python3 by default, and allow this to be overridden by e.g. PYTHON for infra usages?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can be for another PR: Can we replace the PYTHONPATH invocation here?

Yes, let me create another PR for this.

it's hard to use this script locally because the local venv path may be different. Can we instead just have this invoke python3 by default, and allow this to be overridden by e.g. PYTHON for infra usages?

Yep, good point!
I will address this in a separate PR.

pid_web=$!

# Recursively get all the experiment results
wget2 --inet4-only --no-host-directories --http2-request-window 10 --recursive localhost:${WEB_PORT:?}/
cd results-report || exit 1

# Also fetch the sorted line cov diff report
wget2 --inet4-only localhost:${WEB_PORT:?}/sort -O sort.html
# Recursively get all the experiment results.
echo "Download results from localhost."
wget2 --quiet --inet4-only --no-host-directories --http2-request-window 10 --recursive localhost:${WEB_PORT:?}/ 2>&1

# Upload the report to GCS
gsutil -m -h "Content-Type:text/html" \
# Also fetch the sorted line cov diff report.
wget2 --quiet --inet4-only localhost:${WEB_PORT:?}/sort -O sort.html 2>&1

# Stop the server.
kill -9 "$pid_web"

# Upload the report to GCS.
echo "Uploading the report."
gsutil -q -m -h "Content-Type:text/html" \
-h "Cache-Control:public, max-age=3600" \
cp -r . gs://oss-fuzz-gcb-experiment-run-logs/Result-reports/${GCS_DIR:?}
cp -r . "gs://oss-fuzz-gcb-experiment-run-logs/Result-reports/${GCS_DIR:?}"

cd ..

# Upload the raw results into the same GCS directory
gsutil -m cp -r ${RESULTS_DIR:?} \
gs://oss-fuzz-gcb-experiment-run-logs/Result-reports/${GCS_DIR:?}
echo "Uploading the raw results."
gsutil -q -m cp -r "${RESULTS_DIR:?}" \
"gs://oss-fuzz-gcb-experiment-run-logs/Result-reports/${GCS_DIR:?}"

echo "See the published report at https://llm-exp.oss-fuzz.com/Result-reports/${GCS_DIR:?}/"
if [[ -f /experiment_status ]] && [[ "$(cat /experiment_status)" == "1" ]]; then

if [[ -f /experiment_ended ]]; then
echo "Experiment finished."
break
else
echo "Experiment is running..."
sleep 600
exit
fi

echo "Experiment is running..."
sleep 600
done
4 changes: 4 additions & 0 deletions report/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import dataclasses
import json
import logging
import os
import re
import sys
Expand All @@ -26,6 +27,9 @@
from experiment import evaluator

app = Flask(__name__)
# Disable Flask request logs
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)

RESULTS_DIR = ''

Expand Down