gemm_perf.py 5.1 KB
Newer Older
Alan Turner's avatar
Alan Turner committed
1
2
import subprocess, csv, re, datetime

Alan Turner's avatar
Alan Turner committed
3

Alan Turner's avatar
Alan Turner committed
4
class CSVFile:
Alan Turner's avatar
Alan Turner committed
5

Alan Turner's avatar
Alan Turner committed
6
7
8
9
10
11
12
13
    def __init__(self, path="output.csv"):
        self.path = path

    def write_row(self, row=[]):
        with open(self.path, "a+") as f:
            cw = csv.writer(f)
            cw.writerow(row)

turneram's avatar
turneram committed
14
15
16
17
18
19
20
21
22

def get_device_name():
    out = subprocess.run("rocminfo",
                         capture_output=True,
                         check=True,
                         shell=True)
    matches = re.findall("gfx\d*[a-z]*", str(out.stdout))
    return matches[0]

Alan Turner's avatar
Alan Turner committed
23
24
25
26
27
28
29

def run_perf(model,
             batch_size,
             int8=False,
             use_ck=False,
             use_large_k=False,
             disable_fusion=False):
turneram's avatar
turneram committed
30
31
    env_vars = ""
    if use_ck:
Alan Turner's avatar
Alan Turner committed
32
        env_vars += "MIGRAPHX_ENABLE_CK=1 "
turneram's avatar
turneram committed
33
        if use_large_k:
Alan Turner's avatar
Alan Turner committed
34
            env_vars += "MIGRAPHX_USE_LARGE_K=1 "
turneram's avatar
turneram committed
35
36
37
        if disable_fusion:
            env_vars += "MIGRAPHX_DISABLE_CK_FUSION=1 "
    int8_str = "--int8" if int8 else ""
Alan Turner's avatar
Alan Turner committed
38
    cmd = f"{env_vars} ../build/bin/driver perf {model} --fill1 input_ids --input-dim @input_ids {batch_size} 384 --batch {batch_size} --fp16 {int8_str}  --exhaustive-tune"
Alan Turner's avatar
Alan Turner committed
39
    out = subprocess.run(cmd, capture_output=True, check=True, shell=True)
Alan Turner's avatar
Alan Turner committed
40

turneram's avatar
turneram committed
41
42
43
44
    summary = re.findall("Summary.*", str(out.stdout))[0].replace("\\n", "\n")
    total_time = re.findall("Total time: \d+\.\d*", summary)[0]
    total_time = total_time.replace("Total time: ", "")

Alan Turner's avatar
Alan Turner committed
45
46
47
48
49
    ck_gemm_time = re.findall("ck_gemm_kernel: \d+\.\d*", summary)
    if ck_gemm_time:
        ck_gemm_time = re.findall("\d+\.\d*", ck_gemm_time[0])[0]
    else:
        ck_gemm_time = "0.0"
Alan Turner's avatar
Alan Turner committed
50
51
52

    rb_gemm_time = re.findall("gpu::quant_gemm: \d+\.\d*|gpu::gemm: \d+\.\d*",
                              summary)
Alan Turner's avatar
Alan Turner committed
53
54
55
56
    if rb_gemm_time:
        rb_gemm_time = re.findall("\d+\.\d*", rb_gemm_time[0])[0]
    else:
        rb_gemm_time = "0.0"
Alan Turner's avatar
Alan Turner committed
57

Alan Turner's avatar
Alan Turner committed
58
59
60
61
62
63
64
65
66
67
68
69
70
    gemm_pack_time = re.findall("gpu::int8_gemm_pack_a: \d+\.\d*", summary)
    if gemm_pack_time:
        gemm_pack_time = re.findall("\d+\.\d*", gemm_pack_time[0])[0]
    else:
        gemm_pack_time = "0.0"

    gemm_times = [ck_gemm_time, rb_gemm_time, gemm_pack_time]
    total_gemm_time = [str(sum(map(float, gemm_times)))]
    gemm_times.extend(total_gemm_time)

    print(cmd)
    print(total_time + "ms")
    with open("perf_summaries.txt", "a+") as f:
turneram's avatar
turneram committed
71
72
        f.write(cmd + "\n")
        f.write(summary + "\n\n")
Alan Turner's avatar
Alan Turner committed
73

Alan Turner's avatar
Alan Turner committed
74
    return [total_time] + gemm_times
turneram's avatar
turneram committed
75

Alan Turner's avatar
Alan Turner committed
76

Alan Turner's avatar
Alan Turner committed
77
def run_ck_perf(model, batch_size, int8=False, use_large_k=False):
Alan Turner's avatar
Alan Turner committed
78
    # CK with fusions
Alan Turner's avatar
Alan Turner committed
79
    total_time = run_perf(model, batch_size, int8, True, use_large_k, False)[0]
Alan Turner's avatar
Alan Turner committed
80
    # CK without fusions
Alan Turner's avatar
Alan Turner committed
81
    gemm_times = run_perf(model, batch_size, int8, True, use_large_k, True)
turneram's avatar
turneram committed
82

Alan Turner's avatar
Alan Turner committed
83
    return [total_time] + gemm_times[1:]
turneram's avatar
turneram committed
84
85
86
87
88


if __name__ == "__main__":
    device_id = get_device_name()
    model = "/code/bert_base_cased_1_fp16_gpu.onnx"
Alan Turner's avatar
Alan Turner committed
89
90
91
92
    cf = CSVFile()
    cf.write_row([str(datetime.datetime.now())])
    cf.write_row([device_id])
    cf.write_row([model])
Alan Turner's avatar
Alan Turner committed
93
94
95
96
    headers = [
        "", "Total Time (ms)", "CK GEMM Time (ms)", "RB GEMM Time (ms)",
        "GEMM Pack Time (ms)", "Total GEMM Time (ms)"
    ]
Alan Turner's avatar
Alan Turner committed
97
98
99
100
101
102
103
104
105
106

    batch_size = "1"
    # int8:
    quantize = True
    label = f"Int8 / BatchSize: {batch_size}" if quantize else f"FP16 / BatchSize: {batch_size}"
    cf.write_row([label])
    cf.write_row(headers)
    # CK Only
    cf.write_row(["CK"] + run_ck_perf(model, batch_size, quantize, True))
    # CK + rocBLAS (k>2048)
Alan Turner's avatar
Alan Turner committed
107
108
    cf.write_row(["CK + rocBLAS(k>2048)"] +
                 run_ck_perf(model, batch_size, quantize, False))
Alan Turner's avatar
Alan Turner committed
109
110
111
112
113
114
115
116
117
118
119
120
    # rocBLAS Only
    cf.write_row(["rocBLAS"] + run_perf(model, batch_size, quantize))
    cf.write_row()

    # fp16:
    quantize = False
    label = f"Int8 / BatchSize: {batch_size}" if quantize else f"FP16 / BatchSize: {batch_size}"
    cf.write_row([label])
    cf.write_row(headers)
    # CK Only
    cf.write_row(["CK"] + run_ck_perf(model, batch_size, quantize, True))
    # CK + rocBLAS (k>2048)
Alan Turner's avatar
Alan Turner committed
121
122
    cf.write_row(["CK + rocBLAS(k>2048)"] +
                 run_ck_perf(model, batch_size, quantize, False))
Alan Turner's avatar
Alan Turner committed
123
124
125
126
127
128
129
130
131
132
133
134
135
    # rocBLAS Only
    cf.write_row(["rocBLAS"] + run_perf(model, batch_size, quantize))
    cf.write_row()

    batch_size = "64"
    # int8:
    quantize = True
    label = f"Int8 / BatchSize: {batch_size}" if quantize else f"FP16 / BatchSize: {batch_size}"
    cf.write_row([label])
    cf.write_row(headers)
    # CK Only
    cf.write_row(["CK"] + run_ck_perf(model, batch_size, quantize, True))
    # CK + rocBLAS (k>2048)
Alan Turner's avatar
Alan Turner committed
136
137
    cf.write_row(["CK + rocBLAS(k>2048)"] +
                 run_ck_perf(model, batch_size, quantize, False))
Alan Turner's avatar
Alan Turner committed
138
139
140
141
142
143
144
145
146
147
148
149
    # rocBLAS Only
    cf.write_row(["rocBLAS"] + run_perf(model, batch_size, quantize))
    cf.write_row()

    # fp16:
    quantize = False
    label = f"Int8 / BatchSize: {batch_size}" if quantize else f"FP16 / BatchSize: {batch_size}"
    cf.write_row([label])
    cf.write_row(headers)
    # CK Only
    cf.write_row(["CK"] + run_ck_perf(model, batch_size, quantize, True))
    # CK + rocBLAS (k>2048)
Alan Turner's avatar
Alan Turner committed
150
151
    cf.write_row(["CK + rocBLAS(k>2048)"] +
                 run_ck_perf(model, batch_size, quantize, False))
Alan Turner's avatar
Alan Turner committed
152
153
    # rocBLAS Only
    cf.write_row(["rocBLAS"] + run_perf(model, batch_size, quantize))
Alan Turner's avatar
Alan Turner committed
154
    cf.write_row()