aio_bench_generate_param.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. # Copyright (c) Microsoft Corporation.
  2. # SPDX-License-Identifier: Apache-2.0
  3. # DeepSpeed Team
  4. """
  5. Functionality of swapping optimizer tensors to/from (NVMe) storage devices.
  6. """
  7. import os
  8. import argparse
  9. import json
  10. from parse_aio_stats import READ_SPEED, WRITE_SPEED, get_sorted_results
  11. from perf_sweep_utils import BENCH_LOG_DIR, READ_LOG_DIR, WRITE_LOG_DIR
  12. def parse_arguments():
  13. parser = argparse.ArgumentParser()
  14. parser.add_argument('--log_dir',
  15. type=str,
  16. default=BENCH_LOG_DIR,
  17. help=f'Folder of performance sweep logs. Default is {os.path.join(".", BENCH_LOG_DIR)}')
  18. args = parser.parse_args()
  19. print(f'args = {args}')
  20. return args
  21. def validate_args(args):
  22. for d in [READ_LOG_DIR, WRITE_LOG_DIR]:
  23. log_dir = os.path.join(args.log_dir, d)
  24. if not os.path.isdir(log_dir):
  25. print(f'{log_dir} folder is not existent')
  26. return False
  27. return True
  28. def convert_to_param(key):
  29. assert len(key) == 6
  30. return {
  31. "single_submit": "true" if key[0] == "single" else "false",
  32. "overlap_events": "true" if key[1] == "overlap" else "false",
  33. "thread_count": int(key[3]),
  34. "queue_depth": int(key[4]),
  35. "block_size": int(key[5])
  36. }
  37. def generate_aio_param(read_log_dir, write_log_dir):
  38. _, read_results = get_sorted_results(read_log_dir, READ_SPEED)
  39. _, write_results = get_sorted_results(write_log_dir, WRITE_SPEED)
  40. combined_perf = {key[1:]: value for key, value in read_results.items()}
  41. for key, value in write_results.items():
  42. new_key = key[1:]
  43. if new_key in combined_perf:
  44. combined_perf[new_key] += value
  45. else:
  46. combined_perf[new_key] = 0
  47. optimal_key = None
  48. optimal_perf = 0.0
  49. for key, value in combined_perf.items():
  50. if value > optimal_perf:
  51. optimal_perf = value
  52. optimal_key = key
  53. aio_param = {"aio": convert_to_param(optimal_key)}
  54. read_perf_keys = {key[1:]: key for key in read_results.keys()}
  55. write_perf_keys = {key[1:]: key for key in write_results.keys()}
  56. optimal_config_read = read_results.get(read_perf_keys[optimal_key], None)
  57. optimal_config_write = write_results.get(write_perf_keys[optimal_key], None)
  58. print(f'Best performance (GB/sec): read = {optimal_config_read:5.2f}, write = {optimal_config_write:5.2f}')
  59. print(json.dumps(aio_param, indent=3))
  60. def main():
  61. print('Generate aio param')
  62. args = parse_arguments()
  63. if not validate_args(args):
  64. quit()
  65. read_log_dir = os.path.join(args.log_dir, READ_LOG_DIR)
  66. write_log_dir = os.path.join(args.log_dir, WRITE_LOG_DIR)
  67. generate_aio_param(read_log_dir, write_log_dir)
  68. if __name__ == "__main__":
  69. main()