From 5f757e59d798d400b5fab336f8e77f6360072b19 Mon Sep 17 00:00:00 2001 From: olga <odatskov@cern.ch> Date: Tue, 16 Jun 2020 10:10:20 +0200 Subject: [PATCH] Adding an orchestrator for simpletrack including CI benchmark mode tests --- lhc/simpletrack/.simpletrack-ci.yml | 67 +++++++++++----------- lhc/simpletrack/CHANGELOG.md | 5 ++ lhc/simpletrack/Dockerfile.intel | 7 ++- lhc/simpletrack/Dockerfile.nvidia | 7 ++- lhc/simpletrack/Dockerfile.pocl | 9 ++- lhc/simpletrack/README.md | 12 ++-- lhc/simpletrack/lhc-simpletrack.sh | 83 ++++++++++++++++++++++++++++ lhc/simpletrack/lhc-simpletrack.spec | 2 +- 8 files changed, 146 insertions(+), 46 deletions(-) create mode 100755 lhc/simpletrack/lhc-simpletrack.sh diff --git a/lhc/simpletrack/.simpletrack-ci.yml b/lhc/simpletrack/.simpletrack-ci.yml index 9d16d71..0379095 100644 --- a/lhc/simpletrack/.simpletrack-ci.yml +++ b/lhc/simpletrack/.simpletrack-ci.yml @@ -2,6 +2,7 @@ stages: - build - test +- benchmark .job_template: &job_build stage: build @@ -14,52 +15,54 @@ stages: - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json - export HEP_TAG=`grep HEPWL_DOCKERIMAGETAG lhc/simpletrack/lhc-simpletrack.spec | cut -d "=" -f 2` -nvidia: +.job_template: &job_test + stage: test + environment: + name: test/$CI_COMMIT_REF_NAME + script: [ "echo test" ] + +.job_template: &job_benchmark + stage: benchmark + environment: + name: test/$CI_COMMIT_REF_NAME + script: [ "echo test" ] + variables: + BENCHMARK: "device" + artifacts: + paths: + - jobs/ + +build:nvidia: <<: *job_build script: - - mkdir public && wget http://img.shields.io/badge/${HEP_TAG}-Failed-red?style=flat-square -O public/build_simpletrack_nvidia.svg - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/lhc/simpletrack/Dockerfile.nvidia --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:nvidia-$HEP_TAG --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:nvidia-latest - - wget http://img.shields.io/badge/${HEP_TAG}-Done-green?style=flat-square -O public/build_simpletrack_nvidia.svg - artifacts: - paths: - - public/build_simpletrack_nvidia.svg -intel: +build:intel: <<: *job_build script: - - mkdir public && wget http://img.shields.io/badge/${HEP_TAG}-Failed-red?style=flat-square -O public/build_simpletrack_intel.svg - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/lhc/simpletrack/Dockerfile.intel --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:intel-$HEP_TAG --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:intel-latest - - wget http://img.shields.io/badge/${HEP_TAG}-Done-green?style=flat-square -O public/build_simpletrack_intel.svg - artifacts: - paths: - - public/build_simpletrack_intel.svg -pocl: +build:pocl: <<: *job_build script: - - mkdir public && wget http://img.shields.io/badge/${HEP_TAG}-Failed-red?style=flat-square -O public/build_simpletrack_pocl.svg - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/lhc/simpletrack/Dockerfile.pocl --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:pocl-$HEP_TAG --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:pocl-latest - - wget http://img.shields.io/badge/${HEP_TAG}-Done-green?style=flat-square -O public/build_simpletrack_pocl.svg - artifacts: - paths: - - public/build_simpletrack_pocl.svg -intel-test: - stage: test +test:intel: + <<: *job_test image: name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:intel-latest - entrypoint: [""] - environment: - name: test/$CI_COMMIT_REF_NAME - script: - - cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -s && python3 benchmark_opencl.py -p 100 -t 5 -pocl-test: - stage: test +test:pocl: + <<: *job_test + image: + name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:pocl-latest + +bench:intel: + <<: *job_benchmark + image: + name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:intel-latest + +bench:pocl: + <<: *job_benchmark image: name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:pocl-latest - entrypoint: [""] - environment: - name: test/$CI_COMMIT_REF_NAME - script: - - cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -s && python3 benchmark_opencl.py -p 100 -t 5 diff --git a/lhc/simpletrack/CHANGELOG.md b/lhc/simpletrack/CHANGELOG.md index eea2fa9..89edc7a 100644 --- a/lhc/simpletrack/CHANGELOG.md +++ b/lhc/simpletrack/CHANGELOG.md @@ -1,3 +1,8 @@ +# 0.2.0 (June 16th 2020) + +FEATURES: +* Added "benchmark" mode to run and generate json output for the runs. + # 0.1.0 (June 13th 2020) FEATURES: diff --git a/lhc/simpletrack/Dockerfile.intel b/lhc/simpletrack/Dockerfile.intel index e42a0b0..2c1b6a4 100644 --- a/lhc/simpletrack/Dockerfile.intel +++ b/lhc/simpletrack/Dockerfile.intel @@ -3,6 +3,7 @@ FROM debian:latest ENV PARTICLES 20000 ENV TURNS 15 ENV DEVICE "0.0" +ENV BENCHMARK "" ENV INTEL_OCL_DIR "/opt/intel/oclcpuexp" ENV INTEL_TBB_DIR "/opt/intel/tbb" @@ -37,6 +38,8 @@ RUN mkdir -p ${INTEL_NEO_DIR} && cd ${INTEL_NEO_DIR} \ RUN mkdir /.cache && chmod -R 777 /.cache \ && git clone https://github.com/rdemaria/simpletrack \ - && cd simpletrack && pip3 install pyopencl && pip3 install -e . + && cd simpletrack && pip3 install pyopencl && pip3 install -e . -ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE" ] +COPY lhc/simpletrack/lhc-simpletrack.sh /simpletrack/examples/lhc/lhc-simpletrack.sh + +ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && ./lhc-simpletrack.sh" ] diff --git a/lhc/simpletrack/Dockerfile.nvidia b/lhc/simpletrack/Dockerfile.nvidia index 2e278f4..6c1ea6d 100644 --- a/lhc/simpletrack/Dockerfile.nvidia +++ b/lhc/simpletrack/Dockerfile.nvidia @@ -3,6 +3,7 @@ FROM gitlab-registry.cern.ch/linuxsupport/cc7-base:latest ENV PARTICLES 20000 ENV TURNS 15 ENV DEVICE "0.0" +ENV BENCHMARK "" ENV NVIDIA_VISIBLE_DEVICES all ENV NVIDIA_DRIVER_CAPABILITIES compute,utility @@ -15,6 +16,8 @@ RUN distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ RUN yum install -y python3 python3-devel python3-pip git gcc && pip3 install pyopencl \ && mkdir /.cache && chmod -R 777 /.cache \ && git clone https://github.com/rdemaria/simpletrack \ - && cd simpletrack && pip3 install -e . + && cd simpletrack && pip3 install -e . -ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE" ] +COPY lhc/simpletrack/lhc-simpletrack.sh /simpletrack/examples/lhc/lhc-simpletrack.sh + +ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && ./lhc-simpletrack.sh" ] diff --git a/lhc/simpletrack/Dockerfile.pocl b/lhc/simpletrack/Dockerfile.pocl index 635ec1b..464af7f 100644 --- a/lhc/simpletrack/Dockerfile.pocl +++ b/lhc/simpletrack/Dockerfile.pocl @@ -1,12 +1,13 @@ FROM debian:latest ARG LLVM_VERSION=7 -ENV OCL_ICD_VENDORS=/pocl/build/ocl-vendors -ENV POCL_BUILDING=1 +ENV OCL_ICD_VENDORS "/pocl/build/ocl-vendors" +ENV POCL_BUILDING "1" ENV PARTICLES 20000 ENV TURNS 15 ENV DEVICE "0.0" +ENV BENCHMARK "" RUN apt update && apt upgrade -y \ && apt-get install -y build-essential ocl-icd-libopencl1 cmake git gcc g++ libhwloc5 pkg-config python3-pip libclang-${LLVM_VERSION}-dev clang-${LLVM_VERSION} llvm-${LLVM_VERSION}-dev make ninja-build ocl-icd-libopencl1 ocl-icd-dev ocl-icd-opencl-dev libhwloc-dev zlib1g zlib1g-dev clinfo @@ -19,4 +20,6 @@ RUN mkdir /.cache && chmod -R 777 /.cache/ \ && git clone https://github.com/rdemaria/simpletrack.git \ && cd simpletrack && pip3 install pyopencl && pip3 install -e . -ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc/ && python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE" ] +COPY lhc/simpletrack/lhc-simpletrack.sh /simpletrack/examples/lhc/lhc-simpletrack.sh + +ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc/ && ./lhc-simpletrack.sh" ] diff --git a/lhc/simpletrack/README.md b/lhc/simpletrack/README.md index d003953..dab4e93 100644 --- a/lhc/simpletrack/README.md +++ b/lhc/simpletrack/README.md @@ -10,7 +10,6 @@ Docker images containing Simpletrack benchmark built a selection of GPU/CPU targ |--------------|:-------:|:-------:|:------:| | __GPU__ | :heavy_check_mark: | :heavy_check_mark: | | | __CPU__ | :heavy_check_mark: | | :heavy_check_mark: | -| Latest build | [](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/commits/master) | [](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/commits/master) | [](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/commits/master) | # Usage @@ -18,11 +17,12 @@ Docker images containing Simpletrack benchmark built a selection of GPU/CPU targ Default entrypoint accepts the following environment for benchmark execution: -| | Default | Description | -|-----------|----------|---------------------| -| PARTICLES | 20000 | Number of particles | -| TURNS | 15 | Number of turns | -| DEVICE | "0.0" | Platform ID | +| Variable | Default | Description | +|---------------|----------|---------------------| +| __PARTICLES__ | 20000 | Number of particles | +| __TURNS__ | 15 | Number of turns | +| __DEVICE__ | "0.0" | Platform ID | +| __BENCHMARK__ | "" | Enable specific benchmark mode with "all", "device" | Docker example: diff --git a/lhc/simpletrack/lhc-simpletrack.sh b/lhc/simpletrack/lhc-simpletrack.sh new file mode 100755 index 0000000..5e20cdb --- /dev/null +++ b/lhc/simpletrack/lhc-simpletrack.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +######################## +function get_clinfo() { echo "$CLINFO_OUT" | grep -e "$1" | sed -r 's/\S+ \S+ \s+//1'; } +######################## + +######################## +function gen_devices() { +######################## + PLATFORMS="$(clinfo -l | grep "Platform" | cut -d"#" -f2 | cut -d":" -f1)" + DEVICES="$(clinfo -l | grep "Device" | cut -d"#" -f2 | cut -d":" -f1)" + + for dev_id in $(seq 1 $(echo "$DEVICES" | wc -l)) + do + id=`echo "$PLATFORMS" | head -n $dev_id | tail -1`.`echo "$DEVICES" | head -n $dev_id | tail -1` + dtype=`get_clinfo 'Device Type' | head -n $dev_id | tail -1 | xargs` + name=`get_clinfo 'Device Name' | head -n $dev_id | tail -1 | xargs` + dev_ver=`get_clinfo 'Device Version' | head -n $dev_id | tail -1 | xargs` + dri_ver=`get_clinfo 'Driver Version' | head -n $dev_id | tail -1 | xargs` + max_units=`get_clinfo 'Max compute units' | awk '{print $2}' | head -n $dev_id | tail -1 | xargs` + + echo "\"device_id\":\"$id\",\"device_type\":\"$dtype\",\"device_name\":\"$name\",\"device_version\":\"$dev_ver\",\"driver_version\":\"$dri_ver\",\"max_units\":\"$max_units\"" + done +} + +######################### +function log() { +######################### + case $1 in + error) shift 1; echo -e "\e[31m>>> ERROR:\e[0m $*\n" | tee -a $WORK_DIR/out.log ; exit 2 ;; + info) shift 1; echo -e "\e[34m$*\e[0m\n" | tee -a $WORK_DIR/out.log ;; + silent) shift 1; echo "$*" >> $WORK_DIR/out.log ;; + *) echo "$*" | tee -a $WORK_DIR/out.log ; + esac +} + +########################## +function run_benchmark() { +########################## + OUT=$(python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $1 2>&1 | tee $WORK_DIR/out.log) + RESULT=`echo "$OUT" | grep 'particles\*turns/seconds'` + + if [ "$RESULT" == "" ]; then log error "Failed to parse the output. Failed run?"; + else echo $(echo $RESULT | cut -d' ' -f1 | xargs); fi +} + +########################## +function get_json() { +########################## + dev_line=`echo "$DEVICES" | grep "\"device_id\":\"$1\""` + echo "{\"copies\":\"1\",\"threads_per_copy\":\"$TURNS\",\"events_per_thread\":\"$PARTICLES\",\"wl-scores\":{\"sim\":\"$2\"},\"device\":{$dev_line}}" +} + +################################### +####### Main ###################### + +if [ ! "$CI_PROJECT_DIR" == "" ]; then WORK_DIR=$CI_PROJECT_DIR/jobs; +else WORK_DIR=`pwd`/jobs; fi + +if [ ! -d $WORK_DIR ]; then mkdir -p $WORK_DIR; fi +if [ -f $WORK_DIR/out.log ]; then rm $WORK_DIR/out.log; fi + +CLINFO_OUT=`echo "$(clinfo | tee $WORK_DIR/clinfo.log)"` + +if [ `echo $CLINFO_OUT | grep 'Number of platforms' | awk '{print $4}'` -eq 0 ]; then + log error "No platforms found. Exiting.."; fi + +DEVICES="$(gen_devices | tee $WORK_DIR/devices.log)" +log silent "Devices found:\n$DEVICES" + +case $BENCHMARK in + all) list=( `echo "$DEVICES" | cut -d"\"" -f4 | xargs` ); + log info "Running benchmark for ${#list[@]} device(s)"; + for dev in "${list[@]}" + do + OUT=$(run_benchmark $dev); get_json $dev $OUT | tee -a $WORK_DIR/summary.json + done ;; + device) log info "Running benchmark for $DEVICE device"; + OUT=$(run_benchmark $DEVICE); get_json $DEVICE $OUT | tee -a $WORK_DIR/summary.json ;; + *) python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE 2>&1 | tee -a $WORK_DIR/out.log; +esac + +log info "\nFinished running simpletrack" diff --git a/lhc/simpletrack/lhc-simpletrack.spec b/lhc/simpletrack/lhc-simpletrack.spec index 33a0bb2..9da47f5 100644 --- a/lhc/simpletrack/lhc-simpletrack.spec +++ b/lhc/simpletrack/lhc-simpletrack.spec @@ -3,5 +3,5 @@ HEPWL_BMKOPTS="-p 20000 -t 15 -d \"0.0\"" HEPWL_BMKDIR= HEPWL_BMKDESCRIPTION="Simpletrack OpenCL WIP of SixTrack" HEPWL_DOCKERIMAGENAME=lhc/simpletrack -HEPWL_DOCKERIMAGETAG=0.1.0 +HEPWL_DOCKERIMAGETAG=0.2.0 HEPWL_CVMFSREPOS= -- GitLab