Made benchmark `hibench` work
- converted --cmake-path argument in clusterbench-submit into a parameter for benchmark hibench, as it's specific to some benchmarks only work related to [https://bugzilla.ipr.univ-rennes.fr/show_bug.cgi?id=3958]
This commit is contained in:
parent
6000e20d6b
commit
98940824e4
|
@ -1,7 +1,9 @@
|
||||||
from ..core import IBenchmark, BenchParam, BenchmarkConfig
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import subprocess
|
import subprocess
|
||||||
import os
|
import os
|
||||||
|
import shutil
|
||||||
|
from ..core import IBenchmark, BenchParam, BenchmarkConfig
|
||||||
|
from ..util import get_proxy_env_vars
|
||||||
|
|
||||||
|
|
||||||
class HiBench(IBenchmark):
|
class HiBench(IBenchmark):
|
||||||
|
@ -10,12 +12,14 @@ class HiBench(IBenchmark):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
bench_params = []
|
bench_params = []
|
||||||
|
bench_params.append(BenchParam('num_cores', BenchParam.Type.PARAM_TYPE_INT, 'the number of cores to use by this benchmark'))
|
||||||
bench_params.append(BenchParam('hibridon_version', BenchParam.Type.PARAM_TYPE_STRING, 'the version of hibridon, in the form of a commit id'))
|
bench_params.append(BenchParam('hibridon_version', BenchParam.Type.PARAM_TYPE_STRING, 'the version of hibridon, in the form of a commit id'))
|
||||||
bench_params.append(BenchParam('compiler_id', BenchParam.Type.PARAM_TYPE_STRING, 'the id of the compiler used in the benchmark'))
|
bench_params.append(BenchParam('compiler_id', BenchParam.Type.PARAM_TYPE_STRING, 'the id of the compiler used in the benchmark'))
|
||||||
bench_params.append(BenchParam('compiler_version', BenchParam.Type.PARAM_TYPE_STRING, 'the version of the used compiler'))
|
# bench_params.append(BenchParam('compiler_version', BenchParam.Type.PARAM_TYPE_STRING, 'the version of the used compiler'))
|
||||||
bench_params.append(BenchParam('blas_id', BenchParam.Type.PARAM_TYPE_STRING, 'the id of the blas library used in the benchmark'))
|
# bench_params.append(BenchParam('blas_id', BenchParam.Type.PARAM_TYPE_STRING, 'the id of the blas library used in the benchmark'))
|
||||||
bench_params.append(BenchParam('blas_version', BenchParam.Type.PARAM_TYPE_STRING, 'the version of the blas library used in the benchmark'))
|
# bench_params.append(BenchParam('blas_version', BenchParam.Type.PARAM_TYPE_STRING, 'the version of the blas library used in the benchmark'))
|
||||||
bench_params.append(BenchParam('test_id', BenchParam.Type.PARAM_TYPE_STRING, 'the name of the test to run (eg arch4_quick (about 2s on a core i5 8th generation) or nh3h2_qma_long (about 10min on a core i5 8th generation))'))
|
bench_params.append(BenchParam('test_id', BenchParam.Type.PARAM_TYPE_STRING, 'the name of the test to run (eg arch4_quick (about 2s on a core i5 8th generation) or nh3h2_qma_long (about 10min on a core i5 8th generation))'))
|
||||||
|
bench_params.append(BenchParam('cmake_path', BenchParam.Type.PARAM_TYPE_STRING, 'the location of the cmake executable to use (eg "/opt/cmake/cmake-3.23.0/bin/cmake", or simply "cmake" for the one in the path)'))
|
||||||
|
|
||||||
super().__init__(bench_id='hibench', bench_params=bench_params)
|
super().__init__(bench_id='hibench', bench_params=bench_params)
|
||||||
|
|
||||||
|
@ -32,12 +36,19 @@ class HiBench(IBenchmark):
|
||||||
return ram_per_core
|
return ram_per_core
|
||||||
|
|
||||||
def execute(self, config: BenchmarkConfig, benchmark_output_dir: Path):
|
def execute(self, config: BenchmarkConfig, benchmark_output_dir: Path):
|
||||||
|
|
||||||
git_repos_url = 'https://github.com/hibridon/hibridon'
|
git_repos_url = 'https://github.com/hibridon/hibridon'
|
||||||
git_user = 'g-raffy' # os.environ['HIBRIDON_REPOS_USER']
|
git_user = 'g-raffy' # os.environ['HIBRIDON_REPOS_USER']
|
||||||
git_pass_file = f'{os.getenv("HOME")}/.github/personal_access_tokens/bench.hibridon.cluster.ipr.univ-rennes1.fr.pat'
|
git_pass_file = f'{os.getenv("HOME")}/.github/personal_access_tokens/bench.hibridon.cluster.ipr.univ-rennes1.fr.pat'
|
||||||
hibridon_version = config['hibridon_version']
|
hibridon_version = config['hibridon_version']
|
||||||
test_id = config['test_id'] # eg arch4_quick or nh3h2_qma_long
|
test_id = config['test_id'] # eg arch4_quick or nh3h2_qma_long
|
||||||
compiler_id = config['compiler_id']
|
compiler_id = config['compiler_id']
|
||||||
|
cmake_path = config['cmake_path']
|
||||||
|
num_cores = config['num_cores']
|
||||||
|
|
||||||
|
if benchmark_output_dir.exists():
|
||||||
|
shutil.rmtree(benchmark_output_dir)
|
||||||
|
benchmark_output_dir.mkdir(parents=True)
|
||||||
|
|
||||||
src_dir = benchmark_output_dir / 'hibridon.git'
|
src_dir = benchmark_output_dir / 'hibridon.git'
|
||||||
output_dir = benchmark_output_dir / 'output'
|
output_dir = benchmark_output_dir / 'output'
|
||||||
|
@ -62,14 +73,8 @@ class HiBench(IBenchmark):
|
||||||
else:
|
else:
|
||||||
assert f'unhandled compiler_id : {compiler_id}'
|
assert f'unhandled compiler_id : {compiler_id}'
|
||||||
|
|
||||||
ur1_proxy_url = 'http://proxy-nt.univ-rennes1.fr:3128'
|
shell_command = ''
|
||||||
proxy_env_vars = ''
|
if len(env_vars_bash_commands) > 0:
|
||||||
proxy_env_vars = f'{proxy_env_vars} HTTP_PROXY={ur1_proxy_url}'
|
shell_command += f'{env_vars_bash_commands} && '
|
||||||
proxy_env_vars = f'{proxy_env_vars} HTTPS_PROXY={ur1_proxy_url}'
|
shell_command += f'{get_proxy_env_vars()} starbench --source-tree-provider \'{source_tree_provider}\' --num-cores {num_cores} --output-dir={output_dir} --cmake-path={cmake_path} {" ".join([f"--cmake-option={option}" for option in cmake_options])} --benchmark-command=\'{benchmark_command}\''
|
||||||
proxy_env_vars = f'{proxy_env_vars} FTP_PROXY={ur1_proxy_url}'
|
subprocess.run(shell_command, shell=True, check=True, executable='/bin/bash')
|
||||||
proxy_env_vars = f'{proxy_env_vars} http_proxy={ur1_proxy_url}'
|
|
||||||
proxy_env_vars = f'{proxy_env_vars} https_proxy={ur1_proxy_url}'
|
|
||||||
proxy_env_vars = f'{proxy_env_vars} ftp_proxy={ur1_proxy_url}'
|
|
||||||
|
|
||||||
shell_command = f'{env_vars_bash_commands} && {proxy_env_vars} starbench --source-tree-provider \'{source_tree_provider}\' --num-cores 2 --output-dir={output_dir} --cmake-path=/usr/bin/cmake {" ".join([f"--cmake-option={option}" for option in cmake_options])} --benchmark-command=\'{benchmark_command}\''
|
|
||||||
subprocess.run(shell_command, shell=True, check=True, encoding='/bin/bash')
|
|
||||||
|
|
|
@ -271,7 +271,7 @@ def archive_this_virtualenv_to(venv_archive_path: Path, venv_hardcoded_path: Pat
|
||||||
subprocess.run(f'tar czvf {venv_archive_path} {venv_hardcoded_path.relative_to(venv_hardcoded_path.parent)}', shell=True, check=True, cwd=venv_hardcoded_path.parent, stdout=subprocess.DEVNULL)
|
subprocess.run(f'tar czvf {venv_archive_path} {venv_hardcoded_path.relative_to(venv_hardcoded_path.parent)}', shell=True, check=True, cwd=venv_hardcoded_path.parent, stdout=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
|
||||||
def launch_job_for_host_group(benchmark: IBenchmark, benchmark_config: BenchmarkConfig, host_group_id: HostGroupId, results_dir: Path, cluster: ICluster, cmake_path: str):
|
def launch_job_for_host_group(benchmark: IBenchmark, benchmark_config: BenchmarkConfig, host_group_id: HostGroupId, results_dir: Path, cluster: ICluster):
|
||||||
|
|
||||||
compiler_id: CompilerId = benchmark_config['compiler_id']
|
compiler_id: CompilerId = benchmark_config['compiler_id']
|
||||||
|
|
||||||
|
@ -308,7 +308,8 @@ def launch_job_for_host_group(benchmark: IBenchmark, benchmark_config: Benchmark
|
||||||
'<iprbench_venv_hardcoded_path>': str(iprbench_venv_hardcoded_path),
|
'<iprbench_venv_hardcoded_path>': str(iprbench_venv_hardcoded_path),
|
||||||
'<iprbench_venv_archive_path>': str(job_venv_archive_path),
|
'<iprbench_venv_archive_path>': str(job_venv_archive_path),
|
||||||
'<benchmark_config>': json.dumps(benchmark_config).replace('"', r'\"'),
|
'<benchmark_config>': json.dumps(benchmark_config).replace('"', r'\"'),
|
||||||
'<results_dir>': str(results_dir)
|
'<results_dir>': str(results_dir),
|
||||||
|
'<num_cores>': num_cores,
|
||||||
}
|
}
|
||||||
logging.debug('tags_dict = %s', str(tags_dict))
|
logging.debug('tags_dict = %s', str(tags_dict))
|
||||||
with importlib.resources.path('iprbench.resources', 'clusterbench-template.job') as job_template_path:
|
with importlib.resources.path('iprbench.resources', 'clusterbench-template.job') as job_template_path:
|
||||||
|
@ -337,7 +338,7 @@ def launch_job_for_host_group(benchmark: IBenchmark, benchmark_config: Benchmark
|
||||||
cluster.submit_job(qsub_args, exec_path, exec_args, this_bench_dir)
|
cluster.submit_job(qsub_args, exec_path, exec_args, this_bench_dir)
|
||||||
|
|
||||||
|
|
||||||
def launch_perf_jobs(benchmark: IBenchmark, benchmark_config: BenchmarkConfig, results_dir: Path, cluster: ICluster, arch_regexp: str, cmake_path: str):
|
def launch_perf_jobs(benchmark: IBenchmark, benchmark_config: BenchmarkConfig, results_dir: Path, cluster: ICluster, arch_regexp: str):
|
||||||
"""
|
"""
|
||||||
results_dir: where the results of the benchmark are stored (eg $GLOBAL_WORK_DIR/graffy/benchmarks/hibench)
|
results_dir: where the results of the benchmark are stored (eg $GLOBAL_WORK_DIR/graffy/benchmarks/hibench)
|
||||||
"""
|
"""
|
||||||
|
@ -350,7 +351,7 @@ def launch_perf_jobs(benchmark: IBenchmark, benchmark_config: BenchmarkConfig, r
|
||||||
logging.info('requested host groups: %s', host_groups)
|
logging.info('requested host groups: %s', host_groups)
|
||||||
|
|
||||||
for host_group in host_groups:
|
for host_group in host_groups:
|
||||||
launch_job_for_host_group(benchmark, benchmark_config, host_group, results_dir, cluster, cmake_path)
|
launch_job_for_host_group(benchmark, benchmark_config, host_group, results_dir, cluster)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -367,7 +368,6 @@ def main():
|
||||||
arg_parser.add_argument('--results-dir', type=Path, required=True, help='the root directory of the tree where the results of the benchmarks are stored (eg $GLOBAL_WORK_DIR/graffy/benchmarks/hibench)')
|
arg_parser.add_argument('--results-dir', type=Path, required=True, help='the root directory of the tree where the results of the benchmarks are stored (eg $GLOBAL_WORK_DIR/graffy/benchmarks/hibench)')
|
||||||
arg_parser.add_argument('--config', type=str, default='cmake', help='the benchmark configuration in json format, eg {"compiler_id": "gfortran", "matrix_size": 1024}')
|
arg_parser.add_argument('--config', type=str, default='cmake', help='the benchmark configuration in json format, eg {"compiler_id": "gfortran", "matrix_size": 1024}')
|
||||||
arg_parser.add_argument('--arch-regexp', type=str, default='.*', help='the regular expression for the architectures the benchmark is allowed to run on (eg "intel_xeon_.*"). By defauls, all available architectures are allowed.')
|
arg_parser.add_argument('--arch-regexp', type=str, default='.*', help='the regular expression for the architectures the benchmark is allowed to run on (eg "intel_xeon_.*"). By defauls, all available architectures are allowed.')
|
||||||
arg_parser.add_argument('--cmake-path', type=str, default='cmake', help='the location of the cmake command to use (eg /opt/cmake/cmake-3.23.0/bin/cmake)')
|
|
||||||
|
|
||||||
args = arg_parser.parse_args()
|
args = arg_parser.parse_args()
|
||||||
benchmark_id = ClusterId(args.benchmark_id)
|
benchmark_id = ClusterId(args.benchmark_id)
|
||||||
|
@ -375,7 +375,6 @@ def main():
|
||||||
|
|
||||||
results_dir = Path(args.results_dir)
|
results_dir = Path(args.results_dir)
|
||||||
arch_regexp = args.arch_regexp
|
arch_regexp = args.arch_regexp
|
||||||
cmake_path = args.cmake_path
|
|
||||||
benchmark_config = json.loads(args.config)
|
benchmark_config = json.loads(args.config)
|
||||||
|
|
||||||
cluster = ClusterFactory().create_cluster(args.cluster_id)
|
cluster = ClusterFactory().create_cluster(args.cluster_id)
|
||||||
|
@ -383,4 +382,4 @@ def main():
|
||||||
if not cluster.path_is_reachable_by_compute_nodes(results_dir):
|
if not cluster.path_is_reachable_by_compute_nodes(results_dir):
|
||||||
raise ValueError('the results path is expected to be on a disk that is accessible to all cluster nodes, and it doesn\'t seem to be the case for {results_dir}')
|
raise ValueError('the results path is expected to be on a disk that is accessible to all cluster nodes, and it doesn\'t seem to be the case for {results_dir}')
|
||||||
|
|
||||||
launch_perf_jobs(benchmark, benchmark_config, results_dir, cluster, arch_regexp, cmake_path)
|
launch_perf_jobs(benchmark, benchmark_config, results_dir, cluster, arch_regexp)
|
||||||
|
|
|
@ -45,4 +45,5 @@ def main():
|
||||||
benchmark = BenchmarkFactory().create_benchmark(benchmark_id)
|
benchmark = BenchmarkFactory().create_benchmark(benchmark_id)
|
||||||
benchmark_config = json.loads(args.config)
|
benchmark_config = json.loads(args.config)
|
||||||
benchmark.validate_config(benchmark_config)
|
benchmark.validate_config(benchmark_config)
|
||||||
benchmark.execute(benchmark_config, args.results_dir)
|
results_dir = args.results_dir
|
||||||
|
benchmark.execute(benchmark_config, results_dir)
|
||||||
|
|
|
@ -8,7 +8,7 @@ then
|
||||||
# this script is not executed by sge... set dummy values for test
|
# this script is not executed by sge... set dummy values for test
|
||||||
TMPDIR=/tmp
|
TMPDIR=/tmp
|
||||||
JOB_ID=666666
|
JOB_ID=666666
|
||||||
NSLOTS=2
|
NSLOTS=<num_cores>
|
||||||
else
|
else
|
||||||
executed_by_sge='true'
|
executed_by_sge='true'
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -3,6 +3,7 @@ from pathlib import Path
|
||||||
import sys
|
import sys
|
||||||
import shutil
|
import shutil
|
||||||
import logging
|
import logging
|
||||||
|
import socket
|
||||||
|
|
||||||
|
|
||||||
class Singleton(type):
|
class Singleton(type):
|
||||||
|
@ -57,3 +58,51 @@ def extract_resource_dir(resource_package: str, resource_dir_to_extract: str, de
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
else:
|
else:
|
||||||
assert False, f'unexpected method : {method}'
|
assert False, f'unexpected method : {method}'
|
||||||
|
|
||||||
|
|
||||||
|
def get_ip():
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.settimeout(0)
|
||||||
|
try:
|
||||||
|
# doesn't even have to be reachable
|
||||||
|
s.connect(('10.254.254.254', 1))
|
||||||
|
IP = s.getsockname()[0]
|
||||||
|
except Exception:
|
||||||
|
IP = '127.0.0.1'
|
||||||
|
finally:
|
||||||
|
s.close()
|
||||||
|
return IP
|
||||||
|
|
||||||
|
|
||||||
|
VlanId = str # eg 'SIMPA', 'REC_PHYS'
|
||||||
|
|
||||||
|
|
||||||
|
def get_vlan() -> VlanId:
|
||||||
|
ip_address = [int(s) for s in get_ip().split('.')]
|
||||||
|
logging.debug('ip address : %s', ip_address)
|
||||||
|
vlan_id = 'UNKNOWN'
|
||||||
|
if ip_address[0] == 129 and ip_address[1] == 20:
|
||||||
|
vlan_id = {
|
||||||
|
27: 'SIMPA',
|
||||||
|
79: 'REC-PHYS',
|
||||||
|
}[ip_address[2]]
|
||||||
|
else:
|
||||||
|
assert False
|
||||||
|
return vlan_id
|
||||||
|
|
||||||
|
|
||||||
|
def get_proxy_env_vars() -> str:
|
||||||
|
# fatal: unable to access 'https://github.com/hibridon/hibridon/': Failed to connect to proxy-nt.univ-rennes1.fr port 3128: Connection timed out
|
||||||
|
proxy_is_required = get_vlan() in ['SIMPA']
|
||||||
|
if proxy_is_required:
|
||||||
|
ur1_proxy_url = 'http://proxy-nt.univ-rennes1.fr:3128'
|
||||||
|
proxy_env_vars = ''
|
||||||
|
proxy_env_vars = f'{proxy_env_vars} HTTP_PROXY={ur1_proxy_url}'
|
||||||
|
proxy_env_vars = f'{proxy_env_vars} HTTPS_PROXY={ur1_proxy_url}'
|
||||||
|
proxy_env_vars = f'{proxy_env_vars} FTP_PROXY={ur1_proxy_url}'
|
||||||
|
proxy_env_vars = f'{proxy_env_vars} http_proxy={ur1_proxy_url}'
|
||||||
|
proxy_env_vars = f'{proxy_env_vars} https_proxy={ur1_proxy_url}'
|
||||||
|
proxy_env_vars = f'{proxy_env_vars} ftp_proxy={ur1_proxy_url}'
|
||||||
|
else:
|
||||||
|
proxy_env_vars = ''
|
||||||
|
return proxy_env_vars
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import unittest
|
import unittest
|
||||||
import logging
|
import logging
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
class ClusterBenchTestCase(unittest.TestCase):
|
class ClusterBenchTestCase(unittest.TestCase):
|
||||||
|
@ -16,10 +17,17 @@ class ClusterBenchTestCase(unittest.TestCase):
|
||||||
command = 'clusterbench-submit --cluster-id \'dummy\' --arch-regexp "intel_core.*" --benchmark-id \'mamul1\' --config \'{"compiler_id": "gfortran", "matrix_size": 1024, "num_loops":10}\' --results-dir /tmp/mamul1_out'
|
command = 'clusterbench-submit --cluster-id \'dummy\' --arch-regexp "intel_core.*" --benchmark-id \'mamul1\' --config \'{"compiler_id": "gfortran", "matrix_size": 1024, "num_loops":10}\' --results-dir /tmp/mamul1_out'
|
||||||
subprocess.run(command, shell=True, check=True, executable='/bin/bash')
|
subprocess.run(command, shell=True, check=True, executable='/bin/bash')
|
||||||
|
|
||||||
# def test_clusterbench_hibench(self):
|
def test_clusterbench_hibench(self):
|
||||||
# logging.info('test_clusterbench_hibench')
|
logging.info('test_clusterbench_hibench')
|
||||||
# command = 'clusterbench-submit --benchmark-id \'hibench\' --config \'{"compiler_id": "gfortran", "test_id": "arch4_quick"}\' --results-dir /tmp/mamul1_out'
|
config = {
|
||||||
# subprocess.run(command, shell=True, check=True, executable='/bin/bash')
|
'compiler_id': 'gfortran',
|
||||||
|
'test_id': 'arch4_quick',
|
||||||
|
'hibridon_version': 'a3bed1c3ccfbca572003020d3e3d3b1ff3934fad',
|
||||||
|
'cmake_path': 'cmake',
|
||||||
|
'num_cores': 2,
|
||||||
|
}
|
||||||
|
command = f'clusterbench-submit --cluster-id \'dummy\' --benchmark-id \'hibench\' --config \'{json.dumps(config)}\' --results-dir /tmp/hibench_out'
|
||||||
|
subprocess.run(command, shell=True, check=True, executable='/bin/bash')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import unittest
|
import unittest
|
||||||
import logging
|
import logging
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import json
|
||||||
# import importlib.resources
|
# import importlib.resources
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,6 +23,18 @@ class IprBenchTestCase(unittest.TestCase):
|
||||||
command = 'iprbench-run --benchmark-id \'mamul1\' --config \'{"compiler_id": "gfortran", "matrix_size": 1024, "num_loops":10, "num_cores":2}\' --results-dir /tmp/mamul1_out'
|
command = 'iprbench-run --benchmark-id \'mamul1\' --config \'{"compiler_id": "gfortran", "matrix_size": 1024, "num_loops":10, "num_cores":2}\' --results-dir /tmp/mamul1_out'
|
||||||
subprocess.run(command, shell=True, check=True, executable='/bin/bash')
|
subprocess.run(command, shell=True, check=True, executable='/bin/bash')
|
||||||
|
|
||||||
|
def test_iprbench_hibench(self):
|
||||||
|
logging.info('test_iprbench_hibench')
|
||||||
|
config = {
|
||||||
|
'compiler_id': 'gfortran',
|
||||||
|
'test_id': 'arch4_quick',
|
||||||
|
'hibridon_version': 'a3bed1c3ccfbca572003020d3e3d3b1ff3934fad',
|
||||||
|
'cmake_path': 'cmake',
|
||||||
|
'num_cores': 2,
|
||||||
|
}
|
||||||
|
command = f'iprbench-run --benchmark-id \'hibench\' --config \'{json.dumps(config)}\' --results-dir /tmp/hibench_out'
|
||||||
|
subprocess.run(command, shell=True, check=True, executable='/bin/bash')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue