Benchmarks/AMD/GEMMHipblasLt.py (101 lines of code) (raw):

import json import os from Infra import tools from prettytable import PrettyTable import docker class GEMMHipBLAS: def __init__(self, path: str, dir_path: str, machine: str, i: int = 1000, w: int = 10000): self.name = "GEMMHipBLAS" config = self.get_config(path) self.m, self.n, self.k, self.duration, self.datatype = self.config_conversion(config) self.dir_path = dir_path self.i = i self.w = w self.bindir = '' self.machine_name = machine self.container = None def get_config(self, path: str): file = open(path) data = json.load(file) file.close() try: return data[self.name] except KeyError: raise KeyError("no value found") def parse_json(self, config, var): if var == "duration": return config["inputs"]["duration"] if var == "datatype": return config["inputs"]["datatype"] start = config["inputs"][var]["start"] end = config["inputs"][var]["end"] interval = config["inputs"][var]["interval"] data = [a for a in range(start, end, interval)] if not data or data[-1] < end: data.append(end) return data def config_conversion(self, config): m = self.parse_json(config, "m") n = self.parse_json(config, "n") k = self.parse_json(config, "k") duration = self.parse_json(config, "duration") datatype = self.parse_json(config, "datatype") return m, n, k, duration, datatype def create_container(self): client = docker.from_env() # Define the Docker run options docker_run_options = { 'ipc_mode':'host', 'entrypoint': '/bin/bash', 'network': 'host', 'group_add': ['render'], 'privileged': True, 'security_opt': ['seccomp=unconfined'], 'cap_add': ['CAP_SYS_ADMIN', 'SYS_PTRACE'], 'devices': ['/dev/kfd', '/dev/dri', '/dev/mem'], 'volumes': {str(self.dir_path): {'bind': str(self.dir_path), 'mode': 'rw'}}, 'tty': True, 'detach': True } # Creates new Docker container print("Pulling docker container rocm/vllm-dev:main...") self.container = client.containers.run('rocm/vllm-dev:main', **docker_run_options) print(f"Created Docker Container ID: {self.container.id}") def build(self): path = "hipBLASLt" isdir = os.path.isdir(path) if not isdir: clone_cmd = "git clone https://github.com/ROCm/hipBLASLt " + self.dir_path + "/hipBLASLt" results = self.container.exec_run(clone_cmd, stderr=True) results = self.container.exec_run(f'/bin/sh -c "cd {self.dir_path}/hipBLASLt && git checkout a11ccf64efcd818106dbe37768f69dfcc0a7ff22"', stderr=True) if results.exit_code != 0: tools.write_log(results.output.decode('utf-8')) return results = self.container.exec_run(f'sudo apt-get -y update', stderr=True) tools.write_log(results.output.decode('utf-8')) results = self.container.exec_run(f'sudo apt -y install llvm-dev', stderr=True) tools.write_log(results.output.decode('utf-8')) print("Building hipBLAS Library...") results = self.container.exec_run(f'/bin/sh -c "cd {self.dir_path}/hipBLASLt && ./install.sh -dc -a gfx942"', stderr=True) tools.write_log(results.output.decode('utf-8')) # run GEMM with predetermined matrix sizes that are commonly used in transformers def run_model_sizes(self): print("Running HipBLAS...") m_dims = [1024, 2048, 4096, 8192, 16384, 32768, 1024, 6144, 802816] n_dims = [1024, 2048, 4096, 8192, 16384, 32768, 2145, 12288, 192] k_dims = [1024, 2048, 4096, 8192, 16384, 32768, 1024, 12288, 768] for i in range(len(m_dims)): hipblas_cmd = 'cd ' + self.dir_path + '/Benchmarks/AMD && ./hipBLAS_runner.sh ' + str(m_dims[i]) + ' ' + str(n_dims[i]) + ' ' + str(k_dims[i]) results = self.container.exec_run(f'/bin/sh -c ' + '"' + hipblas_cmd + '"') tools.write_log(results.output.decode('utf-8')) with open(self.dir_path + '/Outputs/GEMMHipBLAS_results.txt', 'r') as resFile: table1 = PrettyTable() table1.field_names = ["M","N","K","TFLOPS"] for line in resFile: l = line.strip() if l[0] == "T": l = l.split(',') m = l[4] n = l[5] k = l[6] tflops = float(l[-3])/1000 table1.add_row([m,n,k,tflops]) print(table1) self.container.kill()