From 8d5ba3f58004f8b79648b70c7fa9805deba3ce9c Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 18 Jun 2024 02:07:47 +0000 Subject: [PATCH 01/51] A new Triton compiler sans CUDA support. --- third_party/triton | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/triton b/third_party/triton index b5f3d15d..f471ba9e 160000 --- a/third_party/triton +++ b/third_party/triton @@ -1 +1 @@ -Subproject commit b5f3d15da4a191fc81ade329e5f60c7a1118f921 +Subproject commit f471ba9e3dd672b948dda9dc0b8a7658e6f39e95 From 003b06e4feda59e6fdb0af93d2340b512a412922 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 18 Jun 2024 04:30:13 +0000 Subject: [PATCH 02/51] Fix the compiler for new Triton --- v2python/compile.py | 119 ++++++++++++++++++++++------------- v2python/old_compile.py | 134 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 211 insertions(+), 42 deletions(-) mode change 100755 => 100644 v2python/compile.py create mode 100755 v2python/old_compile.py diff --git a/v2python/compile.py b/v2python/compile.py old mode 100755 new mode 100644 index 8d5be9fc..0ab8e11e --- a/v2python/compile.py +++ b/v2python/compile.py @@ -1,7 +1,4 @@ -#!/usr/bin/env python -# Copyright © 2023-2024 Advanced Micro Devices, Inc. -# SPDX-License-Identifier: MIT - +import binascii import hashlib import importlib.util import sys @@ -10,6 +7,8 @@ from typing import List import triton +from triton.compiler.code_generator import kernel_suffix +from triton.backends.amd.driver import ty_to_cpp import shutil import subprocess @@ -19,24 +18,38 @@ Triton ahead-of-time compiler: """ +from triton.backends.compiler import GPUTarget + +KNOWN_TARGETS = { + None : None, + 'MI200' : GPUTarget('hip', 'gfx90a', 64), + 'MI300X' : GPUTarget('hip', 'gfx942', 64), +} + def main(): # command-line arguments parser = ArgumentParser(description=desc) - parser.add_argument("path", help="Path to Python source containing desired kernel in its scope. File will be executed.") - parser.add_argument("--target", type=str, default=None, help="Ahead of Time (AOT) Compile Architecture. PyTorch is required for autodetection if --target is missing.") - parser.add_argument("--kernel_name", "-n", type=str, default="", help="Name of the kernel to compile", required=True) + parser.add_argument("path", + help="Path to Python source containing desired kernel in its scope. File will be executed.") + parser.add_argument("--target", type=str, default=None, + choices=list(KNOWN_TARGETS.keys()), + help="Ahead of Time (AOT) Compile Architecture. PyTorch is required for autodetection if --target is missing.") + parser.add_argument("--kernel_name", "-n", type=str, default="", help="Name of the kernel to compile", + required=True) parser.add_argument("--num_warps", "-w", type=int, default=1, help="Number of warps to launch the kernel") - parser.add_argument("--num_stages", "-ns", type=int, default=3, help="Number of stages (meta-parameter of the kernel)") + parser.add_argument("--num_stages", "-ns", type=int, default=3, + help="Number of stages (meta-parameter of the kernel)") parser.add_argument("--waves_per_eu", type=int, default=0) - parser.add_argument("--out_path", "-o", type=Path, default=None, help="Out filename", required=True) + parser.add_argument("--out_name", "-on", type=str, default=None, help="Out name for the compiled kernel") + parser.add_argument("--out_path", "-o", type=Path, default=None, help="Out filename") parser.add_argument("--signature", "-s", type=str, help="Signature of the kernel", required=True) parser.add_argument("--grid", "-g", type=str, help="Launch grid of the kernel", required=True) parser.add_argument("--verbose", "-v", help="Enable vebose output", action='store_true') parser.add_argument("--nostrip", help="Keep debugging symbols", action='store_true') args = parser.parse_args() - out_path = args.out_path - out_path = out_path.with_suffix('') + out_name = args.out_name if args.out_name else args.kernel_name + out_path = args.out_path if args.out_path else Path(out_name) # execute python sources and extract functions wrapped in JITFunction arg_path = Path(args.path) @@ -55,13 +68,6 @@ def main(): # kernel = globals()[f"{arg_path.stem}.{args.kernel_name}"] mod = globals()[arg_path.stem] kernel = getattr(mod, args.kernel_name) - # print(fused_attention_trimmed.attn_fwd) - if False: - mod = importlib.import_module(arg_path.stem) - print(mod.attn_fwd) - # print(fused_attention_trimmed.attn_fwd) - kernel = globals()[f"{arg_path.stem}.{args.kernel_name}"] - print(f"{kernel=}") grid = args.grid.split(",") assert len(grid) == 3 @@ -96,12 +102,12 @@ def constexpr(s): hints = {i: constexpr(s.split(":")[1]) for i, s in enumerate(signature) if ":" in s} hints = {k: v for k, v in hints.items() if v is not None} - constexprs = {i: constexpr(s) for i, s in enumerate(signature)} - constexprs = {k: v for k, v in constexprs.items() if v is not None} + constants = {i: constexpr(s) for i, s in enumerate(signature)} + constants = {k: v for k, v in constants.items() if v is not None} # print(f"{constexprs=}") - signature = {i: s.split(":")[0] for i, s in enumerate(signature) if i not in constexprs} - const_sig = 'x'.join([str(v) for v in constexprs.values()]) - doc_string = [f"{kernel.arg_names[i]}={constexprs[i]}" for i in constexprs.keys()] + signature = {i: s.split(":")[0] for i, s in enumerate(signature) if i not in constants} + const_sig = 'x'.join([str(v) for v in constants.values()]) + doc_string = [f"{kernel.arg_names[i]}={constants[i]}" for i in constants.keys()] doc_string += [f"num_warps={args.num_warps}", f"num_stages={args.num_stages}"] # compile ast into cubin @@ -109,26 +115,55 @@ def constexpr(s): assert h in [1, 16], f"Only 1 and 16 are valid hints, got {h}" divisible_by_16 = [i for i, h in hints.items() if h == 16] equal_to_1 = [i for i, h in hints.items() if h == 1] - config = triton.compiler.instance_descriptor(divisible_by_16=divisible_by_16, equal_to_1=equal_to_1) + attrs = triton.compiler.AttrsDescriptor(divisible_by_16=divisible_by_16, equal_to_1=equal_to_1) for i in equal_to_1: - constexprs.update({i: 1}) - # print(f'{kernel=}') - ccinfo = triton.compile(kernel, single_cpu=True, signature=signature, constants=constexprs, configs=[config], num_warps=args.num_warps, num_stages=args.num_stages, waves_per_eu=args.waves_per_eu, aot_arch=args.target) - hsaco_path = ccinfo.asm.get('hsaco_path', None) - if args.verbose: - print(dir(ccinfo)) - print(f'{ccinfo.asm.keys()=}') - print(f'{ccinfo.fn=}') - print(f'{hsaco_path=}') - - if hsaco_path is not None: - if args.nostrip: - shutil.copy(hsaco_path, out_path.with_suffix('.hsaco')) - else: - subprocess.run(['/opt/rocm/llvm/bin/llvm-objcopy', '--remove-section', '.debug_*', str(hsaco_path), str(out_path.with_suffix('.hsaco'))]) - - with out_path.with_suffix('.json').open("w") as fp: - json.dump(ccinfo.metadata, fp, indent=2) + constants.update({i: 1}) + src = triton.compiler.ASTSource(fn=kernel, constants=constants, signature=signature, attrs=attrs) + opts = {"num_warps": args.num_warps, "num_stages": args.num_stages} + ccinfo = triton.compile(src, target=KNOWN_TARGETS[args.target], options=opts) + # import pdb; pdb.set_trace() + with open(out_path.with_suffix('.hsaco'), 'bw') as f: + f.write(ccinfo.kernel) + with open(out_path.with_suffix('.json'), 'w') as f: + di = ccinfo.metadata._asdict() + del di['target'] + json.dump(di, f, indent=2) + + ''' + arg_names = [] + arg_types = [] + for i in signature.keys(): + if i not in equal_to_1: + arg_names += [kernel.arg_names[i]] + arg_types += [signature[i]] + + # dump C stub code + suffix = kernel_suffix(signature.values(), attrs) + func_name = '_'.join([out_name, sig_hash, suffix]) + hex_ = str(binascii.hexlify(ccinfo.asm["cubin"]))[2:-1] + params = { + "kernel_name": func_name, + "triton_kernel_name": args.kernel_name, + "bin_size": len(hex_), + "bin_data": ", ".join([f"0x{x}{y}" for x, y in zip(hex_[::2], hex_[1::2])]), + "signature": ", ".join([f"{ty_to_cpp(ty)} {name}" for name, ty in zip(arg_names, arg_types)]), + "full_signature": ", ".join([f"{ty_to_cpp(signature[i])} {kernel.arg_names[i]}" for i in signature.keys()]), + "arg_pointers": ", ".join([f"&{arg}" for arg in arg_names]), + "num_args": len(arg_names), + "kernel_docstring": doc_string, + "shared": ccinfo.metadata.shared, + "num_warps": args.num_warps, + "algo_info": '_'.join([const_sig, meta_sig]), + "gridX": grid[0], + "gridY": grid[1], + "gridZ": grid[2], + "_placeholder": "", + } + for ext in ['h', 'c']: + template_path = Path(__file__).parent / f"compile.{ext}" + with out_path.with_suffix(f".{sig_hash}_{suffix}.{ext}").open("w") as fp: + fp.write(Path(template_path).read_text().format(**params)) + ''' if __name__ == "__main__": main() diff --git a/v2python/old_compile.py b/v2python/old_compile.py new file mode 100755 index 00000000..8d5be9fc --- /dev/null +++ b/v2python/old_compile.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# Copyright © 2023-2024 Advanced Micro Devices, Inc. +# SPDX-License-Identifier: MIT + +import hashlib +import importlib.util +import sys +from argparse import ArgumentParser +from pathlib import Path +from typing import List + +import triton + +import shutil +import subprocess +import json + +desc = """ +Triton ahead-of-time compiler: +""" + +def main(): + # command-line arguments + parser = ArgumentParser(description=desc) + parser.add_argument("path", help="Path to Python source containing desired kernel in its scope. File will be executed.") + parser.add_argument("--target", type=str, default=None, help="Ahead of Time (AOT) Compile Architecture. PyTorch is required for autodetection if --target is missing.") + parser.add_argument("--kernel_name", "-n", type=str, default="", help="Name of the kernel to compile", required=True) + parser.add_argument("--num_warps", "-w", type=int, default=1, help="Number of warps to launch the kernel") + parser.add_argument("--num_stages", "-ns", type=int, default=3, help="Number of stages (meta-parameter of the kernel)") + parser.add_argument("--waves_per_eu", type=int, default=0) + parser.add_argument("--out_path", "-o", type=Path, default=None, help="Out filename", required=True) + parser.add_argument("--signature", "-s", type=str, help="Signature of the kernel", required=True) + parser.add_argument("--grid", "-g", type=str, help="Launch grid of the kernel", required=True) + parser.add_argument("--verbose", "-v", help="Enable vebose output", action='store_true') + parser.add_argument("--nostrip", help="Keep debugging symbols", action='store_true') + args = parser.parse_args() + + out_path = args.out_path + out_path = out_path.with_suffix('') + + # execute python sources and extract functions wrapped in JITFunction + arg_path = Path(args.path) + sys.path.insert(0, str(arg_path.parent)) + ''' + spec = importlib.util.spec_from_file_location(arg_path.stem, arg_path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + kernel = getattr(mod, args.kernel_name) + ''' + if True: + exec_string = f'import {arg_path.stem}' + # print(exec_string) + exec(exec_string, globals()) # importlib code path miss things + # print(globals()) + # kernel = globals()[f"{arg_path.stem}.{args.kernel_name}"] + mod = globals()[arg_path.stem] + kernel = getattr(mod, args.kernel_name) + # print(fused_attention_trimmed.attn_fwd) + if False: + mod = importlib.import_module(arg_path.stem) + print(mod.attn_fwd) + # print(fused_attention_trimmed.attn_fwd) + kernel = globals()[f"{arg_path.stem}.{args.kernel_name}"] + print(f"{kernel=}") + + grid = args.grid.split(",") + assert len(grid) == 3 + + # validate and parse signature + signature = list(map(lambda s: s.strip(" "), args.signature.split(","))) + + def hash_signature(signature: List[str]): + m = hashlib.sha256() + m.update(" ".join(signature).encode()) + return m.hexdigest()[:8] + + meta_sig = f"warps{args.num_warps}xstages{args.num_stages}" + sig_hash = hash_signature(signature + [meta_sig]) + + def constexpr(s): + try: + ret = int(s) + return ret + except ValueError: + pass + try: + ret = float(s) + return ret + except ValueError: + pass + if s == 'True': + return True + if s == 'False': + return False + return None + + hints = {i: constexpr(s.split(":")[1]) for i, s in enumerate(signature) if ":" in s} + hints = {k: v for k, v in hints.items() if v is not None} + constexprs = {i: constexpr(s) for i, s in enumerate(signature)} + constexprs = {k: v for k, v in constexprs.items() if v is not None} + # print(f"{constexprs=}") + signature = {i: s.split(":")[0] for i, s in enumerate(signature) if i not in constexprs} + const_sig = 'x'.join([str(v) for v in constexprs.values()]) + doc_string = [f"{kernel.arg_names[i]}={constexprs[i]}" for i in constexprs.keys()] + doc_string += [f"num_warps={args.num_warps}", f"num_stages={args.num_stages}"] + + # compile ast into cubin + for h in hints.values(): + assert h in [1, 16], f"Only 1 and 16 are valid hints, got {h}" + divisible_by_16 = [i for i, h in hints.items() if h == 16] + equal_to_1 = [i for i, h in hints.items() if h == 1] + config = triton.compiler.instance_descriptor(divisible_by_16=divisible_by_16, equal_to_1=equal_to_1) + for i in equal_to_1: + constexprs.update({i: 1}) + # print(f'{kernel=}') + ccinfo = triton.compile(kernel, single_cpu=True, signature=signature, constants=constexprs, configs=[config], num_warps=args.num_warps, num_stages=args.num_stages, waves_per_eu=args.waves_per_eu, aot_arch=args.target) + hsaco_path = ccinfo.asm.get('hsaco_path', None) + if args.verbose: + print(dir(ccinfo)) + print(f'{ccinfo.asm.keys()=}') + print(f'{ccinfo.fn=}') + print(f'{hsaco_path=}') + + if hsaco_path is not None: + if args.nostrip: + shutil.copy(hsaco_path, out_path.with_suffix('.hsaco')) + else: + subprocess.run(['/opt/rocm/llvm/bin/llvm-objcopy', '--remove-section', '.debug_*', str(hsaco_path), str(out_path.with_suffix('.hsaco'))]) + + with out_path.with_suffix('.json').open("w") as fp: + json.dump(ccinfo.metadata, fp, indent=2) + +if __name__ == "__main__": + main() From cd9615cf512e14e9219603faae9989288c380148 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 18 Jun 2024 20:41:20 +0000 Subject: [PATCH 03/51] Mitigate compiler bug (https://github.com/ROCm/triton/issues/596) --- tritonsrc/fwd_kernel_common.py | 40 ++++++++++++++++++++++++++++++++++ tritonsrc/fwd_kernel_inner.py | 11 ++++++++++ 2 files changed, 51 insertions(+) diff --git a/tritonsrc/fwd_kernel_common.py b/tritonsrc/fwd_kernel_common.py index 20d3a02d..0746dab5 100644 --- a/tritonsrc/fwd_kernel_common.py +++ b/tritonsrc/fwd_kernel_common.py @@ -6,6 +6,38 @@ from fwd_kernel_inner import attn_fwd_inner +''' +@triton.jit +def store0(O_block_ptr, acc): + tl.store(O_block_ptr, acc.to(O_block_ptr.type.element_ty)) + +@triton.jit +def store1(O_block_ptr, acc): + tl.store(O_block_ptr, acc.to(O_block_ptr.type.element_ty), boundary_check=(0,)) + +@triton.jit +def store2(O_block_ptr, acc): + tl.store(O_block_ptr, acc.to(O_block_ptr.type.element_ty), boundary_check=(1,)) + +@triton.jit +def store3(O_block_ptr, acc): + tl.store(O_block_ptr, acc.to(O_block_ptr.type.element_ty), boundary_check=(1,0)) +''' + +@triton.jit +def store_a(O_block_ptr, acc, q_padded): + if not q_padded: + tl.store(O_block_ptr, acc) + else: + tl.store(O_block_ptr, acc, boundary_check=(0,)) + +@triton.jit +def store_b(O_block_ptr, acc, q_padded): + if not q_padded: + tl.store(O_block_ptr, acc, boundary_check=(1,)) + else: + tl.store(O_block_ptr, acc, boundary_check=(1,0,)) + @triton.jit def attn_fwd_common( Q_block_ptr, @@ -48,6 +80,8 @@ def attn_fwd_common( # don't work as expected with `exp` in the loop qk_scale = sm_scale * 1.44269504089 # load q: it will stay in SRAM throughout on NV GPUs but in VGPRs on AMD GPUs + q = tl.load(Q_block_ptr, boundary_check=(0,1), padding_option="zero") + ''' if q_padded: if PADDED_HEAD: q = tl.load(Q_block_ptr, boundary_check=(0,1), padding_option="zero") @@ -58,6 +92,7 @@ def attn_fwd_common( q = tl.load(Q_block_ptr, boundary_check=(1,), padding_option="zero") else: q = tl.load(Q_block_ptr) + ''' q = (q * qk_scale).to(Q_block_ptr.type.element_ty) # stage 1: off-band # For causal = True, STAGE = 3 and attn_fwd_inner gets 1 as its STAGE @@ -125,6 +160,10 @@ def attn_fwd_common( else: tl.store(m_ptrs, m_i + tl.math.log2(l_i)) + acc = acc.to(O_block_ptr.type.element_ty) + tl.store(O_block_ptr, acc, boundary_check=(1,0,)) + + ''' if q_padded: if PADDED_HEAD: tl.store(O_block_ptr, acc.to(O_block_ptr.type.element_ty), boundary_check=(0,1)) @@ -135,3 +174,4 @@ def attn_fwd_common( tl.store(O_block_ptr, acc.to(O_block_ptr.type.element_ty), boundary_check=(1,)) else: tl.store(O_block_ptr, acc.to(O_block_ptr.type.element_ty)) + ''' diff --git a/tritonsrc/fwd_kernel_inner.py b/tritonsrc/fwd_kernel_inner.py index 4df80b83..6796f427 100644 --- a/tritonsrc/fwd_kernel_inner.py +++ b/tritonsrc/fwd_kernel_inner.py @@ -49,6 +49,8 @@ def attn_fwd_inner( for start_n in range(lo, hi, BLOCK_N): # -- compute qk ---- # MARGINAL_BLOCK serves as a compile-time switch for first attn_fwd_inner calls to "solid" blocks + k = tl.load(K_block_ptr, boundary_check=(1,0), padding_option="zero") + ''' if MARGINAL_BLOCK and k_padded: if PADDED_HEAD: k = tl.load(K_block_ptr, boundary_check=(1,0), padding_option="zero") @@ -70,6 +72,9 @@ def attn_fwd_inner( v = tl.load(V_block_ptr, boundary_check=(1,), padding_option="zero") else: v = tl.load(V_block_ptr) + ''' + if pre_load_v: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) if MARGINAL_BLOCK: if CAUSAL: @@ -83,6 +88,8 @@ def attn_fwd_inner( if BIAS_TYPE == 0: pass elif BIAS_TYPE == 1: + bias = tl.load(B_block_ptr, boundary_check=(0,1), padding_option="zero") + ''' if q_padded and k_padded: # CAVEAT: using "or" disables the partial boundary_check branches bias = tl.load(B_block_ptr, boundary_check=(0,1), padding_option="zero") elif q_padded: @@ -91,6 +98,7 @@ def attn_fwd_inner( bias = tl.load(B_block_ptr, boundary_check=(1,), padding_option="zero") else: bias = tl.load(B_block_ptr) + ''' qk += bias * 1.44269504089 else: tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') @@ -117,6 +125,8 @@ def attn_fwd_inner( alpha = tl.math.exp2(m_i - m_ij) acc = acc * alpha[:, None] if not pre_load_v: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + ''' if MARGINAL_BLOCK and k_padded: if PADDED_HEAD: v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") @@ -127,6 +137,7 @@ def attn_fwd_inner( v = tl.load(V_block_ptr, boundary_check=(1,), padding_option="zero") else: v = tl.load(V_block_ptr) + ''' # -- update m_i and l_i l_i = l_i * alpha + l_ij # update m_i and l_i From 77fa1e13cc2b8279548d429c1425ad07f429de83 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 18 Jun 2024 20:42:07 +0000 Subject: [PATCH 04/51] add wheel as another required package. --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index edc348cb..0abbfe0c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ packaging pluggy numpy setuptools +wheel From 579bf82e87a8f45152a0b172672e63b71379b1c0 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 19 Jun 2024 18:32:30 +0000 Subject: [PATCH 05/51] Port to performant kernel and moving away from block pointers for tl.store --- tritonsrc/attn_torch_function.py | 20 +- tritonsrc/bwd_kernel_common.py | 10 +- tritonsrc/bwd_split_kernel.py | 46 +++- tritonsrc/fwd_kernel.py | 387 ++++++++++++++++++++---------- tritonsrc/fwd_kernel_inner.py | 222 ++++++++--------- tritonsrc/masked_load_store.py | 32 +++ tritonsrc/old_fwd_kernel.py | 194 +++++++++++++++ tritonsrc/old_fwd_kernel_inner.py | 149 ++++++++++++ 8 files changed, 802 insertions(+), 258 deletions(-) create mode 100644 tritonsrc/masked_load_store.py create mode 100644 tritonsrc/old_fwd_kernel.py create mode 100644 tritonsrc/old_fwd_kernel_inner.py diff --git a/tritonsrc/attn_torch_function.py b/tritonsrc/attn_torch_function.py index d74ec176..cfc66a17 100644 --- a/tritonsrc/attn_torch_function.py +++ b/tritonsrc/attn_torch_function.py @@ -56,6 +56,8 @@ def tuned_attn_fwd( stride_vz, stride_vh, stride_vk, stride_vn, stride_bz, stride_bh, stride_bm, stride_bn, stride_oz, stride_oh, stride_om, stride_on, + num_head_q, + num_head_k, cu_seqlens_q, cu_seqlens_k, num_seqlens, @@ -83,6 +85,8 @@ def tuned_attn_fwd( stride_vz, stride_vh, stride_vk, stride_vn, stride_bz, stride_bh, stride_bm, stride_bn, stride_oz, stride_oh, stride_om, stride_on, + num_head_q, + num_head_k, cu_seqlens_q, cu_seqlens_k, num_seqlens, @@ -252,6 +256,8 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax head_dim_rounded = 2 ** (Lk - 1).bit_length() head_dim_rounded = max(16, head_dim_rounded) padded_head = head_dim_rounded != Lk + num_head_q = q.shape[1] + num_head_k = q.shape[2] max_seqlen_q = q.shape[2] max_seqlen_k = k.shape[2] o = torch.zeros_like(q) @@ -269,7 +275,7 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax null_tensor = torch.empty((0), device=q.device, dtype=torch.int32) M = torch.empty((q.shape[0] * q.shape[1], q.shape[2]), device=q.device, dtype=torch.float32) if return_encoded_softmax: - encoded_softmax = torch.ones((q.shape[0], q.shape[1], q.shape[2], k.shape[2]), device=q.device, dtype=_attention.DEBUG_MASK_DTYPE) * 114.514 + encoded_softmax = torch.ones((q.shape[0], q.shape[1], q.shape[2], k.shape[2]), device=q.device, dtype=q.dtype) else: encoded_softmax = None if False or VERBOSE: @@ -321,6 +327,8 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax v.stride(0), v.stride(1), v.stride(2), v.stride(3), b.stride(0), b.stride(1), b.stride(2), b.stride(3), o.stride(0), o.stride(1), o.stride(2), o.stride(3), + num_head_q=num_head_q, + num_head_k=num_head_k, cu_seqlens_q=null_tensor, cu_seqlens_k=null_tensor, num_seqlens=0, @@ -349,6 +357,8 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax v.stride(0), v.stride(1), v.stride(2), v.stride(3), b.stride(0), b.stride(1), b.stride(2), b.stride(3), o.stride(0), o.stride(1), o.stride(2), o.stride(3), + num_head_q=num_head_q, + num_head_k=num_head_k, cu_seqlens_q=null_tensor, cu_seqlens_k=null_tensor, num_seqlens=0, @@ -420,6 +430,8 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax tuning_result = None block_m = min(128, q.shape[2], k.shape[2]) grid = (triton.cdiv(q.shape[2], block_m), q.shape[1], q.shape[0]) + print(f'{M=}') + print(f'{M.shape=}') ctx.save_for_backward(q, k, v, b, o, M) ctx.grid = grid ctx.sm_scale = sm_scale @@ -452,6 +464,8 @@ def backward(ctx, do, _, fwd_tuning_result): db = torch.empty_like(b) delta = torch.empty_like(L) null_tensor = torch.empty((0), device=q.device, dtype=torch.int32) + num_head_q = q.shape[1] + num_head_k = q.shape[2] max_seqlen_q = q.shape[2] max_seqlen_k = k.shape[2] MAX_BLOCK = 64 if ctx.dropout_p == 0 else 16 @@ -608,6 +622,10 @@ def backward(ctx, do, _, fwd_tuning_result): PADDED_HEAD=padded_head, BIAS_TYPE=ctx.bias_type, ) + print(f"{dq.stride()=}", flush=True) + print(f"{dq.data_ptr()=:x}", flush=True) + print(f"{dk.stride()=}", flush=True) + print(f"{dk.data_ptr()=:x}", flush=True) # mask_allclose = torch.allclose(debug_mask < 0, ctx.encoded_softmax < 0) if False: mask_allclose = torch.allclose(torch.abs(debug_mask), torch.abs(ctx.encoded_softmax)) # Stores QK diff --git a/tritonsrc/bwd_kernel_common.py b/tritonsrc/bwd_kernel_common.py index 1921c49a..effca286 100644 --- a/tritonsrc/bwd_kernel_common.py +++ b/tritonsrc/bwd_kernel_common.py @@ -151,8 +151,7 @@ def bwd_kernel_dk_dv_common( if BLOCK_M == 1: dv += p.to(Q_block_ptr.dtype.element_ty) * do else: - # dv += tl.dot(tl.trans(p.to(do.dtype)), do) - dv += tl.dot(tl.trans(p).to(do.dtype), do) + dv += tl.dot(tl.trans(p.to(do.dtype)), do) dp = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) # compute dp = dot(do, vt) # dp += dot(BLOCK_M, BLOCK_DMODEL, BLOCK_DMODEL, do, vt) @@ -173,9 +172,7 @@ def bwd_kernel_dk_dv_common( DO_block_ptr = tl.advance(DO_block_ptr, (BLOCK_M, 0)) # Debug DO accessing problems if BIAS_TYPE == 1: B_block_ptr = tl.advance(B_block_ptr, (BLOCK_M, 0)) - # initialize pointers to output - tl.store(DK_block_ptr, (dk * sm_scale).to(DK_block_ptr.type.element_ty), boundary_check=(0,1)) - tl.store(DV_block_ptr, dv.to(DV_block_ptr.type.element_ty), boundary_check=(0,1)) + return (dk * sm_scale).to(DK_block_ptr.type.element_ty), dv.to(DV_block_ptr.type.element_ty) @triton.jit def bwd_kernel_dq_db_common( @@ -308,4 +305,5 @@ def bwd_kernel_dq_db_common( if BIAS_TYPE == 1: B_block_ptr = tl.advance(B_block_ptr, (0, BLOCK_N)) DB_block_ptr = tl.advance(DB_block_ptr, (0, BLOCK_N)) - tl.store(DQ_block_ptr, (dq * sm_scale).to(DQ_block_ptr.type.element_ty), boundary_check=(0,1)) + return (dq * sm_scale).to(DQ_block_ptr.type.element_ty) + # tl.store(DQ_block_ptr, (dq * sm_scale).to(DQ_block_ptr.type.element_ty), boundary_check=(0,1)) diff --git a/tritonsrc/bwd_split_kernel.py b/tritonsrc/bwd_split_kernel.py index fce7e3cf..58a1fea1 100644 --- a/tritonsrc/bwd_split_kernel.py +++ b/tritonsrc/bwd_split_kernel.py @@ -17,6 +17,7 @@ import triton import triton.language as tl from bwd_kernel_common import bwd_kernel_dk_dv_common, bwd_kernel_dq_db_common +from masked_load_store import mstore2d # TODO: Remove Unused 'Out' Argument from kernels below @triton.jit @@ -171,7 +172,7 @@ def bwd_kernel_dk_dv( order=(1, 0) ) - bwd_kernel_dk_dv_common( + dk, dv = bwd_kernel_dk_dv_common( Q_block_ptr, KT_block_ptr, VT_block_ptr, B_block_ptr, sm_scale, DO_block_ptr, DK_block_ptr, DV_block_ptr, @@ -191,6 +192,26 @@ def bwd_kernel_dk_dv( ENABLE_DROPOUT, PADDED_HEAD, BIAS_TYPE) + mstore2d(dk, + BLOCK_N, + BLOCK_DMODEL, + o_base=DK + dk_offset, + o_start_row=start_m, + o_start_col=0, + o_rows=seqlen_k, + o_cols=head_dim, + stride_row=stride_dkn, + stride_col=stride_dkk) + mstore2d(dv, + BLOCK_N, + BLOCK_DMODEL, + o_base=DV + dv_offset, + o_start_row=start_m, + o_start_col=0, + o_rows=seqlen_k, + o_cols=head_dim, + stride_row=stride_dvk, + stride_col=stride_dvn) @triton.jit def bwd_kernel_dq( @@ -302,7 +323,10 @@ def bwd_kernel_dq( batch_philox_offset = 0 # initialize pointers to output - dq_offset = off_h * stride_dqh + batch_index * stride_dqz + cu_seqlens_q_start * stride_dqm + dq_offset = batch_index * stride_dqz + off_h * stride_dqh + cu_seqlens_q_start * stride_dqm + # tl.device_print('batch_index ', batch_index) + # tl.device_print('off_h ', off_h) + # tl.device_print('cu_seqlens_q_start ', cu_seqlens_q_start) DQ_block_ptr = tl.make_block_ptr( base=DQ + dq_offset, shape=(seqlen_q, head_dim), @@ -339,7 +363,7 @@ def bwd_kernel_dq( else: tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') - bwd_kernel_dq_db_common( + dq = bwd_kernel_dq_db_common( Q_block_ptr, K_block_ptr, V_block_ptr, B_block_ptr, sm_scale, DO_block_ptr, DQ_block_ptr, DB_block_ptr, store_db, @@ -359,3 +383,19 @@ def bwd_kernel_dq( ENABLE_DROPOUT, PADDED_HEAD, BIAS_TYPE) + dq_ptrs, dq_masks = mstore2d(dq, + BLOCK_M, + BLOCK_DMODEL, + o_base=DQ + dq_offset, + o_start_row=start_m, + o_start_col=0, + o_rows=seqlen_q, + o_cols=head_dim, + stride_row=stride_dqm, + stride_col=stride_dqk) + # tl.device_print('dq_offset ', dq_offset) + # tl.device_print('stride_dqm ', stride_dqm) + # tl.device_print('stride_dqk ', stride_dqk) + # tl.device_print('head_dim ', head_dim) + # tl.device_print('dq_ptrs ', dq_ptrs) + # tl.device_print('dq_masks ', dq_masks) diff --git a/tritonsrc/fwd_kernel.py b/tritonsrc/fwd_kernel.py index 058cf08f..fa4ebf93 100644 --- a/tritonsrc/fwd_kernel.py +++ b/tritonsrc/fwd_kernel.py @@ -6,54 +6,65 @@ Fused Attention =============== -This is a Triton implementation of the Flash Attention v2 algorithm from Tri Dao (https://tridao.me/publications/flash2/flash2.pdf) - -Extra Credits: -- Original flash attention paper (https://arxiv.org/abs/2205.14135) -- Rabe and Staats (https://arxiv.org/pdf/2112.05682v2.pdf) -- Adam P. Goucher for simplified vector math +This is a Triton implementation of the Flash Attention v2 algorithm +See https://tridao.me/publications/flash2/flash2.pdf +Credits: +AMD Triton kernels team +OpenAI kernel team """ import triton import triton.language as tl -from fwd_kernel_common import attn_fwd_common +from fwd_kernel_inner import attn_fwd_inner +from masked_load_store import mstore2d + +@triton.jit +def cdiv_fn(x, y): + return (x + y - 1) // y @triton.jit def attn_fwd( - Q, K, V, B, sm_scale, M, Out, - stride_qz, stride_qh, stride_qm, stride_qk, - stride_kz, stride_kh, stride_kn, stride_kk, - stride_vz, stride_vh, stride_vk, stride_vn, - stride_bz, stride_bh, stride_bm, stride_bn, - stride_oz, stride_oh, stride_om, stride_on, - cu_seqlens_q, - cu_seqlens_k, - num_seqlens, # set num_seqlens to zero to ignore cu_seqlens_q/k - max_seqlen_q, # and use max_seqlen_q/k for all seqlen_q/k - max_seqlen_k, - head_dim, - dropout_p, - philox_seed, - philox_offset_base, - encoded_softmax, - CAUSAL: tl.constexpr, - BLOCK_M: tl.constexpr, - BLOCK_DMODEL: tl.constexpr, - BLOCK_N: tl.constexpr, - pre_load_v: tl.constexpr, - ENABLE_DROPOUT: tl.constexpr, - RETURN_ENCODED_SOFTMAX: tl.constexpr, - PADDED_HEAD: tl.constexpr, - BIAS_TYPE: tl.constexpr, + Q, K, V, B, sm_scale, L, Out, + stride_qz, stride_qh, stride_qm, stride_qk, + stride_kz, stride_kh, stride_kn, stride_kk, + stride_vz, stride_vh, stride_vk, stride_vn, + stride_bz, stride_bh, stride_bm, stride_bn, + stride_oz, stride_oh, stride_om, stride_on, + num_head_q, + num_head_k, + cu_seqlens_q, + cu_seqlens_k, + num_seqlens, + max_seqlen_q, + max_seqlen_k, + head_dim, + dropout_p, + philox_seed, + philox_offset_base, + encoded_softmax, + CAUSAL: tl.constexpr, + BLOCK_M: tl.constexpr, + BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, + pre_load_v: tl.constexpr, + ENABLE_DROPOUT: tl.constexpr, + RETURN_ENCODED_SOFTMAX: tl.constexpr, + PADDED_HEAD: tl.constexpr, + BIAS_TYPE: tl.constexpr, ): + # lower case pre_load_v for backward compatibility, minimize changes to + # other files. Will be fixed in a separate PR + PRE_LOAD_V : tl.constexpr = pre_load_v + # No ALIBI interface for now + USE_ALIBI : tl.constexpr = False + # alibi_slopes = None start_m = tl.program_id(0) - off_h = tl.program_id(1) # head index - off_z = tl.program_id(2) # batch index - num_h = tl.num_programs(1) - num_z = tl.num_programs(2) - off_zh = off_z * num_h + off_h * 1 - # FIXME: Better pattern for this branch? It's copied into three kernels + off_h_q = tl.program_id(1) + off_z = tl.program_id(2) + offs_m = start_m * BLOCK_M + tl.arange(0, BLOCK_M) + offs_n = tl.arange(0, BLOCK_N) + offs_d = tl.arange(0, BLOCK_DMODEL) if num_seqlens > 0: cu_seqlens_q_start = tl.load(cu_seqlens_q + off_z) cu_seqlens_q_end = tl.load(cu_seqlens_q + off_z + 1) @@ -84,109 +95,225 @@ def attn_fwd( cu_seqlens_k_start = 0 batch_index = off_z - if start_m * BLOCK_M + BLOCK_M > seqlen_q: - q_padded = True + # Now we compute whether we need to exit early due to causal masking. + # This is because for seqlen_q > seqlen_k, M rows of the attn scores + # are completely masked, resulting in 0s written to the output, and + # inf written to LSE. We don't need to do any GEMMs in this case. + # This block of code determines what N is, and if this WG is operating + # on those M rows. + n_blocks = cdiv_fn(seqlen_k, BLOCK_N) + if CAUSAL: + # If seqlen_q == seqlen_k, the attn scores are a square matrix. + # If seqlen_q != seqlen_k, attn scores are rectangular which means + # the causal mask boundary is bottom right aligned, and ends at either + # the top edge (seqlen_q < seqlen_k) or left edge. + # This captures the decrease in n_blocks if we have a rectangular attn matrix + n_blocks_seqlen = cdiv_fn((start_m + 1) * BLOCK_M + seqlen_k - seqlen_q, BLOCK_N) + # This is what adjusts the block_max for the current WG, only + # if CAUSAL. Otherwise we want to always iterate through all n_blocks + n_blocks = min(n_blocks, n_blocks_seqlen) + # If we have no blocks after adjusting for seqlen deltas, this WG is part of + # the blocks that are all 0. We exit early. + if n_blocks <= 0: + o_offset = Out + batch_index * stride_oz + off_h_q * stride_oh + cu_seqlens_q_start * stride_om + o_ptrs = o_offset + offs_m[:, None] * stride_om + offs_d[None, :] * stride_on + acc = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=Out.type.element_ty) + o_ptrs_mask = offs_m[:, None] < seqlen_q + # We still need to write 0s to the result + tl.store(o_ptrs, acc, mask=o_ptrs_mask) + # The tensor allocated for L is based on max_seqlen_q as that is + # statically known. + L_ptr_base = L + (off_z * num_head_q + off_h_q) * max_seqlen_q + l_ptrs = L_ptr_base + offs_m + # We store inf to LSE, not -inf because in the bwd pass, we subtract this + # from qk which makes it -inf, such that exp(qk - inf) = 0 for these masked blocks. + l = tl.full([BLOCK_M], value=float("inf"), dtype=tl.float32) + l_ptrs_mask = offs_m < max_seqlen_q + tl.store(l_ptrs, l, mask=l_ptrs_mask) + # TODO: Should dropout and return encoded softmax be handled here too? + return + + # If MQA / GQA, set the K and V head offsets appropriately. + group_size = num_head_q // num_head_k + if group_size != 1: + off_h_k = off_h_q // group_size else: - q_padded = False + off_h_k = off_h_q + + n_extra_tokens = 0 if seqlen_k < BLOCK_N: - seqlen_k_faligned = 0 # floor aligned + n_extra_tokens = BLOCK_N - seqlen_k elif seqlen_k % BLOCK_N: - extra_tokens_n = seqlen_k % BLOCK_N - seqlen_k_faligned = seqlen_k - extra_tokens_n - else: - seqlen_k_faligned = seqlen_k + n_extra_tokens = seqlen_k % BLOCK_N - q_offset = off_h * stride_qh + batch_index * stride_qz + cu_seqlens_q_start * stride_qm - Q_block_ptr = tl.make_block_ptr( - base=Q + q_offset, - shape=(seqlen_q, head_dim), - strides=(stride_qm, stride_qk), - offsets=(start_m * BLOCK_M, 0), - block_shape=(BLOCK_M, BLOCK_DMODEL), - order=(1, 0) - ) - k_offset = off_h * stride_kh + batch_index * stride_kz + cu_seqlens_k_start * stride_kn - K_block_ptr = tl.make_block_ptr( - base=K + k_offset, - shape=(head_dim, seqlen_k), - strides=(stride_kk, stride_kn), - offsets=(0, 0), - block_shape=(BLOCK_DMODEL, BLOCK_N), - order=(0, 1) - ) - v_offset = off_h * stride_vh + batch_index * stride_vz + cu_seqlens_k_start * stride_vk - V_block_ptr = tl.make_block_ptr( - base=V + v_offset, - shape=(seqlen_k, head_dim), - strides=(stride_vk, stride_vn), - offsets=(0, 0), - block_shape=(BLOCK_N, BLOCK_DMODEL), - order=(1, 0) - ) + # Compute pointers for all the tensors used in this kernel. + q_offset = Q + batch_index * stride_qz + off_h_q * stride_qh + cu_seqlens_q_start * stride_qm + q_ptrs = q_offset + offs_m[:, None] * stride_qm + offs_d[None, :] * stride_qk + k_offset = K + batch_index * stride_kz + off_h_k * stride_kh + cu_seqlens_k_start * stride_kn + k_ptrs = k_offset + offs_d[:, None] * stride_kk + offs_n[None, :] * stride_kn + v_offset = V + batch_index * stride_vz + off_h_k * stride_vh + cu_seqlens_k_start * stride_vk + v_ptrs = v_offset + offs_n[:, None] * stride_vk + offs_d[None, :] * stride_vn if BIAS_TYPE == 0: - B_block_ptr = 0 + bias_ptrs = None elif BIAS_TYPE == 1: - B_block_ptr = tl.make_block_ptr( - base=B + off_h * stride_bh + batch_index * stride_bz, - shape=(seqlen_q, seqlen_k), - strides=(stride_bm, stride_bn), - offsets=(start_m * BLOCK_M, 0), - block_shape=(BLOCK_M, BLOCK_N), - order=(1, 0) - ) + # Note: this might get large enough to overflow on some configs + bias_offset = off_h_q * stride_bh + bias_ptrs = B + bias_offset + offs_m[:, None] * stride_bm + offs_n[None, :] * stride_bn else: tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') - if RETURN_ENCODED_SOFTMAX: - encoded_softmax_block_ptr = tl.make_block_ptr( - base=encoded_softmax + off_zh * max_seqlen_q * max_seqlen_k, - shape=(seqlen_q, seqlen_k), - strides=(max_seqlen_k, 1), - offsets=(start_m * BLOCK_M, 0), - block_shape=(BLOCK_M, BLOCK_N), - order=(1, 0) - ) + + if USE_ALIBI: + a_offset = batch_index * stride_az + off_h_q * stride_ah + alibi_slope = tl.load(alibi_slopes + a_offset) else: - encoded_softmax_block_ptr = 0 - # write back O - o_offset = off_h * stride_oh + batch_index * stride_oz + cu_seqlens_q_start * stride_om - O_block_ptr = tl.make_block_ptr( - base=Out + o_offset, - shape=(seqlen_q, head_dim), - strides=(stride_om, stride_on), - offsets=(start_m * BLOCK_M, 0), - block_shape=(BLOCK_M, BLOCK_DMODEL), - order=(1, 0) - ) + alibi_slope = None - M_ptr_base = M + off_zh * max_seqlen_q if ENABLE_DROPOUT: - batch_philox_offset = philox_offset_base + off_zh * max_seqlen_q * max_seqlen_k + off_hz = batch_index * num_head_q + off_h_q + batch_philox_offset = philox_offset_base + off_hz * max_seqlen_q * max_seqlen_k else: batch_philox_offset = 0 + # We can ask to return the dropout mask without actually doing any dropout. In + # this case, we return an invalid pointer so indicate the mask is not valid. + if RETURN_ENCODED_SOFTMAX: + encoded_sm_base = encoded_softmax + off_h_q * max_seqlen_q * max_seqlen_k + encoded_sm_ptrs = encoded_sm_base + offs_m[:, None] * max_seqlen_k + offs_n[None, :] + else: + encoded_sm_ptrs = None + # initialize pointer to m and l + m_i = tl.full([BLOCK_M], float("-inf"), dtype=tl.float32) + l_i = tl.full([BLOCK_M], 1.0, dtype=tl.float32) + acc = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + # scale sm_scale by log_2(e) and use 2^x in the loop as we do not + # have native e^x support in HW. + qk_scale = sm_scale * 1.44269504089 + # Q is loaded once at the beginning and shared by all N blocks. + q_ptrs_mask = offs_m[:, None] < seqlen_q + if PADDED_HEAD: + q_ptrs_mask = q_ptrs_mask & (offs_d[None, :] < head_dim) + q = tl.load(q_ptrs, mask=q_ptrs_mask, other=0.0) + q = (q * qk_scale).to(q.type.element_ty) + + # Here we compute how many full and masked blocks we have. + padded_block_k = n_extra_tokens != 0 + is_modulo_mn = not padded_block_k and (seqlen_q % BLOCK_M == 0) + if CAUSAL: + # There are always at least BLOCK_M // BLOCK_N masked blocks. + # Additionally there might be one more due to dissimilar seqlens. + masked_blocks = BLOCK_M // BLOCK_N + (not is_modulo_mn) + else: + # Padding on Q does not need to be masked in the FA loop. + masked_blocks = padded_block_k + # if CAUSAL, not is_modulo_mn does not always result in an additional block. + # In this case we might exceed n_blocks so pick the min. + masked_blocks = min(masked_blocks, n_blocks) + n_full_blocks = n_blocks - masked_blocks + block_min = 0 + block_max = n_blocks * BLOCK_N + # Compute for full blocks. Here we set causal to false regardless of its actual + # value because there is no masking. Similarly we do not need padding. + if n_full_blocks > 0: + block_max = (n_blocks - masked_blocks) * BLOCK_N + acc, l_i, m_i = attn_fwd_inner( + acc, l_i, m_i, + q, k_ptrs, v_ptrs, bias_ptrs, + stride_kn, stride_vk, stride_bn, + seqlen_q, seqlen_k, head_dim, + start_m, block_min, block_max, + dropout_p, philox_seed, batch_philox_offset, max_seqlen_k, + encoded_sm_ptrs, + # offs_n_causal, masked_blocks, n_extra_tokens + 0, 0, 0, + alibi_slope, + # CAUSAL, .... + False, BLOCK_M, BLOCK_DMODEL, BLOCK_N, + # _, MASK_STEPS, ... + PRE_LOAD_V, False, ENABLE_DROPOUT, RETURN_ENCODED_SOFTMAX, PADDED_HEAD) + block_min = block_max + block_max = n_blocks * BLOCK_N + + tl.debug_barrier() + # Remaining blocks, if any, are full / not masked. + if masked_blocks > 0: + if CAUSAL: + offs_n_causal = offs_n + (seqlen_q - seqlen_k) + else: + offs_n_causal = 0 + k_ptrs += n_full_blocks * BLOCK_N * stride_kn + v_ptrs += n_full_blocks * BLOCK_N * stride_vk + if BIAS_TYPE == 0: + pass + elif BIAS_TYPE == 1: + bias_ptrs += n_full_blocks * BLOCK_N * stride_bn + else: + tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') + if RETURN_ENCODED_SOFTMAX: + encoded_sm_ptrs += n_full_blocks * BLOCK_N + acc, l_i, m_i = attn_fwd_inner( + acc, l_i, m_i, + q, k_ptrs, v_ptrs, bias_ptrs, + stride_kn, stride_vk, stride_bn, + seqlen_q, seqlen_k, head_dim, + start_m, block_min, block_max, + dropout_p, philox_seed, batch_philox_offset, max_seqlen_k, + encoded_sm_ptrs, + offs_n_causal, masked_blocks, n_extra_tokens, + alibi_slope, + # CAUSAL, .... + CAUSAL, BLOCK_M, BLOCK_DMODEL, BLOCK_N, + # _, MASK_STEPS, ... + PRE_LOAD_V, True, ENABLE_DROPOUT, RETURN_ENCODED_SOFTMAX, PADDED_HEAD) + # epilogue + acc = acc / l_i[:, None] + if ENABLE_DROPOUT: + acc = acc / (1 - dropout_p) + # If seqlen_q > seqlen_k but the delta is not a multiple of BLOCK_M, + # then we have one block with a row of all NaNs which come from computing + # softmax over a row of all -infs (-inf - inf = NaN). We check for that here + # and store 0s where there are NaNs as these rows should've been zeroed out. + end_m_idx = (start_m + 1) * BLOCK_M + start_m_idx = start_m * BLOCK_M + causal_start_idx = seqlen_q - seqlen_k + acc = acc.to(Out.type.element_ty) + if CAUSAL: + if causal_start_idx > start_m_idx and causal_start_idx < end_m_idx: + out_mask_boundary = tl.full((BLOCK_DMODEL, ), causal_start_idx, dtype=tl.int32) + mask_m_offsets = start_m_idx + tl.arange(0, BLOCK_M) + out_ptrs_mask = mask_m_offsets[:, None] >= out_mask_boundary[None, :] + z = 0.0 + acc = tl.where(out_ptrs_mask, acc, z.to(acc.type.element_ty)) + # FIXME: MQA/GQA L tensor + # TODO: make writing of L optional + # write back LSE + L_ptr_base = L + (off_z * num_head_q + off_h_q) * max_seqlen_q + l_ptrs = L_ptr_base + offs_m + # If seqlen_q not multiple of BLOCK_M, we need to mask out the last few rows. + # This is only true for the last M block. For others, overflow_size will be -ve + overflow_size = end_m_idx - seqlen_q + if overflow_size > 0: + boundary = tl.full((BLOCK_M, ), BLOCK_M - overflow_size, dtype=tl.int32) + l_ptrs_mask = tl.arange(0, BLOCK_M) < boundary + tl.store(l_ptrs, m_i + tl.math.log2(l_i), mask=l_ptrs_mask) + else: + tl.store(l_ptrs, m_i + tl.math.log2(l_i)) - attn_fwd_common(Q_block_ptr, - K_block_ptr, - V_block_ptr, - B_block_ptr, - O_block_ptr, - M_ptr_base, - sm_scale, - start_m, - seqlen_q, - seqlen_k, - seqlen_k_faligned, - q_padded, - dropout_p, - philox_seed, - batch_philox_offset, - max_seqlen_k, - encoded_softmax_block_ptr, - CAUSAL=CAUSAL, - BLOCK_M=BLOCK_M, - BLOCK_DMODEL=BLOCK_DMODEL, - BLOCK_N=BLOCK_N, - pre_load_v=pre_load_v, - ENABLE_DROPOUT=ENABLE_DROPOUT, - RETURN_ENCODED_SOFTMAX=RETURN_ENCODED_SOFTMAX, - PADDED_HEAD=PADDED_HEAD, - BIAS_TYPE=BIAS_TYPE) + o_base = Out + batch_index * stride_oz + off_h_q * stride_oh + cu_seqlens_q_start * stride_om + mstore2d(acc.to(Out.dtype.element_ty), + BLOCK_M, + BLOCK_DMODEL, + o_base=o_base, + o_start_row=start_m * BLOCK_M, + o_start_col=0, + o_rows=seqlen_q, + o_cols=head_dim, + stride_row=stride_om, + stride_col=stride_on) + # # write back O + # o_offset = Out + batch_index * stride_oz + off_h_q * stride_oh + cu_seqlens_q_start * stride_om + # o_ptrs = o_offset + offs_m[:, None] * stride_om + offs_d[None, :] * stride_on + # o_ptrs_mask = tl.full([BLOCK_M, BLOCK_DMODEL], 1, dtype=tl.int1) + # if overflow_size > 0: + # o_ptrs_mask = o_ptrs_mask & (offs_m[:, None] < seqlen_q) + # if PADDED_HEAD: + # o_ptrs_mask = o_ptrs_mask & (offs_d[None, :] < head_dim) + # tl.store(o_ptrs, acc.to(Out.dtype.element_ty), mask=o_ptrs_mask) diff --git a/tritonsrc/fwd_kernel_inner.py b/tritonsrc/fwd_kernel_inner.py index 6796f427..ca325184 100644 --- a/tritonsrc/fwd_kernel_inner.py +++ b/tritonsrc/fwd_kernel_inner.py @@ -5,148 +5,134 @@ import triton.language as tl from dropout import dropout_mask, dropout_rng, dropout_offsets +# Convenience function to load with optional boundary checks. +# "First" is the major dim, "second" is the minor dim. @triton.jit -def max_fn(x, y): - return tl.math.max(x, y) +def load_fn(ptrs, offset_first, offset_second, boundary_first, boundary_second): + if offset_first is not None and offset_second is not None: + mask = (offset_first[:, None] < boundary_first) & \ + (offset_second[None, :] < boundary_second) + tensor = tl.load(ptrs, mask=mask, other=0.0) + elif offset_first is not None: + mask = offset_first[:, None] < boundary_first + tensor = tl.load(ptrs, mask=mask, other=0.0) + elif offset_second is not None: + mask = offset_second[None, :] < boundary_second + tensor = tl.load(ptrs, mask=mask, other=0.0) + else: + tensor = tl.load(ptrs) + return tensor @triton.jit def attn_fwd_inner( - acc, l_i, m_i, q, - K_block_ptr, V_block_ptr, B_block_ptr, - start_m, - seqlen_q, - q_padded, - seqlen_k_low, - seqlen_k_high, - k_padded, - dropout_p, - dropout_seqlen_k, - philox_seed, - batch_philox_offset, - encoded_softmax_block_ptr, - BLOCK_M: tl.constexpr, - BLOCK_DMODEL: tl.constexpr, - BLOCK_N: tl.constexpr, - CAUSAL: tl.constexpr, - offs_m: tl.constexpr, - offs_n: tl.constexpr, - pre_load_v: tl.constexpr, - ENABLE_DROPOUT: tl.constexpr, - RETURN_ENCODED_SOFTMAX: tl.constexpr, - MARGINAL_BLOCK: tl.constexpr, # MARGINAL_BLOCK = CAUSAL or k_padded - PADDED_HEAD: tl.constexpr, - BIAS_TYPE: tl.constexpr, + # Problem Description + acc, l_i, m_i, + q, k_ptrs, v_ptrs, bias_ptrs, + stride_kn, stride_vk, stride_bn, + seqlen_q, seqlen_k, head_dim, + # Sub-problem range + start_m, block_min, block_max, + # Auxiliary options + ## Dropout + dropout_p, philox_seed, batch_philox_offset, max_seqlen_k, + ## Debug Return + encoded_sm_ptrs, + ## Irregular support + offs_n_causal, masked_blocks, n_extra_tokens, + ## Alibi + alibi_slope, + # constexpr starts here + CAUSAL: tl.constexpr, + BLOCK_M: tl.constexpr, + BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, + PRE_LOAD_V: tl.constexpr, + MASK_STEPS: tl.constexpr, + ENABLE_DROPOUT: tl.constexpr, + RETURN_ENCODED_SOFTMAX: tl.constexpr, + PADDED_HEAD: tl.constexpr, ): - lo, hi = seqlen_k_low, seqlen_k_high - if MARGINAL_BLOCK: - K_block_ptr = tl.advance(K_block_ptr, (0, lo)) - V_block_ptr = tl.advance(V_block_ptr, (lo, 0)) - if RETURN_ENCODED_SOFTMAX: - encoded_softmax_block_ptr = tl.advance(encoded_softmax_block_ptr, (0, lo)) - if BIAS_TYPE == 1: - B_block_ptr = tl.advance(B_block_ptr, (0, lo)) - # loop over k, v and update accumulator - for start_n in range(lo, hi, BLOCK_N): - # -- compute qk ---- - # MARGINAL_BLOCK serves as a compile-time switch for first attn_fwd_inner calls to "solid" blocks - k = tl.load(K_block_ptr, boundary_check=(1,0), padding_option="zero") - ''' - if MARGINAL_BLOCK and k_padded: - if PADDED_HEAD: - k = tl.load(K_block_ptr, boundary_check=(1,0), padding_option="zero") - else: - k = tl.load(K_block_ptr, boundary_check=(1,), padding_option="zero") + offs_m = start_m * BLOCK_M + tl.arange(0, BLOCK_M) + offs_n = tl.arange(0, BLOCK_N) + # loop over k, v, and update accumulator + for start_n in range(block_min, block_max, BLOCK_N): + # For padded blocks, we will overrun the tensor size if + # we load all BLOCK_N. For others, the blocks are all within range. + if MASK_STEPS: + k_offs_n = start_n + tl.arange(0, BLOCK_N) else: - if PADDED_HEAD: - k = tl.load(K_block_ptr, boundary_check=(0,), padding_option="zero") - else: - k = tl.load(K_block_ptr) - if pre_load_v: - if MARGINAL_BLOCK and k_padded: - if PADDED_HEAD: - v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") - else: - v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") - else: - if PADDED_HEAD: - v = tl.load(V_block_ptr, boundary_check=(1,), padding_option="zero") - else: - v = tl.load(V_block_ptr) - ''' - if pre_load_v: - v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + k_offs_n = None + k_offs_d = None if not PADDED_HEAD else tl.arange(0, BLOCK_DMODEL) + k = load_fn(k_ptrs, k_offs_d, k_offs_n, head_dim, seqlen_k) + if PRE_LOAD_V: + # We can use the same offsets as k, just with dims transposed. + v = load_fn(v_ptrs, k_offs_n, k_offs_d, seqlen_k, head_dim) qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) - if MARGINAL_BLOCK: - if CAUSAL: - mask = offs_m[:, None] >= (start_n + offs_n[None, :]) + # We start from end of seqlen_k so only the first iteration would need + # to be checked for padding if it is not a multiple of block_n + # TODO: This can be optimized to only be true for the padded block. + if MASK_STEPS: + # If this is the last block / iteration, we want to + # mask if the sequence length is not a multiple of block size + # a solution is to always do BLOCK_M // BLOCK_N + 1 steps if not is_modulo_mn. + # last step might get wasted but that is okay. check if this masking works For + # that case. + if (start_n + BLOCK_N == block_max) and (n_extra_tokens != 0): + boundary_m = tl.full([BLOCK_M], seqlen_k, dtype=tl.int32) + size_n = start_n + offs_n[None, :] + mask = size_n < boundary_m[:, None] qk = tl.where(mask, qk, float("-inf")) - if k_padded: - boundary_m = tl.full([BLOCK_M], seqlen_k_high, dtype=tl.int32) - size_n = start_n + offs_n[None,:] - mask = size_n < boundary_m[:,None] - qk = tl.where(mask, qk, float("-inf")) - if BIAS_TYPE == 0: - pass - elif BIAS_TYPE == 1: - bias = tl.load(B_block_ptr, boundary_check=(0,1), padding_option="zero") - ''' - if q_padded and k_padded: # CAVEAT: using "or" disables the partial boundary_check branches - bias = tl.load(B_block_ptr, boundary_check=(0,1), padding_option="zero") - elif q_padded: - bias = tl.load(B_block_ptr, boundary_check=(0,), padding_option="zero") - elif k_padded: - bias = tl.load(B_block_ptr, boundary_check=(1,), padding_option="zero") - else: - bias = tl.load(B_block_ptr) - ''' - qk += bias * 1.44269504089 - else: - tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') + if CAUSAL: + causal_boundary = start_n + offs_n_causal + causal_mask = offs_m[:, None] >= causal_boundary[None, :] + qk = tl.where(causal_mask, qk, float("-inf")) + # -- compute qk ---- qk += tl.dot(q, k) + if bias_ptrs is not None: + bias_offs_n = start_n + tl.arange(0, BLOCK_N) if MASK_STEPS else None + bias = load_fn(bias_ptrs, offs_m, bias_offs_n, seqlen_q, seqlen_k) + # While bias is added after multiplying qk with sm_scale, + # our optimization to use 2^x instead of e^x results in an additional + # scale factor of log2(e) which we must also multiply the bias with. + qk += (bias * 1.44269504089) + + if alibi_slope is not None: + # Compute the global position of each token within the sequence + global_m_positions = start_m * BLOCK_M + tl.arange(0, BLOCK_M) + global_n_positions = start_n + tl.arange(0, BLOCK_N) + alibi_block = compute_alibi_block(alibi_slope, seqlen_q, seqlen_k, global_m_positions, + global_n_positions) + qk += (alibi_block * 1.44269504089) # scale factor of log2(e) + + # softmax m_ij = tl.maximum(m_i, tl.max(qk, 1)) qk = qk - m_ij[:, None] p = tl.math.exp2(qk) + # CAVEAT: Must update l_ij before applying dropout l_ij = tl.sum(p, 1) - # Note about the conflicts of Flash attention algorithm and PyTorch's CUDA implementation - # PyTorch needs to return softmax(qk) (dropout mask encoded in sign bits) - # While Flash attention paper computer the dropout AFTER exp2(qk- m_ij) if ENABLE_DROPOUT: - philox_offset = batch_philox_offset + start_m * BLOCK_M * dropout_seqlen_k + start_n - keep = dropout_mask(philox_seed, philox_offset, dropout_p, BLOCK_M, BLOCK_N, dropout_seqlen_k) + philox_offset = batch_philox_offset + start_m * BLOCK_M * max_seqlen_k + start_n + keep = dropout_mask(philox_seed, philox_offset, dropout_p, BLOCK_M, BLOCK_N, max_seqlen_k) if RETURN_ENCODED_SOFTMAX: - tl.store(encoded_softmax_block_ptr, tl.where(keep, p, -p).to(encoded_softmax_block_ptr.type.element_ty), boundary_check=(0,1)) + tl.store(encoded_sm_ptrs, tl.where(keep, p, -p).to(q.type.element_ty)) p = tl.where(keep, p, 0.0) elif RETURN_ENCODED_SOFTMAX: - tl.store(encoded_softmax_block_ptr, - p.to(encoded_softmax_block_ptr.type.element_ty), - boundary_check=(0,1)) + tl.store(encoded_sm_ptrs, p.to(q.type.element_ty)) # -- update output accumulator -- alpha = tl.math.exp2(m_i - m_ij) acc = acc * alpha[:, None] - if not pre_load_v: - v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") - ''' - if MARGINAL_BLOCK and k_padded: - if PADDED_HEAD: - v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") - else: - v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") - else: - if PADDED_HEAD: - v = tl.load(V_block_ptr, boundary_check=(1,), padding_option="zero") - else: - v = tl.load(V_block_ptr) - ''' + if not PRE_LOAD_V: + v = load_fn(v_ptrs, k_offs_n, k_offs_d, seqlen_k, head_dim) # -- update m_i and l_i l_i = l_i * alpha + l_ij # update m_i and l_i m_i = m_ij - acc += tl.dot(p.to(V_block_ptr.type.element_ty), v) - V_block_ptr = tl.advance(V_block_ptr, (BLOCK_N, 0)) - K_block_ptr = tl.advance(K_block_ptr, (0, BLOCK_N)) + acc += tl.dot(p.to(v.type.element_ty), v) + k_ptrs += BLOCK_N * stride_kn + v_ptrs += BLOCK_N * stride_vk + if bias_ptrs is not None: + bias_ptrs += BLOCK_N * stride_bn if RETURN_ENCODED_SOFTMAX: - encoded_softmax_block_ptr = tl.advance(encoded_softmax_block_ptr, (0, BLOCK_N)) - if BIAS_TYPE == 1: - B_block_ptr = tl.advance(B_block_ptr, (0, BLOCK_N)) + encoded_sm_ptrs += BLOCK_N return acc, l_i, m_i diff --git a/tritonsrc/masked_load_store.py b/tritonsrc/masked_load_store.py new file mode 100644 index 00000000..68804f88 --- /dev/null +++ b/tritonsrc/masked_load_store.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +# Copyright © 2024 Advanced Micro Devices, Inc. +# SPDX-License-Identifier: MIT + +import triton +import triton.language as tl + +@triton.jit +def mstore2d( + registers, + REG_ROWS : tl.constexpr, + REG_COLS : tl.constexpr, + o_base, + o_start_row, + o_start_col, + o_rows, + o_cols, + stride_row, + stride_col, +): + off_rows = tl.arange(0, REG_ROWS) + o_start_row + off_cols = tl.arange(0, REG_COLS) + o_start_col + o_ptrs = o_base + off_rows[:, None] * stride_row + off_cols[None, :] * stride_col + o_ptrs_mask = tl.full([REG_ROWS, REG_COLS], 1, dtype=tl.int1) + row_overflow = o_start_row + REG_ROWS - o_rows + if row_overflow > 0: + o_ptrs_mask = o_ptrs_mask & (off_rows[:, None] < o_rows) + col_overflow = o_start_col + REG_COLS - o_cols + if col_overflow > 0: + o_ptrs_mask = o_ptrs_mask & (off_cols[None, :] < o_cols) + tl.store(o_ptrs, registers, mask=o_ptrs_mask) + return o_ptrs, o_ptrs_mask diff --git a/tritonsrc/old_fwd_kernel.py b/tritonsrc/old_fwd_kernel.py new file mode 100644 index 00000000..26f1cf4d --- /dev/null +++ b/tritonsrc/old_fwd_kernel.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python +# Copyright © 2023-2024 Advanced Micro Devices, Inc. +# SPDX-License-Identifier: MIT + +""" +Fused Attention +=============== + +This is a Triton implementation of the Flash Attention v2 algorithm from Tri Dao (https://tridao.me/publications/flash2/flash2.pdf) + +Extra Credits: +- Original flash attention paper (https://arxiv.org/abs/2205.14135) +- Rabe and Staats (https://arxiv.org/pdf/2112.05682v2.pdf) +- Adam P. Goucher for simplified vector math + +""" + +import triton +import triton.language as tl +from fwd_kernel_inner import attn_fwd_inner + +@triton.jit +def attn_fwd( + Q, K, V, B, sm_scale, M, Out, + stride_qz, stride_qh, stride_qm, stride_qk, + stride_kz, stride_kh, stride_kn, stride_kk, + stride_vz, stride_vh, stride_vk, stride_vn, + stride_bz, stride_bh, stride_bm, stride_bn, + stride_oz, stride_oh, stride_om, stride_on, + cu_seqlens_q, + cu_seqlens_k, + num_seqlens, # set num_seqlens to zero to ignore cu_seqlens_q/k + max_seqlen_q, # and use max_seqlen_q/k for all seqlen_q/k + max_seqlen_k, + head_dim, + dropout_p, + philox_seed, + philox_offset_base, + encoded_softmax, + CAUSAL: tl.constexpr, + BLOCK_M: tl.constexpr, + BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, + pre_load_v: tl.constexpr, + ENABLE_DROPOUT: tl.constexpr, + RETURN_ENCODED_SOFTMAX: tl.constexpr, + PADDED_HEAD: tl.constexpr, + BIAS_TYPE: tl.constexpr, +): + start_m = tl.program_id(0) + off_h = tl.program_id(1) # head index + off_z = tl.program_id(2) # batch index + num_h = tl.num_programs(1) + num_z = tl.num_programs(2) + off_zh = off_z * num_h + off_h * 1 + # FIXME: Better pattern for this branch? It's copied into three kernels + if num_seqlens > 0: + cu_seqlens_q_start = tl.load(cu_seqlens_q + off_z) + cu_seqlens_q_end = tl.load(cu_seqlens_q + off_z + 1) + seqlen_q = cu_seqlens_q_end - cu_seqlens_q_start + if start_m * BLOCK_M >= seqlen_q: + return + cu_seqlens_k_start = tl.load(cu_seqlens_k + off_z) + cu_seqlens_k_end = tl.load(cu_seqlens_k + off_z + 1) + seqlen_k = cu_seqlens_k_end - cu_seqlens_k_start + batch_index = 0 + elif num_seqlens == 0: + cu_seqlens_q_start = 0 + cu_seqlens_k_start = 0 + seqlen_q = max_seqlen_q + seqlen_k = max_seqlen_k + batch_index = off_z + else: # < 0 for padded seqlen + cu_seqlens_q_start = tl.load(cu_seqlens_q + off_z) + cu_seqlens_q_end = tl.load(cu_seqlens_q + off_z + 1) + seqlen_q = cu_seqlens_q_end - cu_seqlens_q_start + if start_m * BLOCK_M >= seqlen_q: + return + cu_seqlens_k_start = tl.load(cu_seqlens_k + off_z) + cu_seqlens_k_end = tl.load(cu_seqlens_k + off_z + 1) + seqlen_k = cu_seqlens_k_end - cu_seqlens_k_start + # Varlen, but padded to Rank 4 tensor + cu_seqlens_q_start = 0 + cu_seqlens_k_start = 0 + batch_index = off_z + + if start_m * BLOCK_M + BLOCK_M > seqlen_q: + q_padded = True + else: + q_padded = False + if seqlen_k < BLOCK_N: + seqlen_k_faligned = 0 # floor aligned + elif seqlen_k % BLOCK_N: + extra_tokens_n = seqlen_k % BLOCK_N + seqlen_k_faligned = seqlen_k - extra_tokens_n + else: + seqlen_k_faligned = seqlen_k + + q_offset = off_h * stride_qh + batch_index * stride_qz + cu_seqlens_q_start * stride_qm + Q_block_ptr = tl.make_block_ptr( + base=Q + q_offset, + shape=(seqlen_q, head_dim), + strides=(stride_qm, stride_qk), + offsets=(start_m * BLOCK_M, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0) + ) + k_offset = off_h * stride_kh + batch_index * stride_kz + cu_seqlens_k_start * stride_kn + K_block_ptr = tl.make_block_ptr( + base=K + k_offset, + shape=(head_dim, seqlen_k), + strides=(stride_kk, stride_kn), + offsets=(0, 0), + block_shape=(BLOCK_DMODEL, BLOCK_N), + order=(0, 1) + ) + v_offset = off_h * stride_vh + batch_index * stride_vz + cu_seqlens_k_start * stride_vk + V_block_ptr = tl.make_block_ptr( + base=V + v_offset, + shape=(seqlen_k, head_dim), + strides=(stride_vk, stride_vn), + offsets=(0, 0), + block_shape=(BLOCK_N, BLOCK_DMODEL), + order=(1, 0) + ) + if BIAS_TYPE == 0: + B_block_ptr = 0 + elif BIAS_TYPE == 1: + B_block_ptr = tl.make_block_ptr( + base=B + off_h * stride_bh + batch_index * stride_bz, + shape=(seqlen_q, seqlen_k), + strides=(stride_bm, stride_bn), + offsets=(start_m * BLOCK_M, 0), + block_shape=(BLOCK_M, BLOCK_N), + order=(1, 0) + ) + else: + tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') + if RETURN_ENCODED_SOFTMAX: + encoded_softmax_block_ptr = tl.make_block_ptr( + base=encoded_softmax + off_zh * max_seqlen_q * max_seqlen_k, + shape=(seqlen_q, seqlen_k), + strides=(max_seqlen_k, 1), + offsets=(start_m * BLOCK_M, 0), + block_shape=(BLOCK_M, BLOCK_N), + order=(1, 0) + ) + else: + encoded_softmax_block_ptr = 0 + # write back O + o_offset = off_h * stride_oh + batch_index * stride_oz + cu_seqlens_q_start * stride_om + O_block_ptr = tl.make_block_ptr( + base=Out + o_offset, + shape=(seqlen_q, head_dim), + strides=(stride_om, stride_on), + offsets=(start_m * BLOCK_M, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0) + ) + + M_ptr_base = M + off_zh * max_seqlen_q + if ENABLE_DROPOUT: + batch_philox_offset = philox_offset_base + off_zh * max_seqlen_q * max_seqlen_k + else: + batch_philox_offset = 0 + + attn_fwd_common(Q_block_ptr, + K_block_ptr, + V_block_ptr, + B_block_ptr, + O_block_ptr, + M_ptr_base, + sm_scale, + start_m, + seqlen_q, + seqlen_k, + seqlen_k_faligned, + q_padded, + dropout_p, + philox_seed, + batch_philox_offset, + max_seqlen_k, + encoded_softmax_block_ptr, + CAUSAL=CAUSAL, + BLOCK_M=BLOCK_M, + BLOCK_DMODEL=BLOCK_DMODEL, + BLOCK_N=BLOCK_N, + pre_load_v=pre_load_v, + ENABLE_DROPOUT=ENABLE_DROPOUT, + RETURN_ENCODED_SOFTMAX=RETURN_ENCODED_SOFTMAX, + PADDED_HEAD=PADDED_HEAD, + BIAS_TYPE=BIAS_TYPE) + + diff --git a/tritonsrc/old_fwd_kernel_inner.py b/tritonsrc/old_fwd_kernel_inner.py new file mode 100644 index 00000000..db5e0c0f --- /dev/null +++ b/tritonsrc/old_fwd_kernel_inner.py @@ -0,0 +1,149 @@ +# Copyright © 2024 Advanced Micro Devices, Inc. +# SPDX-License-Identifier: MIT + +import triton +import triton.language as tl +from dropout import dropout_mask, dropout_rng, dropout_offsets + +@triton.jit +def attn_fwd_inner( + acc, l_i, m_i, q, + K_block_ptr, V_block_ptr, B_block_ptr, + start_m, + seqlen_q, + q_padded, + seqlen_k_low, + seqlen_k_high, + k_padded, + dropout_p, + dropout_seqlen_k, + philox_seed, + batch_philox_offset, + encoded_softmax_block_ptr, + BLOCK_M: tl.constexpr, + BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, + CAUSAL: tl.constexpr, + offs_m: tl.constexpr, + offs_n: tl.constexpr, + pre_load_v: tl.constexpr, + ENABLE_DROPOUT: tl.constexpr, + RETURN_ENCODED_SOFTMAX: tl.constexpr, + MARGINAL_BLOCK: tl.constexpr, # MARGINAL_BLOCK = CAUSAL or k_padded + PADDED_HEAD: tl.constexpr, + BIAS_TYPE: tl.constexpr, +): + lo, hi = seqlen_k_low, seqlen_k_high + if MARGINAL_BLOCK: + K_block_ptr = tl.advance(K_block_ptr, (0, lo)) + V_block_ptr = tl.advance(V_block_ptr, (lo, 0)) + if RETURN_ENCODED_SOFTMAX: + encoded_softmax_block_ptr = tl.advance(encoded_softmax_block_ptr, (0, lo)) + if BIAS_TYPE == 1: + B_block_ptr = tl.advance(B_block_ptr, (0, lo)) + # loop over k, v and update accumulator + for start_n in range(lo, hi, BLOCK_N): + # -- compute qk ---- + # MARGINAL_BLOCK serves as a compile-time switch for first attn_fwd_inner calls to "solid" blocks + k = tl.load(K_block_ptr, boundary_check=(1,0), padding_option="zero") + ''' + if MARGINAL_BLOCK and k_padded: + if PADDED_HEAD: + k = tl.load(K_block_ptr, boundary_check=(1,0), padding_option="zero") + else: + k = tl.load(K_block_ptr, boundary_check=(1,), padding_option="zero") + else: + if PADDED_HEAD: + k = tl.load(K_block_ptr, boundary_check=(0,), padding_option="zero") + else: + k = tl.load(K_block_ptr) + if pre_load_v: + if MARGINAL_BLOCK and k_padded: + if PADDED_HEAD: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + else: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + else: + if PADDED_HEAD: + v = tl.load(V_block_ptr, boundary_check=(1,), padding_option="zero") + else: + v = tl.load(V_block_ptr) + ''' + if pre_load_v: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) + if MARGINAL_BLOCK: + if CAUSAL: + mask = offs_m[:, None] >= (start_n + offs_n[None, :]) + qk = tl.where(mask, qk, float("-inf")) + if k_padded: + boundary_m = tl.full([BLOCK_M], seqlen_k_high, dtype=tl.int32) + size_n = start_n + offs_n[None,:] + mask = size_n < boundary_m[:,None] + qk = tl.where(mask, qk, float("-inf")) + if BIAS_TYPE == 0: + pass + elif BIAS_TYPE == 1: + bias = tl.load(B_block_ptr, boundary_check=(0,1), padding_option="zero") + ''' + if q_padded and k_padded: # CAVEAT: using "or" disables the partial boundary_check branches + bias = tl.load(B_block_ptr, boundary_check=(0,1), padding_option="zero") + elif q_padded: + bias = tl.load(B_block_ptr, boundary_check=(0,), padding_option="zero") + elif k_padded: + bias = tl.load(B_block_ptr, boundary_check=(1,), padding_option="zero") + else: + bias = tl.load(B_block_ptr) + ''' + qk += bias * 1.44269504089 + else: + tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') + qk += tl.dot(q, k) + m_ij = tl.maximum(m_i, tl.max(qk, 1)) + qk = qk - m_ij[:, None] + p = tl.math.exp2(qk) + # CAVEAT: Must update l_ij before applying dropout + l_ij = tl.sum(p, 1) + # Note about the conflicts of Flash attention algorithm and PyTorch's CUDA implementation + # PyTorch needs to return softmax(qk) (dropout mask encoded in sign bits) + # While Flash attention paper computer the dropout AFTER exp2(qk- m_ij) + if ENABLE_DROPOUT: + philox_offset = batch_philox_offset + start_m * BLOCK_M * dropout_seqlen_k + start_n + keep = dropout_mask(philox_seed, philox_offset, dropout_p, BLOCK_M, BLOCK_N, dropout_seqlen_k) + if RETURN_ENCODED_SOFTMAX: + tl.store(encoded_softmax_block_ptr, tl.where(keep, p, -p).to(encoded_softmax_block_ptr.type.element_ty), boundary_check=(0,1)) + p = tl.where(keep, p, 0.0) + elif RETURN_ENCODED_SOFTMAX: + tl.store(encoded_softmax_block_ptr, + p.to(encoded_softmax_block_ptr.type.element_ty), + boundary_check=(0,1)) + # -- update output accumulator -- + alpha = tl.math.exp2(m_i - m_ij) + acc = acc * alpha[:, None] + if not pre_load_v: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + ''' + if MARGINAL_BLOCK and k_padded: + if PADDED_HEAD: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + else: + v = tl.load(V_block_ptr, boundary_check=(0,1), padding_option="zero") + else: + if PADDED_HEAD: + v = tl.load(V_block_ptr, boundary_check=(1,), padding_option="zero") + else: + v = tl.load(V_block_ptr) + ''' + # -- update m_i and l_i + l_i = l_i * alpha + l_ij + # update m_i and l_i + m_i = m_ij + acc += tl.dot(p.to(V_block_ptr.type.element_ty), v) + V_block_ptr = tl.advance(V_block_ptr, (BLOCK_N, 0)) + K_block_ptr = tl.advance(K_block_ptr, (0, BLOCK_N)) + if RETURN_ENCODED_SOFTMAX: + encoded_softmax_block_ptr = tl.advance(encoded_softmax_block_ptr, (0, BLOCK_N)) + if BIAS_TYPE == 1: + B_block_ptr = tl.advance(B_block_ptr, (0, BLOCK_N)) + return acc, l_i, m_i + From 2a6872a60b69b0d5cba114e422aecf13e4e2622b Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 25 Jun 2024 02:26:55 +0000 Subject: [PATCH 06/51] Fix the off_h_k computation. The old pattern triggers a compiler bug --- tritonsrc/fwd_kernel.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tritonsrc/fwd_kernel.py b/tritonsrc/fwd_kernel.py index fa4ebf93..d323ad71 100644 --- a/tritonsrc/fwd_kernel.py +++ b/tritonsrc/fwd_kernel.py @@ -134,11 +134,12 @@ def attn_fwd( return # If MQA / GQA, set the K and V head offsets appropriately. - group_size = num_head_q // num_head_k - if group_size != 1: - off_h_k = off_h_q // group_size - else: - off_h_k = off_h_q + # group_size = num_head_q // num_head_k + # if group_size != 1: + # off_h_k = off_h_q // group_size + # else: + # off_h_k = off_h_q + off_h_k = off_h_q if num_head_q != num_head_k else off_h_q // (num_head_q // num_head_k) n_extra_tokens = 0 if seqlen_k < BLOCK_N: From c62c904695dede8b744d05e65f74611a7947a723 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 25 Jun 2024 03:42:53 +0000 Subject: [PATCH 07/51] Fix writing to encoded_softmax --- tritonsrc/fwd_kernel.py | 20 ++++++++------- tritonsrc/fwd_kernel_inner.py | 48 ++++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/tritonsrc/fwd_kernel.py b/tritonsrc/fwd_kernel.py index d323ad71..b2b758e9 100644 --- a/tritonsrc/fwd_kernel.py +++ b/tritonsrc/fwd_kernel.py @@ -169,18 +169,19 @@ def attn_fwd( else: alibi_slope = None + off_zh = batch_index * num_head_q + off_h_q if ENABLE_DROPOUT: - off_hz = batch_index * num_head_q + off_h_q - batch_philox_offset = philox_offset_base + off_hz * max_seqlen_q * max_seqlen_k + batch_philox_offset = philox_offset_base + off_zh * max_seqlen_q * max_seqlen_k else: batch_philox_offset = 0 # We can ask to return the dropout mask without actually doing any dropout. In # this case, we return an invalid pointer so indicate the mask is not valid. if RETURN_ENCODED_SOFTMAX: - encoded_sm_base = encoded_softmax + off_h_q * max_seqlen_q * max_seqlen_k - encoded_sm_ptrs = encoded_sm_base + offs_m[:, None] * max_seqlen_k + offs_n[None, :] + encoded_sm_base = encoded_softmax + off_zh * max_seqlen_q * max_seqlen_k + # encoded_sm_ptrs = encoded_sm_base + offs_m[:, None] * max_seqlen_k + offs_n[None, :] else: - encoded_sm_ptrs = None + encoded_sm_base = None + # encoded_sm_ptrs = None # initialize pointer to m and l m_i = tl.full([BLOCK_M], float("-inf"), dtype=tl.float32) l_i = tl.full([BLOCK_M], 1.0, dtype=tl.float32) @@ -222,7 +223,7 @@ def attn_fwd( seqlen_q, seqlen_k, head_dim, start_m, block_min, block_max, dropout_p, philox_seed, batch_philox_offset, max_seqlen_k, - encoded_sm_ptrs, + encoded_sm_base, # offs_n_causal, masked_blocks, n_extra_tokens 0, 0, 0, alibi_slope, @@ -248,8 +249,9 @@ def attn_fwd( bias_ptrs += n_full_blocks * BLOCK_N * stride_bn else: tl.static_assert(False, f'Unsupported BIAS_TYPE {BIAS_TYPE}') - if RETURN_ENCODED_SOFTMAX: - encoded_sm_ptrs += n_full_blocks * BLOCK_N + # if RETURN_ENCODED_SOFTMAX: + # encoded_sm_base += n_full_blocks * BLOCK_N + # encoded_sm_ptrs += n_full_blocks * BLOCK_N acc, l_i, m_i = attn_fwd_inner( acc, l_i, m_i, q, k_ptrs, v_ptrs, bias_ptrs, @@ -257,7 +259,7 @@ def attn_fwd( seqlen_q, seqlen_k, head_dim, start_m, block_min, block_max, dropout_p, philox_seed, batch_philox_offset, max_seqlen_k, - encoded_sm_ptrs, + encoded_sm_base, offs_n_causal, masked_blocks, n_extra_tokens, alibi_slope, # CAUSAL, .... diff --git a/tritonsrc/fwd_kernel_inner.py b/tritonsrc/fwd_kernel_inner.py index ca325184..145a5cbd 100644 --- a/tritonsrc/fwd_kernel_inner.py +++ b/tritonsrc/fwd_kernel_inner.py @@ -4,11 +4,22 @@ import triton import triton.language as tl from dropout import dropout_mask, dropout_rng, dropout_offsets +from masked_load_store import mstore2d # Convenience function to load with optional boundary checks. # "First" is the major dim, "second" is the minor dim. @triton.jit -def load_fn(ptrs, offset_first, offset_second, boundary_first, boundary_second): +def load_fn(ptrs, offset_first, offset_second, _in_boundary_first, _in_boundary_second): + boundary_first = _in_boundary_first + boundary_second = _in_boundary_second + """ + # Debugging GPU segfault + boundary_first = 0 + boundary_second = 0 + mask = (offset_first[:, None] < boundary_first) & \ + (offset_second[None, :] < boundary_second) + return tl.load(ptrs, mask=mask, other=0.0) + """ if offset_first is not None and offset_second is not None: mask = (offset_first[:, None] < boundary_first) & \ (offset_second[None, :] < boundary_second) @@ -36,7 +47,7 @@ def attn_fwd_inner( ## Dropout dropout_p, philox_seed, batch_philox_offset, max_seqlen_k, ## Debug Return - encoded_sm_ptrs, + encoded_sm_base, ## Irregular support offs_n_causal, masked_blocks, n_extra_tokens, ## Alibi @@ -63,6 +74,11 @@ def attn_fwd_inner( else: k_offs_n = None k_offs_d = None if not PADDED_HEAD else tl.arange(0, BLOCK_DMODEL) + ''' + k_offs_n = start_n + tl.arange(0, BLOCK_N) + k_offs_d = tl.arange(0, BLOCK_DMODEL) + # k_offs_d = None if not PADDED_HEAD else tl.arange(0, BLOCK_DMODEL) + ''' k = load_fn(k_ptrs, k_offs_d, k_offs_n, head_dim, seqlen_k) if PRE_LOAD_V: # We can use the same offsets as k, just with dims transposed. @@ -115,10 +131,30 @@ def attn_fwd_inner( philox_offset = batch_philox_offset + start_m * BLOCK_M * max_seqlen_k + start_n keep = dropout_mask(philox_seed, philox_offset, dropout_p, BLOCK_M, BLOCK_N, max_seqlen_k) if RETURN_ENCODED_SOFTMAX: - tl.store(encoded_sm_ptrs, tl.where(keep, p, -p).to(q.type.element_ty)) + mstore2d(tl.where(keep, p, -p).to(q.type.element_ty), + BLOCK_M, + BLOCK_N, + o_base=encoded_sm_base, + o_start_row=start_m * BLOCK_M, + o_start_col=start_n, + o_rows=seqlen_q, + o_cols=seqlen_k, + stride_row=max_seqlen_k, + stride_col=1) + # tl.store(encoded_sm_ptrs, tl.where(keep, p, -p).to(q.type.element_ty)) p = tl.where(keep, p, 0.0) elif RETURN_ENCODED_SOFTMAX: - tl.store(encoded_sm_ptrs, p.to(q.type.element_ty)) + mstore2d(p.to(q.type.element_ty), + BLOCK_M, + BLOCK_N, + o_base=encoded_sm_base, + o_start_row=start_m * BLOCK_M, + o_start_col=start_n, + o_rows=seqlen_q, + o_cols=seqlen_k, + stride_row=max_seqlen_k, + stride_col=1) + # tl.store(encoded_sm_ptrs, p.to(q.type.element_ty)) # -- update output accumulator -- alpha = tl.math.exp2(m_i - m_ij) acc = acc * alpha[:, None] @@ -133,6 +169,6 @@ def attn_fwd_inner( v_ptrs += BLOCK_N * stride_vk if bias_ptrs is not None: bias_ptrs += BLOCK_N * stride_bn - if RETURN_ENCODED_SOFTMAX: - encoded_sm_ptrs += BLOCK_N + # if RETURN_ENCODED_SOFTMAX: + # encoded_sm_ptrs += BLOCK_N return acc, l_i, m_i From 8be265dbc59801dae68b7900fa085f834f0e538c Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 25 Jun 2024 16:22:00 +0000 Subject: [PATCH 08/51] Submit the Triton kernel as we are testing. All UTs passed --- tritonsrc/attn_torch_function.py | 4 ++++ tritonsrc/fwd_kernel.py | 8 ++++++-- tritonsrc/test_backward.py | 26 +++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tritonsrc/attn_torch_function.py b/tritonsrc/attn_torch_function.py index cfc66a17..e28fae87 100644 --- a/tritonsrc/attn_torch_function.py +++ b/tritonsrc/attn_torch_function.py @@ -350,6 +350,10 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax RETURN_ENCODED_SOFTMAX=encoded_softmax is not None print(f'{BLOCK_M=} {BLOCK_N=} {RETURN_ENCODED_SOFTMAX=} seqlen_q={q.shape[2]} seqlen_k={k.shape[2]}', flush=True) + print(f'{q.data_ptr()=:x} {k.data_ptr()=:x} {v.data_ptr()=:x} {b.data_ptr()=:x} {M.data_ptr()=:x} {o.data_ptr()=:x}', flush=True) + print(f'{encoded_softmax.data_ptr()=:x}', flush=True) + print(f'{q.shape=} {k.shape=} {v.shape=} {b.shape=} {M.shape=} {o.shape=}', flush=True) + print(f'{q.stride()=} {k.stride()=} {v.stride()=} {b.stride()=} {M.stride()=} {o.stride()=}', flush=True) bare_attn_fwd[grid]( q, k, v, b, sm_scale, M, o, q.stride(0), q.stride(1), q.stride(2), q.stride(3), diff --git a/tritonsrc/fwd_kernel.py b/tritonsrc/fwd_kernel.py index b2b758e9..65e08a15 100644 --- a/tritonsrc/fwd_kernel.py +++ b/tritonsrc/fwd_kernel.py @@ -150,8 +150,12 @@ def attn_fwd( # Compute pointers for all the tensors used in this kernel. q_offset = Q + batch_index * stride_qz + off_h_q * stride_qh + cu_seqlens_q_start * stride_qm q_ptrs = q_offset + offs_m[:, None] * stride_qm + offs_d[None, :] * stride_qk - k_offset = K + batch_index * stride_kz + off_h_k * stride_kh + cu_seqlens_k_start * stride_kn - k_ptrs = k_offset + offs_d[:, None] * stride_kk + offs_n[None, :] * stride_kn + k_offset = batch_index * stride_kz + off_h_k * stride_kh + cu_seqlens_k_start * stride_kn + k_ptrs = K + k_offset + offs_d[:, None] * stride_kk + offs_n[None, :] * stride_kn + # tl.device_print('batch_index ', batch_index) + # tl.device_print('off_h_k ', off_h_k) + # tl.device_print('cu_seqlens_k_start ', cu_seqlens_k_start) + # tl.device_print('k_offset ', k_offset) v_offset = V + batch_index * stride_vz + off_h_k * stride_vh + cu_seqlens_k_start * stride_vk v_ptrs = v_offset + offs_n[:, None] * stride_vk + offs_d[None, :] * stride_vn if BIAS_TYPE == 0: diff --git a/tritonsrc/test_backward.py b/tritonsrc/test_backward.py index 9e48ed9f..7ee8de32 100644 --- a/tritonsrc/test_backward.py +++ b/tritonsrc/test_backward.py @@ -71,6 +71,8 @@ def _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale print(f'{err_idx=}') print(f'{tri_out[err_idx]=}') print(f'{ref_out[err_idx]=}') + print(f'{tri_out[0, 0, :4, :4]=}') + print(f'{ref_out[0, 0, :4, :4]=}') assert is_allclose, 'Forward pass {is_allclose=}' dq_allclose, dk_allclose, dv_allclose, db_allclose = grads_allclose @@ -207,6 +209,28 @@ def test_op_bwd_with_matrix_bias(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, sm_ ''' _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) +def main2(): + # Memo: False-0.0-dtype0-0.0-False-4-256-8-4-1 + # Memo: False-0.0-dtype0-0.0-False-4-256-8-1-4 + # False-1.2-dtype0-0.0-False-4-4-72-1-4 + # BATCH = 8 + # D_HEAD = 32 + # N_HEADS = 8 + # seqlen_q = 16 + # seqlen_k = 16 + BATCH = 4 + D_HEAD = 1 + N_HEADS = 8 + seqlen_q = 256 + seqlen_k = 4 + causal = False + sm_scale = 1.2 + dropout_p = 0.0 + dtype = torch.float16 + storage_flip = False + bias_type = None + _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + def main(): BATCH = 1 D_HEAD = 80 @@ -225,4 +249,4 @@ def main(): _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) if __name__ == '__main__': - main() + main2() From e150f54c02c7815e20655577f6806ceb58af7031 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 25 Jun 2024 16:24:22 +0000 Subject: [PATCH 09/51] remove debugging output --- tritonsrc/attn_torch_function.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tritonsrc/attn_torch_function.py b/tritonsrc/attn_torch_function.py index e28fae87..d5936b78 100644 --- a/tritonsrc/attn_torch_function.py +++ b/tritonsrc/attn_torch_function.py @@ -434,8 +434,8 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax tuning_result = None block_m = min(128, q.shape[2], k.shape[2]) grid = (triton.cdiv(q.shape[2], block_m), q.shape[1], q.shape[0]) - print(f'{M=}') - print(f'{M.shape=}') + # print(f'{M=}') + # print(f'{M.shape=}') ctx.save_for_backward(q, k, v, b, o, M) ctx.grid = grid ctx.sm_scale = sm_scale From 713e87aa6a7945a44438385ca2ae87ba19a65149 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 8 Jul 2024 19:21:07 +0000 Subject: [PATCH 10/51] cpp tuning: Add basic C++ tuning support * Add new build option AOTRITON_BUILD_FOR_TUNING. Required by all features below. * KernelDescription.gen_autotune_configs is introduced to specify autotune.Config objects. All kernels will be built by the build system. * Users now can select kernel through ExtraArguments::force_kernel_index --- .gitignore | 4 +- CMakeLists.txt | 1 + bindings/CMakeLists.txt | 6 +++ bindings/module.cc | 19 +++++++-- include/aotriton/flash.h | 18 ++++++-- v2python/autotune_config.py | 33 +++++++++++++++ v2python/common_tuning_database.py | 34 ++++++++++++++- v2python/generate_compile.py | 6 ++- v2python/generate_shim.py | 8 ++-- v2python/json_tuning_database.py | 8 +++- v2python/kernel_argument.py | 16 ++++++++ v2python/kernel_desc.py | 28 ++++++++++--- v2python/rules/flash/_common.py | 1 + v2python/rules/flash/attn_fwd.py | 32 ++++++++++++++- v2python/sqlite_tuning_database.py | 5 ++- v2python/tuning_database.py | 57 +++++++++++++++++++++++--- v2python/tuning_lut.py | 18 ++++++-- v2src/CMakeLists.txt | 16 ++++++-- v2src/flash/attn_bwd.cc | 35 ++++++++++++---- v2src/flash/attn_fwd.cc | 19 ++++++--- v2src/template/autotune_table_entry.cc | 17 +++++++- v2src/template/shim.h | 3 ++ 22 files changed, 330 insertions(+), 54 deletions(-) create mode 100644 v2python/autotune_config.py diff --git a/.gitignore b/.gitignore index f75f6a5d..18834858 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ __pycache__/ -build/ +*build*/ *.swp tritonsrc/tune-*.json +*.csv +*.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d936106..4f227789 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ set(AOTRITON_HIPCC_PATH "hipcc" CACHE STRING "Set HIPCC Path") option(AOTRITON_NO_SHARED "Disable shared object build. Incompatible with AOTRITON_COMPRESS_KERNEL." ON) option(AOTRITON_NO_PYTHON "Disable python binding build" OFF) option(AOTRITON_ENABLE_ASAN "Enable Address Sanitizer. Implies -g" OFF) +option(AOTRITON_BUILD_FOR_TUNING "Build all GPU kernels and set -DAOTRITON_BUILD_FOR_TUNING=1 (=0 otherwise)" OFF) set(TARGET_GPUS "MI200;MI300X" CACHE STRING "Target Architecture (Note here uses Trade names)") set(AMDHSA_LD_PRELOAD "/opt/rocm/lib/libhsa-runtime64.so" CACHE STRING "Workaround of libamdhip64.so.5: undefined symbol: hsa_amd_memory_async_copy_on_engine") diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt index dbf69793..31ddf8ea 100644 --- a/bindings/CMakeLists.txt +++ b/bindings/CMakeLists.txt @@ -13,3 +13,9 @@ if(AOTRITON_OVERRIDE_ZSTD_LIB) else() target_link_libraries(pyaotriton PRIVATE ${ZSTD_TARGET}) endif() +# TODO: Unify build option marcos with "interface target+public compile definitions" +if(AOTRITON_BUILD_FOR_TUNING) + target_compile_definitions(pyaotriton PRIVATE -DAOTRITON_BUILD_FOR_TUNING=1) +else(AOTRITON_BUILD_FOR_TUNING) + target_compile_definitions(pyaotriton PRIVATE -DAOTRITON_BUILD_FOR_TUNING=0) +endif(AOTRITON_BUILD_FOR_TUNING) diff --git a/bindings/module.cc b/bindings/module.cc index a966a840..e2b2dd37 100644 --- a/bindings/module.cc +++ b/bindings/module.cc @@ -14,8 +14,15 @@ namespace py = pybind11; namespace pyaotriton { namespace v2 { namespace flash { + using aotriton::v2::flash::ExtraArguments; void setup_module(py::module_& m) { m.def("check_gpu", &aotriton::v2::flash::check_gpu, py::arg("stream")); + py::class_(m, "ExtraArguments") + .def(py::init<>()) +#if AOTRITON_BUILD_FOR_TUNING + .def_readwrite("force_kernel_index", &ExtraArguments::force_kernel_index) +#endif + ; m.def("attn_fwd", &aotriton::v2::flash::attn_fwd, "Flash Attention Forward Pass", @@ -31,7 +38,8 @@ namespace pyaotriton { py::arg("philox_offset"), py::arg("encoded_softmax"), py::arg("is_causal"), - py::arg("stream") = nullptr); + py::arg("stream") = nullptr, + py::arg("extargs") = ExtraArguments()); m.def("attn_fwd_compact_varlen", &aotriton::v2::flash::attn_fwd_compact_varlen, "Flash Attention Forward Pass, Compact Stored Varlen", @@ -51,7 +59,8 @@ namespace pyaotriton { py::arg("philox_offset"), py::arg("encoded_softmax"), py::arg("is_causal"), - py::arg("stream") = nullptr); + py::arg("stream") = nullptr, + py::arg("extargs") = ExtraArguments()); m.def("attn_bwd", &aotriton::v2::flash::attn_bwd, "Flash Attention Backward Pass", @@ -72,7 +81,8 @@ namespace pyaotriton { py::arg("philox_seed"), py::arg("philox_offset"), py::arg("is_causal"), - py::arg("stream") = nullptr); + py::arg("stream") = nullptr, + py::arg("extargs") = ExtraArguments()); m.def("attn_bwd_compact_varlen", &aotriton::v2::flash::attn_bwd_compact_varlen, "Flash Attention Backward Pass, Compact Stored Varlen", @@ -97,7 +107,8 @@ namespace pyaotriton { py::arg("philox_seed"), py::arg("philox_offset"), py::arg("is_causal"), - py::arg("stream") = nullptr); + py::arg("stream") = nullptr, + py::arg("extargs") = ExtraArguments()); m.def("debug_fill_dropout_rng", &aotriton::v2::flash::debug_fill_dropout_rng, "Flash Attention Debugging Function to get raw RNG numbers used in dropout", diff --git a/include/aotriton/flash.h b/include/aotriton/flash.h index 2fb50244..70eb9001 100644 --- a/include/aotriton/flash.h +++ b/include/aotriton/flash.h @@ -16,6 +16,12 @@ using T4 = aotriton::TensorView<4>; using T2 = aotriton::TensorView<2>; using T1 = aotriton::TensorView<1>; +struct ExtraArguments { +#if AOTRITON_BUILD_FOR_TUNING + int force_kernel_index = -1; +#endif +}; + hipError_t attn_fwd(T4 q, // batch_size x num_heads x seqlen_q x head_size T4 k, // batch_size x num_heads x seqlen_k x head_size @@ -29,7 +35,8 @@ attn_fwd(T4 q, // batch_size x num_heads x seqlen_q x head_size uint64_t philox_offset, T4 encoded_softmax, bool is_causal, - aotriton::Stream stream); + aotriton::Stream stream, + ExtraArguments* extargs = nullptr); hipError_t attn_fwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, total_q := \sum_{i=0}^{b} s_i @@ -48,7 +55,8 @@ attn_fwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, total_q := uint64_t philox_offset, T4 encoded_softmax, bool is_causal, - aotriton::Stream stream); + aotriton::Stream stream, + ExtraArguments* extargs = nullptr); hipError_t attn_bwd(T4 q, // batch_size x num_heads x seqlen_q x head_size @@ -68,7 +76,8 @@ attn_bwd(T4 q, // batch_size x num_heads x seqlen_q x head_size uint64_t philox_seed, uint64_t philox_offset, bool is_causal, - aotriton::Stream stream); + aotriton::Stream stream, + ExtraArguments* extargs = nullptr); hipError_t attn_bwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, total_q := \sum_{i=0}^{b} @@ -92,7 +101,8 @@ attn_bwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, total_q := uint64_t philox_seed, uint64_t philox_offset, bool is_causal, - aotriton::Stream stream); + aotriton::Stream stream, + ExtraArguments* extargs = nullptr); hipError_t debug_fill_dropout_rng(T4 r, diff --git a/v2python/autotune_config.py b/v2python/autotune_config.py new file mode 100644 index 00000000..c35908b3 --- /dev/null +++ b/v2python/autotune_config.py @@ -0,0 +1,33 @@ +# Copyright © 2023-2024 Advanced Micro Devices, Inc. +# Copyright © 2020-2022 OpenAI +# SPDX-License-Identifier: MIT + +from .kernel_argument import TunedArgument + +class Config: + ''' + A compatibile class to store triton.Config + ''' + def __init__(self, kwargs, num_warps=4, num_stages=2, num_ctas=1, maxnreg=None, pre_hook=None): + self.kwargs = kwargs + self.num_warps = num_warps + self.num_ctas = num_ctas + self.num_stages = num_stages + self.maxnreg = maxnreg + self.pre_hook = pre_hook + + def translate_to_psel_and_co(self, perf_metas : 'list[ArgumentMetadata]'): + psels = [] + for k, v in self.kwargs.items(): + for meta in perf_metas: + if meta.has_argument(k): + psels.append(TunedArgument(meta, v)) + break + if 'waves_per_eu' in self.kwargs: + co = {'waves_per_eu' : self.kwargs['waves_per_eu'] } + else: + co = {} + co['num_warps'] = self.num_warps + co['num_stages'] = self.num_stages + # print(f'translate_to_psel_and_co {psels=} {co=}') + return psels, co diff --git a/v2python/common_tuning_database.py b/v2python/common_tuning_database.py index fe1ff7a4..e947e0e9 100644 --- a/v2python/common_tuning_database.py +++ b/v2python/common_tuning_database.py @@ -40,6 +40,10 @@ def gpu(self): def arch_number(self): return self._arch_number + @classmethod + def is_passthrough_tuning(klass): + return False + ''' Create db index, and also initialize _fsel_positions so that _extract_keys_from_fsels can use it ''' @@ -47,6 +51,13 @@ def arch_number(self): def _build_db_index(self, fsels): pass + ''' + Callgraph: select -> _select_from_db -> _lookup_tuning_info + <- + _select_from_db -> craft_perf_selection + <--------------------------- craft_perf_selection + Called by KernelDescription.gen_all_object_files to narrow down kernels to build for fsels + ''' def select(self, fsels : 'list[ArgumentSelection]', perf_meta : 'list[ArgumentMetadata]') -> 'list[ArgumentSelection], dict[str,str]': if self.empty: yield [], None @@ -61,12 +72,31 @@ def _select_from_db(self, pass ''' - tinfo: one piece of tuning information, can be a json object, or a row in SQLite database + Translate row into dict that only contains maps from input keys to values + ''' + @abstractmethod + def extract_inputs(self, columns, row): + pass + + ''' + columns, row: one piece of tuning information, can be a json object, or a + single row in SQLite database. + For json database, columns is None (schemaless, metadata included in rows) + Called by select -> _select_from_db + or + KernelTuningEntryForFunctionalOnGPU ''' @abstractmethod - def craft_perf_selection(self, tinfo, perf_meta: 'list[ArgumentSelection]'): + def craft_perf_selection(self, + columns, + row, + perf_meta: 'list[ArgumentSelection]') -> 'list[TunedArgument], compiler_options': pass + ''' + Callgraph: get_lut -> (Extract tuning info for kdesc+fsels) + <--------- Construct KernelTuningEntryForFunctionalOnGPU fro tuning info + ''' @abstractmethod def get_lut(self, kdesc : 'KernelDescription', diff --git a/v2python/generate_compile.py b/v2python/generate_compile.py index 66a78d69..a20ec3b3 100644 --- a/v2python/generate_compile.py +++ b/v2python/generate_compile.py @@ -20,6 +20,7 @@ def parse(): p.add_argument("--python", type=str, default=None, help="python binary to run compile.py") p.add_argument("--enable_zstd", type=str, default=None, help="Use zstd to compress the compiled kernel") p.add_argument("--bare_mode", action='store_true', help="Instead of generating a proper Makefile, only generate compiler options and leave the remaining tasks to cmake.") + p.add_argument("--build_for_tuning", action='store_true', help="Build all possible GPU kernels for performance tuning.") # p.add_argument("--autotune_data", type=str, default=None, help="Autotune results generated by tune_flash.py") args = p.parse_args() # print(args) @@ -53,8 +54,9 @@ def gen_from_kernel(args, k, build_dir, makefile): all_targets = [] object_rules = io.StringIO() arches = [None] if args.target_gpus is None else args.target_gpus - ktd = KernelTuningDatabase(SOURCE_PATH.parent / 'rules', k) - if True: # Debugging + # ktd = None if args.build_for_tuning else KernelTuningDatabase(SOURCE_PATH.parent / 'rules', k) + ktd = KernelTuningDatabase(SOURCE_PATH.parent / 'rules', k, build_for_tuning=args.build_for_tuning) + if False: # Debugging if k.SHIM_KERNEL_NAME == 'attn_fwd': assert not ktd.empty k.set_target_gpus(arches) diff --git a/v2python/generate_shim.py b/v2python/generate_shim.py index 6140c21f..45c0dd93 100755 --- a/v2python/generate_shim.py +++ b/v2python/generate_shim.py @@ -51,6 +51,7 @@ def parse(): p.add_argument("--archive_only", action='store_true', help='Only generate archive library instead of shared library. No linking with dependencies.') p.add_argument("--enable_zstd", type=str, default=None, help="Use zstd to compress the compiled kernel") p.add_argument("--bare_mode", action='store_true', help="Instead of generating a proper Makefile, only generate a list of source files and leave the remaining tasks to cmake.") + p.add_argument("--build_for_tuning", action='store_true', help="Include all GPU kernels in the dispatcher for performance tuning.") p.add_argument("--verbose", action='store_true', help="Print debugging messages") args = p.parse_args() args._build_root = Path(args.build_dir) @@ -281,7 +282,9 @@ def __init__(self, args, out, k : 'KernelDescription'): # Autotune dispatcher self._autotune_path = Path(args.build_dir) / k.KERNEL_FAMILY / f'autotune.{k.SHIM_KERNEL_NAME}' self._autotune_path.mkdir(parents=True, exist_ok=True) - self._ktd = KernelTuningDatabase(SOURCE_PATH.parent / 'rules', k) + self._ktd = KernelTuningDatabase(SOURCE_PATH.parent / 'rules', + k, + build_for_tuning=self._args.build_for_tuning) self._objpaths = [] @property @@ -307,7 +310,6 @@ def gen_children(self, out): k = self._kdesc p = self._shim_path / f'gpu_kernel_image.{k.SHIM_KERNEL_NAME}' args = self._args - ktd = KernelTuningDatabase(SOURCE_PATH.parent / 'rules', k) debug_counter = 0 for gpu, fsels, lut in k.gen_tuned_kernel_lut(self._ktd): # print(f'KernelShimGenerator.gen_children {fsels=}') @@ -320,7 +322,7 @@ def gen_children(self, out): if self.is_bare: return - for o in k.gen_all_object_files(p, tuned_db=ktd, sancheck_fileexists=True): + for o in k.gen_all_object_files(p, tuned_db=self._ktd, sancheck_fileexists=True): yield ObjectShimCodeGenerator(self._args, k, o) def write_conclude(self): diff --git a/v2python/json_tuning_database.py b/v2python/json_tuning_database.py index c5bc322c..6cd46276 100644 --- a/v2python/json_tuning_database.py +++ b/v2python/json_tuning_database.py @@ -139,7 +139,11 @@ def _lookup_tuning_info(self, fsels, with_duplicates=True): tuning_info = self._index[fallback_tup] if with_duplicates else self._index_dedup[fallback_tup] return self._downgrade(fallback_applied_fsels, tuning_info) - def craft_perf_selection(self, tinfo, perf_meta: 'list[ArgumentSelection]'): + def craft_perf_selection(self, + columns, + row, + perf_meta: 'list[ArgumentSelection]') -> 'list[TunedArgument], compiler_options': + tinfo = row if tinfo is None: # default value when tuning db does not contain the kernel return [TunedArgument(meta, meta.default_value) for meta in perf_meta], None ps = dict(tinfo['tuned_kernel']) @@ -157,7 +161,7 @@ def _select_from_db(self, indexed = self._lookup_tuning_info(fsels, with_duplicates=not no_duplicate) assert indexed for tinfo in indexed: - yield self.craft_perf_selection(tinfo, perf_meta) + yield self.craft_perf_selection(None, tinfo, perf_meta) def get_lut(self, kdesc : 'KernelDescription', diff --git a/v2python/kernel_argument.py b/v2python/kernel_argument.py index f25047b8..a24a0398 100644 --- a/v2python/kernel_argument.py +++ b/v2python/kernel_argument.py @@ -75,6 +75,10 @@ def nchoices(self): def argument_names(self): return [a[0] for a in self._ordered_arguments] + @property + def repr_name(self): + return self._ordered_arguments[0][0] + def has_argument(self, aname): return aname in self.argument_names @@ -214,6 +218,18 @@ def update_triton_api_signature(self, sig: dict): for place in self._meta.ordered_argument_places: sig[place] = self.triton_signature + # FIXME: XXX_CHOICES's key is unordered + ''' + Build a dict that maps "representative name" to selected value + Consider changing it from frozenset to tuple + ''' + @staticmethod + def build_fsel_dict(fsels : 'list[ArgumentSelection]'): + d = {} + for fsel in fsels: + d[fsel.meta.repr_name] = fsel.argument_value + return d + class TunedArgument(ArgumentSelection): def __init__(self, meta : ArgumentMetadata, value): self._meta = meta diff --git a/v2python/kernel_desc.py b/v2python/kernel_desc.py index 81d379d5..86fb12b7 100644 --- a/v2python/kernel_desc.py +++ b/v2python/kernel_desc.py @@ -155,6 +155,14 @@ def gen_tuned_perf_selections(self, def set_target_gpus(self, gpus): self._target_gpus = ['native'] if gpus is None else list(gpus) + def gen_perf_selections_from_kdesc(self, + gpu : str, + fsels : 'list[ArgumentSelection]'): + fsel_dict = ArgumentSelection.build_fsel_dict(fsels) + for cfg in self.gen_autotune_configs(fsel_dict): + psels, compiler_options = cfg.translate_to_psel_and_co(self._perf_meta) + yield gpu, fsels, psels, compiler_options + def gen_all_object_files(self, outpath : Path, # kernel_name : str = None, @@ -163,17 +171,27 @@ def gen_all_object_files(self, sancheck_fileexists = False) -> 'Iterator[ObjectFileDescription]': def gen(): if tuned_db is None or tuned_db.empty: - yield from itertools.product(self._target_gpus, - self.gen_func_selections(), - self.gen_perf_selections(), - [None]) + if not hasattr(self, 'gen_autotune_configs'): + yield from itertools.product(self._target_gpus, + self.gen_func_selections(), + self.gen_perf_selections(), + [None]) + return + for gpu, fsels in itertools.product(self._target_gpus, + self.gen_func_selections()): + yield from self.gen_perf_selections_from_kdesc(gpu, fsels) else: for gpu, fsels in itertools.product(self._target_gpus, self.gen_func_selections()): yield from self.gen_tuned_perf_selections(tuned_db, gpu, fsels) debug_counter = 0 for gpu, fsels, psels, compiler_options in gen(): - sig = KernelSignature(self, fsels, psels, compiler_options, gpu) + try: + sig = KernelSignature(self, fsels, psels, compiler_options, gpu) + except: + print(f"{fsels=}") + print(f"{psels=}") + exit() yield self.build_object_file_description(outpath, sig, sancheck_fileexists=sancheck_fileexists) if False: # Debugging debug_counter += 1 diff --git a/v2python/rules/flash/_common.py b/v2python/rules/flash/_common.py index b024dc66..b9bec0a3 100644 --- a/v2python/rules/flash/_common.py +++ b/v2python/rules/flash/_common.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: MIT from ...kernel_desc import KernelDescription, get_possible_types, select_pattern +from ...autotune_config import Config from ...autotune_binning import BinningLessOrEqual, BinningExact class FlashKernel(KernelDescription): diff --git a/v2python/rules/flash/attn_fwd.py b/v2python/rules/flash/attn_fwd.py index 615366ba..d6a936cc 100644 --- a/v2python/rules/flash/attn_fwd.py +++ b/v2python/rules/flash/attn_fwd.py @@ -1,7 +1,8 @@ # Copyright © 2023-2024 Advanced Micro Devices, Inc. # SPDX-License-Identifier: MIT -from ._common import FlashKernel, select_pattern, BinningLessOrEqual, BinningExact +import itertools +from ._common import FlashKernel, select_pattern, BinningLessOrEqual, BinningExact, Config class attn_fwd(FlashKernel): ARGUMENTS = [ @@ -11,6 +12,8 @@ class attn_fwd(FlashKernel): 'stride_vz', 'stride_vh', 'stride_vk', 'stride_vn', 'stride_bz', 'stride_bh', 'stride_bm', 'stride_bn', 'stride_oz', 'stride_oh', 'stride_om', 'stride_on', + 'num_head_q', + 'num_head_k', 'cu_seqlens_q', 'cu_seqlens_k', 'num_seqlens', @@ -43,7 +46,7 @@ class attn_fwd(FlashKernel): frozenset(['sm_scale']) : ['fp32'], frozenset(['M']) : ['*fp32:16'], frozenset(['cu_seqlens_q', 'cu_seqlens_k']) : ['*i32:16'], - frozenset(['num_seqlens', 'max_seqlen_q', 'max_seqlen_k']) : ['i32'], + frozenset(['num_head_q', 'num_head_k', 'num_seqlens', 'max_seqlen_q', 'max_seqlen_k']) : ['i32'], frozenset(['head_dim']) : ['i32'], frozenset(['dropout_p']) : ['fp32'], frozenset(['philox_seed']) : ['u64'], @@ -109,3 +112,28 @@ def DOWNGRADE_RETURN_ENCODED_SOFTMAX(tuned_kernel, compiler_options): DOWNGRADER = [(('RETURN_ENCODED_SOFTMAX', True), DOWNGRADE_RETURN_ENCODED_SOFTMAX)] + @staticmethod + def gen_autotune_configs(fsel_dict : 'dict[str, Any]'): + dtype = fsel_dict['Q'] + ret = [] + BLOCK_SIZES = [(128, 64), (64, 64), (64, 32)] + WAVES_PER_EU = [0, 1, 2, 3, 4] + PRE_LOAD_V = [True, False] + for (M, N), waves, pre in itertools.product(BLOCK_SIZES, + WAVES_PER_EU, + PRE_LOAD_V): + if dtype == '*fp32:16': + M //= 2 + kw = {'BLOCK_M': M, 'BLOCK_N': N, 'waves_per_eu': waves, 'pre_load_v': pre} + yield Config(kw, num_stages=1, num_warps=4) + yield from [ + Config({'BLOCK_M': 256, 'BLOCK_N': 64, 'waves_per_eu': 2, 'pre_load_v': False}, num_stages=1, num_warps=8), + Config({'BLOCK_M': 128, 'BLOCK_N':128, 'waves_per_eu': 2, 'pre_load_v': False}, num_stages=1, num_warps=4), + Config({'BLOCK_M': 256, 'BLOCK_N':128, 'waves_per_eu': 2, 'pre_load_v': False}, num_stages=1, num_warps=8), + Config({'BLOCK_M': 128, 'BLOCK_N': 64, 'waves_per_eu': 3, 'pre_load_v': True}, num_stages=1, num_warps=4), + Config({'BLOCK_M': 128, 'BLOCK_N': 64, 'waves_per_eu': 3, 'pre_load_v': False}, num_stages=1, num_warps=4), + Config({'BLOCK_M': 64, 'BLOCK_N': 64, 'waves_per_eu': 4, 'pre_load_v': False}, num_stages=1, num_warps=8), + Config({'BLOCK_M': 128, 'BLOCK_N': 64, 'waves_per_eu': 1, 'pre_load_v': False}, num_stages=1, num_warps=4), + Config({'BLOCK_M': 32, 'BLOCK_N': 32, 'waves_per_eu': 4, 'pre_load_v': False}, num_stages=1, num_warps=8), + Config({'BLOCK_M': 16, 'BLOCK_N': 16, 'waves_per_eu': 1, 'pre_load_v': False}, num_stages=1, num_warps=4), + ] diff --git a/v2python/sqlite_tuning_database.py b/v2python/sqlite_tuning_database.py index eb4486f4..a1198ee9 100644 --- a/v2python/sqlite_tuning_database.py +++ b/v2python/sqlite_tuning_database.py @@ -99,7 +99,10 @@ def _select_from_db(self, for row in selected_rows: yield self.craft_perf_selection(selected_columns, row, perf_meta) - def craft_perf_selection(self, columns, row, perf_meta: 'list[ArgumentSelection]'): + def craft_perf_selection(self, + columns, + row, + perf_meta: 'list[ArgumentSelection]') -> 'list[TunedArgument], compiler_options': if row is None: # default value when tuning db does not contain the kernel return [TunedArgument(meta, meta.default_value) for meta in perf_meta], None ps = self._row_to_dict(columns, row, prefix='tuned_kernel') diff --git a/v2python/tuning_database.py b/v2python/tuning_database.py index 5bfa48ce..f7ca313c 100644 --- a/v2python/tuning_database.py +++ b/v2python/tuning_database.py @@ -3,7 +3,7 @@ import pathlib import sqlite3 -from .kernel_argument import TunedArgument +from .kernel_argument import ArgumentSelection, TunedArgument from .gpu_targets import AOTRITON_GPU_ARCH_TUNING_STRING from .common_tuning_database import CommonKernelTuningDatabaseForArch from .sqlite_tuning_database import SQLiteKernelTuningDatabaseForArch @@ -27,7 +27,13 @@ def _select_from_db(self, no_duplicate=True): assert False - def craft_perf_selection(self, tinfo, perf_meta: 'list[ArgumentSelection]'): + def extract_inputs(self, columns, row): + assert False + + def craft_perf_selection(self, + columns, + row, + perf_meta: 'list[ArgumentSelection]') -> 'list[TunedArgument], compiler_options': return [TunedArgument(meta, meta.default_value) for meta in perf_meta], None def get_lut(self, @@ -40,12 +46,48 @@ def get_lut(self, autotune_keys=None, perf_meta=perf_meta) +class BootstrapTuningDatabaseForArch(EmptyKernelTuningDatabaseForArch): + + @classmethod + def is_passthrough_tuning(klass): + return True + + def extract_inputs(self, columns, row): + assert False + + def craft_perf_selection(self, + columns, + row, + perf_meta: 'list[ArgumentSelection]') -> 'list[TunedArgument], compiler_options': + if row is None: + return [TunedArgument(meta, meta.default_value) for meta in perf_meta], None + return row + + def get_lut(self, + kdesc : 'KernelDescription', + autotune_keys : 'list[tuple[str, Binning]]', + fsels : 'list[ArgumentSelection]', + perf_meta : 'list[ArgumentMetadata]'): + fsel_dict = ArgumentSelection.build_fsel_dict(fsels) + rows = [] + for cfg in kdesc.gen_autotune_configs(fsel_dict): + psels, compiler_options = cfg.translate_to_psel_and_co(perf_meta) + rows.append((psels, compiler_options)) + # print(f'get_lut {len(rows)=}') + return KernelTuningEntryForFunctionalOnGPU(kdesc, self, fsels, + columns=None, rows=rows, + autotune_keys=None, + perf_meta=perf_meta) + class KernelTuningDatabase(object): MONOLITHIC_TUNING_DATABASE_FILE = 'tuning_database.sqlite3' - def __init__(self, tune_info_dir : pathlib.Path, k : 'KernelDescription'): + def __init__(self, tune_info_dir : pathlib.Path, k : 'KernelDescription', build_for_tuning=False): self._kdesc = k self.arch_dict = {} + self._build_for_tuning = build_for_tuning and hasattr(k, 'gen_autotune_configs') + if self._build_for_tuning: + return td = pathlib.Path(tune_info_dir) / self.MONOLITHIC_TUNING_DATABASE_FILE # in case tune_info_dir is str # print(f"Tryint to probe KernelTuningDatabase inside {td}") downgrader = TuningDowngrader.create_from_kdesc(k) @@ -62,10 +104,13 @@ def __init__(self, tune_info_dir : pathlib.Path, k : 'KernelDescription'): def select_gpu(self, gpu, index): arch = AOTRITON_GPU_ARCH_TUNING_STRING[gpu] if arch not in self.arch_dict: - print(f'For kernel {self._kdesc.KERNEL_FAMILY}.{self._kdesc.name}, Architecture {arch} was not found in tuning database, using dummy one instead') - self.arch_dict[arch] = EmptyKernelTuningDatabaseForArch(self._kdesc, arch) + if not self._build_for_tuning: + print(f'For kernel {self._kdesc.KERNEL_FAMILY}.{self._kdesc.name}, Architecture {arch} was not found in tuning database, using dummy one instead') + self.arch_dict[arch] = EmptyKernelTuningDatabaseForArch(self._kdesc, arch) + else: + self.arch_dict[arch] = BootstrapTuningDatabaseForArch(self._kdesc, arch) return self.arch_dict[arch].set_gpu(gpu, index) @property def empty(self): - return not self.arch_dict + return not self.arch_dict or self._build_for_tuning diff --git a/v2python/tuning_lut.py b/v2python/tuning_lut.py index 14cbfad4..a73b0d85 100644 --- a/v2python/tuning_lut.py +++ b/v2python/tuning_lut.py @@ -26,19 +26,27 @@ def __init__(self, self._fsels = fsels # print(f'{self._fsels=}') self._lut_dic = {} - self._autotune_keys = autotune_keys if autotune_keys is not None else None + self._autotune_keys = autotune_keys self._autotune_key_values = { key : set() for key, _ in autotune_keys } if autotune_keys is not None else None self._autotune_key_class = { key : klass for key, klass in autotune_keys } if autotune_keys is not None else None self._sigs = [] self._sig_dict = {} - if rows is None and autotune_keys is None: + if autotune_keys is None: self._lut_dtype = np.uint8 self._lut_cdtype = f'uint8_t' self._lut_tensor = np.array([0], dtype=np.uint8) self._lut_cshape = ''.join([f'[{s}]' for s in self._lut_tensor.shape]) self._untuned = True - default_psels, default_co = dba.craft_perf_selection(None, perf_meta) - self._lut_dic[0] = self._allocate_sig(default_psels, default_co)[0] + # print(f'{dba.is_passthrough_tuning()=}') + if dba.is_passthrough_tuning(): + # print(f'KernelTuningEntryForFunctionalOnGPU.__init__ {len(rows)=}') + for row in rows: + psels, compiler_options = dba.craft_perf_selection(columns, row, perf_meta) + self._allocate_sig(psels, compiler_options) + self._lut_dic[0] = 0 + else: + default_psels, default_co = dba.craft_perf_selection(None, None, perf_meta) + self._lut_dic[0] = self._allocate_sig(default_psels, default_co)[0] return self._untuned = False # print(f'KernelTuningEntryForFunctionalOnGPU {fsels=}') @@ -65,6 +73,7 @@ def track_autotune_key_values(self, columns, row, tup): def _allocate_sig(self, psels, compiler_options): sig = KernelSignature(self._kdesc, self._fsels, psels, compiler_options, self._dba.gpu) + # print(f'_allocate_sig {sig.compact_signature}') compact = sig.compact_signature if compact not in self._sig_dict: self._sig_dict[compact] = (len(self._sigs), sig) @@ -101,6 +110,7 @@ def _build_lut_tensor(self): def gen_kernel_symbols(self, kernel_image_dir): for sig in self._sigs: + # print(f"gen_kernel_symbols {sig.compact_signature=}") o = self._kdesc.build_object_file_description(kernel_image_dir, sig) yield o.c_identifier_signature, o._hsaco_kernel_path, o diff --git a/v2src/CMakeLists.txt b/v2src/CMakeLists.txt index 02dd38e2..0cf16b06 100644 --- a/v2src/CMakeLists.txt +++ b/v2src/CMakeLists.txt @@ -25,8 +25,13 @@ message("AOTRITON_COMPILER ${AOTRITON_COMPILER}") # ) # add_dependencies(aotriton_v2_gen_compile aotriton_venv_triton) +if(AOTRITON_BUILD_FOR_TUNING) + set(GENERATE_OPTION "--build_for_tuning") +else(AOTRITON_BUILD_FOR_TUNING) + set(GENERATE_OPTION "") +endif() execute_process( - COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_compile --target_gpus ${TARGET_GPUS} --build_dir "${AOTRITON_V2_BUILD_DIR}" --bare_mode + COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_compile --target_gpus ${TARGET_GPUS} --build_dir "${AOTRITON_V2_BUILD_DIR}" --bare_mode ${GENERATE_OPTION} COMMAND_ECHO STDOUT WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_PARENT_DIR}" ) @@ -113,7 +118,7 @@ message(STATUS "AOTRITON_ZSTD_INCLUDE ${AOTRITON_ZSTD_INCLUDE}") message(STATUS "AOTRITON_SHIM_FLAGS ${AOTRITON_SHIM_FLAGS}") execute_process( - COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} --bare_mode + COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} --bare_mode "${GENERATE_OPTION}" COMMAND_ECHO STDOUT WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/.." ) @@ -122,7 +127,7 @@ file(STRINGS "${AOTRITON_V2_BUILD_DIR}/Bare.shim" SHIM_CC_FILES) # CAVEAT: Actual shim code can only be generated during build phase because it # requires some kernel information. (Notably shared memory requirement) add_custom_target(aotriton_v2_gen_shim - COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} ${AOTRITON_SHIM_FLAGS} + COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} ${AOTRITON_SHIM_FLAGS} "${GENERATE_OPTION}" BYPRODUCTS ${SHIM_CC_FILES} # Essential, otherwise add_library complains COMMAND_EXPAND_LISTS WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/.." @@ -148,6 +153,11 @@ target_include_directories(aotriton_v2 PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../inclu target_include_directories(aotriton_v2 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(aotriton_v2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../third_party/incbin) target_compile_options(aotriton_v2 PRIVATE -fPIC --no-offload-arch=all) +if(AOTRITON_BUILD_FOR_TUNING) + target_compile_definitions(aotriton_v2 PRIVATE -DAOTRITON_BUILD_FOR_TUNING=1) +else(AOTRITON_BUILD_FOR_TUNING) + target_compile_definitions(aotriton_v2 PRIVATE -DAOTRITON_BUILD_FOR_TUNING=0) +endif(AOTRITON_BUILD_FOR_TUNING) # message(STATUS "AOTRITON_EXTRA_COMPILER_OPTIONS ${AOTRITON_EXTRA_COMPILER_OPTIONS}") # add_custom_target(aotriton_v2 diff --git a/v2src/flash/attn_bwd.cc b/v2src/flash/attn_bwd.cc index 245c6f25..4e3d88bb 100644 --- a/v2src/flash/attn_bwd.cc +++ b/v2src/flash/attn_bwd.cc @@ -117,7 +117,8 @@ bwd_kernel_dk_dv(T4 q, uint64_t philox_seed, uint64_t philox_offset, bool is_causal, - aotriton::Stream stream_wrap) { + aotriton::Stream stream_wrap, + ExtraArguments* extargs) { hipError_t err; auto stream = stream_wrap.native(); auto arch = getArchFromStream(stream); @@ -163,6 +164,10 @@ bwd_kernel_dk_dv(T4 q, .PADDED_HEAD = head_size_rounded != head_size, .BIAS_TYPE = bias_type, }; +#if AOTRITON_BUILD_FOR_TUNING + if (extargs) + params._has_preferred_kernel = extargs->force_kernel_index; +#endif BwdKernelDkDvContext context; context.grid_calculator = grid_calculator; err = context.lookup_optimal(params, arch); @@ -194,7 +199,8 @@ bwd_kernel_dq(T4 q, uint64_t philox_seed, uint64_t philox_offset, bool is_causal, - aotriton::Stream stream_wrap) { + aotriton::Stream stream_wrap, + ExtraArguments* extargs) { hipError_t err; auto stream = stream_wrap.native(); auto arch = getArchFromStream(stream); @@ -240,6 +246,10 @@ bwd_kernel_dq(T4 q, .PADDED_HEAD = head_size_rounded != head_size, .BIAS_TYPE = bias_type, }; +#if AOTRITON_BUILD_FOR_TUNING + if (extargs) + params._has_preferred_kernel = extargs->force_kernel_index; +#endif BwdKernelDqContext context; context.grid_calculator = grid_calculator; err = context.lookup_optimal(params, arch); @@ -273,7 +283,8 @@ _attn_bwd_common(T4 q, uint64_t philox_seed, uint64_t philox_offset, bool is_causal, - aotriton::Stream stream) { + aotriton::Stream stream, + ExtraArguments* extargs) { hipError_t ret; if (num_seqlens == 0) ret = bwd_preprocess(out, dout, delta, stream); @@ -301,7 +312,8 @@ _attn_bwd_common(T4 q, philox_seed, philox_offset, is_causal, - stream); + stream, + extargs); if (ret != hipSuccess) return ret; @@ -325,7 +337,8 @@ _attn_bwd_common(T4 q, philox_seed, philox_offset, is_causal, - stream); + stream, + extargs); return ret; } @@ -347,7 +360,8 @@ attn_bwd(T4 q, uint64_t philox_seed, uint64_t philox_offset, bool is_causal, - aotriton::Stream stream) { + aotriton::Stream stream, + ExtraArguments* extargs) { auto null_t1 = T1::get_null_tensor(DType::kInt32); return _attn_bwd_common(q, k, @@ -371,7 +385,8 @@ attn_bwd(T4 q, philox_seed, philox_offset, is_causal, - stream); + stream, + extargs); } hipError_t @@ -396,7 +411,8 @@ attn_bwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, uint64_t philox_seed, uint64_t philox_offset, bool is_causal, - aotriton::Stream stream) { + aotriton::Stream stream, + ExtraArguments* extargs) { return _attn_bwd_common(q, k, v, @@ -419,7 +435,8 @@ attn_bwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, philox_seed, philox_offset, is_causal, - stream); + stream, + extargs); } } diff --git a/v2src/flash/attn_fwd.cc b/v2src/flash/attn_fwd.cc index 07428dc1..043a3eb2 100644 --- a/v2src/flash/attn_fwd.cc +++ b/v2src/flash/attn_fwd.cc @@ -33,7 +33,8 @@ _attn_fwd_common(T4 q, uint64_t philox_offset, T4 encoded_softmax, bool is_causal, - aotriton::Stream stream_wrap) { + aotriton::Stream stream_wrap, + ExtraArguments* extargs) { hipError_t err; auto stream = stream_wrap.native(); auto arch = getArchFromStream(stream); @@ -85,6 +86,10 @@ _attn_fwd_common(T4 q, .PADDED_HEAD = head_dim_rounded != head_size, .BIAS_TYPE = bias_type, }; +#if AOTRITON_BUILD_FOR_TUNING + if (extargs) + params._has_preferred_kernel = extargs->force_kernel_index; +#endif AttnFwdContext context; context.grid_calculator = grid_calculator; // .grid_calculator = grid_calculator @@ -109,7 +114,8 @@ attn_fwd(T4 q, uint64_t philox_offset, T4 encoded_softmax, bool is_causal, - aotriton::Stream stream_wrap) { + aotriton::Stream stream_wrap, + ExtraArguments* extargs) { auto null_t1 = T1::get_null_tensor(DType::kInt32); return _attn_fwd_common(q, k, @@ -128,7 +134,8 @@ attn_fwd(T4 q, philox_offset, encoded_softmax, is_causal, - stream_wrap); + stream_wrap, + extargs); } hipError_t @@ -148,7 +155,8 @@ attn_fwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, uint64_t philox_offset, T4 encoded_softmax, bool is_causal, - aotriton::Stream stream_wrap) { + aotriton::Stream stream_wrap, + ExtraArguments* extargs) { return _attn_fwd_common(q, k, v, @@ -166,7 +174,8 @@ attn_fwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, philox_offset, encoded_softmax, is_causal, - stream_wrap); + stream_wrap, + extargs); } } diff --git a/v2src/template/autotune_table_entry.cc b/v2src/template/autotune_table_entry.cc index 1a13565b..70d0e825 100644 --- a/v2src/template/autotune_table_entry.cc +++ b/v2src/template/autotune_table_entry.cc @@ -18,12 +18,18 @@ [[incbin_kernel_images]]; -#ifndef NDEBUG +#if defined(NDEBUG) || AOTRITON_BUILD_FOR_TUNING [[incbin_kernel_names]]; #endif +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) + namespace { // Anonymous namespace +#if AOTRITON_BUILD_FOR_TUNING +static constexpr int incbin_num_kernels = ARRAY_SIZE(incbin_kernel_names); +#endif + struct PerfFields { [[perf_fields]]; }; @@ -45,6 +51,15 @@ namespace aotriton::v2::[[kernel_family_name]]::autotune { // using aotriton::v2::[[kernel_family_name]]::[[param_class_name]]; void CURRENT_ENTRY_PUBLIC::operator()([[param_class_name]]& params) { +#if AOTRITON_BUILD_FOR_TUNING + int preferred_index = params._has_preferred_kernel; + if (preferred_index >= 0) { + if (preferred_index >= incbin_num_kernels) + return ; + params.selected_kernel = &image_list[preferred_index]; + return ; + } +#endif [[binning_autotune_keys]] auto kernel_index = lut[[binned_indices]]; params.selected_kernel = &image_list[kernel_index]; diff --git a/v2src/template/shim.h b/v2src/template/shim.h index 635174be..484b50d6 100644 --- a/v2src/template/shim.h +++ b/v2src/template/shim.h @@ -20,6 +20,9 @@ struct [[param_class_name]] { TritonKernel* selected_kernel = nullptr; const char* _debug_kernel_name = nullptr; +#if AOTRITON_BUILD_FOR_TUNING + int _has_preferred_kernel = -1; // For C++ based autotune database generation +#endif int64_t godel_number() const; }; From 36ca9feb26f59dbeb8711d6b4f84018257803a35 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 8 Jul 2024 21:06:07 +0000 Subject: [PATCH 11/51] v2src/flash/attn_fwd: add missing num_head_q and num_head_k --- v2src/flash/attn_fwd.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/v2src/flash/attn_fwd.cc b/v2src/flash/attn_fwd.cc index 043a3eb2..74937dfa 100644 --- a/v2src/flash/attn_fwd.cc +++ b/v2src/flash/attn_fwd.cc @@ -70,11 +70,13 @@ _attn_fwd_common(T4 q, .encoded_softmax = &encoded_softmax, .sm_scale = sm_scale, .M = &softmax_lse, - .cu_seqlens_q = &cu_seqlens_q, - .cu_seqlens_k = &cu_seqlens_k, + .num_head_q = head_size, + .num_head_k = head_size, .num_seqlens = num_seqlens, .max_seqlen_q = max_seqlen_q, .max_seqlen_k = max_seqlen_k, + .cu_seqlens_q = &cu_seqlens_q, + .cu_seqlens_k = &cu_seqlens_k, .head_dim = static_cast(head_size), .dropout_p = dropout_p, .philox_seed = philox_seed, From 63cc8fb719ebe74f1886aa652c018029ea95dee8 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 8 Jul 2024 21:15:48 +0000 Subject: [PATCH 12/51] Flash API now returns selected psels and copts to extra arguments, if AOTRITON_BUILD_FOR_TUNING=1 --- bindings/module.cc | 2 ++ include/aotriton/flash.h | 2 ++ v2python/kernel_signature.py | 12 ++++++++++++ v2python/rules/flash/attn_fwd.py | 1 + v2python/tuning_lut.py | 14 ++++++++++++++ v2src/flash/attn_fwd.cc | 6 ++++++ v2src/template/autotune_table_entry.cc | 8 ++++++++ v2src/template/shim.h | 2 ++ 8 files changed, 47 insertions(+) diff --git a/bindings/module.cc b/bindings/module.cc index e2b2dd37..51cb6d97 100644 --- a/bindings/module.cc +++ b/bindings/module.cc @@ -21,6 +21,8 @@ namespace pyaotriton { .def(py::init<>()) #if AOTRITON_BUILD_FOR_TUNING .def_readwrite("force_kernel_index", &ExtraArguments::force_kernel_index) + .def_readonly("selected_kernel_psels", &ExtraArguments::selected_kernel_psels) + .def_readonly("selected_kernel_copts", &ExtraArguments::selected_kernel_copts) #endif ; m.def("attn_fwd", diff --git a/include/aotriton/flash.h b/include/aotriton/flash.h index 70eb9001..5a9b54bc 100644 --- a/include/aotriton/flash.h +++ b/include/aotriton/flash.h @@ -19,6 +19,8 @@ using T1 = aotriton::TensorView<1>; struct ExtraArguments { #if AOTRITON_BUILD_FOR_TUNING int force_kernel_index = -1; + const char* selected_kernel_psels = nullptr; + const char* selected_kernel_copts = nullptr; #endif }; diff --git a/v2python/kernel_signature.py b/v2python/kernel_signature.py index 10dae4d4..fbd43d1d 100644 --- a/v2python/kernel_signature.py +++ b/v2python/kernel_signature.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: MIT from .gpu_targets import AOTRITON_GPU_ARCH_TUNING_STRING +import json class KernelSignature(object): def __init__(self, @@ -83,3 +84,14 @@ def codegen_perf_object(self) -> str: for aname in ps.argument_names: perf_key_value.append(f'.{aname} = {value}') return ', '.join(perf_key_value) + + def jsongen_psels(self) -> str: + d = {} + for ps in self._perf_selections: + value = ps.argument_value + for aname in ps.argument_names: + d[aname] = value + return json.dumps(d) + + def jsongen_copts(self) -> str: + return json.dumps(self._compiler_options) diff --git a/v2python/rules/flash/attn_fwd.py b/v2python/rules/flash/attn_fwd.py index d6a936cc..39a08854 100644 --- a/v2python/rules/flash/attn_fwd.py +++ b/v2python/rules/flash/attn_fwd.py @@ -86,6 +86,7 @@ class attn_fwd(FlashKernel): 'max_seqlen_q' : BinningLessOrEqual, 'max_seqlen_k' : BinningLessOrEqual, 'CAUSAL' : BinningExact, + 'ENABLE_DROPOUT' : BinningExact, } # List of functionals that are not fully tuned in the tuning database # First element of the tuple is name. Second is the value to use instead diff --git a/v2python/tuning_lut.py b/v2python/tuning_lut.py index a73b0d85..dc1f29fe 100644 --- a/v2python/tuning_lut.py +++ b/v2python/tuning_lut.py @@ -131,6 +131,18 @@ def codegen_incbin_names(self, kernel_image_dir, compressed=False): incbin_lines.append(f'"{incbin_symbol_name}"') return 'static const char* incbin_kernel_names[] = {\n ' + ",\n ".join(incbin_lines) + "\n};" + def codegen_kernel_psels(self, kernel_image_dir, compressed=False): + lines = [] + for sig in self._sigs: + lines.append(f'R"xyzw({sig.jsongen_psels()})xyzw"') + return 'static const char* kernel_psels[] = {\n ' + ",\n ".join(lines) + "\n};" + + def codegen_kernel_copts(self, kernel_image_dir, compressed=False): + lines = [] + for sig in self._sigs: + lines.append(f'R"xyzw({sig.jsongen_copts()})xyzw"') + return 'static const char* kernel_copts[] = {\n ' + ",\n ".join(lines) + "\n};" + def codegen_kernel_image_objects(self, kernel_image_dir): kernel_image_symbols = [] for incbin_symbol_name, _, o in self.gen_kernel_symbols(kernel_image_dir): @@ -168,6 +180,8 @@ def write_lut_source(self, outdir : 'pathlib.Path', compressed, bare_mode): d = { 'incbin_kernel_images' : self.codegen_incbin_code(gpu_kernel_image_dir, compressed=compressed), 'incbin_kernel_names' : self.codegen_incbin_names(gpu_kernel_image_dir, compressed=compressed), + 'kernel_psels' : self.codegen_kernel_psels(gpu_kernel_image_dir, compressed=compressed), + 'kernel_copts' : self.codegen_kernel_copts(gpu_kernel_image_dir, compressed=compressed), 'kernel_family_name' : self._kdesc.KERNEL_FAMILY, 'shim_kernel_name' : self._kdesc.SHIM_KERNEL_NAME, 'godel_number' : godel_number, diff --git a/v2src/flash/attn_fwd.cc b/v2src/flash/attn_fwd.cc index 74937dfa..6cc91c40 100644 --- a/v2src/flash/attn_fwd.cc +++ b/v2src/flash/attn_fwd.cc @@ -96,6 +96,12 @@ _attn_fwd_common(T4 q, context.grid_calculator = grid_calculator; // .grid_calculator = grid_calculator err = context.lookup_optimal(params, arch); +#if AOTRITON_BUILD_FOR_TUNING + if (extargs) { + extargs->selected_kernel_psels = params._preferred_kernel_psels; + extargs->selected_kernel_copts = params._preferred_kernel_copts; + } +#endif if (err != hipSuccess) { return err; } diff --git a/v2src/template/autotune_table_entry.cc b/v2src/template/autotune_table_entry.cc index 70d0e825..501356d7 100644 --- a/v2src/template/autotune_table_entry.cc +++ b/v2src/template/autotune_table_entry.cc @@ -30,6 +30,12 @@ namespace { // Anonymous namespace static constexpr int incbin_num_kernels = ARRAY_SIZE(incbin_kernel_names); #endif +#if AOTRITON_BUILD_FOR_TUNING +// PSels and Copts in JSON String +[[kernel_psels]]; +[[kernel_copts]]; +#endif + struct PerfFields { [[perf_fields]]; }; @@ -57,6 +63,8 @@ void CURRENT_ENTRY_PUBLIC::operator()([[param_class_name]]& params) { if (preferred_index >= incbin_num_kernels) return ; params.selected_kernel = &image_list[preferred_index]; + params._preferred_kernel_psels = kernel_psels[preferred_index]; + params._preferred_kernel_copts = kernel_psels[preferred_index]; return ; } #endif diff --git a/v2src/template/shim.h b/v2src/template/shim.h index 484b50d6..1dbed1af 100644 --- a/v2src/template/shim.h +++ b/v2src/template/shim.h @@ -22,6 +22,8 @@ struct [[param_class_name]] { const char* _debug_kernel_name = nullptr; #if AOTRITON_BUILD_FOR_TUNING int _has_preferred_kernel = -1; // For C++ based autotune database generation + const char* _preferred_kernel_psels = nullptr; + const char* _preferred_kernel_copts = nullptr; #endif int64_t godel_number() const; From fdd14e1df05e5d86bcd26105fdc5ce30fd769988 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 9 Jul 2024 01:46:29 +0000 Subject: [PATCH 13/51] Implement tune_flash with AOT kernels --- bindings/module.cc | 1 + include/aotriton/flash.h | 2 + test/aotriton_flash.py | 20 ++- test/attn_torch_function.py | 40 ++++- test/cpp_autotune.py | 114 ++++++++++++++ test/rocm_arch.py | 1 + test/tune_flash.py | 210 +++++++++++++++++++++++++ tritonsrc/_common_test.py | 8 +- v2src/flash/attn_fwd.cc | 1 + v2src/template/autotune_table_entry.cc | 6 +- v2src/template/shim.h | 1 + 11 files changed, 386 insertions(+), 18 deletions(-) create mode 100644 test/cpp_autotune.py create mode 120000 test/rocm_arch.py create mode 100644 test/tune_flash.py diff --git a/bindings/module.cc b/bindings/module.cc index 51cb6d97..e42d91f2 100644 --- a/bindings/module.cc +++ b/bindings/module.cc @@ -21,6 +21,7 @@ namespace pyaotriton { .def(py::init<>()) #if AOTRITON_BUILD_FOR_TUNING .def_readwrite("force_kernel_index", &ExtraArguments::force_kernel_index) + .def_readonly("total_number_of_kernels", &ExtraArguments::total_number_of_kernels) .def_readonly("selected_kernel_psels", &ExtraArguments::selected_kernel_psels) .def_readonly("selected_kernel_copts", &ExtraArguments::selected_kernel_copts) #endif diff --git a/include/aotriton/flash.h b/include/aotriton/flash.h index 5a9b54bc..6ae38214 100644 --- a/include/aotriton/flash.h +++ b/include/aotriton/flash.h @@ -18,7 +18,9 @@ using T1 = aotriton::TensorView<1>; struct ExtraArguments { #if AOTRITON_BUILD_FOR_TUNING + // TODO: Move them into a base class since they are common to all kernels int force_kernel_index = -1; + int total_number_of_kernels = -1; const char* selected_kernel_psels = nullptr; const char* selected_kernel_copts = nullptr; #endif diff --git a/test/aotriton_flash.py b/test/aotriton_flash.py index 908035eb..0cefbf6d 100644 --- a/test/aotriton_flash.py +++ b/test/aotriton_flash.py @@ -7,8 +7,9 @@ attn_fwd_compact_varlen as fa_forward_compact_varlen, attn_bwd_compact_varlen as fa_backward_compact_varlen, debug_fill_dropout_rng as fa_debug_fill_dropout_rng, + ExtraArguments as ExtraArguments, ) -from pyaotriton import T1, T2, T4, DType, Stream +from pyaotriton import T1, T2, T4, DType, Stream, hipError_t def cast_dtype(dtype): assert not dtype.is_complex @@ -37,7 +38,9 @@ def mk_aotensor(q, if_empty_then_like=None): return klass(q.data_ptr(), tuple(q.size()), q.stride(), cast_dtype(q.dtype)) def attn_fwd(q, k, v, b, sm_scale, M, o, - dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal): + dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal, + extargs=None): + extargs = ExtraArguments() if extargs is None else extargs err = fa_forward(mk_aotensor(q), mk_aotensor(k), mk_aotensor(v), @@ -50,13 +53,15 @@ def attn_fwd(q, k, v, b, sm_scale, M, o, int(philox_offset), mk_aotensor(encoded_softmax, if_empty_then_like=q), is_causal, - Stream()) - print(f'{err=}') + Stream(), + extargs) + # print(f'{err=}') + return err def attn_bwd(q, k, v, b, sm_scale, o, dout, dq, dk, dv, db, L, delta, dropout_p, philox_seed, philox_offset, is_causal): b = mk_aotensor(b, if_empty_then_like=q) - print(f'{b=}') + # print(f'{b=}') err = fa_backward(mk_aotensor(q), mk_aotensor(k), mk_aotensor(v), @@ -75,14 +80,15 @@ def attn_bwd(q, k, v, b, sm_scale, o, dout, dq, dk, dv, db, L, delta, int(philox_offset), is_causal, Stream()) - print(f'{err=}') + # print(f'{err=}') + return err def debug_fill_dropout_rng(R, philox_seed, philox_offset): err = fa_debug_fill_dropout_rng(mk_aotensor(R), philox_seed, philox_offset, Stream()) - print(f'{err=}') + print(f'debug_fill_dropout_rng {err=}') def attn_fwd_compact_varlen(q, k, v, cu_seqlens_q, cu_seqlens_k, max_seqlen_q, max_seqlen_k, diff --git a/test/attn_torch_function.py b/test/attn_torch_function.py index 638175a2..6988513e 100644 --- a/test/attn_torch_function.py +++ b/test/attn_torch_function.py @@ -3,7 +3,16 @@ # SPDX-License-Identifier: MIT import torch -from aotriton_flash import attn_fwd, attn_bwd, debug_fill_dropout_rng +from aotriton_flash import attn_fwd, attn_bwd, debug_fill_dropout_rng, ExtraArguments, hipError_t +from collections import namedtuple +from cpp_autotune import do_bench, cpp_autotune + +AttentionExtraArgs = namedtuple('AttentionExtraArgs', + ['return_encoded_softmax', + 'autotune', + 'return_autotune', + 'autotune_validator'], + defaults=[False, False, False, None]) VERBOSE=False DEFAULT_PHILOX_SEED = 0x1BF52 @@ -21,8 +30,9 @@ class _attention(torch.autograd.Function): # DEBUG_MASK_DTYPE = torch.float32 @staticmethod - def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax, - autotune=False, return_autotune=False): + def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, + attn_extra_args=AttentionExtraArgs()): + return_encoded_softmax, autotune, return_autotune = attn_extra_args[:3] # shape constraints Lq, Lk, Lv = q.shape[-1], k.shape[-1], v.shape[-1] assert Lq == Lk and Lk == Lv @@ -58,8 +68,23 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax philox_seed = DEFAULT_PHILOX_SEED philox_offset = DEFAULT_PHILOX_OFFSET - attn_fwd(q, k, v, b, sm_scale, M, o, - dropout_p, philox_seed, philox_offset, encoded_softmax, causal); + if autotune and return_autotune: + assert attn_extra_args.autotune_validator is not None + def func(extargs): + print(f'running attn_fwd with {extargs.force_kernel_index=}') + try: + ret = attn_fwd(q, k, v, b, sm_scale, M, o, + dropout_p, philox_seed, philox_offset, encoded_softmax, causal, + extargs); + except Exception as e: + print(e) + return hipError_t.hipErrorLaunchFailure, None + return ret, (o,) + tuning_result = cpp_autotune(ExtraArguments, func, attn_extra_args.autotune_validator) + else: + attn_fwd(q, k, v, b, sm_scale, M, o, + dropout_p, philox_seed, philox_offset, encoded_softmax, causal); + tuning_result = None ctx.save_for_backward(q, k, v, b, o, M) ctx.sm_scale = sm_scale @@ -69,7 +94,8 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax ctx.philox_seed = philox_seed ctx.philox_offset = philox_offset ctx.encoded_softmax = encoded_softmax # FIXME: for debugging only - return o, encoded_softmax, None + ctx.tuning_result = [('attn_fwd', tuning_result)] if tuning_result is not None else None + return o, encoded_softmax, ctx.tuning_result @staticmethod def backward(ctx, do, _, __): @@ -91,6 +117,6 @@ def backward(ctx, do, _, __): seqlen_k = k.shape[2] attn_bwd(q, k, v, b, sm_scale, o, do, dq, dk, dv, db, L, delta, dropout_p, philox_seed, philox_offset, causal); - return dq, dk, dv, db, None, None, None, None, None, None, None + return dq, dk, dv, db, None, None, None, None, None attention = _attention.apply diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py new file mode 100644 index 00000000..21600354 --- /dev/null +++ b/test/cpp_autotune.py @@ -0,0 +1,114 @@ +from collections import namedtuple +from aotriton_flash import hipError_t +import json +import sys + +def do_bench(fn, *, warmup=25, rep=100, + grad_to_none=None, + quantiles=None, + fast_flush=True, + return_mode="mean", + validator=None): + """ + Benchmark the runtime of the provided function. By default, return the median runtime of :code:`fn` along with + the 20-th and 80-th performance percentile. + + :param fn: Function to benchmark + :type fn: Callable + :param warmup: Warmup time (in ms) + :type warmup: int + :param rep: Repetition time (in ms) + :type rep: int + :param grad_to_none: Reset the gradient of the provided tensor to None + :type grad_to_none: torch.tensor, optional + :param quantiles: Performance percentile to return in addition to the median. + :type quantiles: list[float], optional + :param fast_flush: Use faster kernel to flush L2 cache between measurements + :type fast_flush: bool, default is True + :param return_mode: The statistical measure to return. Options are "min", "max", "mean", or "median". Default is "mean". + :type return_mode: str + """ + assert return_mode in ["min", "max", "mean", "median"] + import torch + + ret, outs = fn() + print(f'{ret=} {outs=}', file=sys.stderr, flush=True) + if ret != hipError_t.hipSuccess: + return float('inf') + if not validator(*outs): + return float('inf') + torch.cuda.synchronize() + + # We maintain a buffer of 256 MB that we clear + # before each kernel call to make sure that the L2 cache + # doesn't contain any input data before the run + cache_size = 256 * 1024 * 1024 + if fast_flush: + cache = torch.empty(int(cache_size // 4), dtype=torch.int, device='cuda') + else: + cache = torch.empty(int(cache_size), dtype=torch.int8, device='cuda') + + # Estimate the runtime of the function + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + for _ in range(5): + cache.zero_() + fn() + end_event.record() + torch.cuda.synchronize() + estimate_ms = start_event.elapsed_time(end_event) / 5 + + # compute number of warmup and repeat + n_warmup = max(1, int(warmup / estimate_ms)) + n_repeat = max(1, int(rep / estimate_ms)) + start_event = [torch.cuda.Event(enable_timing=True) for i in range(n_repeat)] + end_event = [torch.cuda.Event(enable_timing=True) for i in range(n_repeat)] + # Warm-up + for _ in range(n_warmup): + fn() + # Benchmark + for i in range(n_repeat): + # we don't want `fn` to accumulate gradient values + # if it contains a backward pass. So we clear the + # provided gradients + if grad_to_none is not None: + for x in grad_to_none: + x.grad = None + # we clear the L2 cache before each run + cache.zero_() + # record time of `fn` + start_event[i].record() + fn() + end_event[i].record() + # Record clocks + torch.cuda.synchronize() + times = torch.tensor([s.elapsed_time(e) for s, e in zip(start_event, end_event)], dtype=torch.float) + if quantiles is not None: + ret = torch.quantile(times, torch.tensor(quantiles, dtype=torch.float)).tolist() + if len(ret) == 1: + ret = ret[0] + return ret + return getattr(torch, return_mode)(times).item() + +AutotuneResult = namedtuple('AutotuneResult', ['kernel_index', 'time', 'psels', 'copts']) + +def cpp_autotune(extarg_klass, kernel_func, validator): + assert validator is not None + kernel_index = 0 + extargs = extarg_klass() + timings = [] + while True: + extargs.force_kernel_index = kernel_index + def func(): + return kernel_func(extargs) + t = do_bench(func, validator=validator, quantiles=(0.5, 0.2, 0.8)) + timings.append(AutotuneResult(kernel_index=kernel_index, + time=t, + psels=json.loads(extargs.selected_kernel_psels), + copts=json.loads(extargs.selected_kernel_copts))) + kernel_index += 1 + if kernel_index >= extargs.total_number_of_kernels: + break + print(f'cpp_autotune {timings=}') + return min(timings, key=lambda atr:atr.time) diff --git a/test/rocm_arch.py b/test/rocm_arch.py new file mode 120000 index 00000000..e7c4a439 --- /dev/null +++ b/test/rocm_arch.py @@ -0,0 +1 @@ +../tritonsrc/rocm_arch.py \ No newline at end of file diff --git a/test/tune_flash.py b/test/tune_flash.py new file mode 100644 index 00000000..bdfaaee6 --- /dev/null +++ b/test/tune_flash.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python +# Copyright © 2023-2024 Advanced Micro Devices, Inc. +# SPDX-License-Identifier: MIT + +import pytest +import torch +import json +import sys +import subprocess +import argparse +import itertools +import os +import time + +from rocm_arch import rocm_get_gpuarch +from attn_torch_function import ( + DEFAULT_PHILOX_SEED, + DEFAULT_PHILOX_OFFSET, + attention, + debug_fill_dropout_rng, + AttentionExtraArgs +) +from _common_test import SdpaContext, SdpaParams + +_DEBUG_SKIP_TUNE_BACKWARD = True + +class Tuner(object): + KERNEL_FAMILY = 'FLASH' + + def __init__(self, args): + self._args = args + self._arch = rocm_get_gpuarch() + dbargs = ['python3', '-m', 'v2python.table_tool', '-v', '-f', self._args.db_file, '-k', self.KERNEL_FAMILY] + if args.create_table_only: + dbargs += ['--action', 'createtableonly'] + self._dbp = subprocess.Popen(dbargs, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + text=True) + os.set_blocking(self._dbp.stdout.fileno(), False) + os.set_blocking(self._dbp.stderr.fileno(), False) + + @property + def verbose(self): + return self._args.verbose + + def gen(self): + a = self._args + yield from itertools.product(a.batch, a.n_heads, a.d_head, a.seqlen_q, a.seqlen_k, a.causal, a.sm_scale, a.dropout_p, a.return_encoded_softmax, a.dtype, a.bias_type) + + def profile_all(self): + a = self._args + for i, tup in enumerate(self.gen()): + print(f"[{i:06d}] Handling {tup}") + if a.continue_from is not None and i < a.continue_from: + continue + if a.stop_at is not None and i > a.stop_at: + break + if a.dry_run: + continue + self.profile(*tup) + + def profile(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type): + a = self._args + ''' + Create SdpaContext for testing + ''' + ctx = SdpaContext(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, dtype, + bias_type=bias_type, storage_flip=None, device='cuda') + ctx.create_ref_inputs() + ctx.set_require_grads(skip_db=True) + q, k, v, b = ctx.dev_tensors + ''' + Create reference dropout_mask + ''' + if dropout_p > 0.0: + rdims = (BATCH, N_HEADS, seqlen_q, seqlen_k) + r = torch.empty(rdims, device=q.device, dtype=torch.float32) + philox_seed = DEFAULT_PHILOX_SEED + philox_offset = DEFAULT_PHILOX_OFFSET + debug_fill_dropout_rng(r, philox_seed, philox_offset) + else: + r = None + sdpa_params = SdpaParams(causal=causal, sm_scale=sm_scale, dropout_p=dropout_p, dropout_mask=r) + ref_out, _ = ctx.compute_ref_forward(sdpa_params) + + ''' + Now, enable autotune (C++ form), enable output validation + ''' + def fwd_validator(tri_out): + is_allclose, adiff, _, _ = ctx.validate_with_reference(tri_out, None, no_backward=True) + return is_allclose + + ext = AttentionExtraArgs(return_encoded_softmax=return_encoded_softmax, + autotune=True, + return_autotune=True, + autotune_validator=fwd_validator) + tri_out, encoded_softmax, best_configs = attention(q, k, v, b, causal, sm_scale, dropout_p, ext) + if self.verbose: + print('Returned best configs') + for kernel_name, best in best_configs: + # print(f'{kernel_name=} {best.kwargs=} {best.num_warps=} {best.num_stages=}') + print(f'{kernel_name=}') + if not _DEBUG_SKIP_TUNE_BACKWARD: + dout = torch.randn_like(q) + tri_out.backward(dout) + if self.verbose: + print('Returned best configs after backward') + for kernel_name, best in best_configs: + print(f'{kernel_name=}') + head_dim_rounded = 2 ** (D_HEAD - 1).bit_length() + head_dim_rounded = max(16, head_dim_rounded) + inputs = { + 'Q_dtype': str(dtype), + 'N_HEADS': N_HEADS, + 'D_HEAD': D_HEAD, + 'max_seqlen_q': seqlen_q, + 'max_seqlen_k': seqlen_k, + 'CAUSAL': causal, + 'RETURN_ENCODED_SOFTMAX': return_encoded_softmax, + 'BLOCK_DMODEL': head_dim_rounded, + 'ENABLE_DROPOUT' : dropout_p > 0.0, + 'PADDED_HEAD' : head_dim_rounded != D_HEAD, + 'BIAS_TYPE' : bias_type, + } + self.pipe_configs(inputs, best_configs) + + def pipe_configs(self, inputs, best_configs): + for kernel_name, best in best_configs: + j = self.translate_config(inputs, kernel_name, best) + js = json.dumps(j, separators=(',', ':')) + print(f'Piping to db process {js}') + print(js, file=self._dbp.stdin, flush=True) + self.splice_pipes() + + def splice_pipes(self): + for i in range(10): + while True: + line = self._dbp.stdout.readline() + if line: + print(line, end='') + else: + time.sleep(0.1) + break + + for i in range(10): + while True: + line = self._dbp.stderr.readline() + if line: + print(line, end='', file=sys.stderr) + else: + time.sleep(0.1) + break + sys.stdout.flush() + sys.stderr.flush() + + def translate_config(self, inputs, kernel_name, best): + tuning_result = { + 'arch' : self._arch, + 'kernel_name' : kernel_name, + 'inputs' : inputs, + 'tuned_kernel' : best.psels, + 'compiler_options' : best.copts, + } + return tuning_result + + def stop(self): + self._dbp.stdin.close() + print("Waiting for database process to terminate") + self._dbp.wait() + self.splice_pipes() + +def parse(): + p = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + p.add_argument('--batch', type=int, nargs=1, default=[1], help='(Not a functional) Batch size.') + p.add_argument('--n_heads', type=int, nargs=1, default=[48], help='(Not a functional) Number of heads') + p.add_argument('--sm_scale', type=float, nargs=1, default=[1.2], help='(Not a functional) Softmax Scale') + p.add_argument('--return_encoded_softmax', type=bool, default=[False], + help="(A functional for debugging) kernel that returns softmax(dropout(QK')) to validate the correctness of dropout") + p.add_argument('--d_head', type=int, nargs='+', default=[16,32,64,128,256], help='Head dimensions.') + p.add_argument('--seqlen_q', type=int, nargs='+', default=[256,1024,2048,4096,8192,16384,32768], help='Sequence length of Q.') + p.add_argument('--seqlen_k', type=int, nargs='+', default=[256,1024,2048,4096,8192,16384,32768], help='Sequence length of K/V.') + p.add_argument('--causal', type=int, nargs='+', default=[True,False], choices=[0, 1], help='Causal mask. (Use 0/1 for False/True') + p.add_argument('--dropout_p', type=float, nargs='+', default=[0.5, 0.0], help='Probablity to dropout (0 to disable).') + p.add_argument('--dtype', type=str, nargs='+', + default=['float16', 'bfloat16', 'float32'], + choices=['float16', 'bfloat16', 'float32'], + help='Datatype to profile.') + p.add_argument('--bias_type', type=int, nargs='+', default=[0, 1], choices=[0, 1], help='Bias types to profile, 0: None, 1: Matrix.') + p.add_argument('--verbose', action='store_true', help='Verbose') + p.add_argument('--validate', + action='store_true', help='Validate the correctness of the output to avoid faulty autotune configs') + p.add_argument('--dry_run', action='store_true', help="Print parameter combinations without running tests") + p.add_argument('--continue_from', type=int, default=None, help="Continue from n-th functional set") + p.add_argument('--stop_at', type=int, default=None, help="Stop at n-th functional set") + p.add_argument('--db_file', type=str, required=True, help="Sqlite Database file") + p.add_argument('--create_table_only', action='store_true', help="Do not insert data, only create tables. Used for schema updates.") + args = p.parse_args() + args.dtype = [ getattr(torch, t) for t in args.dtype ] + args.causal = [ bool(c) for c in args.causal ] + # assert args.causal == [False], f'{args.causal=} {args.return_encoded_softmax=}' + return args + +def main(): + args = parse() + tuner = Tuner(args) + tuner.profile_all() + tuner.stop() + +if __name__ == '__main__': + main() diff --git a/tritonsrc/_common_test.py b/tritonsrc/_common_test.py index 69fadc55..40aa4d21 100644 --- a/tritonsrc/_common_test.py +++ b/tritonsrc/_common_test.py @@ -101,9 +101,9 @@ def __init__(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, dtype, q = torch.rand(*qdims, dtype=dtype, device=device) k = torch.rand(*kdims, dtype=dtype, device=device) v = torch.rand(*vdims, dtype=dtype, device=device) - if bias_type is None: + if bias_type is None or bias_type == 0: b = None - elif bias_type == 'matrix': + elif bias_type == 'matrix' or bias_type == 1: # b = torch.empty(bdims, dtype=dtype, device="cuda").normal_(mean=0., std=0.5) b = torch.rand(*bdims, dtype=dtype, device=device) b = b.expand(BATCH, N_HEADS, b.shape[0], b.shape[1]) @@ -257,8 +257,10 @@ def _validate(out, ref, lp_ref, fudge_factor, tname): max_adiff = float(torch.max(torch.abs(x - y))) return torch.allclose(x, y, atol=atol, rtol=rtol), max_adiff - def validate_with_reference(self, out, grads): + def validate_with_reference(self, out, grads, *, no_backward=False): out_allclose, out_adiff = self._validate(out, self.refout_tensors[0], self.lp_refout_tensors[0], self.OUT_FUDGE_FACTOR, 'out') + if no_backward: + return out_allclose, out_adiff, [], [] grads_allclose = [] grads_adiff = [] for grad, ref, lp_ref, fudge_factor, tname in zip(grads, self.dref_tensors, self.lp_dref_tensors, self.fudge_factors, self.TENSOR_NAMES): diff --git a/v2src/flash/attn_fwd.cc b/v2src/flash/attn_fwd.cc index 6cc91c40..3c545400 100644 --- a/v2src/flash/attn_fwd.cc +++ b/v2src/flash/attn_fwd.cc @@ -98,6 +98,7 @@ _attn_fwd_common(T4 q, err = context.lookup_optimal(params, arch); #if AOTRITON_BUILD_FOR_TUNING if (extargs) { + extargs->total_number_of_kernels = params._total_number_of_kernels; extargs->selected_kernel_psels = params._preferred_kernel_psels; extargs->selected_kernel_copts = params._preferred_kernel_copts; } diff --git a/v2src/template/autotune_table_entry.cc b/v2src/template/autotune_table_entry.cc index 501356d7..fc601693 100644 --- a/v2src/template/autotune_table_entry.cc +++ b/v2src/template/autotune_table_entry.cc @@ -59,12 +59,16 @@ namespace aotriton::v2::[[kernel_family_name]]::autotune { void CURRENT_ENTRY_PUBLIC::operator()([[param_class_name]]& params) { #if AOTRITON_BUILD_FOR_TUNING int preferred_index = params._has_preferred_kernel; + params._total_number_of_kernels = incbin_num_kernels; if (preferred_index >= 0) { if (preferred_index >= incbin_num_kernels) return ; params.selected_kernel = &image_list[preferred_index]; + params._debug_kernel_name = incbin_kernel_names[preferred_index]; params._preferred_kernel_psels = kernel_psels[preferred_index]; - params._preferred_kernel_copts = kernel_psels[preferred_index]; + params._preferred_kernel_copts = kernel_copts[preferred_index]; + const auto& perf = image_perf_list[preferred_index]; + [[perf_field_assignment]]; return ; } #endif diff --git a/v2src/template/shim.h b/v2src/template/shim.h index 1dbed1af..99150741 100644 --- a/v2src/template/shim.h +++ b/v2src/template/shim.h @@ -22,6 +22,7 @@ struct [[param_class_name]] { const char* _debug_kernel_name = nullptr; #if AOTRITON_BUILD_FOR_TUNING int _has_preferred_kernel = -1; // For C++ based autotune database generation + int _total_number_of_kernels = -1; const char* _preferred_kernel_psels = nullptr; const char* _preferred_kernel_copts = nullptr; #endif From 0e988f96983e9ca5d477f1588f9ef98ba7b45a94 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 9 Jul 2024 06:37:09 +0000 Subject: [PATCH 14/51] Fix the dropout_mask and add a progressbar to test/tune_flash.py --- .gitignore | 4 +++ requirements.txt | 1 + test/aotriton_flash.py | 9 ++++-- test/attn_torch_function.py | 2 +- test/cpp_autotune.py | 57 +++++++++++++++++++++++++++++++------ test/tune_flash.py | 18 ++++++++++-- 6 files changed, 76 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 18834858..a9eec59c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ __pycache__/ tritonsrc/tune-*.json *.csv *.png +1 +2 +1.* +2.* diff --git a/requirements.txt b/requirements.txt index 0abbfe0c..49569100 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ pluggy numpy setuptools wheel +tqdm diff --git a/test/aotriton_flash.py b/test/aotriton_flash.py index 0cefbf6d..ad76c8d6 100644 --- a/test/aotriton_flash.py +++ b/test/aotriton_flash.py @@ -88,7 +88,8 @@ def debug_fill_dropout_rng(R, philox_seed, philox_offset): philox_seed, philox_offset, Stream()) - print(f'debug_fill_dropout_rng {err=}') + # print(f'debug_fill_dropout_rng {err=}') + return err def attn_fwd_compact_varlen(q, k, v, cu_seqlens_q, cu_seqlens_k, max_seqlen_q, max_seqlen_k, @@ -111,7 +112,8 @@ def attn_fwd_compact_varlen(q, k, v, mk_aotensor(encoded_softmax, if_empty_then_like=q), is_causal, Stream()) - print(f'{err=}') + # print(f'{err=}') + return err def attn_bwd_compact_varlen(q, k, v, cu_seqlens_q, cu_seqlens_k, max_seqlen_q, max_seqlen_k, @@ -141,4 +143,5 @@ def attn_bwd_compact_varlen(q, k, v, int(philox_offset), is_causal, Stream()) - print(f'{err=}') + # print(f'{err=}') + return err diff --git a/test/attn_torch_function.py b/test/attn_torch_function.py index 6988513e..4e6c4a6b 100644 --- a/test/attn_torch_function.py +++ b/test/attn_torch_function.py @@ -71,7 +71,7 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, if autotune and return_autotune: assert attn_extra_args.autotune_validator is not None def func(extargs): - print(f'running attn_fwd with {extargs.force_kernel_index=}') + # print(f'running attn_fwd with {extargs.force_kernel_index=}') try: ret = attn_fwd(q, k, v, b, sm_scale, M, o, dropout_p, philox_seed, philox_offset, encoded_softmax, causal, diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py index 21600354..41b099d1 100644 --- a/test/cpp_autotune.py +++ b/test/cpp_autotune.py @@ -2,6 +2,8 @@ from aotriton_flash import hipError_t import json import sys +import math +from tqdm import tqdm def do_bench(fn, *, warmup=25, rep=100, grad_to_none=None, @@ -31,11 +33,16 @@ def do_bench(fn, *, warmup=25, rep=100, assert return_mode in ["min", "max", "mean", "median"] import torch + torch.cuda.synchronize() ret, outs = fn() - print(f'{ret=} {outs=}', file=sys.stderr, flush=True) if ret != hipError_t.hipSuccess: + # print(f'{ret=}', file=sys.stderr, flush=True) return float('inf') - if not validator(*outs): + torch.cuda.synchronize() + valret = validator(*outs) + # print(f'{valret=}', flush=True) + if not valret: + # assert False return float('inf') torch.cuda.synchronize() @@ -98,17 +105,49 @@ def cpp_autotune(extarg_klass, kernel_func, validator): kernel_index = 0 extargs = extarg_klass() timings = [] + pbar = None + failed = 0 + success = 0 while True: extargs.force_kernel_index = kernel_index def func(): return kernel_func(extargs) - t = do_bench(func, validator=validator, quantiles=(0.5, 0.2, 0.8)) - timings.append(AutotuneResult(kernel_index=kernel_index, - time=t, - psels=json.loads(extargs.selected_kernel_psels), - copts=json.loads(extargs.selected_kernel_copts))) + # t = do_bench(func, validator=validator, quantiles=(0.5, 0.2, 0.8)) + t = do_bench(func, validator=validator) + r = AutotuneResult(kernel_index=kernel_index, + time=t, + psels=json.loads(extargs.selected_kernel_psels), + copts=json.loads(extargs.selected_kernel_copts)) + timings.append(r) + ''' + if kernel_index == 0: + print(f'Benchmarking with {kernel_index=}. Time {t}') + else: + print(f'Benchmarking with {kernel_index=} out of {extargs.total_number_of_kernels}. Time {t}') + ''' + assert extargs.total_number_of_kernels > 0 + if math.isinf(t): + failed += 1 + else: + success += 1 + + if pbar is None and extargs.total_number_of_kernels > 0: + pbar = tqdm(total=extargs.total_number_of_kernels, unit="configs") + pbar.set_description(f'Success {success}, Fail {failed}. Last time {t:.2g}') + if pbar is not None: + pbar.set_description(f'Success {success}, Fail {failed}. Last time {t:.2g}') + pbar.update(1) + + # print(f'{r.psels=}') + # print(f'{r.copts=}') kernel_index += 1 if kernel_index >= extargs.total_number_of_kernels: break - print(f'cpp_autotune {timings=}') - return min(timings, key=lambda atr:atr.time) + # print(f'cpp_autotune {timings=}') + ret = min(timings, key=lambda atr:atr.time) + # print(f'{ret=}') + if math.isinf(ret.time): + # with open("/proc/self/maps") as f: + # print(f.read(), file=sys.stderr) + print("ERROR: No configuration works") + return ret diff --git a/test/tune_flash.py b/test/tune_flash.py index bdfaaee6..f7b6a64b 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -11,6 +11,7 @@ import itertools import os import time +import math from rocm_arch import rocm_get_gpuarch from attn_torch_function import ( @@ -61,6 +62,9 @@ def profile_all(self): def profile(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type): a = self._args + if causal and seqlen_q != seqlen_k: + print('FA does not support accept casual=True when seqlen_q != seqlen_k. Skipping') + return ''' Create SdpaContext for testing ''' @@ -78,9 +82,11 @@ def profile(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, philox_seed = DEFAULT_PHILOX_SEED philox_offset = DEFAULT_PHILOX_OFFSET debug_fill_dropout_rng(r, philox_seed, philox_offset) + mask = r > dropout_p + torch.cuda.synchronize() else: - r = None - sdpa_params = SdpaParams(causal=causal, sm_scale=sm_scale, dropout_p=dropout_p, dropout_mask=r) + mask = None + sdpa_params = SdpaParams(causal=causal, sm_scale=sm_scale, dropout_p=dropout_p, dropout_mask=mask) ref_out, _ = ctx.compute_ref_forward(sdpa_params) ''' @@ -88,6 +94,14 @@ def profile(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, ''' def fwd_validator(tri_out): is_allclose, adiff, _, _ = ctx.validate_with_reference(tri_out, None, no_backward=True) + ''' + if not is_allclose: + import numpy as np + err_idx = np.unravel_index(torch.argmax(torch.abs(ref_out - tri_out)).cpu().numpy(), ref_out.shape) + print(f'{err_idx=}') + print(f'{tri_out[err_idx]=}') + print(f'{ref_out[err_idx]=}') + ''' return is_allclose ext = AttentionExtraArgs(return_encoded_softmax=return_encoded_softmax, From c4c201f18c9929ee159731d13dc07183967ad644 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 9 Jul 2024 06:48:45 +0000 Subject: [PATCH 15/51] Save memory for long seq length --- test/cpp_autotune.py | 2 +- test/tune_flash.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py index 41b099d1..6a393b57 100644 --- a/test/cpp_autotune.py +++ b/test/cpp_autotune.py @@ -113,7 +113,7 @@ def cpp_autotune(extarg_klass, kernel_func, validator): def func(): return kernel_func(extargs) # t = do_bench(func, validator=validator, quantiles=(0.5, 0.2, 0.8)) - t = do_bench(func, validator=validator) + t = do_bench(func, warmup=75, rep=300, validator=validator) r = AutotuneResult(kernel_index=kernel_index, time=t, psels=json.loads(extargs.selected_kernel_psels), diff --git a/test/tune_flash.py b/test/tune_flash.py index f7b6a64b..0e7a84ae 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -186,7 +186,7 @@ def stop(self): def parse(): p = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) p.add_argument('--batch', type=int, nargs=1, default=[1], help='(Not a functional) Batch size.') - p.add_argument('--n_heads', type=int, nargs=1, default=[48], help='(Not a functional) Number of heads') + p.add_argument('--n_heads', type=int, nargs=1, default=[12], help='(Not a functional) Number of heads') p.add_argument('--sm_scale', type=float, nargs=1, default=[1.2], help='(Not a functional) Softmax Scale') p.add_argument('--return_encoded_softmax', type=bool, default=[False], help="(A functional for debugging) kernel that returns softmax(dropout(QK')) to validate the correctness of dropout") From 8528c7a93482d385c1f3f048dc3d19fc6a0f3b27 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 10 Jul 2024 01:30:58 +0000 Subject: [PATCH 16/51] Update the tuning database for MI200 only GPUs --- v2python/rules/tuning_database.sqlite3 | Bin 2801664 -> 2801664 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/v2python/rules/tuning_database.sqlite3 b/v2python/rules/tuning_database.sqlite3 index 19d860383aa1be53affe7ac5e7c0538cfc757f05..72421b105be9a14b84aeb7484618a3a4e58d669a 100644 GIT binary patch delta 78254 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 From 1d4fbd089132b75ebae0e121e243b7e990c0fbe2 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 10 Jul 2024 01:31:31 +0000 Subject: [PATCH 17/51] Remove seqlen_q/k >= 32k rows from the database --- v2python/rules/tuning_database.sqlite3 | Bin 2801664 -> 2801664 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/v2python/rules/tuning_database.sqlite3 b/v2python/rules/tuning_database.sqlite3 index 72421b105be9a14b84aeb7484618a3a4e58d669a..029845a469eb788cbc7397df0aed5a7f213cc87c 100644 GIT binary patch delta 1129 zcmZwFUrbw790%}oZqM)Z+!l$ z{hjms<`#>yyhtWP{9L*5F*wIMb4SPXr93a?jZ)rI%8P|OyyFNiSO&p`eR$A?1fHUw zTDJ1vn&RmmTyddCNXg!(r;A2+KaOW1u2=nVKnPnsSl+j_yjEXXW{kZ@|Gr>!*WtRvapK}Ac@yp4Y1YTTpB;Fc?W_`Z}4jDLe!F>cf zy37C;M`KD)#9*XBcz3aWgbXC{K!!%oXW*d4k3Xn#U%mb`11F`hKVZ+%2&eQ|7GnQQ zv_1bbl|kDv^>PgK$T4`^qjGGCd0n=IzCpMwyoY2K%ZpB}rmMUPyq~)CO%48HPyIL- z&~roZ)UbdqmP43_=c|?YL0lIT;)MD`t>Kw@=;2@K8}o2l2z7}ir*7X$;D#x~y08EV z52kjjB+jh0d8b!o===hOx^V-{Y#ofS0lJ0tyR~Y4Se3BTI3tRXYX_;`$K~Tgl%I%T9woi4c(!&3CNJR?!-=IxNHd)_mO@HusyL zzEjuK*-DlB!Wbz>)%hcP0e_0ifL@QtH>6=+#psy*^us+(dpEhT{@lLHcFsXutp^i% zLT-wxf&bYP`thW^E<*MvEJ?vS-#D{Q(HU}*4)@*lUGa_ka@drj3?5C%n4t>#L`ptk z3tz|1USYl2EB6~aMh>4HJuHcrC}I+e*rbY76CZJiOZ=pU>>{6eMF=S~uG>NaL&Lzh4U%4J;s=2x z25Gn8B8v%4!`>?sP5g+Uj&5t-T^K)h<1Uy(oSRXzxJ$ipdZ8vx=hL2g=)CwPCwZRt zdH(PJdES%BY?2JJ)=Y9a-{X*zdKS)Q(<^DRl9pG}wv{w3rr`}2l_cpf2OYYZHm{9n z3h&pUld+fBFk}1~{8q>dNJ&{4 zOkpTm4(0kIL62_6q)d|1#6jy=@RdkdvknbB!Luo77dvivl&Xoil~!&XI8loG${cYSC@B*!7fKG+C*?`XF3aYJfFtG|^}^82u@16$$ZLb7SNv?i$3%%aD^~V}Apj*EC;3}Jh=@NzFf2b5 z_S;RPQ#{!32=mO#5k;&2isM>YE2OGg6+nSWZC%XEtkP;6|8+n)`6lDr)Y7{$Ev@CQev~ z(9r6AI9?i7l*bn$AQs2qb(=aZU6bs(bdAmOnhDsDS&HYby6X7_jrsYV6xhXY6EF?L zn;UJ&PyAvhHjbwG?WWX4el$$N;=&Y6&Xf$9;jjhIyZb?*cj#rhN@tb(%C7PrKfMKm ze6k32;>#^aQ>D{c+4H_D;Iosmb`PKU6hdOT2pzWnC17nFQV-7xXcfO-0WIZKmZVA4 zuC=LusXOXBHJ#c6?WXp=wzTeH=U@@WAXMC7*Q;9H9b&%9G!OF6*CEXB0key3UT~hxIr)-n||W-e22DK54(Hb_gR zOyh5W9h2#w`0SaVoaU!=HjIycjjvrr5udqH#EWkBYSpFhHd|5;@vN7%ic|v|QubUa zCzvCjmR|?A6+^C-$ zxuA0XKnL(2+gX#iXRz0pTr$E>b^w(2e7AedF46Wn5FPn2R`XIX`e_oyVMA+!sevKH~f1tZn@hriy3d z?0~k{6Q^dDTqsRH#P#_I6%U43xBO6!50|*KBPYsP`L$kpc4>qmc0@rOh>B=P4e|)$ zL|llDxRF|<4yi{P5D(IbG$CGOAJUBY5I@p_1P}uWA|WJN1={%GD E7nPiBnE(I) From dd6a26ba889a27842d828c817c2c33155a73a28e Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 10 Jul 2024 01:32:06 +0000 Subject: [PATCH 18/51] Fix CMakeLists. Do not pass empty string as cmd argument if GENERATE_OPTION is empty --- v2src/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2src/CMakeLists.txt b/v2src/CMakeLists.txt index 0cf16b06..6651cff0 100644 --- a/v2src/CMakeLists.txt +++ b/v2src/CMakeLists.txt @@ -118,7 +118,7 @@ message(STATUS "AOTRITON_ZSTD_INCLUDE ${AOTRITON_ZSTD_INCLUDE}") message(STATUS "AOTRITON_SHIM_FLAGS ${AOTRITON_SHIM_FLAGS}") execute_process( - COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} --bare_mode "${GENERATE_OPTION}" + COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} --bare_mode ${GENERATE_OPTION} COMMAND_ECHO STDOUT WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/.." ) @@ -127,7 +127,7 @@ file(STRINGS "${AOTRITON_V2_BUILD_DIR}/Bare.shim" SHIM_CC_FILES) # CAVEAT: Actual shim code can only be generated during build phase because it # requires some kernel information. (Notably shared memory requirement) add_custom_target(aotriton_v2_gen_shim - COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} ${AOTRITON_SHIM_FLAGS} "${GENERATE_OPTION}" + COMMAND ${CMAKE_COMMAND} -E env VIRTUAL_ENV=${VENV_DIR} "${VENV_DIR}/bin/python" -m v2python.generate_shim --target_gpus ${TARGET_GPUS} --build_dir ${AOTRITON_V2_BUILD_DIR} ${AOTRITON_SHIM_FLAGS} ${GENERATE_OPTION} BYPRODUCTS ${SHIM_CC_FILES} # Essential, otherwise add_library complains COMMAND_EXPAND_LISTS WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/.." From 98c404c296742fcd6e9d0b61a3ce8524a47bac46 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 10 Jul 2024 01:36:50 +0000 Subject: [PATCH 19/51] Return hipErrorSharedObjectSymbolNotFound for untuned cases. This is to address is_causal=true while seqlen_q != seqlen_k cases. For these cases the inputs are not supported and this solution makes sense. However for more complicated cases interpolation will be needed. --- v2python/tuning_lut.py | 12 ++++++------ v2src/template/autotune_table_entry.cc | 3 +++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/v2python/tuning_lut.py b/v2python/tuning_lut.py index dc1f29fe..1bd454b8 100644 --- a/v2python/tuning_lut.py +++ b/v2python/tuning_lut.py @@ -32,9 +32,9 @@ def __init__(self, self._sigs = [] self._sig_dict = {} if autotune_keys is None: - self._lut_dtype = np.uint8 - self._lut_cdtype = f'uint8_t' - self._lut_tensor = np.array([0], dtype=np.uint8) + self._lut_dtype = np.int8 + self._lut_cdtype = f'int8_t' + self._lut_tensor = np.array([0], dtype=np.int8) self._lut_cshape = ''.join([f'[{s}]' for s in self._lut_tensor.shape]) self._untuned = True # print(f'{dba.is_passthrough_tuning()=}') @@ -88,11 +88,11 @@ def get_lut(self) -> 'tuple[np.ndarray, list[KernelSignature]': def _build_lut_tensor(self): self._autotune_key_buckets = [ klass(self._autotune_key_values[key]) for key, klass in self._autotune_keys ] - for dtype in [np.uint8, np.uint16, np.uint32, np.uint64]: + for dtype in [np.int8, np.int16, np.int32, np.int64]: if len(self._sigs) < np.iinfo(dtype).max: break self._lut_dtype = dtype - self._lut_cdtype = f'uint{np.iinfo(dtype).bits}_t' + self._lut_cdtype = f'int{np.iinfo(dtype).bits}_t' self._lut_tensor = np.empty([bucket.nvalues for bucket in self._autotune_key_buckets], dtype=dtype) assert self._lut_tensor.size > 0, 'LUT tensor must be non-empty. Empty LUT is not constructed by _build_lut_tensor' self._lut_cshape = ''.join([f'[{s}]' for s in self._lut_tensor.shape]) @@ -101,7 +101,7 @@ def _build_lut_tensor(self): for indices, atk_values in zip(itertools.product(*list_of_atk_indices), itertools.product(*self._list_of_atk_representatives)): fs_atk_values = tuple(atk_values) - self._lut_tensor[indices] = self._lut_dic[fs_atk_values] + self._lut_tensor[indices] = self._lut_dic.get(fs_atk_values, -1) # FIXME: Debugging if False and self._kdesc.SHIM_KERNEL_NAME == 'attn_fwd': print(f'_build_lut_tensor {self._autotune_key_values=}') diff --git a/v2src/template/autotune_table_entry.cc b/v2src/template/autotune_table_entry.cc index fc601693..f119c741 100644 --- a/v2src/template/autotune_table_entry.cc +++ b/v2src/template/autotune_table_entry.cc @@ -74,6 +74,9 @@ void CURRENT_ENTRY_PUBLIC::operator()([[param_class_name]]& params) { #endif [[binning_autotune_keys]] auto kernel_index = lut[[binned_indices]]; + if (kernel_index < 0) { + return ; + } params.selected_kernel = &image_list[kernel_index]; #ifndef NDEBUG std::cerr << __FILE__ << " kernel_index = " << int(kernel_index) << std::endl; From ec1293491170439e0344ebf9785a848ce21629ea Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 10 Jul 2024 01:52:07 +0000 Subject: [PATCH 20/51] Fix test/test_backward.py --- test/test_backward.py | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/test/test_backward.py b/test/test_backward.py index 2fd4aee7..5b9d6e03 100644 --- a/test/test_backward.py +++ b/test/test_backward.py @@ -4,8 +4,15 @@ import pytest import torch +import os -from attn_torch_function import attention +from attn_torch_function import ( + DEFAULT_PHILOX_SEED, + DEFAULT_PHILOX_OFFSET, + attention, + debug_fill_dropout_rng, + AttentionExtraArgs +) from _common_test import SdpaContext, SdpaParams def _make_block_eyes(q, base=1.0, inc=0.0): @@ -54,11 +61,13 @@ def _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale bias_type=bias_type, storage_flip=transpose, device='cuda') ctx.create_ref_inputs() ctx.set_require_grads(skip_dq=SKIP_DQ, skip_dk_dv=SKIP_DK_DV, skip_db=SKIP_DB) - return_encoded_softmax = True q, k, v, b = ctx.dev_tensors # autotune = True # # triton implementation - tri_out, encoded_softmax, _ = attention(q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax, USE_AUTOTUNE) + ext = AttentionExtraArgs(return_encoded_softmax=True, + autotune=False, + return_autotune=False) + tri_out, encoded_softmax, _ = attention(q, k, v, b, causal, sm_scale, dropout_p, ext) dropout_mask = encoded_softmax >= 0 sdpa_params = SdpaParams(causal=causal, sm_scale=sm_scale, dropout_p=dropout_p, dropout_mask=dropout_mask) ref_out, _ = ctx.compute_ref_forward(sdpa_params) @@ -211,6 +220,24 @@ def test_op_bwd_with_matrix_bias(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, sm_ ''' _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) +def main2(): + # Memo: False-0.0-dtype0-0.0-False-4-256-8-4-1 + # Memo: False-0.0-dtype0-0.0-False-4-256-8-1-4 + # False-1.2-dtype0-0.0-False-4-4-72-1-4 + BATCH = 8 + D_HEAD = 32 + N_HEADS = 8 + seqlen_q = 16 + seqlen_k = 16 + causal = False + + sm_scale = 1.2 + dropout_p = 0.0 + dtype = torch.float16 + storage_flip = False + bias_type = None + _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + def main(): BATCH = 1 D_HEAD = 80 @@ -231,4 +258,4 @@ def main(): _do_test_op_bwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) if __name__ == '__main__': - main() + main2() From 4513dfe274e97e81cb5dd4b9fa7a062bf38e15bc Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 10 Jul 2024 04:49:43 +0000 Subject: [PATCH 21/51] Fix AUTOTUNE_KEYS for backward kernels. --- v2python/kernel_desc.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/v2python/kernel_desc.py b/v2python/kernel_desc.py index 86fb12b7..6bfd3bec 100644 --- a/v2python/kernel_desc.py +++ b/v2python/kernel_desc.py @@ -127,6 +127,11 @@ def __init__(self, triton_kernel_name, triton_file_path): break if is_type: self.AUTOTUNE_KEYS_VALIDATED.append((key, self.AUTOTUNE_KEYS[key])) + ''' + AUTOTUNE_KEYS sanity check, otherwise autotune code may be broken (already happened twice). + ''' + for key in self.AUTOTUNE_KEYS: + assert key in self.ARGUMENTS, f'AUTOTUNE_KEYS "{key}" cannot be found in {self.__class__.__name__}.ARGUMENTS' @property def name(self): From 350b6bb6dd6ca1ac5e4b4e8158f8b890543f3521 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Wed, 10 Jul 2024 05:43:29 +0000 Subject: [PATCH 22/51] tritonsrc: add type annotation 'i32' to num_seqlens, and fix varlen handling accordingly. Without type annotation the compiler behaves differently in JIT mode and then bugs will slip into AOT mode. --- tritonsrc/bwd_split_kernel.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/tritonsrc/bwd_split_kernel.py b/tritonsrc/bwd_split_kernel.py index 58a1fea1..0bf89384 100644 --- a/tritonsrc/bwd_split_kernel.py +++ b/tritonsrc/bwd_split_kernel.py @@ -35,7 +35,7 @@ def bwd_kernel_dk_dv( stride_dvz, stride_dvh, stride_dvk, stride_dvn, cu_seqlens_q, cu_seqlens_k, - num_seqlens, # set num_seqlens to zero to ignore cu_seqlens_q/k + num_seqlens : 'i32', # set num_seqlens to zero to ignore cu_seqlens_q/k max_seqlen_q, # and use max_seqlen_q/k for all seqlen_q/k max_seqlen_k, head_dim, @@ -56,6 +56,13 @@ def bwd_kernel_dk_dv( num_h = tl.num_programs(1) num_z = tl.num_programs(2) off_zh = off_z * num_h + off_h * 1 + + cu_seqlens_q_start = 0 + cu_seqlens_k_start = 0 + seqlen_q = max_seqlen_q + seqlen_k = max_seqlen_k + batch_index = off_z + if num_seqlens > 0: cu_seqlens_k_start = tl.load(cu_seqlens_k + off_z) cu_seqlens_k_end = tl.load(cu_seqlens_k + off_z + 1) @@ -66,13 +73,8 @@ def bwd_kernel_dk_dv( cu_seqlens_q_end = tl.load(cu_seqlens_q + off_z + 1) seqlen_q = cu_seqlens_q_end - cu_seqlens_q_start batch_index = 0 - elif num_seqlens == 0: - cu_seqlens_q_start = 0 - cu_seqlens_k_start = 0 - seqlen_q = max_seqlen_q - seqlen_k = max_seqlen_k - batch_index = off_z - else: # < 0 for padded seqlen + + if num_seqlens < 0: # for padded seqlen cu_seqlens_k_start = tl.load(cu_seqlens_k + off_z) cu_seqlens_k_end = tl.load(cu_seqlens_k + off_z + 1) seqlen_k = cu_seqlens_k_end - cu_seqlens_k_start @@ -248,6 +250,13 @@ def bwd_kernel_dq( num_h = tl.num_programs(1) num_z = tl.num_programs(2) off_zh = off_z * num_h + off_h * 1 + + cu_seqlens_q_start = 0 + cu_seqlens_k_start = 0 + seqlen_q = max_seqlen_q + seqlen_k = max_seqlen_k + batch_index = off_z + if num_seqlens > 0: cu_seqlens_q_start = tl.load(cu_seqlens_q + off_z) cu_seqlens_q_end = tl.load(cu_seqlens_q + off_z + 1) @@ -258,13 +267,8 @@ def bwd_kernel_dq( cu_seqlens_k_end = tl.load(cu_seqlens_k + off_z + 1) seqlen_k = cu_seqlens_k_end - cu_seqlens_k_start batch_index = 0 - elif num_seqlens == 0: - cu_seqlens_q_start = 0 - cu_seqlens_k_start = 0 - seqlen_q = max_seqlen_q - seqlen_k = max_seqlen_k - batch_index = off_z - else: # < 0 for padded seqlen + + if num_seqlens < 0: # for padded seqlen cu_seqlens_q_start = tl.load(cu_seqlens_q + off_z) cu_seqlens_q_end = tl.load(cu_seqlens_q + off_z + 1) seqlen_q = cu_seqlens_q_end - cu_seqlens_q_start From ece99b8094f5217014e2e33312fcbbd52ff4cb98 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Thu, 11 Jul 2024 15:49:26 +0000 Subject: [PATCH 23/51] fix the assignment of .num_head_q/k --- v2src/flash/attn_fwd.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/v2src/flash/attn_fwd.cc b/v2src/flash/attn_fwd.cc index 3c545400..a1acf291 100644 --- a/v2src/flash/attn_fwd.cc +++ b/v2src/flash/attn_fwd.cc @@ -55,6 +55,8 @@ _attn_fwd_common(T4 q, return grid; }; int head_size = q.size(3); + int num_head_q = q.size(1); + int num_head_k = k.size(1); int head_dim_rounded = std::max(16, aotriton::bit_ceil(head_size)); int bias_type = 0; if (b) { @@ -70,8 +72,8 @@ _attn_fwd_common(T4 q, .encoded_softmax = &encoded_softmax, .sm_scale = sm_scale, .M = &softmax_lse, - .num_head_q = head_size, - .num_head_k = head_size, + .num_head_q = num_head_q, + .num_head_k = num_head_k, .num_seqlens = num_seqlens, .max_seqlen_q = max_seqlen_q, .max_seqlen_k = max_seqlen_k, From b3f9dab46d35f5bb7cad5d0c23dc9d46b54afb06 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Thu, 11 Jul 2024 16:26:26 +0000 Subject: [PATCH 24/51] Add Navi 31/32 compiler options. Note the database has not been updated yet. --- include/aotriton/util.h | 2 ++ v2python/compile.py | 2 ++ v2python/gpu_targets.py | 4 ++++ v2src/util.cc | 2 ++ 4 files changed, 10 insertions(+) diff --git a/include/aotriton/util.h b/include/aotriton/util.h index 91f61d98..efb93950 100644 --- a/include/aotriton/util.h +++ b/include/aotriton/util.h @@ -37,6 +37,8 @@ enum GpuArch : uint64_t { GPU_ARCH_UNKNOWN = 0, GPU_ARCH_AMD_GFX90A = CAT(GpuVendor::kAMD, 0x90a), GPU_ARCH_AMD_GFX942 = CAT(GpuVendor::kAMD, 0x942), + GPU_ARCH_AMD_GFX1100 = CAT(GpuVendor::kAMD, 0x1100), + GPU_ARCH_AMD_GFX1101 = CAT(GpuVendor::kAMD, 0x1101), }; template diff --git a/v2python/compile.py b/v2python/compile.py index 0ab8e11e..adccbb1e 100644 --- a/v2python/compile.py +++ b/v2python/compile.py @@ -24,6 +24,8 @@ None : None, 'MI200' : GPUTarget('hip', 'gfx90a', 64), 'MI300X' : GPUTarget('hip', 'gfx942', 64), + 'Navi31' : GPUTarget('hip', 'gfx1100', 32), + 'Navi32' : GPUTarget('hip', 'gfx1101', 32), } def main(): diff --git a/v2python/gpu_targets.py b/v2python/gpu_targets.py index 86ef5dc0..d6f0a450 100644 --- a/v2python/gpu_targets.py +++ b/v2python/gpu_targets.py @@ -5,9 +5,13 @@ AOTRITON_SUPPORTED_GPUS = { 'MI200' : 'GPU_ARCH_AMD_GFX90A', 'MI300X' : 'GPU_ARCH_AMD_GFX942', + 'Navi31' : 'GPU_ARCH_AMD_GFX1100', + 'Navi32' : 'GPU_ARCH_AMD_GFX1101', } AOTRITON_GPU_ARCH_TUNING_STRING = { 'MI200' : 'gfx90a', 'MI300X' : 'gfx942', + 'Navi31' : 'gfx1100', + 'Navi32' : 'gfx1101', } diff --git a/v2src/util.cc b/v2src/util.cc index 28fca9de..2c47e1dc 100644 --- a/v2src/util.cc +++ b/v2src/util.cc @@ -30,6 +30,8 @@ struct LazyArch { std::unordered_map LazyArch::string_to_arch = { {"gfx90a:sramecc+:xnack-", GPU_ARCH_AMD_GFX90A}, {"gfx942:sramecc+:xnack-", GPU_ARCH_AMD_GFX942}, + {"gfx1100", GPU_ARCH_AMD_GFX1100}, + {"gfx1101", GPU_ARCH_AMD_GFX1101}, }; GpuArch From d33cf4336e4b056dd4b524822fcde9a38509be15 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Thu, 11 Jul 2024 17:00:05 +0000 Subject: [PATCH 25/51] Fix various problems and now most fwd kernel tests passed. The only things left are bias with very irregular shapes (e.g., False-1.2-dtype0-0.0-4-2048-32-1-1). Maybe due to tuning database extrapolation problems. --- test/attn_torch_function.py | 9 +- test/test_forward.py | 400 +++++++++++++----------------------- tritonsrc/fwd_kernel.py | 16 +- v2src/flash/attn_bwd.cc | 2 +- 4 files changed, 157 insertions(+), 270 deletions(-) diff --git a/test/attn_torch_function.py b/test/attn_torch_function.py index 4e6c4a6b..b64e0a1c 100644 --- a/test/attn_torch_function.py +++ b/test/attn_torch_function.py @@ -100,7 +100,7 @@ def func(extargs): @staticmethod def backward(ctx, do, _, __): q, k, v, b, o, L = ctx.saved_tensors - print(f'{b=}') + # print(f'{b=}') sm_scale = ctx.sm_scale dropout_p = ctx.dropout_p philox_seed = ctx.philox_seed @@ -108,15 +108,16 @@ def backward(ctx, do, _, __): causal = ctx.causal # if q.shape[-1] <= 32: # do = do.contiguous() - dq = torch.zeros_like(q) + dq = torch.empty_like(q) dk = torch.empty_like(k) dv = torch.empty_like(v) db = torch.empty_like(b) if b is not None else None delta = torch.empty_like(L) seqlen_q = q.shape[2] seqlen_k = k.shape[2] - attn_bwd(q, k, v, b, sm_scale, o, do, dq, dk, dv, db, L, delta, - dropout_p, philox_seed, philox_offset, causal); + ret = attn_bwd(q, k, v, b, sm_scale, o, do, dq, dk, dv, db, L, delta, + dropout_p, philox_seed, philox_offset, causal); + assert ret == hipError_t.hipSuccess, ret return dq, dk, dv, db, None, None, None, None, None attention = _attention.apply diff --git a/test/test_forward.py b/test/test_forward.py index 451779ad..6a39121a 100644 --- a/test/test_forward.py +++ b/test/test_forward.py @@ -4,61 +4,16 @@ import pytest import torch +import os -from attn_torch_function import attention, debug_fill_dropout_rng, DEFAULT_PHILOX_SEED, DEFAULT_PHILOX_OFFSET - -def scaled_dot_product_attention(query, key, value, attn_mask=None, dropout_mask=None, dropout_p=0.0, is_causal=False, scale=None) -> torch.Tensor: - # Efficient implementation equivalent to the following: - L, S = query.size(-2), key.size(-2) - scale_factor = 1 / math.sqrt(query.size(-1)) if scale is None else scale - attn_bias = torch.zeros(L, S, dtype=query.dtype) - if is_causal: - assert attn_mask is None - temp_mask = torch.ones(L, S, dtype=torch.bool).tril(diagonal=0) - attn_bias.masked_fill_(temp_mask.logical_not(), float("-inf")) - attn_bias.to(query.dtype) - - """ - if attn_mask is not None: - if attn_mask.dtype == torch.bool: - attn_mask.masked_fill_(attn_mask.logical_not(), float("-inf")) - else: - attn_bias += attn_mask - """ - attn_weight = query @ key.transpose(-2, -1) * scale_factor - SPARSE_HEAD_SINCE = 5 - SPARSE_SEQ_SINCE = 5 - print(f'{query=}') - print(f'{key=}') - print(f'BEFORE softmax {attn_weight[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - # attn_weight += attn_bias - attn_weight = torch.softmax(attn_weight, dim=-1) - print(f'BEFORE DROPOUT_MASK {attn_weight[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - if dropout_p > 0.0: - if dropout_mask is not None: - print(f'BEFORE DROPOUT_MASK {attn_weight[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - attn_weight.masked_fill_(dropout_mask.logical_not(), float("0.0")) - print(f'AFTER DROPOUT_MASK {attn_weight[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - value = value / (1 - dropout_p) - else: - # assert False, "TESTING dropout_mask code path" - attn_weight = torch.dropout(attn_weight, dropout_p, train=True) - else: - # assert False, "TESTING dropout_mask code path" - pass - print(f'{value[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - av = attn_weight @ value - print(f'{av[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - return av, attn_weight - -def query_key_value_clones(query: torch.Tensor, key: torch.Tensor, value: torch.Tensor, dtype: torch.dtype = None, device=None): - """ Clones the query, key, and value tensors and moves them to the specified dtype. """ - if dtype is None: - dtype = query.dtype - query_ref = query.clone().detach().to(dtype=dtype, device=device).requires_grad_(query.requires_grad) - key_ref = key.clone().detach().to(dtype=dtype, device=device).requires_grad_(key.requires_grad) - value_ref = value.clone().detach().to(dtype=dtype, device=device).requires_grad_(value.requires_grad) - return query_ref, key_ref, value_ref +from attn_torch_function import ( + DEFAULT_PHILOX_SEED, + DEFAULT_PHILOX_OFFSET, + attention, + debug_fill_dropout_rng, + AttentionExtraArgs +) +from _common_test import SdpaContext, SdpaParams ''' Flash Attention is batch operator that evaluates sm(QK')V @@ -74,243 +29,172 @@ def query_key_value_clones(query: torch.Tensor, key: torch.Tensor, value: torch. but in PyTorch API it does not present at all ''' -class FwdTester(object): - - def __init__(self): - self.use_fill_rng_for_dropout = False - - def do_test_op_fwd(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type,): - if causal and seqlen_q != seqlen_k: - pytest.skip("PyTorch's Flash V2 does not accept casual=True when seqlen_q != seqlen_k. Skipping") - if causal and bias_type is not None: - pytest.skip("_scaled_dot_product_attention: Explicit attn_mask should not be set when is_causal=True") - torch.manual_seed(20) - print(f"test_op_fwd {BATCH=}, {N_HEADS=}, {seqlen_q=}, {seqlen_k=}, {D_HEAD=}, {causal=}") - SPARSE_HEAD_SINCE = 3 - SPARSE_SEQ_SINCE = 3 - Z = BATCH - H = N_HEADS - if True: # Real UT - qdims = (BATCH, N_HEADS, seqlen_q, D_HEAD) - kdims = (BATCH, N_HEADS, seqlen_k, D_HEAD) - vdims = (BATCH, N_HEADS, seqlen_k, D_HEAD) - bdims = (BATCH, N_HEADS, seqlen_q, seqlen_k) - if storage_flip: - qdims = (qdims[0], qdims[2], qdims[1], qdims[3]) - kdims = (kdims[0], kdims[2], kdims[1], kdims[3]) - vdims = (vdims[0], vdims[2], vdims[1], vdims[3]) - bdims = (bdims[0], bdims[2], bdims[1], bdims[3]) - q = ( - torch.empty(qdims, dtype=dtype, device="cuda") - .normal_(mean=0., std=0.5) - .requires_grad_() - ) - k = ( - torch.empty(kdims, dtype=dtype, device="cuda") - .normal_(mean=0., std=0.5) - .requires_grad_() - ) - v = ( - torch.empty(vdims, dtype=dtype, device="cuda") - .normal_(mean=0., std=0.5) - .requires_grad_() - ) - if bias_type is None: - b = None - elif bias_type == 'matrix': - b = torch.empty(bdims, dtype=dtype, device="cuda").normal_(mean=0., std=0.5) - else: - assert False, f'Unsupported bias_type {bias_type}' - if storage_flip: - q = torch.transpose(q, 1, 2) - k = torch.transpose(k, 1, 2) - v = torch.transpose(v, 1, 2) - if b is not None: - b = torch.transpose(b, 1, 2) - assert q.shape == (BATCH, N_HEADS, seqlen_q, D_HEAD) - assert k.shape == (BATCH, N_HEADS, seqlen_k, D_HEAD) - assert v.shape == (BATCH, N_HEADS, seqlen_k, D_HEAD) - if False: # Debugging - q = ( - torch.empty((Z, H, seqlen_q, D_HEAD), dtype=dtype, device="cuda") - .normal_(mean=0., std=0.5) - .requires_grad_() - ) - k = torch.ones((Z, H, seqlen_k, D_HEAD), dtype=dtype, device="cuda") * 1.0 - v = torch.ones((Z, H, seqlen_k, D_HEAD), dtype=dtype, device="cuda") * 1.0 - if False: - q = torch.ones((Z, H, seqlen_q, D_HEAD), dtype=dtype, device="cuda") * 1.0 - k = torch.ones((Z, H, seqlen_k, D_HEAD), dtype=dtype, device="cuda") * 2.0 - v = torch.ones((Z, H, seqlen_k, D_HEAD), dtype=dtype, device="cuda") * 3.0 - if False: - import numpy as np - q = torch.arange(np.prod([Z, H, seqlen_q, D_HEAD]), dtype=dtype, device="cuda").reshape((Z, H, seqlen_q, D_HEAD)) - k = torch.arange(np.prod([Z, H, seqlen_k, D_HEAD]), dtype=dtype, device="cuda").reshape((Z, H, seqlen_q, D_HEAD)) - v = torch.arange(np.prod([Z, H, seqlen_k, D_HEAD]), dtype=dtype, device="cuda").reshape((Z, H, seqlen_q, D_HEAD)) - q = (q - 128.0) * 0.01 - k = (k - 128.0) * 0.01 - v = (v - 128.0) * 0.01 - q[:, :, :, SPARSE_HEAD_SINCE: ] = 0.0 - k[:, :, :, SPARSE_HEAD_SINCE: ] = 0.0 - v[:, :, :, SPARSE_HEAD_SINCE: ] = 0.0 - q[:, :, SPARSE_SEQ_SINCE:, : ] = 0.0 - k[:, :, SPARSE_SEQ_SINCE:, : ] = 0.0 - v[:, :, SPARSE_SEQ_SINCE:, : ] = 0.0 +def _do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type): + if causal and seqlen_q != seqlen_k: + pytest.skip("PyTorch's Flash V2 does not accept casual=True when seqlen_q != seqlen_k. Skipping") + if causal and bias_type is not None: + pytest.skip("_scaled_dot_product_attention: Explicit attn_mask should not be set when is_causal=True") + # if BATCH > 1 and seqlen_q >= 1024 and seqlen_k >= 1024: + # torch.cuda.empty_cache() + SKIP_DK_DV = True + SKIP_DQ = True + SKIP_DB = True if bias_type is None else False + USE_AUTOTUNE = False + torch.manual_seed(20) + SPARSE_HEAD_SINCE = 1 + SPARSE_SEQ_SINCE = 1 + transpose = (1, 2) if storage_flip else None + ctx = SdpaContext(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, dtype, + bias_type=bias_type, storage_flip=transpose, device='cuda') + ctx.create_ref_inputs() + ctx.set_require_grads(skip_dq=SKIP_DQ, skip_dk_dv=SKIP_DK_DV, skip_db=SKIP_DB) + q, k, v, b = ctx.dev_tensors + # autotune = True + # # triton implementation + ext = AttentionExtraArgs(return_encoded_softmax=causal, + autotune=False, + return_autotune=False) + tri_out, encoded_softmax, _ = attention(q, k, v, b, causal, sm_scale, dropout_p, ext) + dropout_mask = encoded_softmax >= 0 if causal else None + sdpa_params = SdpaParams(causal=causal, sm_scale=sm_scale, dropout_p=dropout_p, dropout_mask=dropout_mask) + ref_out, _ = ctx.compute_ref_forward(sdpa_params) - ''' - dout = torch.randn_like(q) - # reference implementation - M = torch.tril(torch.ones((N_CTX, N_CTX), device="cuda")) - p = torch.matmul(q, k.transpose(2, 3)) * sm_scale - if causal: - p[:, :, M == 0] = float("-inf") - p = torch.softmax(p.float(), dim=-1).half() - ref_out = torch.matmul(p, v) - ''' - return_encoded_softmax = dropout_p > 0.0 and not self.use_fill_rng_for_dropout - # return_encoded_softmax = dropout_p > 0.0 # Reserved for debugging use_fill_rng_for_dropout - higher_precision_dtype = torch.float64 if dtype == torch.float32 else torch.float32 - REF_DEVICE=None - q_ref, k_ref, v_ref = query_key_value_clones(q, k, v, dtype=higher_precision_dtype, device=REF_DEVICE) - def TO(ref_tensor): - return ref_tensor.to(device=q.device, dtype=dtype) - autotune = False - return_autotune = False - tri_out, encoded_softmax, _ = attention(q, k, v, b, causal, sm_scale, dropout_p, return_encoded_softmax, - autotune, return_autotune) + is_allclose, adiff, _, _ = ctx.validate_with_reference(tri_out, None, no_backward=True) + if not is_allclose: + import numpy as np + err_idx = np.unravel_index(torch.argmax(torch.abs(ref_out.to(device=tri_out.device) - tri_out)).cpu().numpy(), ref_out.shape) + print(f'{err_idx=}') + print(f'{tri_out[err_idx]=}') + print(f'{ref_out[err_idx]=}') + assert is_allclose, 'Forward pass {is_allclose=}' + print(f'{adiff=}') - if self.use_fill_rng_for_dropout: - rdims = (BATCH, N_HEADS, seqlen_q, seqlen_k) - if storage_flip: - rdims = (rdims[0], rdims[2], rdims[1], rdims[3]) - r = torch.empty(rdims, device=q.device, dtype=torch.float32) - if storage_flip: - r = torch.transpose(r, 1, 2) - philox_seed = DEFAULT_PHILOX_SEED - philox_offset = DEFAULT_PHILOX_OFFSET - debug_fill_dropout_rng(r, philox_seed, philox_offset) - # Reserved for debugging use_fill_rng_for_dropout - # print(f'{r[0,0,:16, :16]}=') - # print(f'{r[0,0,:16, :16] > dropout_p}=') - # print(f'{encoded_softmax[0,0,:16, :16] > 0}=') - dropout_mask = r > dropout_p - else: - dropout_mask = encoded_softmax > 0 if encoded_softmax is not None else None - # assert torch.allclose(dropout_mask, dropout_mask_naive) - ref_out, ref_softmax = torch.ops.aten._scaled_dot_product_attention_math(q_ref, k_ref, v_ref, - dropout_p=dropout_p, - is_causal=causal, - attn_mask=b, - scale=sm_scale, - dropout_mask=dropout_mask) - if False: - mref_out, mref_softmax = scaled_dot_product_attention(q, k, v, - dropout_p=dropout_p, - is_causal=causal, - scale=sm_scale, - dropout_mask=dropout_mask) - print(f'{tri_out[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - print(f'{ref_out[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - print(f'{mref_out[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - print(f'{tri_out[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]/ref_out[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - print(f'{q.shape=} {q.stride()=}') - print(f'{k.shape=} {k.stride()=}') - print(f'{v.shape=} {v.stride()=}') - print(f'{encoded_softmax=}') - if encoded_softmax is not None: - print(f'{encoded_softmax.shape=} {encoded_softmax.stride()=}') - print(f'{encoded_softmax[:,:, :SPARSE_SEQ_SINCE, :SPARSE_SEQ_SINCE]=}') - print(f'{dropout_mask.shape=} {dropout_mask.stride()=}') - print(f'{dropout_mask[:,:, :SPARSE_SEQ_SINCE, :SPARSE_HEAD_SINCE]=}') - if dtype==torch.bfloat16: - ATOL = 1e-1 * max(1.0, (seqlen_q + seqlen_k + D_HEAD) / 128.0) - else: - ATOL = 1e-2 * max(1.0, (seqlen_q + seqlen_k + D_HEAD) / 128.0) - RTOL = 0.0 - print(f'Using ATOL={ATOL} RTOL={RTOL}') - is_allclose = torch.allclose(TO(ref_out), tri_out, atol=ATOL, rtol=RTOL) - if not is_allclose: - import numpy as np - err_idx = np.unravel_index(torch.argmax(torch.abs(TO(ref_out) - tri_out)).cpu().numpy(), ref_out.shape) - print(f'{err_idx=}') - print(f'{tri_out[err_idx]=} {ref_out[err_idx]=} error: {tri_out[err_idx] - ref_out[err_idx]}') - # if not is_allclose: - if False: - import numpy as np - err_idx = np.unravel_index(torch.argmax(torch.abs(TO(ref_out) - tri_out)).cpu().numpy(), ref_out.shape) - print(f'{tri_out[0][0][0][:]=}') - print(f'{ref_out[0][0][0][:]=}') - print(f'{mref_out[0][0][0][:]=}') - if encoded_softmax is not None: - print(f'{encoded_softmax[0][0][0][:]=}') - print(f'{ref_softmax[0][0][0][:]=}') - print(f'{tri_out[-1][0][0][:]=}') - print(f'{ref_out[-1][0][0][:]=}') - print(f'{err_idx=}') - print(f'{tri_out[err_idx]=}') - print(f'{ref_out[err_idx]=}') - if dropout_p > 0: - # print(f'{unmasked_ref_out[0][0][0][:]=}') - print(f'{dropout_mask[0][0][0][:]=}') - print(f'{dropout_mask[err_idx]=}') - # tri_cpu = tri_out[0, 0].cpu().detach().numpy() - # print(f'{tri_cpu.shape=}') - # compare - assert is_allclose - -# @pytest.mark.parametrize('BATCH', [1, 4]) -# @pytest.mark.parametrize('N_HEADS', [1, 4]) +# @pytest.mark.parametrize('BATCH', [1]) +# @pytest.mark.parametrize('N_HEADS', [1]) @pytest.mark.parametrize('BATCH', [1, 4]) @pytest.mark.parametrize('N_HEADS', [1, 4]) +# @pytest.mark.parametrize('D_HEAD', [16, 32, 64, 128, 256]) +# Irregular-only PyTorch set +# @pytest.mark.parametrize('D_HEAD', [8, 21, 72, 96, 160, 192, 203]) +# @pytest.mark.parametrize('seqlen_q', [1, 4, 32, 128, 256, 512, 1024, 7, 394, 250, 399, 511, 1019]) +# @pytest.mark.parametrize('seqlen_k', [1, 4, 32, 128, 256, 512, 1024, 3, 217, 339, 313, 491, 988]) +# PyTorch set @pytest.mark.parametrize('D_HEAD', [8, 16, 21, 32, 64, 72, 96, 128, 160, 192, 203, 256]) -# @pytest.mark.parametrize('seqlen_q', [16,32,64,128,256,512,1024]) -# @pytest.mark.parametrize('seqlen_k', [16,32,64,128,256,512,1024]) @pytest.mark.parametrize('seqlen_q', [4, 8, 64, 143, 256, 512, 1024, 2048]) @pytest.mark.parametrize('seqlen_k', [4, 8, 64, 128, 256, 587, 1024, 2048]) +# Minimal set # @pytest.mark.parametrize('seqlen_q', [32, 128]) # @pytest.mark.parametrize('seqlen_k', [32, 128]) @pytest.mark.parametrize('causal', [False, True]) @pytest.mark.parametrize('dropout_p', [0.0, 0.5]) # @pytest.mark.parametrize('dropout_p', [0.0]) -@pytest.mark.parametrize('dtype', [torch.float16, torch.bfloat16]) +@pytest.mark.parametrize('dtype', [torch.float16, torch.bfloat16, torch.float32]) +# @pytest.mark.parametrize('dtype', [torch.float16, torch.bfloat16]) @pytest.mark.parametrize('sm_scale', [0.0, 1.2]) @pytest.mark.parametrize('storage_flip', [False, True]) # @pytest.mark.parametrize('return_encoded_softmax', [False]) def test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip): bias_type = None - tester = FwdTester() - tester.do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + _do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) +# @pytest.mark.parametrize('BATCH', [1, 4]) +# @pytest.mark.parametrize('N_HEADS', [1, 4]) @pytest.mark.parametrize('BATCH', [1, 4]) @pytest.mark.parametrize('N_HEADS', [1, 4]) @pytest.mark.parametrize('D_HEAD', [16,32,64,128,256]) +# @pytest.mark.parametrize('D_HEAD', [128]) +# Complete set +# @pytest.mark.parametrize('seqlen_q', [4,8,16,17,32,64,128,143,256,512,1024,2048]) +# @pytest.mark.parametrize('seqlen_k', [4,8,16,23,32,64,128,256,512,587,1024,2048]) +# PyTorch set @pytest.mark.parametrize('seqlen_q', [4, 8, 64, 143, 256, 512, 1024, 2048]) @pytest.mark.parametrize('seqlen_k', [4, 8, 64, 128, 256, 587, 1024, 2048]) +# @pytest.mark.parametrize('seqlen_q', [128,256,512,1024]) +# @pytest.mark.parametrize('seqlen_k', [128,256,512,1024]) +# @pytest.mark.parametrize('seqlen_q', [128, 113]) +# @pytest.mark.parametrize('seqlen_k', [128, 79]) @pytest.mark.parametrize('dropout_p', [0.0, 0.5]) -@pytest.mark.parametrize('dtype', [torch.float16, torch.bfloat16]) +# @pytest.mark.parametrize('dropout_p', [0.0]) +@pytest.mark.parametrize('dtype', [torch.float16, torch.bfloat16, torch.float32]) +# @pytest.mark.parametrize('dtype', [torch.float16, torch.bfloat16]) @pytest.mark.parametrize('sm_scale', [0.0, 1.2]) @pytest.mark.parametrize('storage_flip', [False, True]) +# @pytest.mark.parametrize('return_encoded_softmax', [False]) def test_op_fwd_with_matrix_bias(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, sm_scale, dropout_p, dtype, storage_flip): causal = False bias_type = 'matrix' - tester = FwdTester() ''' _scaled_dot_product_attention: Explicit attn_mask should not be set when is_causal=True ''' - tester.do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + _do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) -@pytest.mark.parametrize('BATCH', [1, 4]) -@pytest.mark.parametrize('N_HEADS', [1, 4]) -@pytest.mark.parametrize('seqlen_q', [4, 8, 64, 143, 256, 512, 1024, 2048]) -@pytest.mark.parametrize('seqlen_k', [4, 8, 64, 128, 256, 587, 1024, 2048]) -@pytest.mark.parametrize('causal', [False, True]) -@pytest.mark.parametrize('storage_flip', [False, True]) -def test_fill_dropout_rng(BATCH, N_HEADS, seqlen_q, seqlen_k, causal, storage_flip): - D_HEAD = 128 - dropout_p = 0.5 +dtype0 = torch.float16 +dtype1 = torch.bfloat16 +dtype2 = torch.float32 + +# Testing test_op_fwd_with_matrix_bias from string +def main4(): + # utshort = 'False-1.2-dtype0-0.0-587-2048-32-1-1' + utshort = 'False-1.2-dtype0-0.0-4-2048-32-1-1' + # utshort = 'False-1.2-dtype0-0.0-4-1024-32-1-1' + utlist_str = list(reversed(utshort.split('-'))) + BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, dropout_p, dtype, sm_scale, storage_flip = [eval(e) for e in utlist_str] + causal = False + bias_type = 'matrix' + _do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + +def main3(): + # utshort = 'False-1.2-dtype0-0.0-4-2048-32-1-1' + # utshort = 'False-1.2-dtype0-0.0-4-1024-32-1-1' + utlist_str = list(reversed(utshort.split('-'))) + BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, dropout_p, dtype, sm_scale, storage_flip = [eval(e) for e in utlist_str] + bias_type = None + _do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + +def main2(): + # False-1.2-dtype0-0.0-587-2048-32-1-1 + # Memo: False-0.0-dtype0-0.0-False-4-256-8-4-1 + # Memo: False-0.0-dtype0-0.0-False-4-256-8-1-4 + # False-1.2-dtype0-0.0-False-4-4-72-1-4 + # BATCH = 1 + # D_HEAD = 32 + # N_HEADS = 4 + # seqlen_q = 16 + # seqlen_k = 16 + # causal = False + + BATCH = 2 + D_HEAD = 4 + N_HEADS = 1 + seqlen_q = 8 + seqlen_k = 8 + causal = False + + sm_scale = 1.2 + dropout_p = 0.0 dtype = torch.float16 + storage_flip = False + bias_type = None + _do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + +def main(): + BATCH = 1 + D_HEAD = 80 + N_HEADS = 2 + seqlen_q = 6432 + seqlen_k = 6432 + ''' + N_HEADS = 6432 + seqlen_q = 2 + seqlen_k = 2 + ''' + causal = False sm_scale = 1.2 + dropout_p = 0.0 + dtype = torch.bfloat16 + storage_flip = False bias_type = None - tester = FwdTester() - tester.use_fill_rng_for_dropout = True - tester.do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + _do_test_op_fwd(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, dtype, storage_flip, bias_type) + +if __name__ == '__main__': + main4() diff --git a/tritonsrc/fwd_kernel.py b/tritonsrc/fwd_kernel.py index 65e08a15..70612d98 100644 --- a/tritonsrc/fwd_kernel.py +++ b/tritonsrc/fwd_kernel.py @@ -31,14 +31,14 @@ def attn_fwd( stride_vz, stride_vh, stride_vk, stride_vn, stride_bz, stride_bh, stride_bm, stride_bn, stride_oz, stride_oh, stride_om, stride_on, - num_head_q, - num_head_k, + num_head_q : 'i32', + num_head_k : 'i32', cu_seqlens_q, cu_seqlens_k, - num_seqlens, - max_seqlen_q, - max_seqlen_k, - head_dim, + num_seqlens : 'i32', + max_seqlen_q : 'i32', + max_seqlen_k : 'i32', + head_dim : 'i32', dropout_p, philox_seed, philox_offset_base, @@ -292,7 +292,9 @@ def attn_fwd( # FIXME: MQA/GQA L tensor # TODO: make writing of L optional # write back LSE - L_ptr_base = L + (off_z * num_head_q + off_h_q) * max_seqlen_q + + # L's shape: (batch, head, seqlen_q) + L_ptr_base = L + (off_z * num_head_q + off_h_q) * max_seqlen_q l_ptrs = L_ptr_base + offs_m # If seqlen_q not multiple of BLOCK_M, we need to mask out the last few rows. # This is only true for the last M block. For others, overflow_size will be -ve diff --git a/v2src/flash/attn_bwd.cc b/v2src/flash/attn_bwd.cc index 4e3d88bb..91ccfe39 100644 --- a/v2src/flash/attn_bwd.cc +++ b/v2src/flash/attn_bwd.cc @@ -418,7 +418,7 @@ attn_bwd_compact_varlen(T4 q, // 1 x num_heads x total_q x head_size, v, cu_seqlens_q, cu_seqlens_k, - cu_seqlens_q.size(0) - 1, + cu_seqlens_q.size(0), max_seqlen_q, max_seqlen_k, b, From ad33017a3608357e40a47c683c5ca08a39e415f9 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Thu, 11 Jul 2024 17:08:30 +0000 Subject: [PATCH 26/51] Various fixes to tune_flash Skip unaccepted inputs (notably causual=True has lots requirements) Add more sequence lengths --- test/tune_flash.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/test/tune_flash.py b/test/tune_flash.py index 0e7a84ae..9dc53476 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -61,31 +61,39 @@ def profile_all(self): self.profile(*tup) def profile(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type): - a = self._args + if seqlen_q > 8192 and seqlen_k > 8192: + N_HEADS = 1 if causal and seqlen_q != seqlen_k: print('FA does not support accept casual=True when seqlen_q != seqlen_k. Skipping') return - ''' - Create SdpaContext for testing - ''' - ctx = SdpaContext(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, dtype, - bias_type=bias_type, storage_flip=None, device='cuda') - ctx.create_ref_inputs() - ctx.set_require_grads(skip_db=True) - q, k, v, b = ctx.dev_tensors + if causal and bias_type != 0: + print('FA does not support accept casual=True when bias_type != 0. Skipping') + return + torch.cuda.empty_cache() ''' Create reference dropout_mask ''' if dropout_p > 0.0: rdims = (BATCH, N_HEADS, seqlen_q, seqlen_k) - r = torch.empty(rdims, device=q.device, dtype=torch.float32) + r = torch.empty(rdims, device='cuda', dtype=torch.float32) philox_seed = DEFAULT_PHILOX_SEED philox_offset = DEFAULT_PHILOX_OFFSET debug_fill_dropout_rng(r, philox_seed, philox_offset) mask = r > dropout_p torch.cuda.synchronize() + del r else: mask = None + torch.cuda.empty_cache() + a = self._args + ''' + Create SdpaContext for testing + ''' + ctx = SdpaContext(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, dtype, + bias_type=bias_type, storage_flip=None, device='cuda') + ctx.create_ref_inputs() + ctx.set_require_grads(skip_db=True) + q, k, v, b = ctx.dev_tensors sdpa_params = SdpaParams(causal=causal, sm_scale=sm_scale, dropout_p=dropout_p, dropout_mask=mask) ref_out, _ = ctx.compute_ref_forward(sdpa_params) @@ -191,8 +199,8 @@ def parse(): p.add_argument('--return_encoded_softmax', type=bool, default=[False], help="(A functional for debugging) kernel that returns softmax(dropout(QK')) to validate the correctness of dropout") p.add_argument('--d_head', type=int, nargs='+', default=[16,32,64,128,256], help='Head dimensions.') - p.add_argument('--seqlen_q', type=int, nargs='+', default=[256,1024,2048,4096,8192,16384,32768], help='Sequence length of Q.') - p.add_argument('--seqlen_k', type=int, nargs='+', default=[256,1024,2048,4096,8192,16384,32768], help='Sequence length of K/V.') + p.add_argument('--seqlen_q', type=int, nargs='+', default=[4,8,16,32,64,128,256,1024,2048,4096,8192,16384], help='Sequence length of Q.') + p.add_argument('--seqlen_k', type=int, nargs='+', default=[4,8,16,32,64,128,256,1024,2048,4096,8192,16384], help='Sequence length of K/V.') p.add_argument('--causal', type=int, nargs='+', default=[True,False], choices=[0, 1], help='Causal mask. (Use 0/1 for False/True') p.add_argument('--dropout_p', type=float, nargs='+', default=[0.5, 0.0], help='Probablity to dropout (0 to disable).') p.add_argument('--dtype', type=str, nargs='+', From 09583e2ff7e28cb9fc3a57d28adba7bb479d0a85 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 09:38:30 +0000 Subject: [PATCH 27/51] Make zstd quite --- v2src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2src/CMakeLists.txt b/v2src/CMakeLists.txt index 6651cff0..f7399fdc 100644 --- a/v2src/CMakeLists.txt +++ b/v2src/CMakeLists.txt @@ -61,7 +61,7 @@ foreach(RULE IN LISTS HSACO_RULES) "--waves_per_eu" "${WAVESPEREU}" "--target" "${TGTGPU}" "--signature" "${SIG}" - COMMAND ${ZSTD_EXEC} "-f" ${HSACO} + COMMAND ${ZSTD_EXEC} "-q" "-f" ${HSACO} DEPENDS aotriton_venv_triton ) list(APPEND ALL_HSACOS "${HSACO}.zst") From 87262c1411bd611acdb1b98fc5d6102a1d347686 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:09:25 +0000 Subject: [PATCH 28/51] Add draft document 'How To Generate Tuning Database.md' --- doc/How To Generate Tuning Database.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/How To Generate Tuning Database.md diff --git a/doc/How To Generate Tuning Database.md b/doc/How To Generate Tuning Database.md new file mode 100644 index 00000000..f16f4a99 --- /dev/null +++ b/doc/How To Generate Tuning Database.md @@ -0,0 +1,12 @@ +# TL;DR + +``` +mkdir cpptune_build +cd cpptune_build +cmake .. -DCMAKE_INSTALL_PREFIX=./install_dir -DCMAKE_BUILD_TYPE=Release -DAOTRITON_BUILD_FOR_TUNING=ON -G Ninja +# Optionally only build for one arch +# cmake .. -DCMAKE_INSTALL_PREFIX=./install_dir -DCMAKE_BUILD_TYPE=Release -DAOTRITON_BUILD_FOR_TUNING=ON -DTARGET_GPUS=Navi32 -G Ninja +ninja install +cd .. +PYTHONPATH=cpptune_build/bindings/ python test/tune_flash.py --bias_type 0 --db_file v2python/rules/tuning_database.sqlite3 +``` From f95d8782f3c6234e81e0a8d9280c1c92bd504474 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:09:50 +0000 Subject: [PATCH 29/51] doc -> docs --- {doc => docs}/How To Generate Tuning Database.md | 0 {doc => docs}/How To Update Constraints of Tuning Database.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {doc => docs}/How To Generate Tuning Database.md (100%) rename {doc => docs}/How To Update Constraints of Tuning Database.md (100%) diff --git a/doc/How To Generate Tuning Database.md b/docs/How To Generate Tuning Database.md similarity index 100% rename from doc/How To Generate Tuning Database.md rename to docs/How To Generate Tuning Database.md diff --git a/doc/How To Update Constraints of Tuning Database.md b/docs/How To Update Constraints of Tuning Database.md similarity index 100% rename from doc/How To Update Constraints of Tuning Database.md rename to docs/How To Update Constraints of Tuning Database.md From a5a3189689dd07872a64d44cf00c55dd99a11036 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:33:15 +0000 Subject: [PATCH 30/51] Debugging output in bwd kernel --- v2src/flash/attn_bwd.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/v2src/flash/attn_bwd.cc b/v2src/flash/attn_bwd.cc index 91ccfe39..fefe8d33 100644 --- a/v2src/flash/attn_bwd.cc +++ b/v2src/flash/attn_bwd.cc @@ -128,6 +128,7 @@ bwd_kernel_dk_dv(T4 q, uint32_t(params.Q->size(1)), params.num_seqlens == 0 ? uint32_t(params.Q->size(0)) : params.num_seqlens, }; + // std::cerr << "bwd_kernel_dk_dv grid conf " << grid.x << " " << grid.y << " " << grid.z << std::endl; return grid; }; constexpr int kMinHeadDimCompiled = 16; @@ -210,6 +211,7 @@ bwd_kernel_dq(T4 q, uint32_t(params.Q->size(1)), params.num_seqlens == 0 ? uint32_t(params.Q->size(0)) : params.num_seqlens, }; + // std::cerr << "bwd_kernel_dq grid conf " << grid.x << " " << grid.y << " " << grid.z << std::endl; return grid; }; constexpr int kMinHeadDimCompiled = 16; From c091ef38a25b5a9780e2ea636d07c73714e68dd6 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:33:58 +0000 Subject: [PATCH 31/51] add num_head_q/k argument to varlen's attention module. --- tritonsrc/varlen_attn_torch_function.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tritonsrc/varlen_attn_torch_function.py b/tritonsrc/varlen_attn_torch_function.py index d73b17c0..afcc5e3d 100644 --- a/tritonsrc/varlen_attn_torch_function.py +++ b/tritonsrc/varlen_attn_torch_function.py @@ -37,6 +37,8 @@ def forward(ctx, q, k, v, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, retur head_dim_rounded = 2 ** (Lk - 1).bit_length() head_dim_rounded = max(16, head_dim_rounded) padded_head = head_dim_rounded != Lk + num_head_q = q.shape[1] + num_head_k = k.shape[1] # Varlen packed all batches of seqlens into dim[0] batch = len(seqlen_q) num_heads = q.shape[1] @@ -131,6 +133,8 @@ def forward(ctx, q, k, v, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, retur v.stride(0), v.stride(1), v.stride(2), v.stride(3), b.stride(0), b.stride(1), b.stride(2), b.stride(3), o.stride(0), o.stride(1), o.stride(2), o.stride(3), + num_head_q=num_head_q, + num_head_k=num_head_k, cu_seqlens_q=cu_seqlens_q, cu_seqlens_k=cu_seqlens_k, num_seqlens=len(cu_seqlens_q), From 34ac678a186c13a674fbed6c067e402404028aca Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:35:08 +0000 Subject: [PATCH 32/51] tritonsrc/performance_forward: read env var N_CTX to determine testing cases --- tritonsrc/performance_forward.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tritonsrc/performance_forward.py b/tritonsrc/performance_forward.py index 2c9445b0..cec50c08 100644 --- a/tritonsrc/performance_forward.py +++ b/tritonsrc/performance_forward.py @@ -5,6 +5,7 @@ import pytest import torch +import os import triton from attn_torch_function import attention @@ -20,6 +21,12 @@ FLASH_VER = None HAS_FLASH = FLASH_VER is not None +n_ctx = os.getenv('N_CTX', default=list(range(10, 14))) +if isinstance(n_ctx, str): + n_ctx = map(lambda x: int(x), n_ctx.split(',')) +X_VALS = list(map(lambda x: 2 ** x, n_ctx)) +print(f'{X_VALS=}') + BATCH, N_HEADS, N_CTX, D_HEAD = 4, 48, 4096, 64 # vary seq length for fixed head and batch=4 configs = [] @@ -27,7 +34,9 @@ for causal in [False, True]: configs.append(triton.testing.Benchmark( x_names=['N_CTX'], - x_vals=[2**i for i in range(10, 15)], + x_vals=list(X_VALS), + # x_vals=[2**i for i in range(10, 14)], # 2 ** 15 not working for now + # x_vals=[2**12], line_arg='provider', line_vals=['triton'] + (['flash'] if HAS_FLASH else []), line_names=['Triton'] + ([f'Flash-{FLASH_VER}'] if HAS_FLASH else []), From 22c3197b6477ab2597afbff0118de9ecb4c09155 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:36:07 +0000 Subject: [PATCH 33/51] Reduce the tuning time since there are too many cases to test... --- test/cpp_autotune.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py index 6a393b57..41b099d1 100644 --- a/test/cpp_autotune.py +++ b/test/cpp_autotune.py @@ -113,7 +113,7 @@ def cpp_autotune(extarg_klass, kernel_func, validator): def func(): return kernel_func(extargs) # t = do_bench(func, validator=validator, quantiles=(0.5, 0.2, 0.8)) - t = do_bench(func, warmup=75, rep=300, validator=validator) + t = do_bench(func, validator=validator) r = AutotuneResult(kernel_index=kernel_index, time=t, psels=json.loads(extargs.selected_kernel_psels), From 0b40af300a301b047a72c59cf9177eae76c29546 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Thu, 11 Jul 2024 17:23:50 -0500 Subject: [PATCH 34/51] cpp autotune: x2 num_warps if warp_size == 32 --- v2python/gpu_targets.py | 8 +++++++- v2python/kernel_desc.py | 12 ++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/v2python/gpu_targets.py b/v2python/gpu_targets.py index d6f0a450..fb51fef5 100644 --- a/v2python/gpu_targets.py +++ b/v2python/gpu_targets.py @@ -1,7 +1,6 @@ # Copyright © 2023-2024 Advanced Micro Devices, Inc. # SPDX-License-Identifier: MIT - AOTRITON_SUPPORTED_GPUS = { 'MI200' : 'GPU_ARCH_AMD_GFX90A', 'MI300X' : 'GPU_ARCH_AMD_GFX942', @@ -15,3 +14,10 @@ 'Navi31' : 'gfx1100', 'Navi32' : 'gfx1101', } + +AOTRITON_GPU_WARPSIZE = { + 'MI200' : 64, + 'MI300X' : 64, + 'Navi31' : 32, + 'Navi32' : 32, +} diff --git a/v2python/kernel_desc.py b/v2python/kernel_desc.py index 6bfd3bec..ddeea1b1 100644 --- a/v2python/kernel_desc.py +++ b/v2python/kernel_desc.py @@ -12,7 +12,7 @@ ) from .kernel_signature import KernelSignature from .object_desc import ObjectFileDescription -from .gpu_targets import AOTRITON_SUPPORTED_GPUS +from .gpu_targets import AOTRITON_SUPPORTED_GPUS, AOTRITON_GPU_WARPSIZE SOURCE_PATH = Path(__file__).resolve() @@ -89,6 +89,14 @@ def insert_tensor_strides_to_choices(self, last_is_continuous=False): print(f"{self.TYPE_CHOICES=}") print(f"{self.FEAT_CHOICES=}") + def gen_patched_autotune_configs(self, gpu, fsel_dict): + if AOTRITON_GPU_WARPSIZE[gpu] == 64: + yield from self.gen_autotune_configs(fsel_dict) + return + for cfg in self.gen_autotune_configs(fsel_dict): + cfg.num_warps *= 2 + yield cfg + def __init__(self, triton_kernel_name, triton_file_path): self.insert_tensor_strides_to_choices(last_is_continuous=True) self._DATA_ARGUMENTS = None @@ -164,7 +172,7 @@ def gen_perf_selections_from_kdesc(self, gpu : str, fsels : 'list[ArgumentSelection]'): fsel_dict = ArgumentSelection.build_fsel_dict(fsels) - for cfg in self.gen_autotune_configs(fsel_dict): + for cfg in self.gen_patched_autotune_configs(gpu, fsel_dict): psels, compiler_options = cfg.translate_to_psel_and_co(self._perf_meta) yield gpu, fsels, psels, compiler_options From 7457a5ae989c6dde80551b518042ac7c99694435 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:39:44 +0000 Subject: [PATCH 35/51] Navi32: skip autotune configs that takes too long to build --- v2python/kernel_desc.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/v2python/kernel_desc.py b/v2python/kernel_desc.py index ddeea1b1..7fadc181 100644 --- a/v2python/kernel_desc.py +++ b/v2python/kernel_desc.py @@ -95,6 +95,8 @@ def gen_patched_autotune_configs(self, gpu, fsel_dict): return for cfg in self.gen_autotune_configs(fsel_dict): cfg.num_warps *= 2 + if cfg.num_warps > 8: # ignore super large block + continue yield cfg def __init__(self, triton_kernel_name, triton_file_path): From b7d647c66b1df18507e827351739ceb88bee1185 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 14:07:43 -0500 Subject: [PATCH 36/51] Add --use_multigpu to test/tune_flash.py for multi-GPU tuning --- test/attn_torch_function.py | 10 +++- test/cpp_autotune.py | 4 +- test/tune_flash.py | 116 ++++++++++++++++++++++++++++++------ 3 files changed, 106 insertions(+), 24 deletions(-) diff --git a/test/attn_torch_function.py b/test/attn_torch_function.py index b64e0a1c..084c30fb 100644 --- a/test/attn_torch_function.py +++ b/test/attn_torch_function.py @@ -11,8 +11,10 @@ ['return_encoded_softmax', 'autotune', 'return_autotune', - 'autotune_validator'], - defaults=[False, False, False, None]) + 'autotune_validator', + 'cpp_autotune_tqdm_position', + ], + defaults=[False, False, False, None, None]) VERBOSE=False DEFAULT_PHILOX_SEED = 0x1BF52 @@ -80,7 +82,9 @@ def func(extargs): print(e) return hipError_t.hipErrorLaunchFailure, None return ret, (o,) - tuning_result = cpp_autotune(ExtraArguments, func, attn_extra_args.autotune_validator) + tuning_result = cpp_autotune(ExtraArguments, func, + attn_extra_args.autotune_validator, + tqdm_position=attn_extra_args.cpp_autotune_tqdm_position) else: attn_fwd(q, k, v, b, sm_scale, M, o, dropout_p, philox_seed, philox_offset, encoded_softmax, causal); diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py index 41b099d1..8413d160 100644 --- a/test/cpp_autotune.py +++ b/test/cpp_autotune.py @@ -100,7 +100,7 @@ def do_bench(fn, *, warmup=25, rep=100, AutotuneResult = namedtuple('AutotuneResult', ['kernel_index', 'time', 'psels', 'copts']) -def cpp_autotune(extarg_klass, kernel_func, validator): +def cpp_autotune(extarg_klass, kernel_func, validator, *, tqdm_position=None): assert validator is not None kernel_index = 0 extargs = extarg_klass() @@ -132,7 +132,7 @@ def func(): success += 1 if pbar is None and extargs.total_number_of_kernels > 0: - pbar = tqdm(total=extargs.total_number_of_kernels, unit="configs") + pbar = tqdm(total=extargs.total_number_of_kernels, unit="configs", position=tqdm_position) pbar.set_description(f'Success {success}, Fail {failed}. Last time {t:.2g}') if pbar is not None: pbar.set_description(f'Success {success}, Fail {failed}. Last time {t:.2g}') diff --git a/test/tune_flash.py b/test/tune_flash.py index 9dc53476..3e8127ca 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -7,6 +7,9 @@ import json import sys import subprocess +import queue +import multiprocessing +from multiprocessing import Process, Queue import argparse import itertools import os @@ -25,20 +28,11 @@ _DEBUG_SKIP_TUNE_BACKWARD = True -class Tuner(object): - KERNEL_FAMILY = 'FLASH' - +class TunerWorker(object): def __init__(self, args): self._args = args self._arch = rocm_get_gpuarch() - dbargs = ['python3', '-m', 'v2python.table_tool', '-v', '-f', self._args.db_file, '-k', self.KERNEL_FAMILY] - if args.create_table_only: - dbargs += ['--action', 'createtableonly'] - self._dbp = subprocess.Popen(dbargs, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - text=True) - os.set_blocking(self._dbp.stdout.fileno(), False) - os.set_blocking(self._dbp.stderr.fileno(), False) + self._tqdm_position = 0 @property def verbose(self): @@ -48,27 +42,29 @@ def gen(self): a = self._args yield from itertools.product(a.batch, a.n_heads, a.d_head, a.seqlen_q, a.seqlen_k, a.causal, a.sm_scale, a.dropout_p, a.return_encoded_softmax, a.dtype, a.bias_type) - def profile_all(self): + def do_profile(self): a = self._args for i, tup in enumerate(self.gen()): - print(f"[{i:06d}] Handling {tup}") + print(f"{shard_prefx}[{i:06d}] Handling {tup}") if a.continue_from is not None and i < a.continue_from: continue if a.stop_at is not None and i > a.stop_at: break if a.dry_run: continue - self.profile(*tup) + action, inputs, best_configs = self.profile_single_config(*tup) + if action == 'Success': + self.pipe_configs(inputs, best_configs) - def profile(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type): + def profile_single_config(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type): if seqlen_q > 8192 and seqlen_k > 8192: N_HEADS = 1 if causal and seqlen_q != seqlen_k: print('FA does not support accept casual=True when seqlen_q != seqlen_k. Skipping') - return + return 'Skip', None, None if causal and bias_type != 0: print('FA does not support accept casual=True when bias_type != 0. Skipping') - return + return 'Skip', None, None torch.cuda.empty_cache() ''' Create reference dropout_mask @@ -115,7 +111,8 @@ def fwd_validator(tri_out): ext = AttentionExtraArgs(return_encoded_softmax=return_encoded_softmax, autotune=True, return_autotune=True, - autotune_validator=fwd_validator) + autotune_validator=fwd_validator, + cpp_autotune_tqdm_position=self._tqdm_position) tri_out, encoded_softmax, best_configs = attention(q, k, v, b, causal, sm_scale, dropout_p, ext) if self.verbose: print('Returned best configs') @@ -144,7 +141,86 @@ def fwd_validator(tri_out): 'PADDED_HEAD' : head_dim_rounded != D_HEAD, 'BIAS_TYPE' : bias_type, } - self.pipe_configs(inputs, best_configs) + return 'Success', inputs, best_configs + +class IPCTunerWorker(TunerWorker): + + def do_profile(self, ipc_read, ipc_write): + a = self._args + shard, total_shards = ipc_read.get() + print(f'{shard=} {total_shards=}') + shard_prefx= '' if shard is None else f'[Shard {shard:02d}/{total_shards:02d}]' + self._tqdm_position = shard + for i, tup in enumerate(self.gen()): + if i % total_shards != shard: + continue + print(f"{shard_prefx}[{i:06d}] Handling {tup}") + if a.continue_from is not None and i < a.continue_from: + continue + if a.stop_at is not None and i > a.stop_at: + break + if a.dry_run: + continue + action, inputs, best_configs = self.profile_single_config(*tup) + if action == 'Success': + ipc_write.put((inputs, best_configs)) + ipc_write.put((None, shard)) + +class Tuner(object): + KERNEL_FAMILY = 'FLASH' + + def __init__(self, args): + self._args = args + self._arch = rocm_get_gpuarch() + dbargs = ['python3', '-m', 'v2python.table_tool', '-v', '-f', self._args.db_file, '-k', self.KERNEL_FAMILY] + if args.create_table_only: + dbargs += ['--action', 'createtableonly'] + self._dbp = subprocess.Popen(dbargs, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + text=True) + os.set_blocking(self._dbp.stdout.fileno(), False) + os.set_blocking(self._dbp.stderr.fileno(), False) + + @property + def verbose(self): + return self._args.verbose + + def profile_all(self): + a = self._args + if a.use_multigpu is None: + for inputs, best_configs in TunerWorker(args).do_profile(): + self.pipe_configs(inputs, best_configs) + return + shards = list([i for i in range(torch.cuda.device_count())]) if -1 in a.use_multigpu else a.use_multigpu + ipc_write = Queue() + ipc_read = Queue() + ipc_tuners = [IPCTunerWorker(self._args) for i in shards] + workers = [Process(target=worker.do_profile, args=(ipc_write, ipc_read)) for worker in ipc_tuners] + nlive_processes = len(workers) + for i, p in enumerate(workers): + ipc_write.put((i, nlive_processes)) + for p in workers: + p.start() + while nlive_processes > 0: + try: + inputs, best_configs = ipc_read.get(timeout=30) + # print(f'{inputs=}') + # print(f'{best_configs=}') + if inputs is None: + shard = best_configs + nlive_processes -= 1 + print(f'Shard {shard} has completed all tasks. Updated {nlive_processes=}') + continue + self.pipe_configs(inputs, best_configs) + except queue.Empty: + print("Timed out. Re-scan live processes") + # "watchdog" + nlive_processes = 0 + for i, p in enumerate(workers): + nlive_processes += 1 if p.is_alive() else 0 + print(f"{nlive_processes=}") + for p in workers: + p.join() def pipe_configs(self, inputs, best_configs): for kernel_name, best in best_configs: @@ -216,6 +292,7 @@ def parse(): p.add_argument('--stop_at', type=int, default=None, help="Stop at n-th functional set") p.add_argument('--db_file', type=str, required=True, help="Sqlite Database file") p.add_argument('--create_table_only', action='store_true', help="Do not insert data, only create tables. Used for schema updates.") + p.add_argument('--use_multigpu', type=int, nargs='+', default=None, help='Profiling on multiple GPUs. Passing -1 for all GPUs available to pytorch.') args = p.parse_args() args.dtype = [ getattr(torch, t) for t in args.dtype ] args.causal = [ bool(c) for c in args.causal ] @@ -223,6 +300,7 @@ def parse(): return args def main(): + multiprocessing.set_start_method('spawn') # Otherwise torch complains args = parse() tuner = Tuner(args) tuner.profile_all() From e8191600175761823762234dcf06dcf8a9ae61b7 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 14:26:41 -0500 Subject: [PATCH 37/51] test/tune_flash.py: actually distribute tensor/computing to different GPUs. Confirmed with amd-smi -w 2 --- test/tune_flash.py | 45 +++++++++++++++++++++++---------------- tritonsrc/_common_test.py | 6 +++--- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/test/tune_flash.py b/test/tune_flash.py index 3e8127ca..b94c92e0 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -33,6 +33,7 @@ def __init__(self, args): self._args = args self._arch = rocm_get_gpuarch() self._tqdm_position = 0 + self._gpu_device = 'cuda' @property def verbose(self): @@ -71,7 +72,7 @@ def profile_single_config(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, caus ''' if dropout_p > 0.0: rdims = (BATCH, N_HEADS, seqlen_q, seqlen_k) - r = torch.empty(rdims, device='cuda', dtype=torch.float32) + r = torch.empty(rdims, device=self._gpu_device, dtype=torch.float32) philox_seed = DEFAULT_PHILOX_SEED philox_offset = DEFAULT_PHILOX_OFFSET debug_fill_dropout_rng(r, philox_seed, philox_offset) @@ -86,8 +87,8 @@ def profile_single_config(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, caus Create SdpaContext for testing ''' ctx = SdpaContext(BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, dtype, - bias_type=bias_type, storage_flip=None, device='cuda') - ctx.create_ref_inputs() + bias_type=bias_type, storage_flip=None, device=self._gpu_device) + ctx.create_ref_inputs(target_gpu_device=self._gpu_device) ctx.set_require_grads(skip_db=True) q, k, v, b = ctx.dev_tensors sdpa_params = SdpaParams(causal=causal, sm_scale=sm_scale, dropout_p=dropout_p, dropout_mask=mask) @@ -145,25 +146,30 @@ def fwd_validator(tri_out): class IPCTunerWorker(TunerWorker): + def set_shard(self, shard): + self._tqdm_position = shard + self._gpu_device = f'cuda:{shard}' + def do_profile(self, ipc_read, ipc_write): a = self._args shard, total_shards = ipc_read.get() print(f'{shard=} {total_shards=}') shard_prefx= '' if shard is None else f'[Shard {shard:02d}/{total_shards:02d}]' - self._tqdm_position = shard - for i, tup in enumerate(self.gen()): - if i % total_shards != shard: - continue - print(f"{shard_prefx}[{i:06d}] Handling {tup}") - if a.continue_from is not None and i < a.continue_from: - continue - if a.stop_at is not None and i > a.stop_at: - break - if a.dry_run: - continue - action, inputs, best_configs = self.profile_single_config(*tup) - if action == 'Success': - ipc_write.put((inputs, best_configs)) + self.set_shard(shard) + with torch.cuda.device(shard): + for i, tup in enumerate(self.gen()): + if i % total_shards != shard: + continue + print(f"{shard_prefx}[{i:06d}] Handling {tup}") + if a.continue_from is not None and i < a.continue_from: + continue + if a.stop_at is not None and i > a.stop_at: + break + if a.dry_run: + continue + action, inputs, best_configs = self.profile_single_config(*tup) + if action == 'Success': + ipc_write.put((inputs, best_configs)) ipc_write.put((None, shard)) class Tuner(object): @@ -172,7 +178,10 @@ class Tuner(object): def __init__(self, args): self._args = args self._arch = rocm_get_gpuarch() - dbargs = ['python3', '-m', 'v2python.table_tool', '-v', '-f', self._args.db_file, '-k', self.KERNEL_FAMILY] + dbargs = ['python3', '-m', 'v2python.table_tool'] + if self.verbose: + dbargs += ['-v'] + dbargs += ['-f', self._args.db_file, '-k', self.KERNEL_FAMILY] if args.create_table_only: dbargs += ['--action', 'createtableonly'] self._dbp = subprocess.Popen(dbargs, diff --git a/tritonsrc/_common_test.py b/tritonsrc/_common_test.py index 40aa4d21..1a762d70 100644 --- a/tritonsrc/_common_test.py +++ b/tritonsrc/_common_test.py @@ -149,7 +149,7 @@ def clone_tensor(t, dtype, device=None): def clone_tensor_tuple(in_tensors, dtype, device=None): return tuple([SdpaContext.clone_tensor(t, dtype=dtype, device=device) for t in in_tensors]) - def create_ref_inputs(self): + def create_ref_inputs(self, target_gpu_device='cuda'): ref_device_option = os.getenv('AOTRITON_REF_DEVICE_OPTION', default='default') if ref_device_option == 'default': seqlen_k = self.seqlen_k @@ -161,9 +161,9 @@ def create_ref_inputs(self): if seqlen_k == 587: ref_device = 'cpu' else: - ref_device = 'cuda' + ref_device = target_gpu_device elif ref_device_option == 'cuda': - ref_device = 'cuda' + ref_device = target_gpu_device elif ref_device_option == 'cpu': ref_device = 'cpu' else: From b8c702d7222224187ddd39d27e694d9155817cf5 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:03:42 -0500 Subject: [PATCH 38/51] Move dev-only packages from requirements.txt into requirements-dev.txt Mainly autotune-related scripts --- requirements-dev.txt | 3 +++ requirements.txt | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 requirements-dev.txt diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 00000000..f627c2c1 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,3 @@ +-r requirements.txt +tqdm +textual diff --git a/requirements.txt b/requirements.txt index 49569100..0abbfe0c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,3 @@ pluggy numpy setuptools wheel -tqdm From b5869a118fda01242e047757a635b58de2224eb8 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Fri, 12 Jul 2024 16:50:13 -0500 Subject: [PATCH 39/51] tune_flash.py: Fix the slow splice_pipes --- test/tune_flash.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/tune_flash.py b/test/tune_flash.py index b94c92e0..75156b34 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -240,22 +240,25 @@ def pipe_configs(self, inputs, best_configs): self.splice_pipes() def splice_pipes(self): - for i in range(10): + nattempts = 10 if self.verbose else 1 + for i in range(nattempts): while True: line = self._dbp.stdout.readline() if line: print(line, end='') else: - time.sleep(0.1) + if self.verbose: + time.sleep(0.1) break - for i in range(10): + for i in range(nattempts): while True: line = self._dbp.stderr.readline() if line: print(line, end='', file=sys.stderr) else: - time.sleep(0.1) + if self.verbose: + time.sleep(0.1) break sys.stdout.flush() sys.stderr.flush() From c4f0de52c9c8b2ddb2245d822c966b8be507332c Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Sat, 13 Jul 2024 07:17:01 +0000 Subject: [PATCH 40/51] Fix single GPU script. --- test/tune_flash.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/tune_flash.py b/test/tune_flash.py index 75156b34..02ef3847 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -46,7 +46,7 @@ def gen(self): def do_profile(self): a = self._args for i, tup in enumerate(self.gen()): - print(f"{shard_prefx}[{i:06d}] Handling {tup}") + print(f"[{i:06d}] Handling {tup}") if a.continue_from is not None and i < a.continue_from: continue if a.stop_at is not None and i > a.stop_at: @@ -55,7 +55,7 @@ def do_profile(self): continue action, inputs, best_configs = self.profile_single_config(*tup) if action == 'Success': - self.pipe_configs(inputs, best_configs) + yield inputs, best_configs def profile_single_config(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type): if seqlen_q > 8192 and seqlen_k > 8192: @@ -197,7 +197,7 @@ def verbose(self): def profile_all(self): a = self._args if a.use_multigpu is None: - for inputs, best_configs in TunerWorker(args).do_profile(): + for inputs, best_configs in TunerWorker(a).do_profile(): self.pipe_configs(inputs, best_configs) return shards = list([i for i in range(torch.cuda.device_count())]) if -1 in a.use_multigpu else a.use_multigpu From 8558d73741550b4f054ae7a7c42bebe52c992791 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Sat, 13 Jul 2024 08:41:51 +0000 Subject: [PATCH 41/51] Move database accessing to a separate process, and unify the task generator Now the whole pipeline is: TunerManager -(mp.Q)-> [Worker] * N -(mp.Q)-> DbAccessor -(stdio)-> table_tool.py --- test/attn_torch_function.py | 6 +- test/cpp_autotune.py | 6 +- test/tune_flash.py | 219 ++++++++++++++++++++++++------------ 3 files changed, 153 insertions(+), 78 deletions(-) diff --git a/test/attn_torch_function.py b/test/attn_torch_function.py index 084c30fb..dffef3b5 100644 --- a/test/attn_torch_function.py +++ b/test/attn_torch_function.py @@ -13,8 +13,9 @@ 'return_autotune', 'autotune_validator', 'cpp_autotune_tqdm_position', + 'cpp_autotune_tqdm_prefix', ], - defaults=[False, False, False, None, None]) + defaults=[False, False, False, None, None, '']) VERBOSE=False DEFAULT_PHILOX_SEED = 0x1BF52 @@ -84,7 +85,8 @@ def func(extargs): return ret, (o,) tuning_result = cpp_autotune(ExtraArguments, func, attn_extra_args.autotune_validator, - tqdm_position=attn_extra_args.cpp_autotune_tqdm_position) + tqdm_position=attn_extra_args.cpp_autotune_tqdm_position, + tqdm_prefix=attn_extra_args.cpp_autotune_tqdm_prefix) else: attn_fwd(q, k, v, b, sm_scale, M, o, dropout_p, philox_seed, philox_offset, encoded_softmax, causal); diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py index 8413d160..e9f2c81b 100644 --- a/test/cpp_autotune.py +++ b/test/cpp_autotune.py @@ -100,7 +100,7 @@ def do_bench(fn, *, warmup=25, rep=100, AutotuneResult = namedtuple('AutotuneResult', ['kernel_index', 'time', 'psels', 'copts']) -def cpp_autotune(extarg_klass, kernel_func, validator, *, tqdm_position=None): +def cpp_autotune(extarg_klass, kernel_func, validator, *, tqdm_position=None, tqdm_prefix=''): assert validator is not None kernel_index = 0 extargs = extarg_klass() @@ -133,9 +133,9 @@ def func(): if pbar is None and extargs.total_number_of_kernels > 0: pbar = tqdm(total=extargs.total_number_of_kernels, unit="configs", position=tqdm_position) - pbar.set_description(f'Success {success}, Fail {failed}. Last time {t:.2g}') + pbar.set_description(f'{tqdm_prefix} Success {success}, Fail {failed}. Last time {t:.2g}') if pbar is not None: - pbar.set_description(f'Success {success}, Fail {failed}. Last time {t:.2g}') + pbar.set_description(f'{tqdm_prefix} Success {success}, Fail {failed}. Last time {t:.2g}') pbar.update(1) # print(f'{r.psels=}') diff --git a/test/tune_flash.py b/test/tune_flash.py index 02ef3847..c2b783d4 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -28,36 +28,23 @@ _DEBUG_SKIP_TUNE_BACKWARD = True -class TunerWorker(object): +class ArgArchVerbose: def __init__(self, args): self._args = args self._arch = rocm_get_gpuarch() - self._tqdm_position = 0 - self._gpu_device = 'cuda' @property def verbose(self): return self._args.verbose - def gen(self): - a = self._args - yield from itertools.product(a.batch, a.n_heads, a.d_head, a.seqlen_q, a.seqlen_k, a.causal, a.sm_scale, a.dropout_p, a.return_encoded_softmax, a.dtype, a.bias_type) - - def do_profile(self): - a = self._args - for i, tup in enumerate(self.gen()): - print(f"[{i:06d}] Handling {tup}") - if a.continue_from is not None and i < a.continue_from: - continue - if a.stop_at is not None and i > a.stop_at: - break - if a.dry_run: - continue - action, inputs, best_configs = self.profile_single_config(*tup) - if action == 'Success': - yield inputs, best_configs +class TunerWorker(ArgArchVerbose): + def __init__(self, args): + super().__init__(args) + self._tqdm_position = 0 + self._gpu_device = 'cuda' - def profile_single_config(self, BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type): + def profile_single_config(self, tup, *, shard_prefix=''): + BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type = tup if seqlen_q > 8192 and seqlen_k > 8192: N_HEADS = 1 if causal and seqlen_q != seqlen_k: @@ -113,7 +100,9 @@ def fwd_validator(tri_out): autotune=True, return_autotune=True, autotune_validator=fwd_validator, - cpp_autotune_tqdm_position=self._tqdm_position) + cpp_autotune_tqdm_position=self._tqdm_position, + cpp_autotune_tqdm_prefix=f'{shard_prefix}{tup}', + ) tri_out, encoded_softmax, best_configs = attention(q, k, v, b, causal, sm_scale, dropout_p, ext) if self.verbose: print('Returned best configs') @@ -145,6 +134,7 @@ def fwd_validator(tri_out): return 'Success', inputs, best_configs class IPCTunerWorker(TunerWorker): + END_OF_QUEUE_OBJECT = (-1, None) def set_shard(self, shard): self._tqdm_position = shard @@ -154,35 +144,49 @@ def do_profile(self, ipc_read, ipc_write): a = self._args shard, total_shards = ipc_read.get() print(f'{shard=} {total_shards=}') - shard_prefx= '' if shard is None else f'[Shard {shard:02d}/{total_shards:02d}]' + shard_prefix= '' if shard is None else f'[Shard {shard:02d}/{total_shards:02d}]' self.set_shard(shard) + with torch.cuda.device(shard): + while True: + try: + i, tup = ipc_read.get() + if i == -1 and tup is None: + break + prefix = shard_prefix + f'[{i:06d}]' + action, inputs, best_configs = self.profile_single_config(tup, shard_prefix=prefix) + if action == 'Success': + ipc_write.put((i, inputs, best_configs)) + except ValueError: # mp.Queue closed + break + ''' with torch.cuda.device(shard): for i, tup in enumerate(self.gen()): if i % total_shards != shard: continue - print(f"{shard_prefx}[{i:06d}] Handling {tup}") + print(f"{shard_prefix}[{i:06d}] Handling {tup}") if a.continue_from is not None and i < a.continue_from: continue if a.stop_at is not None and i > a.stop_at: break if a.dry_run: continue - action, inputs, best_configs = self.profile_single_config(*tup) + action, inputs, best_configs = self.profile_single_config(tup) if action == 'Success': ipc_write.put((inputs, best_configs)) ipc_write.put((None, shard)) + ''' -class Tuner(object): +class DbAccessor(ArgArchVerbose): KERNEL_FAMILY = 'FLASH' + END_OF_QUEUE_OBJECT = (-1, None, None) - def __init__(self, args): - self._args = args - self._arch = rocm_get_gpuarch() + def create_dbp(self): + a = self._args dbargs = ['python3', '-m', 'v2python.table_tool'] if self.verbose: dbargs += ['-v'] dbargs += ['-f', self._args.db_file, '-k', self.KERNEL_FAMILY] - if args.create_table_only: + if a.create_table_only: dbargs += ['--action', 'createtableonly'] self._dbp = subprocess.Popen(dbargs, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -190,52 +194,25 @@ def __init__(self, args): os.set_blocking(self._dbp.stdout.fileno(), False) os.set_blocking(self._dbp.stderr.fileno(), False) - @property - def verbose(self): - return self._args.verbose - - def profile_all(self): - a = self._args - if a.use_multigpu is None: - for inputs, best_configs in TunerWorker(a).do_profile(): - self.pipe_configs(inputs, best_configs) - return - shards = list([i for i in range(torch.cuda.device_count())]) if -1 in a.use_multigpu else a.use_multigpu - ipc_write = Queue() - ipc_read = Queue() - ipc_tuners = [IPCTunerWorker(self._args) for i in shards] - workers = [Process(target=worker.do_profile, args=(ipc_write, ipc_read)) for worker in ipc_tuners] - nlive_processes = len(workers) - for i, p in enumerate(workers): - ipc_write.put((i, nlive_processes)) - for p in workers: - p.start() - while nlive_processes > 0: + def pipe_from_ipc(self, ipc_read): + self.create_dbp() + while True: try: - inputs, best_configs = ipc_read.get(timeout=30) - # print(f'{inputs=}') - # print(f'{best_configs=}') - if inputs is None: - shard = best_configs - nlive_processes -= 1 - print(f'Shard {shard} has completed all tasks. Updated {nlive_processes=}') - continue - self.pipe_configs(inputs, best_configs) - except queue.Empty: - print("Timed out. Re-scan live processes") - # "watchdog" - nlive_processes = 0 - for i, p in enumerate(workers): - nlive_processes += 1 if p.is_alive() else 0 - print(f"{nlive_processes=}") - for p in workers: - p.join() + i, inputs, best_configs = ipc_read.get(timeout=30) + if i == -1 and inputs is None: + print('[DbAccessor] No more tasks. Exiting') + break + self.pipe_configs(inputs, best_configs, prefix=f'[{i:06d}]') + except ValueError: # mp.Queue closed + break + self.stop() + return - def pipe_configs(self, inputs, best_configs): + def pipe_configs(self, inputs, best_configs, *, prefix=''): for kernel_name, best in best_configs: j = self.translate_config(inputs, kernel_name, best) js = json.dumps(j, separators=(',', ':')) - print(f'Piping to db process {js}') + print(f'{prefix}Piping to db process {js}') print(js, file=self._dbp.stdin, flush=True) self.splice_pipes() @@ -279,6 +256,103 @@ def stop(self): self._dbp.wait() self.splice_pipes() +class TunerManager(ArgArchVerbose): + + def gen(self): + a = self._args + yield from itertools.product(a.batch, a.n_heads, a.d_head, a.seqlen_q, a.seqlen_k, a.causal, a.sm_scale, a.dropout_p, a.return_encoded_softmax, a.dtype, a.bias_type) + + def gen_itup(self): + a = self._args + for i, tup in enumerate(self.gen()): + # print(f"[{i:06d}] Handling {tup}") + if a.continue_from is not None and i < a.continue_from: + continue + if a.stop_at is not None and i > a.stop_at: + break + if a.dry_run: + continue + yield i, tup + + def profile_all(self): + a = self._args + dba = DbAccessor(a) + if a.use_multigpu is None: + for i, tup in self.gen_itup(): + action, inputs, best_configs = self.profile_single_config(tup) + if action == 'Success': + dba.pipe_configs(inputs, best_configs) + dba.stop() + return + shards = list([i for i in range(torch.cuda.device_count())]) if -1 in a.use_multigpu else a.use_multigpu + ipc_write = Queue() + ipc_worker_out = Queue() + ipc_tuners = [IPCTunerWorker(self._args) for i in shards] + workers = [Process(target=worker.do_profile, args=(ipc_write, ipc_worker_out)) for worker in ipc_tuners] + db_accessor = Process(target=dba.pipe_from_ipc, args=(ipc_worker_out,)) + + ''' + Start processes + ''' + nlive_processes = len(workers) + for i, p in enumerate(workers): + ipc_write.put((i, nlive_processes)) + for p in workers: + p.start() + db_accessor.start() + ''' + Dispatching tasks to ipc_write + ''' + for i, tup in self.gen_itup(): + obj = (i, tup) + any_process_alive = self.write_to_ipc(ipc_write, obj, workers) + if not any_process_alive: + break + nlive_processes = self.scan_live_processes(workers) + for i in range(nlive_processes): + self.write_to_ipc(ipc_write, IPCTunerWorker.END_OF_QUEUE_OBJECT, workers) + ipc_write.close() + """ + while nlive_processes > 0: + try: + inputs, best_configs = ipc_worker_out.get(timeout=30) + # print(f'{inputs=}') + # print(f'{best_configs=}') + if inputs is None: + shard = best_configs + nlive_processes -= 1 + print(f'Shard {shard} has completed all tasks. Updated {nlive_processes=}') + continue + self.pipe_configs(inputs, best_configs) + except queue.Empty: + print("Timed out. Re-scan live processes") + # "watchdog" + """ + for p in workers: + p.join() + print('All workers joined') + ipc_worker_out.put(DbAccessor.END_OF_QUEUE_OBJECT) + ipc_worker_out.close() + + def write_to_ipc(self, ipc_write, obj, workers): + while True: + try: + ipc_write.put(obj, timeout=60) + return True + except queue.Full: + print("Task Queue Full. Re-scan live processes") + nlive_processes = self.scan_live_processes(workers) + print(f"{nlive_processes=}") + if nlive_processes == 0: + print("PANIC: All Processes Died") + return False + + def scan_live_processes(self, workers): + nlive_processes = 0 + for i, p in enumerate(workers): + nlive_processes += 1 if p.is_alive() else 0 + return nlive_processes + def parse(): p = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) p.add_argument('--batch', type=int, nargs=1, default=[1], help='(Not a functional) Batch size.') @@ -314,9 +388,8 @@ def parse(): def main(): multiprocessing.set_start_method('spawn') # Otherwise torch complains args = parse() - tuner = Tuner(args) + tuner = TunerManager(args) tuner.profile_all() - tuner.stop() if __name__ == '__main__': main() From 18b56c0c4e3d9f44d45dadabe9435ad1e63fdabb Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Sat, 13 Jul 2024 22:22:54 +0000 Subject: [PATCH 42/51] tune_flash: add --json_file, improve --dry_run to report total numbers, and be less verbose. --- test/tune_flash.py | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/test/tune_flash.py b/test/tune_flash.py index c2b783d4..cd0b24ad 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -37,6 +37,10 @@ def __init__(self, args): def verbose(self): return self._args.verbose + def print(self, text): + if self.verbose: + print(text) + class TunerWorker(ArgArchVerbose): def __init__(self, args): super().__init__(args) @@ -44,15 +48,18 @@ def __init__(self, args): self._gpu_device = 'cuda' def profile_single_config(self, tup, *, shard_prefix=''): + a = self._args BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type = tup if seqlen_q > 8192 and seqlen_k > 8192: N_HEADS = 1 if causal and seqlen_q != seqlen_k: - print('FA does not support accept casual=True when seqlen_q != seqlen_k. Skipping') + self.print('FA does not support accept casual=True when seqlen_q != seqlen_k. Skipping') return 'Skip', None, None if causal and bias_type != 0: - print('FA does not support accept casual=True when bias_type != 0. Skipping') + self.print('FA does not support accept casual=True when bias_type != 0. Skipping') return 'Skip', None, None + if a.dry_run: + return 'Dryrun', None, None torch.cuda.empty_cache() ''' Create reference dropout_mask @@ -69,7 +76,6 @@ def profile_single_config(self, tup, *, shard_prefix=''): else: mask = None torch.cuda.empty_cache() - a = self._args ''' Create SdpaContext for testing ''' @@ -182,6 +188,11 @@ class DbAccessor(ArgArchVerbose): def create_dbp(self): a = self._args + if a.json_file is not None and not a.dry_run: + assert a.json_file != a.db_file + self._jsonfile = open(a.json_file, 'w') + else: + self._jsonfile = None dbargs = ['python3', '-m', 'v2python.table_tool'] if self.verbose: dbargs += ['-v'] @@ -212,7 +223,10 @@ def pipe_configs(self, inputs, best_configs, *, prefix=''): for kernel_name, best in best_configs: j = self.translate_config(inputs, kernel_name, best) js = json.dumps(j, separators=(',', ':')) - print(f'{prefix}Piping to db process {js}') + if self._jsonfile is None: + print(f'{prefix}Piping to db process {js}') + else: + print(js, file=self._jsonfile, flush=True) print(js, file=self._dbp.stdin, flush=True) self.splice_pipes() @@ -251,6 +265,8 @@ def translate_config(self, inputs, kernel_name, best): return tuning_result def stop(self): + if self._jsonfile is not None: + self._jsonfile.close() self._dbp.stdin.close() print("Waiting for database process to terminate") self._dbp.wait() @@ -270,19 +286,26 @@ def gen_itup(self): continue if a.stop_at is not None and i > a.stop_at: break - if a.dry_run: - continue yield i, tup def profile_all(self): a = self._args dba = DbAccessor(a) if a.use_multigpu is None: + dba.create_dbp() + dry_run_counter = 0 + skip_counter = 0 + worker = TunerWorker(a) for i, tup in self.gen_itup(): - action, inputs, best_configs = self.profile_single_config(tup) + action, inputs, best_configs = worker.profile_single_config(tup) if action == 'Success': dba.pipe_configs(inputs, best_configs) + if action == 'Dryrun': + dry_run_counter += 1 + if action == 'Skip': + skip_counter += 1 dba.stop() + print(f"Valid sample points {dry_run_counter=}. Skipped invalid/unsupported points {skip_counter}") return shards = list([i for i in range(torch.cuda.device_count())]) if -1 in a.use_multigpu else a.use_multigpu ipc_write = Queue() @@ -333,6 +356,8 @@ def profile_all(self): print('All workers joined') ipc_worker_out.put(DbAccessor.END_OF_QUEUE_OBJECT) ipc_worker_out.close() + db_accessor.join() + print('Db accessor joined') def write_to_ipc(self, ipc_write, obj, workers): while True: @@ -377,6 +402,7 @@ def parse(): p.add_argument('--continue_from', type=int, default=None, help="Continue from n-th functional set") p.add_argument('--stop_at', type=int, default=None, help="Stop at n-th functional set") p.add_argument('--db_file', type=str, required=True, help="Sqlite Database file") + p.add_argument('--json_file', type=str, default=None, help="Json file for record. Disables printing json to stdout") p.add_argument('--create_table_only', action='store_true', help="Do not insert data, only create tables. Used for schema updates.") p.add_argument('--use_multigpu', type=int, nargs='+', default=None, help='Profiling on multiple GPUs. Passing -1 for all GPUs available to pytorch.') args = p.parse_args() From fcfa3e81453c2733d8ca773a4ca731d87c9fe9ca Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Sun, 14 Jul 2024 06:24:58 +0000 Subject: [PATCH 43/51] tune_flash: Move the testing to a separate process to avoid segfault. However this seriously reduced the tuning process. Thinking of alternatives.. --- test/aotriton_flash.py | 10 +++++++++ test/attn_torch_function.py | 42 ++++++++++++++++++++++++++++++------- test/cpp_autotune.py | 20 +++++++++--------- test/tune_flash.py | 20 +++++++++++++----- 4 files changed, 70 insertions(+), 22 deletions(-) diff --git a/test/aotriton_flash.py b/test/aotriton_flash.py index ad76c8d6..92edfe15 100644 --- a/test/aotriton_flash.py +++ b/test/aotriton_flash.py @@ -58,6 +58,16 @@ def attn_fwd(q, k, v, b, sm_scale, M, o, # print(f'{err=}') return err +def ipc_attn_fwd(ipc): + q, k, v, b, sm_scale, M, o, dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal, force_kernel_index, shard = ipc.get() + extargs = ExtraArguments() + extargs.force_kernel_index = force_kernel_index + import torch + with torch.cuda.device(shard): + return attn_fwd(q, k, v, b, sm_scale, M, o, + dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal, + extargs) + def attn_bwd(q, k, v, b, sm_scale, o, dout, dq, dk, dv, db, L, delta, dropout_p, philox_seed, philox_offset, is_causal): b = mk_aotensor(b, if_empty_then_like=q) diff --git a/test/attn_torch_function.py b/test/attn_torch_function.py index dffef3b5..898dad5a 100644 --- a/test/attn_torch_function.py +++ b/test/attn_torch_function.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT import torch -from aotriton_flash import attn_fwd, attn_bwd, debug_fill_dropout_rng, ExtraArguments, hipError_t +from aotriton_flash import attn_fwd, ipc_attn_fwd, attn_bwd, debug_fill_dropout_rng, ExtraArguments, hipError_t from collections import namedtuple from cpp_autotune import do_bench, cpp_autotune @@ -14,8 +14,9 @@ 'autotune_validator', 'cpp_autotune_tqdm_position', 'cpp_autotune_tqdm_prefix', + 'gpu_device', ], - defaults=[False, False, False, None, None, '']) + defaults=[False, False, False, None, None, '', None]) VERBOSE=False DEFAULT_PHILOX_SEED = 0x1BF52 @@ -73,16 +74,43 @@ def forward(ctx, q, k, v, b, causal, sm_scale, dropout_p, if autotune and return_autotune: assert attn_extra_args.autotune_validator is not None - def func(extargs): - # print(f'running attn_fwd with {extargs.force_kernel_index=}') + def sameprocess_func(extargs): + args = (q, k, v, b, sm_scale, M, o, + dropout_p, philox_seed, philox_offset, encoded_softmax, causal, + extargs) try: - ret = attn_fwd(q, k, v, b, sm_scale, M, o, - dropout_p, philox_seed, philox_offset, encoded_softmax, causal, - extargs); + ret = attn_fwd(*args) except Exception as e: print(e) return hipError_t.hipErrorLaunchFailure, None return ret, (o,) + def ipc_func(force_kernel_index): + ipc = torch.multiprocessing.Queue() + shard = attn_extra_args.gpu_device + p = torch.multiprocessing.Process(target=ipc_attn_fwd, args=(ipc,)) + # print(f'{q.data_ptr()=:x}') + # print(f'{k.data_ptr()=:x}') + # print(f'{v.data_ptr()=:x}') + # print(f'{b.data_ptr()=:x}') + # print(f'{M.data_ptr()=:x}') + # print(f'{o.data_ptr()=:x}') + ipc.put((q, k, v, b, sm_scale, M, o, + dropout_p, philox_seed, philox_offset, encoded_softmax, causal, + force_kernel_index, shard)) + # print(f'Process attn_fwd starting') + p.start() + p.join() + # print(f'Process attn_fwd joined') + # print(f'Process exitcode {p.exitcode}') + ret = hipError_t.hipSuccess if p.exitcode == 0 else hipError_t.ErrorLaunchFailure + return ret, (o,) + def func(extargs, is_testing): + o.fill_(float('nan')) + # print(f'{is_testing=}') + if not is_testing: + return sameprocess_func(extargs) + return ipc_func(extargs.force_kernel_index) + # print(f'running attn_fwd with {extargs.force_kernel_index=}') tuning_result = cpp_autotune(ExtraArguments, func, attn_extra_args.autotune_validator, tqdm_position=attn_extra_args.cpp_autotune_tqdm_position, diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py index e9f2c81b..95c922d2 100644 --- a/test/cpp_autotune.py +++ b/test/cpp_autotune.py @@ -34,7 +34,7 @@ def do_bench(fn, *, warmup=25, rep=100, import torch torch.cuda.synchronize() - ret, outs = fn() + ret, outs = fn(is_testing=True) if ret != hipError_t.hipSuccess: # print(f'{ret=}', file=sys.stderr, flush=True) return float('inf') @@ -110,26 +110,26 @@ def cpp_autotune(extarg_klass, kernel_func, validator, *, tqdm_position=None, tq success = 0 while True: extargs.force_kernel_index = kernel_index - def func(): - return kernel_func(extargs) + def func(is_testing=False): + return kernel_func(extargs, is_testing) # t = do_bench(func, validator=validator, quantiles=(0.5, 0.2, 0.8)) t = do_bench(func, validator=validator) - r = AutotuneResult(kernel_index=kernel_index, - time=t, - psels=json.loads(extargs.selected_kernel_psels), - copts=json.loads(extargs.selected_kernel_copts)) - timings.append(r) ''' if kernel_index == 0: print(f'Benchmarking with {kernel_index=}. Time {t}') else: print(f'Benchmarking with {kernel_index=} out of {extargs.total_number_of_kernels}. Time {t}') ''' - assert extargs.total_number_of_kernels > 0 + # assert extargs.total_number_of_kernels > 0 if math.isinf(t): failed += 1 else: success += 1 + r = AutotuneResult(kernel_index=kernel_index, + time=t, + psels=json.loads(extargs.selected_kernel_psels), + copts=json.loads(extargs.selected_kernel_copts)) + timings.append(r) if pbar is None and extargs.total_number_of_kernels > 0: pbar = tqdm(total=extargs.total_number_of_kernels, unit="configs", position=tqdm_position) @@ -141,7 +141,7 @@ def func(): # print(f'{r.psels=}') # print(f'{r.copts=}') kernel_index += 1 - if kernel_index >= extargs.total_number_of_kernels: + if extargs.total_number_of_kernels > 0 and kernel_index >= extargs.total_number_of_kernels: break # print(f'cpp_autotune {timings=}') ret = min(timings, key=lambda atr:atr.time) diff --git a/test/tune_flash.py b/test/tune_flash.py index cd0b24ad..6a43b713 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -47,7 +47,7 @@ def __init__(self, args): self._tqdm_position = 0 self._gpu_device = 'cuda' - def profile_single_config(self, tup, *, shard_prefix=''): + def profile_single_config(self, tup, *, prefix='', shard=None): a = self._args BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type = tup if seqlen_q > 8192 and seqlen_k > 8192: @@ -107,7 +107,8 @@ def fwd_validator(tri_out): return_autotune=True, autotune_validator=fwd_validator, cpp_autotune_tqdm_position=self._tqdm_position, - cpp_autotune_tqdm_prefix=f'{shard_prefix}{tup}', + cpp_autotune_tqdm_prefix=f'{prefix}{tup}', + gpu_device=shard, ) tri_out, encoded_softmax, best_configs = attention(q, k, v, b, causal, sm_scale, dropout_p, ext) if self.verbose: @@ -143,6 +144,7 @@ class IPCTunerWorker(TunerWorker): END_OF_QUEUE_OBJECT = (-1, None) def set_shard(self, shard): + self._shard = shard self._tqdm_position = shard self._gpu_device = f'cuda:{shard}' @@ -159,7 +161,9 @@ def do_profile(self, ipc_read, ipc_write): if i == -1 and tup is None: break prefix = shard_prefix + f'[{i:06d}]' - action, inputs, best_configs = self.profile_single_config(tup, shard_prefix=prefix) + action, inputs, best_configs = self.profile_single_config(tup, + prefix=prefix, + shard=self._shard) if action == 'Success': ipc_write.put((i, inputs, best_configs)) except ValueError: # mp.Queue closed @@ -209,7 +213,7 @@ def pipe_from_ipc(self, ipc_read): self.create_dbp() while True: try: - i, inputs, best_configs = ipc_read.get(timeout=30) + i, inputs, best_configs = ipc_read.get() if i == -1 and inputs is None: print('[DbAccessor] No more tasks. Exiting') break @@ -353,11 +357,15 @@ def profile_all(self): """ for p in workers: p.join() + ipc_write.close() print('All workers joined') ipc_worker_out.put(DbAccessor.END_OF_QUEUE_OBJECT) ipc_worker_out.close() db_accessor.join() print('Db accessor joined') + # Otherwise current process may block if any child died + ipc_write.cancel_join_thread() + ipc_worker_out.cancel_join_thread() def write_to_ipc(self, ipc_write, obj, workers): while True: @@ -412,7 +420,9 @@ def parse(): return args def main(): - multiprocessing.set_start_method('spawn') # Otherwise torch complains + assert os.getenv('PYTORCH_NO_CUDA_MEMORY_CACHING', default=0) == 0, 'PYTORCH_NO_HIP_MEMORY_CACHING does not play nicely with torch.multiprocessing. See https://github.com/pytorch/pytorch/issues/114534' + torch.multiprocessing.set_start_method('spawn', force=True) # Otherwise torch complains + # multiprocessing.set_start_method('spawn') # "context has already been set" args = parse() tuner = TunerManager(args) tuner.profile_all() From f7b1f286cfc2ae11dde8319849a27b42246adb2d Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Sun, 14 Jul 2024 07:23:38 +0000 Subject: [PATCH 44/51] Cache the minesweeping process to avoid creating processes repeatedly Performance restored to normal with this trick. --- test/aotriton_flash.py | 22 ++++++++++++------- test/attn_torch_function.py | 43 ++++++++++++++++++++++++++++--------- test/cpp_autotune.py | 9 +++++++- test/tune_flash.py | 33 +++++++++++++++++++++++++--- 4 files changed, 85 insertions(+), 22 deletions(-) diff --git a/test/aotriton_flash.py b/test/aotriton_flash.py index 92edfe15..0be463f7 100644 --- a/test/aotriton_flash.py +++ b/test/aotriton_flash.py @@ -58,15 +58,21 @@ def attn_fwd(q, k, v, b, sm_scale, M, o, # print(f'{err=}') return err -def ipc_attn_fwd(ipc): - q, k, v, b, sm_scale, M, o, dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal, force_kernel_index, shard = ipc.get() - extargs = ExtraArguments() - extargs.force_kernel_index = force_kernel_index +def ipc_attn_fwd(ipc_to_read, ipc_to_write): import torch - with torch.cuda.device(shard): - return attn_fwd(q, k, v, b, sm_scale, M, o, - dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal, - extargs) + while True: + tup = ipc_to_read.get() + if tup is None: + break + q, k, v, b, sm_scale, M, o, dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal, force_kernel_index, shard = tup + extargs = ExtraArguments() + extargs.force_kernel_index = force_kernel_index + with torch.cuda.device(shard): + ret = attn_fwd(q, k, v, b, sm_scale, M, o, + dropout_p, philox_seed, philox_offset, encoded_softmax, is_causal, + extargs) + torch.cuda.synchronize() + ipc_to_write.put(ret) def attn_bwd(q, k, v, b, sm_scale, o, dout, dq, dk, dv, db, L, delta, dropout_p, philox_seed, philox_offset, is_causal): diff --git a/test/attn_torch_function.py b/test/attn_torch_function.py index 898dad5a..2dd8ea6d 100644 --- a/test/attn_torch_function.py +++ b/test/attn_torch_function.py @@ -3,6 +3,8 @@ # SPDX-License-Identifier: MIT import torch +import queue +from torch.multiprocessing import Process from aotriton_flash import attn_fwd, ipc_attn_fwd, attn_bwd, debug_fill_dropout_rng, ExtraArguments, hipError_t from collections import namedtuple from cpp_autotune import do_bench, cpp_autotune @@ -15,8 +17,9 @@ 'cpp_autotune_tqdm_position', 'cpp_autotune_tqdm_prefix', 'gpu_device', + 'tune_worker', ], - defaults=[False, False, False, None, None, '', None]) + defaults=[False, False, False, None, None, '', None, None]) VERBOSE=False DEFAULT_PHILOX_SEED = 0x1BF52 @@ -85,30 +88,50 @@ def sameprocess_func(extargs): return hipError_t.hipErrorLaunchFailure, None return ret, (o,) def ipc_func(force_kernel_index): - ipc = torch.multiprocessing.Queue() shard = attn_extra_args.gpu_device - p = torch.multiprocessing.Process(target=ipc_attn_fwd, args=(ipc,)) + tune_worker = attn_extra_args.tune_worker + def factory(): + ipc_to_worker = torch.multiprocessing.Queue() + ipc_from_worker = torch.multiprocessing.Queue() + ipc_to_worker.cancel_join_thread() + ipc_from_worker.cancel_join_thread() + p = Process(target=ipc_attn_fwd, + args=(ipc_to_worker, ipc_from_worker)) + p.start() + return (ipc_to_worker, ipc_from_worker, p) + ipc_to_worker, ipc_from_worker, p = tune_worker.request_cached_gpukernel_process(ipc_attn_fwd, factory) # print(f'{q.data_ptr()=:x}') # print(f'{k.data_ptr()=:x}') # print(f'{v.data_ptr()=:x}') # print(f'{b.data_ptr()=:x}') # print(f'{M.data_ptr()=:x}') # print(f'{o.data_ptr()=:x}') - ipc.put((q, k, v, b, sm_scale, M, o, - dropout_p, philox_seed, philox_offset, encoded_softmax, causal, - force_kernel_index, shard)) + ipc_to_worker.put((q, k, v, b, sm_scale, M, o, + dropout_p, philox_seed, philox_offset, encoded_softmax, causal, + force_kernel_index, shard)) + while p.is_alive(): + try: + iret = ipc_from_worker.get(timeout=1) + break + except queue.Empty: + # print(f'Process timeout {p.is_alive()=}') + pass # print(f'Process attn_fwd starting') - p.start() - p.join() + if not p.is_alive(): + # print(f'Process exitcode {p.exitcode}') + tune_worker.invalid_gpukernel_process_cache(ipc_attn_fwd) + p.join() + ret = hipError_t.hipErrorLaunchFailure + else: + ret = hipError_t.hipSuccess if iret == 0 else hipError_t.hipErrorLaunchFailure # print(f'Process attn_fwd joined') # print(f'Process exitcode {p.exitcode}') - ret = hipError_t.hipSuccess if p.exitcode == 0 else hipError_t.ErrorLaunchFailure return ret, (o,) def func(extargs, is_testing): - o.fill_(float('nan')) # print(f'{is_testing=}') if not is_testing: return sameprocess_func(extargs) + o.fill_(float('nan')) return ipc_func(extargs.force_kernel_index) # print(f'running attn_fwd with {extargs.force_kernel_index=}') tuning_result = cpp_autotune(ExtraArguments, func, diff --git a/test/cpp_autotune.py b/test/cpp_autotune.py index 95c922d2..994ac3d6 100644 --- a/test/cpp_autotune.py +++ b/test/cpp_autotune.py @@ -100,6 +100,9 @@ def do_bench(fn, *, warmup=25, rep=100, AutotuneResult = namedtuple('AutotuneResult', ['kernel_index', 'time', 'psels', 'copts']) +# cannot be maxint in case extargs.total_number_of_kernels never returns a positive number +CPP_AUTOTUNE_MAX_KERNELS = 100 + def cpp_autotune(extarg_klass, kernel_func, validator, *, tqdm_position=None, tqdm_prefix=''): assert validator is not None kernel_index = 0 @@ -108,6 +111,7 @@ def cpp_autotune(extarg_klass, kernel_func, validator, *, tqdm_position=None, tq pbar = None failed = 0 success = 0 + total_number_of_kernels = CPP_AUTOTUNE_MAX_KERNELS while True: extargs.force_kernel_index = kernel_index def func(is_testing=False): @@ -124,6 +128,9 @@ def func(is_testing=False): if math.isinf(t): failed += 1 else: + if extargs.total_number_of_kernels > 0: + assert extargs.total_number_of_kernels <= CPP_AUTOTUNE_MAX_KERNELS + total_number_of_kernels = extargs.total_number_of_kernels success += 1 r = AutotuneResult(kernel_index=kernel_index, time=t, @@ -141,7 +148,7 @@ def func(is_testing=False): # print(f'{r.psels=}') # print(f'{r.copts=}') kernel_index += 1 - if extargs.total_number_of_kernels > 0 and kernel_index >= extargs.total_number_of_kernels: + if kernel_index >= total_number_of_kernels: break # print(f'cpp_autotune {timings=}') ret = min(timings, key=lambda atr:atr.time) diff --git a/test/tune_flash.py b/test/tune_flash.py index 6a43b713..0d133dc1 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -2,6 +2,12 @@ # Copyright © 2023-2024 Advanced Micro Devices, Inc. # SPDX-License-Identifier: MIT +import os +# FIXME: Should set PYTORCH_NO_HIP_MEMORY_CACHING=1 as well but need to wait for +# https://github.com/pytorch/pytorch/issues/114534 +os.environ['HSA_SVM_GUARD_PAGES'] = '1' +os.environ['HSA_DISABLE_FRAGMENT_ALLOCATOR'] = '1' + import pytest import torch import json @@ -12,7 +18,6 @@ from multiprocessing import Process, Queue import argparse import itertools -import os import time import math @@ -109,6 +114,7 @@ def fwd_validator(tri_out): cpp_autotune_tqdm_position=self._tqdm_position, cpp_autotune_tqdm_prefix=f'{prefix}{tup}', gpu_device=shard, + tune_worker=self, ) tri_out, encoded_softmax, best_configs = attention(q, k, v, b, causal, sm_scale, dropout_p, ext) if self.verbose: @@ -143,17 +149,29 @@ def fwd_validator(tri_out): class IPCTunerWorker(TunerWorker): END_OF_QUEUE_OBJECT = (-1, None) - def set_shard(self, shard): + ''' + Initialize multiprocessing related variables + ''' + def init_mp(self, shard): self._shard = shard self._tqdm_position = shard self._gpu_device = f'cuda:{shard}' + self._cached_gpukernel_process = {} + + def clean_mp(self, shard): + for k, tup in self._cached_gpukernel_process.items(): + ipc_to, ipc_from, p = tup + ipc_to.put(None) + p.join() + ipc_to.close() + ipc_from.close() def do_profile(self, ipc_read, ipc_write): a = self._args shard, total_shards = ipc_read.get() print(f'{shard=} {total_shards=}') shard_prefix= '' if shard is None else f'[Shard {shard:02d}/{total_shards:02d}]' - self.set_shard(shard) + self.init_mp(shard) with torch.cuda.device(shard): while True: try: @@ -168,6 +186,7 @@ def do_profile(self, ipc_read, ipc_write): ipc_write.put((i, inputs, best_configs)) except ValueError: # mp.Queue closed break + self.clean_mp(shard) ''' with torch.cuda.device(shard): for i, tup in enumerate(self.gen()): @@ -186,6 +205,14 @@ def do_profile(self, ipc_read, ipc_write): ipc_write.put((None, shard)) ''' + def request_cached_gpukernel_process(self, target, factory): + if target not in self._cached_gpukernel_process: + self._cached_gpukernel_process[target] = factory() + return self._cached_gpukernel_process[target] + + def invalid_gpukernel_process_cache(self, target): + del self._cached_gpukernel_process[target] + class DbAccessor(ArgArchVerbose): KERNEL_FAMILY = 'FLASH' END_OF_QUEUE_OBJECT = (-1, None, None) From a1507162cea7a6f7c43bf2c1b9993b3f575fe997 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 15 Jul 2024 09:50:47 +0000 Subject: [PATCH 45/51] Remove 16k from seqlen_q/k, record task id and skipped tests in json --- test/tune_flash.py | 129 +++++++++++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 51 deletions(-) diff --git a/test/tune_flash.py b/test/tune_flash.py index 0d133dc1..ec9435c2 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -51,18 +51,34 @@ def __init__(self, args): super().__init__(args) self._tqdm_position = 0 self._gpu_device = 'cuda' + self._cached_gpukernel_process = {} def profile_single_config(self, tup, *, prefix='', shard=None): a = self._args BATCH, N_HEADS, D_HEAD, seqlen_q, seqlen_k, causal, sm_scale, dropout_p, return_encoded_softmax, dtype, bias_type = tup + head_dim_rounded = 2 ** (D_HEAD - 1).bit_length() + head_dim_rounded = max(16, head_dim_rounded) + inputs = { + 'Q_dtype': str(dtype), + 'N_HEADS': N_HEADS, + 'D_HEAD': D_HEAD, + 'max_seqlen_q': seqlen_q, + 'max_seqlen_k': seqlen_k, + 'CAUSAL': causal, + 'RETURN_ENCODED_SOFTMAX': return_encoded_softmax, + 'BLOCK_DMODEL': head_dim_rounded, + 'ENABLE_DROPOUT' : dropout_p > 0.0, + 'PADDED_HEAD' : head_dim_rounded != D_HEAD, + 'BIAS_TYPE' : bias_type, + } if seqlen_q > 8192 and seqlen_k > 8192: N_HEADS = 1 if causal and seqlen_q != seqlen_k: self.print('FA does not support accept casual=True when seqlen_q != seqlen_k. Skipping') - return 'Skip', None, None + return 'Skip', inputs, None if causal and bias_type != 0: self.print('FA does not support accept casual=True when bias_type != 0. Skipping') - return 'Skip', None, None + return 'Skip', inputs, None if a.dry_run: return 'Dryrun', None, None torch.cuda.empty_cache() @@ -129,23 +145,40 @@ def fwd_validator(tri_out): print('Returned best configs after backward') for kernel_name, best in best_configs: print(f'{kernel_name=}') - head_dim_rounded = 2 ** (D_HEAD - 1).bit_length() - head_dim_rounded = max(16, head_dim_rounded) - inputs = { - 'Q_dtype': str(dtype), - 'N_HEADS': N_HEADS, - 'D_HEAD': D_HEAD, - 'max_seqlen_q': seqlen_q, - 'max_seqlen_k': seqlen_k, - 'CAUSAL': causal, - 'RETURN_ENCODED_SOFTMAX': return_encoded_softmax, - 'BLOCK_DMODEL': head_dim_rounded, - 'ENABLE_DROPOUT' : dropout_p > 0.0, - 'PADDED_HEAD' : head_dim_rounded != D_HEAD, - 'BIAS_TYPE' : bias_type, - } return 'Success', inputs, best_configs + def do_profile(self, dba, gen): + dry_run_counter = 0 + skip_counter = 0 + for i, tup in gen(): + action, inputs, best_configs = self.profile_single_config(tup) + if action == 'Success': + dba.pipe_configs(inputs, best_configs, _debug_task_id=i) + if action == 'Dryrun': + dry_run_counter += 1 + if action == 'Skip': + dba.pipe_skipped_configs(inputs, _debug_task_id=i) + skip_counter += 1 + dba.stop() + self.clean_cached_gpukernel_process() + print(f"Valid sample points {dry_run_counter=}. Skipped invalid/unsupported points {skip_counter}") + + def request_cached_gpukernel_process(self, target, factory): + if target not in self._cached_gpukernel_process: + self._cached_gpukernel_process[target] = factory() + return self._cached_gpukernel_process[target] + + def invalid_gpukernel_process_cache(self, target): + del self._cached_gpukernel_process[target] + + def clean_cached_gpukernel_process(self): + for k, tup in self._cached_gpukernel_process.items(): + ipc_to, ipc_from, p = tup + ipc_to.put(None) + p.join() + ipc_to.close() + ipc_from.close() + class IPCTunerWorker(TunerWorker): END_OF_QUEUE_OBJECT = (-1, None) @@ -159,12 +192,7 @@ def init_mp(self, shard): self._cached_gpukernel_process = {} def clean_mp(self, shard): - for k, tup in self._cached_gpukernel_process.items(): - ipc_to, ipc_from, p = tup - ipc_to.put(None) - p.join() - ipc_to.close() - ipc_from.close() + self.clean_cached_gpukernel_process() def do_profile(self, ipc_read, ipc_write): a = self._args @@ -176,14 +204,14 @@ def do_profile(self, ipc_read, ipc_write): while True: try: i, tup = ipc_read.get() + # print(f'ipc_read {i} {tup}') if i == -1 and tup is None: break prefix = shard_prefix + f'[{i:06d}]' action, inputs, best_configs = self.profile_single_config(tup, prefix=prefix, shard=self._shard) - if action == 'Success': - ipc_write.put((i, inputs, best_configs)) + ipc_write.put((i, action, inputs, best_configs)) except ValueError: # mp.Queue closed break self.clean_mp(shard) @@ -205,14 +233,6 @@ def do_profile(self, ipc_read, ipc_write): ipc_write.put((None, shard)) ''' - def request_cached_gpukernel_process(self, target, factory): - if target not in self._cached_gpukernel_process: - self._cached_gpukernel_process[target] = factory() - return self._cached_gpukernel_process[target] - - def invalid_gpukernel_process_cache(self, target): - del self._cached_gpukernel_process[target] - class DbAccessor(ArgArchVerbose): KERNEL_FAMILY = 'FLASH' END_OF_QUEUE_OBJECT = (-1, None, None) @@ -240,19 +260,24 @@ def pipe_from_ipc(self, ipc_read): self.create_dbp() while True: try: - i, inputs, best_configs = ipc_read.get() + i, action, inputs, best_configs = ipc_read.get() if i == -1 and inputs is None: print('[DbAccessor] No more tasks. Exiting') break - self.pipe_configs(inputs, best_configs, prefix=f'[{i:06d}]') + if action == 'Success': + self.pipe_configs(inputs, best_configs, prefix=f'[{i:06d}]', _debug_task_id=i) + if action == 'Skip': + self.pipe_skipped_configs(inputs, prefix=f'[{i:06d} (skip)]', _debug_task_id=i) except ValueError: # mp.Queue closed break self.stop() return - def pipe_configs(self, inputs, best_configs, *, prefix=''): + def pipe_configs(self, inputs, best_configs, *, prefix='', _debug_task_id=None): for kernel_name, best in best_configs: j = self.translate_config(inputs, kernel_name, best) + if _debug_task_id is not None: + j['_debug_task_id'] = _debug_task_id js = json.dumps(j, separators=(',', ':')) if self._jsonfile is None: print(f'{prefix}Piping to db process {js}') @@ -261,6 +286,17 @@ def pipe_configs(self, inputs, best_configs, *, prefix=''): print(js, file=self._dbp.stdin, flush=True) self.splice_pipes() + def pipe_skipped_configs(self, inputs, _debug_task_id, *, prefix=''): + skipped_result = { + 'arch' : self._arch, + 'inputs' : inputs, + '_debug_task_id' : _debug_task_id, + 'result' : 'skipped', + } + js = json.dumps(skipped_result, separators=(',', ':')) + if self._jsonfile is not None: + print(js, file=self._jsonfile, flush=True) + def splice_pipes(self): nattempts = 10 if self.verbose else 1 for i in range(nattempts): @@ -290,6 +326,7 @@ def translate_config(self, inputs, kernel_name, best): 'arch' : self._arch, 'kernel_name' : kernel_name, 'inputs' : inputs, + 'result' : 'tuned', 'tuned_kernel' : best.psels, 'compiler_options' : best.copts, } @@ -312,7 +349,7 @@ def gen(self): def gen_itup(self): a = self._args for i, tup in enumerate(self.gen()): - # print(f"[{i:06d}] Handling {tup}") + # print(f"[{i:06d}] gen_itup {tup}") if a.continue_from is not None and i < a.continue_from: continue if a.stop_at is not None and i > a.stop_at: @@ -324,19 +361,8 @@ def profile_all(self): dba = DbAccessor(a) if a.use_multigpu is None: dba.create_dbp() - dry_run_counter = 0 - skip_counter = 0 worker = TunerWorker(a) - for i, tup in self.gen_itup(): - action, inputs, best_configs = worker.profile_single_config(tup) - if action == 'Success': - dba.pipe_configs(inputs, best_configs) - if action == 'Dryrun': - dry_run_counter += 1 - if action == 'Skip': - skip_counter += 1 - dba.stop() - print(f"Valid sample points {dry_run_counter=}. Skipped invalid/unsupported points {skip_counter}") + worker.do_profile(dba, self.gen_itup) return shards = list([i for i in range(torch.cuda.device_count())]) if -1 in a.use_multigpu else a.use_multigpu ipc_write = Queue() @@ -359,6 +385,7 @@ def profile_all(self): ''' for i, tup in self.gen_itup(): obj = (i, tup) + # print(f"write_to_ipc {obj}") any_process_alive = self.write_to_ipc(ipc_write, obj, workers) if not any_process_alive: break @@ -421,8 +448,8 @@ def parse(): p.add_argument('--return_encoded_softmax', type=bool, default=[False], help="(A functional for debugging) kernel that returns softmax(dropout(QK')) to validate the correctness of dropout") p.add_argument('--d_head', type=int, nargs='+', default=[16,32,64,128,256], help='Head dimensions.') - p.add_argument('--seqlen_q', type=int, nargs='+', default=[4,8,16,32,64,128,256,1024,2048,4096,8192,16384], help='Sequence length of Q.') - p.add_argument('--seqlen_k', type=int, nargs='+', default=[4,8,16,32,64,128,256,1024,2048,4096,8192,16384], help='Sequence length of K/V.') + p.add_argument('--seqlen_q', type=int, nargs='+', default=[4,8,16,32,64,128,256,1024,2048,4096,8192], help='Sequence length of Q.') + p.add_argument('--seqlen_k', type=int, nargs='+', default=[4,8,16,32,64,128,256,1024,2048,4096,8192], help='Sequence length of K/V.') p.add_argument('--causal', type=int, nargs='+', default=[True,False], choices=[0, 1], help='Causal mask. (Use 0/1 for False/True') p.add_argument('--dropout_p', type=float, nargs='+', default=[0.5, 0.0], help='Probablity to dropout (0 to disable).') p.add_argument('--dtype', type=str, nargs='+', From d93ceef4616b9fdc919259ac5c5a0257cc27b0e5 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 15 Jul 2024 12:20:46 -0500 Subject: [PATCH 46/51] tune_flash: add --continue_from_json_file Now it is possible to continue a failed tuninng (maybe due to various limitations like power failure and full disk) CAVEAT: this option assumes the new pass uses the same set of samples (defined by --seqlen_q/k, etc. options). The correctness is not guarateed if different sets of samples were used. --- test/tune_flash.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/tune_flash.py b/test/tune_flash.py index ec9435c2..b193a8ed 100644 --- a/test/tune_flash.py +++ b/test/tune_flash.py @@ -241,7 +241,7 @@ def create_dbp(self): a = self._args if a.json_file is not None and not a.dry_run: assert a.json_file != a.db_file - self._jsonfile = open(a.json_file, 'w') + self._jsonfile = open(a.json_file, 'a' if a.continue_from_json_file else 'w') else: self._jsonfile = None dbargs = ['python3', '-m', 'v2python.table_tool'] @@ -348,10 +348,18 @@ def gen(self): def gen_itup(self): a = self._args + skip_set = set() + if a.continue_from_json_file and a.json_file is not None: + with open(a.json_file, 'r') as f: + for line in f.readlines(): + j = json.loads(line) + skip_set.add(j['_debug_task_id']) for i, tup in enumerate(self.gen()): # print(f"[{i:06d}] gen_itup {tup}") if a.continue_from is not None and i < a.continue_from: continue + if i in skip_set: + continue if a.stop_at is not None and i > a.stop_at: break yield i, tup @@ -465,6 +473,7 @@ def parse(): p.add_argument('--stop_at', type=int, default=None, help="Stop at n-th functional set") p.add_argument('--db_file', type=str, required=True, help="Sqlite Database file") p.add_argument('--json_file', type=str, default=None, help="Json file for record. Disables printing json to stdout") + p.add_argument('--continue_from_json_file', action='store_true', help="Append to Json file instead of overwrite, and skip already tested entries.") p.add_argument('--create_table_only', action='store_true', help="Do not insert data, only create tables. Used for schema updates.") p.add_argument('--use_multigpu', type=int, nargs='+', default=None, help='Profiling on multiple GPUs. Passing -1 for all GPUs available to pytorch.') args = p.parse_args() From 7d224cdff1dd27ec31795907cfa4a8a14345c6fe Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 15 Jul 2024 19:59:41 +0000 Subject: [PATCH 47/51] table_tool: skip result=skipped json objects --- v2python/table_tool.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/v2python/table_tool.py b/v2python/table_tool.py index 7a84027c..3e89a10a 100644 --- a/v2python/table_tool.py +++ b/v2python/table_tool.py @@ -102,6 +102,11 @@ def upsert(self, line_text, *, create_table_only): if self.verbose: print(f'{line_text=}') print(f'{tune_info=}') + tune_result = tune_info.get('result', 'result-not-reported-in-older-version') + if not tune_result == 'tuned': + if self.verbose: + print(f'{tune_result=}') + return sql_table = self.ensure_table(tune_info) if create_table_only: return From 6ef9a40c146178c055ca3f6cacf687df8c72ef65 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 15 Jul 2024 20:02:24 +0000 Subject: [PATCH 48/51] tuning_database: Update FLASH$attn_fwd for gfx90a and gfx942 --- v2python/rules/tuning_database.sqlite3 | Bin 2801664 -> 3493888 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/v2python/rules/tuning_database.sqlite3 b/v2python/rules/tuning_database.sqlite3 index 029845a469eb788cbc7397df0aed5a7f213cc87c..29aeb0e2cd8c15bce87927ad85685bd8ddc3e84b 100644 GIT binary patch literal 3493888 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

%2;i>?D0>9(0R}3H4-!!J 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

WWCPG?Z7)oBuHk1JYTn?bEs z*HWMnTGwY#tJU=;<8vBTF!s2%T3yRAq|qoKmsOA!rGQ+KA#FBSkVtz>!R9IqX|p+5 zLE3e$!H_nas}s_J)u4G^#V;tj7GX$(O@SPvAdNZ&a&d;V*<4H_ZSfQ~Co-hX<^%<4 z*SR!9+H5W*k=A&65KosOO*RqfC`hwTL}nS%W-}v^)_9`LB177278ImiXO$ssHY*Zo zjVC-xYacPB$tEH{RFGz!i2Q^hZ8rZQk=A&k&3`ha&F1F{(ysF>hP2uImqc3Q36Id) zYYb_!iO4@GNV85vzQK?-n}3l=Ydq2B+YD*5`IdsT>wJ$PZ8qPPNNYS(b6T~h8Pa4E zkxwZ|vra@l$B;IgzmrI7JkjP$3~96ZqJp&R{3Ao!Y`(m*c)r6s|3h*rMtpB?@>;KOBzq9^t z*A$Fz2=HpuS^q=j#jg~YUXQR+&{_Y>DABHr(8H(YL6kb{e~1#SMvN~hB1)b0zl@Tp zFJVogv;Lm&|;Sot51@b3~?cc*t=W~}$7w`TfP?*Oly{&sq5`se9$ z+?(Bb>4N)5xMg62^5Uhx!QO%kONW)dSsGh>t9W;H3wLj~>1LgmoEx0)I=ecnq`pc$ ztzUr_&n%wl{6hb~b^hChHv(d*Pn-GVdn?;b59hnWZhF{BHXiSpmizu>-!?$;o@oh{ zzqA{muP`XR5*nZ{D^QD8*hx12MFurmMdQihlkY;DCh-)7Ar;W$^ zf91X*vjW1ZJFU%0AS~WN+_r0yOIW-!Sz^tx&Er0@@pzwZ8*8*Huy~)Y#9G=Wu#r2% zDP{u8cTXGRi~GpN<2}eygC%AHd$WSI=oMIXx3_$22zTAQz}}$PwZs?qk&Vaue`Dws zSiJvNVl8?F7VjW#V~u$eSiXDO7+>5OJ|6GAm3A%h71+xZtVOTD;@!K_t|h(#d!d50 z#5Xku^!|upjd2jzA1YXjUV;4q!`khhtxP2ry)BS?CW9KyB9w2XDC)J!A0n4 z3~IF64bbBl)TkAqGZm;M0th{cL9JHRt=X1*!7lFc2Psx95kM&Ia*KLO<`GJp%p}yP z6`@B+0j8b&G~eN~mo}M!Rk|W3ygk1SRrgz4B7j!+gx3;0hl>7K?=@xF6SKoasT@85 zFpu~y=sXiD3e+s83)B2B1~r9FK)+C+=FWrA326qkS)JfWs5K#7n7h9yP)h_5`nH6c zKCKYB6IMT9P@`6~`o03SL;#_mGN{$6`u(3}Okn4sy@ax(oB9hBXHw($jU_-pY1<)L zHFuXhzKv1QT|!OG5>VP87^xMlZWm80Liu+ErU-cA9dBbcx=dmTyS{=or9h|Ur#jd4o!mhff-#o_1?li@&MXz`lTajUnaS&Mk zwXrF@p1`i6*tO^t*vX^!|2+oh|Lg z%3GJmm0l}dUplF@QK?#dskoqcY;oOUuJBBuuW(3VY9W<>6i)x!FTZ;3)7-te-rOF! z6|x^>@5s*0?f`XwH#4_n&VbYZ7xVt)jldrN4ZUjm#q^cwqtol8Gwze_NxhNofxGC!oSb7*VGO zr{=(q2Y8G_&!B$}LF#-M)?s?kxH(;W0qL2+>#C=Bh$ z7KtqR=b-qcxLNW~LNU4u$OBK!LH{Teqo)9evgDtIB1o~bc|fAEbR?alYV;J~ zprhvC5p-g!AVp;f<%zL$I3wA!0+l&UZYvspOM1B(~ug2GZc9`PXT!% zOZzcS*io3%9Nbrmi}757pV%l%-)5w6?9>(^34_-d+(*hYxKiW+iN@02j1%@0;82$K zQsn7k7nCQ)(w>YI4xWb87~DgVr}Gq$C$h9V068xj$M#M zS=v>~Gq?)K6Ju!?#tC~0a41VVEAn))3(6B&+KG|E!PAf$gF7nnbe;n8M3#17oUo%X zr#ZO26ldt*syKKvq_MOeBZXrZBvF>OmGTU(6nWr@#?m&76ZRC~P?ok<1|mjFG~z3z8^Hn@V{GR{?oq zEN#L#VNU@LWoctYo-TGlc_K?2F;X~q8d76$Lq(p>Q$U``(gutZb`<6`2U}8{p@Xa9 zAO6Us{E!{|8E7q%>N12 z|0lvX|G56Y3cmPX2iE^j6)wm1fBx(IBl!zq{l9ANliYo|^KyITR?dE${dM-->~7f= z;9S4EGv{P>%`ES|=iTm|5 zrLMq=aDB)>JyovmEyp^-JlTRk)Q9}TQ|0PD4y98=fH&$+4M7apP7R@j2bVSn7vdU1 zBUnSQ403Tugm^RuN(hz%Zv_V@{d%y15OSnU#U9K+xKIid5JG-91>H1)^@ETb^)Uf{ z#Ec&(AH?9)gVlo&hik+6bTCjnh^91xwSy2P&>E4QK;wu2 zAwQf#*$LDQLT&=uM0NsYgBYB8uxb$EaBU(xfucb)C2`FFS06ot32O%aeK^T#2IBDJ z!DKZ9arkj_Fk#IAk4$e4Caf9I+3d+`2I36p!DKZ9ntl`33@A$pYX*LnlGO|-OUY^m zewGr}3@A$pYX+31WHkfIQnH!>Whr6JfU=aZX5eROVXYZZmJ-$sC`$`z&499$ux8+A zX<@AyP?i$b3@A$rY0ZGLl(1&tXK7)r8BmrI)(j|1$!iAq{r@)ZaLU`?o9-3Te@Ne$ z{%(2~xR38k_esqc0h?Fpn}ACyM^svsu}~SfvwR-h3^=`9DE*;yW9hr4T}mq#zbHOl z94gK#ZdROFc(-s*;m3u83TqY0`B&id|1R|5F80DdJP zz81i*1mJ4{ci26_-2%@2d*8X&xzITTDg)KjpHfd@Wx(*4{uTcpoO}6y?)<0!tO%@D zoiN!y>_51jMZR<6#Q?bXbt3M4K`{LC54$w@J{bkv4g01h?8~rx|4k6Pk0Jt!actwG zf~5mlw`E|XVFGWhfGvs%yb}XQSl(U%+ce`QrwJP}u-UQzZ=ir}ngw_>29B`2iOh*+ z>!T9qRts{yh=R3s48$%bv6{_~LA!VhgzQ7X&4)qkcm->TgwTt(KuEh$dY4hKmfW?v zp>27FH3nEg|mn`Qxiih(06KdFFinsKw| zgnJm+Y*~PRrGRak1^7V*j<9^60=8+!E&da3VPLam0lrxQ+cXRC?F<}Y`BnvN(~KVh zO}K`E&6WlDY6Wc5EWkG~aD?US6tGP*zBo;|oPo`j1^6-rY||{jS1@pd^Tf;w>wY4+VY0a^qCB6wu{(f6s%1zVrMg~-R=nr)}|Mq(+4rE*)C!a zRIoO^h&_T~?RF1Wur|H;oZg*b&2|yHE3W@{b_P>yt^eEV71a}~TUVE@d{TL|GFX{a z*}Sr3`GfNPwI_a^HMxGjGA3fFEZL$*h~{@?Q6D z_0IM7^`?4xs6zZS{r&WA>DAIH_gVKE_f&U#carm&^O!T}%yKq&mP~!XzYcJ2{m)v` z##bwHDUZOXc}srOAlD)-I4c-7TaI~wVJYt>?DG-}`(I zuy(tzNG$Bavgw67z!@OuYBEE>dlVR<4?@+K&dhcOayWL;G=W!SZJdnlKe_O3FS2C#CEI@}9s7)0eBEBBPm)=98=3Os^*zYNJZF&() z@0RizXpRG7=SsWQzDpX;WmvmiJX1mDB1$iJ7qN#htljRx5*ra;v`gy;ii7z%?4=M(>jxP#b9@m?Yc7ek>pfcPjfih*PHW80 z3~RQF*qs!tExw4|jbZI}za_B|@kP6PF|6J0o(eWf@4gIcw~JR1M!z?Bsa9*u#tdpU z3($=es7)etoBs+UyvuhuL7sytG;sIp&W zwesiX2g~P|_bE>{XZOmk1Uvh0%X}}hO=i3}|L-_&T`!w{GJRS4p!5{?Gxr|% z9Cv4TDd!F6M&~4FBd3yjJ~aUA?P>E?8Jkin?|C>}%Ri`39&s&yvM6`qqq-|KCpE|Q zdge`LJov&B-~RDTKqC*naGbX?u<%Z1|A;?e1-$uRUyeF!rGd4Q!oo_dQ_!*C_(>^I zuvTO&R2a>gI&TGqg}*|F;t^Dc;g~va642xi82H0eNMb0ApmFNF7#q&E{U=#6Mg$D%2@Mp|>;Qi@85 z2z;PWuy)5*H;|T8dR!~pAR z>>d*sOB4Gb3xhFj-guzN&ZzCfYRZH+FF3 zrGNOodghH)NKrEZk#PQ4l(FIle-U8GC~5~;D2g!3rp_C~XxOg6w4rtw1Y7b6yr$GKw@& z*`on7RnNQ(BSDjF9dWc-9usKl97+hG(>Ld(84Ejyx%X1DfaLll%xzRZY*9CC&T|;a z-VH}dDIj6|+MWXP)G;YoUUTjljD)F*BsJ!q&g5bE0wkp?k)y`k(-;T)p1J$AMDJ_N zJyqd|9uZ8g(vN@x4ncG7k&L8iPLPB#ID(0b6Sw-@!x;x1>G}>$jUsOK zxrZqf(cLUDfUW~a0nI&>QS4z8l;+$+fFi?2o!Sz%F6af=a}H)CjUP2^zP5v6X`=}E zlmi(B1Fh=?k|M_F0SX1yQr3>+d)c2+z)Mt|8*^s>MFuT$V#A<8%=Tj(jj~Y8=={H- zRPDF5pVSVj^@#QVrPYI~J=Ij@F}VBhz)G|HRr!(fh2?$AtCl{6_5Zo0-Aa>+?-y@} zyY_Y{E>U=+a8u#*!WM*eT z``Eh&cKUzITQ2=>`nL4<(%Ysdx^K8YgI)fcxr;h4JJ-M-|CUoqJ(n7S3P5ux_L-*+ ztp8i$aEInl{4-AlOPs|$6#x8^QBq?l_W30w56^`fihbtkD5p6T|IAYohbJ}-#XrA< zNU*L0d9lwgA$j1bITZWMQ{teb=1}}IPe~r0*fbRX{E|^pV<`6dB_vN|DfXGCqnzeY z{4-A-+|((~FByt|ehHB%OR>){8THg0ihbs3+fj2U{+Xx55?P9We#t1QF%t z&k}6>aYdGnYL<{hSz1HNGq_UZ0VyrAv^wL2Jq0+FrPUO9y4VHfi7c(kNa5gV zNR6RY6nQ#N0eK=zlNl%MD9mXNtt`bEI(Sf=$kIxT6pmexL|Ix<$}_kM$P-ywfpNl~ z0vyWHBt@Psc0qX}OUpA-ICvUTV`w==p3YN1p2*U&j1zVg<}`=8r8q+eSH(dLXe=$m zNa5H8NtC6fr96WxMII1nEG@-2VNU@LWob!8o-TGlc_K?oFj6>p8d76uq9RY{DIiZ| zX#(Sf9fdi~q483jp@Rp-iLo?}k;1VHk|;}yOL+!Y0eNC9Eyg%uPXP{PX{;ho7rUT5 zk)=f$DI7cvsWG&OB2VWjAWvjz4C90yg*o-1E?*o~>tMZTd1$ua58kM2jDo+f@Y}}J z_Ox0UxcX4lm*%?(J)0G2;6u2nFp4!nfG0O)MH)mcqBRh-`cR2ca0P5@ji3}2Wf8dn zWr9**6l-cEB`<|hr;ZRNLY8Bcc$vvcWzk~?d4WZ&q;5c9_PO1UhkgdZsb;-mz)L8vCg_qF7*to{{K6FjiK15q>6*i{EG4TlP?kDX2DRi%e*gcx z^qbO!r5UAq@n6M9i11Fg(nMrg~Q>5|6Kmr{80Yr{CfFP?#0}K+;O=La<%Ns z*^%t*>?YYoGk?n5m^m%8WoDfB7w=~8JKlEQl28NqC7kuQW4haY&%MJv+x-@t^!Jf- zk2Bxd)0v$51f)g%)i1@(?XYVfc2&rYdWJn5t-N1cyA(IJwjVjDJ|HZ zHsw-(Q@ijYN?4{n97ut!GE*+~H?;cX-VP+08y=p-|`&PW*lBW{TR9|HIyU zfXh`?Z{t(W^p-+^B$P`FgqAxqH}o>}lF&QSd+(h931CHX5d{MxkXtB;3O5OYqJjt_ zMLKps#eyh^hyvFCT5In;v)9?>%<*}CKJotzAKx#4@4ME!*V_A>v)Ami4l(2r_6S*U z5P3X3B3hk+^xuSM)0GqJK*CP? zZ^DD=9ZFZa@Kk#A;5)iz+=K_x6(eG%j1x0Oo<)xsJIyW0kO$F;VI6yCk;u7)htSo~ zttaEOXpxitoA3mBhf)A%p(!7x%(w}UpGS|Kq9sRy2hSD5d(g3!mkfF6JYwv6wB&j7 zi1>C?_1}bt&DGGY@eL2X|0X#^y|4n$XTn*hi*uEuWl(iyuL$pSo4 zt{B!V5~DMc84KibayhpwvJ8eiOdb(mnpg8dDRN@auRtz_9xZu>Tt=$^e}*m)As_t<@B}#x#O1>rh&(|Kk2CZz6zOEf z0(pR(7!j8gnG$(^+|4j$;puS|Ew__S-e)Y3N5>;(3dJ{|mAF729G47Nd^?Q(1$b;+ zO_ZpsymTUujYr6$fe@pAfjl+tmZe2YI>9sJ(X+8Lk{Ju+fpNE!&fJndk=TDZ@ z^#$^zxTK&i+w;Go^ugPXGZx6B;xb^Cv4le0Sb!(Rar8nMyloQ}))_r2qx$0lJS*NI z!T7@`(m4r#US5EQ#aRT9X5G%9AD{%y1$bDz!|}X~Mo|;*RrfDAN@Ka#u?if-x_`lu zi~`ESQD{%Jc6yEgii&~N3y%S%^l-+pxG^~W3l8f_8qPH-t$)Es7{xaW+LS{ziu+DX zF&ii6=OK*Zou5F#`Pp1>FmP1R;9>@|Ei?(V000SQTPnc*fBU4)PXv3wdHna&Pp22A zFG$aV-S}TpPo{3K{h;=x+Lg6~Ya7>s>QAcoRIjccQr)4rGxtI6ncPV3lHA_8Y1w~dU&!8>os-=sJ1z6~%yXI1%q5weMQxK$bxr zRs}SppuV^YXpup^Rtp+5LTi;ly;ds<>WgbC0T=0U?=q;962(ABOP_Na0sw;*+uC3O%UoxcAC?J2KAw5a~`5T7x+5ELa`eO<< z-(*Oi&EIKAzs|QA(r5E66?$Jhlh`PE+zSlqFe;$WYfz_B0sR4kdab^!puU(2t3P2- zuhk!G&d}hO?=q;@>SGG(k1JYzl0m&zpU|KY zTAyK1uhs7>s6VbL(7J>{omLS#ra?Vg5&BgI^;*48LH%(>t6yhOuhp+<&d}hO8yVDV^#%p?#}%#K%%EPYH)+rat+z6$*XkG59nK%uR%_gq z4Cyoq$axylqZE)IV@RLPk1C`;reO0^4C%A^Ne$`OIls66UtTuF{}1UMV(zuvUAYT#JLbm2>HkI93)`pv=VW$kpZ?!7m`bPrKbqbT z&KtZXPyeq2r~eHkN&*%i+i+(@35kUtYUPME+kjy~v_if7;lH)IUUVG;T3 zu442LZXi!r2p<+k`*cOy$@-cT>v<`10_Q&3jOmQwI$Y9W^bfA5$+G$g%jzFomr*QE z!ju_<)4I~72Y4OEu!JiV;2DFVw>TV0q_O8k5{;KQTnCH#`iRj#i0^RV5gF%1(S|N5 z_!38lVi`!7GGh?m;=q$tPA{FY%aQ0Walj74F?NctWbl_bTns&0_!5UwWj#~XnT>Mj z_zs5}x|IAJQs;0 zK`(fWu76N}jl(*Yu$vi!`fD6kiVoC=x{7<3{L+bzSf}vVD-boMx(*kIyw}K8k!ES3RcmLqrMcgaX6)e`h4|Xhs-BXoT~sRaP}@3n2&FEO!v(JEdW50(``P!-qE3f zpYSc2({Q@Y#}_dZGmsn5sPJX8!Ku2U!t=i7YsqKDHBj~hu-Z+bX6EN(GOc;!NE*KW(HTv_T-z)LM8VfTIuwf=lcHY#=wj{!^7_W# z|L{&xpor@mz5t>EV7=&Q0RWQ7Xk$LU1Ja>k4BXR{e8Iu|`S==$ih|WwCkky>_4)W7 zNQY%{#aJzTcA2lg2V$KH#G%;(o*+e{|KD@i|L?}y(Y1}LA66f&4ptAXPOH3Ad9d>F z%6^sA%D*cwgA@L{mnW5eS-PimX=#_z#NyA3i;EW)cPx%Cyi&NkaDHL?LM8v>{Am8{ z{8sr~?uFc~xs!6u?7y>5WpB(Lo!v0=LFSRnwV6XQ>jduv4+b9#_Jw!4*&NF`dL8QoCVjY^1=g8Nou zsOv^0f&<55fYg1X5+M(Ifi#A?Z&cDI)rY!nR3hYI)1RTP8KBQWrx?IT>Aw6Mp!p4y5iR$tc;)pD%rl?4w zbrd0wvZUIg3KCoxqDl23)fm;~DI|}wq&lOz9GRTPkZO&Z62DXb}bF3 zR%A)FM|HUh$)hZ(&Lu8SA&$tBYLJSguCtVu4POPR%Pgg2FBX@lkUYv#l5tE&CZ{o! zP~y~slV=J+4APjTg;y|=KTAlWEG@iT$#b~Uj}=QED!Da1iXjfLlF@@%mS%cCrv%SdMMETsCvb2NE2Pa%1frL!5wbY$b4 zCB=ykVN2)km_8n+UkfTmg(V)V|og4&{1RIVVXQ!B!_X79Om`Ii_}498B)!!h;yej9r){vUH%5 z=WrF0N6Ym9#xXsGI3i2?Yw~Qd3(KP{?Z-%F@GPYI!hJP)HcugWl%;(b$8=KNn|Nr<9l37V*mdv_W!$q_WvKi@Bi~*|G#$SkF@{ax3X&a z4cPx*Uf!*|V(E3c|6if_8tnfsD()or{}&Xtll%X(@>}M!u>Zd$cOvcopUmEnJqq^! zf6aWG_Wx@Ke+<43`~SV+*MHpqU!LAAy#nn27r`6;xc~oAayWSg?Eizrv*Epc7ysTE z>b|)tZDHxk6}M&}qP^VK4Co0uZp{Em%Wcg7XKL)4fvoH-uQdbsSr4icF>3}$T5f9w zB1vnfyh$Knt{ktyqbZ? zQoNdh$WqLjfyh$KngL}A-~Zn;b$ue(K3FOJhxE78H>OWbx8N7~H&YMQUal>wT~XV= zwqErg)#s`s)r+dLt9_OCD&MQzQaP)#V`b&?AIcAxKUY4fyj6Kz=~tx(N}nzrRT?Pe zi$5#gTfDk>aB;(8qVQ7TuELzc-q8E+gZ$I^+wHaI@lxVR zvl@^dR{t&eE%i^mKmXSvupz!{n}S1tdH7rO#_K=&yfe=^_N0wvb*&5&VD7j?GBM>> z^d38$9q@u%Er71ZpyHKx(=I_*(V$Qmr1pFkXdhS=&FO>yIN;@j2AWm(z*=av!k}KO zB@OD)Ixd-*{5J-5T1Dsw8q}i|pi`0z>b3fBmRc87ruLT_*gY_8X8T z-Gh^sf5^ZQmVcmueVPN*{9OiiTPE;h8rY|qz)v%9gyknSuupRmHGiFf-IfXbH4W_3 zOyGwZIKuL`6u6Lw0~u~`VlHUDO9SKKJL9M{oOZGpVP2Dy?8bJD8st#BKArR>(h(aPcf|D?k6>@Pj4RVUc|6&yNJC&!}|0h z_Hu^x+nu9feR>11dn&`a?IQLh4eQg3*mD`yZ})70#na=S_15Z3fZd}R)@4^(NWM<$i{B+9m7^4eQZM*i9JL zZ+Ae$di2tbb8Uuo+9m9o8rGwiup2O}-|l+qiP-yeLOYG|8r1!4LeLcz)PL1!!6ci^ zpiZ#}T}k}@e|w_#RPFP%W8nS&zg53my&m5GUk~>A4^^(I98l>izgfNy&i~JX-~WGJ zT2wl})GC#VKPcW_Jf%1j_V-T}ZYUg8SU>-l{KNTc@(1Soa&PAD%gxQr%1z4t9Nzvv zKikTdGC#=No;f8mGm{9O3T_CF3f52mCH-*vn)HF`KBzU^mzoRx{U;?~OD;;DpKK*d ziI)?%cT8GtGGD~v>Gs0xi z1{B_&Krg~oW6ACs$^DKGJ!C3e?7lAV|<%b={TcGO(C;};704jRcFzmUG|HGS6jS@boRY{yvLj;f^z zwEF7QGCEUfTSl_DvXQpYNbXdL_~E?`)<){Nxx#7NC0TLG!-snmA0C3EGPwIWrL z)LgO!b7j$|r>gC0bIp}I=xkJtC7Usl#g(?`+nzSnNKx~zJ*Z8zL0RQl2Gv|Lld&xN zEUd0l; z+ttR*l|`Q(^tLO}hDP0WT&~!t8cRec8g+rTxYB~&_Jqx7ph_xliY^lK)Leq?XjJ^H zbHXyH<`Qg4(_vX$Sy+uF*p{Xv&=m@?>f58j#xxz0#g#1-(=<}l{KIEYnt!4@O;pfD z{3NNl1RK<-NLW4Tk!ZUTO=^@Yet*X+duf zO7yD{q^O&Adr;W2M#V33{!J0(u^ zxlxW>;>5I5(H4zv6vraYjCL`zUSi+G@6+k~VK07Ux|z<^UaH+yn^W7nws!S{>eJQR ztLIgBt*!#y03NL@sGL@5RaSua0lrbbu6%5HlX9W-Gk7E5%F+Sw#lOE7pD8XZo>$zZ zIHmAb;o-t(3nvsdFO>7I<(K3?nm;(dLGE9<=iz&Q7v^@)t(tuYcKrLLevr+C6E$$8=HnPR!t${KtO^b;&8>U_;(QbXJ1qeS%42? z;0Vhff%4vT{30QgVw{%2F1%?o{tpc6Ff6gZ*Ram~N$fie>$m$yg@w1Ve0rh3#rT&t z67wE@tAM{9c5!y%|C?|wEF_KK6x}9V#L!XZFI4ELMMz@iGIW&fD>Sq-C~e(y7&^-K zr4W_}y12$HcMxrqs=#c$j^Quh69yHUri$lsL)ke`tuQ}YEXVyB*comC-cJL2W}pBc z%)k+r57NM%InoL+96K_w+cJT7(7-;;1m2Z_BP{Qtz*^IFseA7&yZ6mKr!xbBlo^EN`p8 z5pkyFy*2~8EfaVx4eZlQ;Pn_d!t%Nb91&--ydeWeSl&PbM{4e8;0Vhz6gVQzbYWb9 zf!&q~JW&JtG!uAb29B`2k^)D>nJlluz!8?GYT!uCeGD97d3AcQfgMaloLg|&2pHCF z7_n&$>r;%_Jj43!<`gy}#%Q<9uztHG4I8C*9K-tU)(ERUz3sTe!+jM#=Q{p9hIQDL z*gtDnr(TKufMNZ1-&fd(2XoZ>4~F&I{kw*Z&^sZ)uztJ$R@jIKbKFS$iecS$5&OD^ z_31_I8w~5W``h0B9}kuryY$}v|GfGpaM4Q4#Vc2D|Bumt%NH)M-u_=r4SI0s?f;j% zJ-;qU?dak8q__W{JE6D#7mK$QB;dN<+yBdG(3ZZp|CiC|?fO(8RQ|^N(fJK?ALJg% zU7I^Jw{G^&*@v>%WDm}+mHA`l8<|gL4uJRi--7;s9}V^iR)w$sEu;SbD?h-@BwustF*0uqaF2_bzFZ>O)=kF3~t$ z_b$;ms&@$-w1L0jy|W#W?0QC=>(W^bhT>X|ws^+K93nqnK_CN_}Wo zrOeUDH>3=r))?A_ak|XT&PtoZ5!Xi9*@;n1Kb#`6v!kZX7PZiLC_6haju|$S(?7Jm zrp@MuYoqLJ$0(*7gVGpkNo9Bt$-j0|_!|wj9%~M5%SdL}I>Qkp5x8xnI+v@qy0)jr z(AJD&dJ1vSQDbN;O`a`sVR;a{#?Y3GWX8@yst;|U$+LM1$)mZjIpdg)Oip8HGbPS3 zwZq~lOPey18M`n^WN8y6&*3U04?H!7W-^ZHDZ~+38qnm~Vi%T2S!yzp89WQAKGe|U z**t~hQI_hAV>&W9jiG)eu8Xx4$iCY{GZ@K?ojxKYi7aibb4>8CI9f~VGLjj) zFiB)-nv&;m6_Q75X&uHfJ%uWpN@E=&?xT20AwxYFc-Cu;IJv?}A6o=$sdlHL0AN0_w?jt-0BX`0 zvuHp~8sioX#KT(5qJiiX8?$JDiH%z{pl*<{iw4yBHEz)WNpXt?)P8d)UeQ35c48I{ zM3!O}4P=($6%9m|;uQ^KmSPqSM3!O}4MdjW6%9m|;uQ@9CtlG&T=nA>4Mc0_ctr!O z^TjM0$S1;hMFSD*ctr!`#4H-%WvhQER?$FQ9pe=ZM0Vm84P%UVp!2bVxr9PFcy&Oz}{rET2pGhB|-aK7N z{UUW=L?3`j&=>F_=>C6ld7JXY(i^33maZ?ISlX&IzWAHsgT?EL#}~IK)(XEWe629Q za7QkvBQv<02d;wr-@)OC!lZ|99@iVsRcl=B8D~|u6_n()$2(YG= z;>{%1bf0=^w4k~0ynt{dU*UupYhG$z}2+hIQH{>_iQ#ULdlJjj&T0)^9hm*Jvkgf6_AS zmOvT)kU?Dv2>QMTbqA~kO`a$JhC!WH5&CNl>d}hOw;0rG7283mN#oYqhh0o3|B_){ zW(D?V8rH2=VDYUpr9r(BU`_;qeNDr9^kM_h$uBUhQ!in^uVFoU3HuVm`t81`VLf`W z-{IuP7}jZ*u;13O9=(M99>e(NWtZ!oOi?t>cEqn9p_ ziy78wm#}whSdU)9-pjClyZ2~Vk6yay-Nvv^yM&crQD7}@ENh6cqncgMdL!(xb}8}b zZNc>YEQ31bBJ?vF)DvBV-o&6@tDjd;dQ;m8?E|ZqX;4oH5PF4zYVT89B8$+EF{oF- zM>VJ?0%-MG2K8FKMuU2?1)p!2d>(^3ts?YX4eHT~&`TK9YxQCc>d}f%S0^#3(<(ww z)Sw=%2tAWQy;e`xpdPJw?>&q`omLV05e@3miqK;i)N7T0-@*A9NO$yuv@3yX#AMEG z>JdJ9Uk&S4E3lE@RuGT4q~QR~t~<8Wk$Q6Ew-tn4x=Zh<+4blp>@0?Lg;!|UO~ZQh z(w%p6hIQH{>}DF)qnEJTFs$G1)*9BMH%P!V+lXPEb_u(IhV|$rY$Kt~Uyq0uXvpLK ze|G9qiC}iHdive;W9bF({l9I}<5Ry%-CujLc1P{v+U(lu)px6pRTorGt!`5tU-?z# z{>rB+hgbS5>GBWCcbDgs_bRVh`b+71r7x7uC~a3-q4?Y4*NfK{k195bLE#7R^}kCB zvkR-`-^o9c|6Klr{AT%L?q|8Lz!w7c&8?mNYxaBDo3p27x5^+YQ1jg$M(@oo3mm z8OJ!K!N6|K1g>jfpJoELTVh3MCa~?5Sar+N2Z&FvQ>JM$!uK}=yp90NbUOzq(w)}8 zo&gGQk%1#D7c{UZDaiyp7fgAdfjyQH{1*-E)r{bOF>r+Ce`xRYdo(BJ;vIj=9~jzc zTB3iip*^Z4`cDiUW&3Rn?bVG>2~&Q~&>q`_eoaGrbrbs63>{_rbq(#+jZX_x+U+)J z2jj6#=odBHUfqQL2}4KO{*i|E>c*#rDc@sgk8MIfuA#lU3H=O1N7??qhW6^FOVl?Q z+GCs04{B(yZbCo8&{4L(tr2Sh_@;Sn?{8kLFQE1nW7CkN;!@y3< z0?fO2M_85}$F0BG88VJ%GTfHwc77lOyEPN|01fPkv-lk5M;JK5@*x`7GdG}(7-VpF z26kH}@NOE|r$zSVUr|EN4)xubGvW$(&5h4%_iz#ISP<@YS?Ug*pJHUD&eD1T9IjqG2cv;XYe z_j5z}wQ?V1p2*yqT|M(2eEo0t>{Hp>gR_I3gU5qgGOGsfX3ov*nx33`JAGz)N2oa5 z9868Wll*q_#?(s5Kcv2sT2TI5`PuSl`O@+}<#kK{EWKE|ySQ%c<=Ud!6}A0q)2shV zo(f+GoRoMo@lXQP|8V)<*8WH8sDLBd(W`u`j?dc53)uAXRt6RG$N~ML237OZ0lk?) zy;j9f1`%3Q33yd!{A!w2^~hrg5YSZ>RJ^LiJ|Yl`z>N&*)p~=1idTzVRs+yFpFy2g z5h{K%uzx&2(~8hfX;#%1*@!@pK8KWq_sZc_ahw3&dvlw@DJ;Bllien=VjO@S2M z;WlPar{o~f8o!Z(`uvM0hY1Yow2D{a@fy?<2!x8SZ>zh8*Xkr?)i-5?)+r3?wK|z) zzyYNUEYy(BQ4#VEhV2M$mSx3^x3>yL;7`og&}=5zpMi4nuy0wD(f+d#fnhff+ic5734eHT~ z&}j_nwYrXi`s0dL*Jn_#)#-3$`~Us+(Gdas{90@LH+%d4|7e5$e@xP*uyYNGYtyX^ z>d3W#eo=#Zo@MYdb~A%|t@if+*Ro(ap3=njySM-E?f=hF(}ixk&b5V4oxS~kZ~x!h z|I3|S%{)teQ*DdWldaL&Nzv+)!YB~ z_W%FKd&4fwt0zn-mN@6D-2aRIe@|oozt7i>sci)P|G!h65B>kALI3}6R6Y*<|5q)) z0sa5yLjV62OTU2r{}-0Fr~ZGV#j}cALjV8g3%6kZKj{DeWc~)||Gz=*uh9Q*e(n%B z-T%kzgV~Q}_s*`8c_Xtlb9rXB%%tG8U{P>EuzgTT|0q2SX8<-&2dU>%x28@>ZIVhQ zpH1GJJR#XkCK69~F;WJp535e6_yYv|2IOhgjh8j-Jk~#~8l4J`r(0l$qFR=?+_Zo7 zRh0U$YI6#*fMt47CtzA|JOq@%-;H6_!L#5!VKO>cgsCiOUbC zpqu)z>Q;grC?<3f>H4tha4I<6Wk)qQb@}1iD50uViOY>aX$*JYsf0=?*yW`;+E^}#6;-2y{X`!qsDOe?M;O|Y^*cfeW#K(sXp9wrxGC#9My-rZg1M=G=^7J zy;mdGkPt^%T8WW-i%5_}mR3~VR~@d}b4bVoPmSS8jAMEVaYU9@(B%2ok&s7On#f4L zh14e1hbL(AY@R~$C`;oR$8=jARDSLaGm^G7}Jclby9(WSHYcFFQ(^H5; zSsI$7$+N{SEDy6ZbSWd5!LyL+LzigsY@R~$FiS%hGmh!V$;YyPSp2S)@opDT0A&$t>X_`D+ z?85RWOQ$lD89WQAK6HvE&*mv4kFsj_E1H5m`D;lV^)vSRQ5RSVl5~XCcMye2@Fz_Wu8=+KsiNVgLVr^%2_t zuTy!a@*wR0_o=Kx`~NG-yO$@y{(o`l0^0xoxHwWg6ZZd^!gI9$Z|47%e**UZN9Nb3 z{r|POgL7-a{{L&)t7-rL+su;8Ww8IB7`#gR|LuZu`iHRpKRvx!I+J=q?*G%tXJG$- zVshX=+yAT2qqz3+ouJ_^oBAxqtQjCDX3YSbVfGKlsu@tv&6qWVG)~Z%H3RCN8M9`9 z7si-11L|-Zw`L%+6R&03}QOEGH(B1`dV1|m!GY6c=pF>40+*wBnyGmu@kJ{X)UO}P`$l+Ms>?-q4LAZNagIxwv|fxr_kr`g7OaK@uk<`1i+=G zT}zXSuNTLPmlby}t^_^)?=4&g-2hg~zn;G*KPSIiep2q|(BJ>uTq{@3{y2L__8jQ% zSIYb-GXlN+x5%V}=Ym^;lY>oyRQj3p7t$xCXQuw0dMfp~)KRGolOHC(o4h`GL~?_~ z2OzAAzv_b*uaLmgZ`fNx{JIYHlER56T(r4rd?4#G<-Wdrq7QcdLI2=I8i&pbz^~XQ z2YOr*XB_O|2QOq4_-QMOQXjkkDAT1fs{Mp1swB~NQy)B^abPHsoc_V{m^2HAMSwh&f=;Q zH_g-0jD?a1Tbwr#$!57EB#_)|m~Q>3Bwu+*k&q1)wETGmB9ygE1+)Gi68#&9qL)TJ#WB zAKZ;mT!W#I$-&GR+*RX5%rhFxjKN(P!!i~UMz;hx`kjHH0v0vPBxNT?=_1B626tq- zEEGLpFvVsJ?!XwXk;r%vV|$H3Gt9lj`Y`h|2Df7jmnw=DG5QBvz);bm+jQ86HdiEN zTSl=AButqxxDC@~p>(1pN3u0zxJE+Jl8mi1M#S8bj4c_%rAm+17Qj%^ike$8TAMS9 zWgup>He$tAKX|C#HC6b2sshI z|38N3{}sS6#`F7=+%7K+N%Ws#zR=yg#{7)_Yx^!=84($FX z7GEviT|B?IZLtU){)Y;u7d9)T^UvmQ${&~S&;29!c<%b#;koJAKWD#{{Z#hA>>8Or zWbV&gmDvNn>-VeR-r!Q`1~@+bO8U<9Iq<$aG={sbSLU(#hphc~U#}z<6`O{;uUEE7_2I7Tl|mlcVDl}CjxoK zX}J3{PJ%?IXNJ2z<3uF!3r*McO2MJiGsE52D}_AzsjB-kPHj?sxa%`cLLOzQ>w0CI z(-`i)UMa-k#&Nj&Gfsjevefk%Cm|0!HHN#cR|<~EQup;rA&;`u{TZh=sXly+b_9!V zpYkEoXyPa2QI?Ko9Jr81avH-&sRLMaDTT{*h@-Bg_{L63t)(Lw$vhtxCW$N^q2xJS z$y>Gbl%^~l&N!y05JzO`FioB07tB^d((gBQPdJ1twmiE`=*_S>B!_XhIdus91}b&4rX|Bco#-8 zV;3fgEbXl1Ib4P0(OTMxaZFDkj>yuEnmk+V!ty9fJ1~+NJPWBlyuBvR<|!nPva}uJ zn2t-Og9hscQ@McP!V}ggpQI!w z5H||l48}1-rw<4S7`p!9jior3BTby}Qy<=lQA|IaBBsKInl@Y9LfRm1+W!Bh+HrFK z|Jmvh)#b#Q`VQLv7g8^!ZiD^* z%v6H*|HmdbPJ9?+|6d>O`izs_c#jF{~EG@4!1CgbeH3N~Q|L1E4bV7PKUd=$9kRD!M zYX)>edN^LqfKEs+zcmAqrFb<1nWg2mW+1W@uVx^!6tiZ4v5Q?Zpy1VqKY>5Lt>@Gmu$|S2GYMUztA;It2VH_d@QD z+$Fg^b8BY*ntd{RE4(4Fb9PGR?aU*Y8#AY5w$6+TUJt$+d=lyc=cIN@t(^RQ@>|Kz zz{!A3lf}d<$y(yKsmBu=MV=5yJ`xG(0hZ$kz=to_g~qG!UI+XwTI+{j>40yu!v{5! ziK)+QAiz*#1F&eUZi2-};&U1n3T4zT*@g|^Q=RWItlKVP-_@{g!QylB|72Ld-M?#r zaO;IrrTA^pHyPMvSc2csz;4A7{6_|ku>6(=_GzZivc9T;-N}=gep&;&Ee8qwVD;2* zFtAIr1bXjq?O#D0}w{dSjWSfAcLusg!A zZo7yb(y%_gh+WLEe!F*TSf5__O!d?S4C}Uw*w1TNpI*e?#;|_7w`f?OUid`y)K4?4 z+b&{1rD1(~5&Kz&_1pc7hV|)%tKihj8P;tVv2!%6PcLFW#;|_7AJrD8TQ9tlk^sZ! zGqB6B1fQ#c-HIg`KSkcTgGE@rPy_ok;}vu2Net|^Okn)@c1MQ$en;Rl7&yZ6sT$a) z89z5Y^)Lo@TP84me7hUX1U{O9BP`>0%avuHX1v`@-G_nQmI=I<2KLPj0^@hfl??Yi zPdwjD-CuzVdFVs$mO+m~TWesSWdd)nz+lxE4Fd1Tz!5Tb(7?WEkY)TLdNolWtvxbsI+P+8WlU7_l2Ntl#eX8rG+` z5A051ShrooPS&tKy@*|dVf}Vj)383hc&Dy1tlKVP%No|F7qKfatl#cL4eQg3cj^?w zy6qx1sbPJ35u3;T|K7<(iP{Ubk=g~dU29XSf2e+|dR_IH>OeJH`B7z2Wlm+!N?-Zi z@}uP&%O{n$D3?pG!YP0&OZ%6m6+b9GY1!##^FPWjf<6Fy=KFH*<{r)6m^&%A1#|*< zHG6ON%IyBxX_*f)PiAg`UI4Ak1b83dtHCFNLxT;||4KiX9!j5=-Z{N;>dn+QQuCo7 zKqD0-f0$g9yezqQa;?N)6HkEPw>y0S($ByWoDN&WL?YS!3j@pXj@Kzoj#KPz`B&!J z$2#CO_(Ur)cOqWIFev&~Se=hHz%w=yV7U0Vum2V>Y@A_3HE{)o7BkU}o~WVKTy&#X zX6Pu}D=D;g-*Vetg`uNtPu0-Ty89S9%J%9C9TjifW=;$k+GCs0X$|ewP3SyBN7>FP zbX2^_cA250Y?m~2wC-^X9c3Gun$lv3oZoN_nLFVP0iZ|K*8AC_e z{;7tJ*8Ovaj{X56?=f(M<;N8`D%NNj%d6_?L2Wgy zH&z5crGXTHvVFfo`(rI_e}kc; zY(J=>qjf*b&{4J@Qs}672N>@WhW6Md^st8Z>L&DE3>{_rPKAz&H`)FYLr2+Otf8ZI z-^qZrX@-uneNAuw@7!=NXa57cb@ulE zb0@CEX1X&XvTm^oLp#@nL{HVwp7kuzeGDCCySM+>N>KRg22?qE`+pV_x^up-%_>zN zwmyav`X3DKnS+G>yN348Z$$U@{~NRH(0#VI|7S5t%!NHcZ~xC?(t?om_W$SAH-SJv zuLX!kZ~w2}+Qs!kb&KBqUt2SYxwJ>`?f+R!=#Jgn|C=%C?f+R!{?q;ctkh^C*dnN; zf1X~N{#g2u^oG!l|Ao|O?Zw(??ZVn_wW-y&st;8^Q$4mivzn{?xU#r%S!J)v8s$Hi zA1i;pd~$iqas|E%Fjl&%bU9n2n`ZDuo>A7<{(Tnaq`R}cOad?&aeI5Bl$YPZzX zEjE9%TF|fxn zf@>Pss~N#7YTHeZi~x?90QwDvcIuGm-)Lx$5Q)~eZQ+xV+FX+8Hd>sqE0e(xS^|4i8?bd-{xXlQRt$o4N7I?DFXHMBREbWrn2hW6Md^b;D| ztDDfzF?5ve_Ron?@lMQzcz;W??YZXQ<0_!PsiD2P3H>NTdvp`J{iAS{?iL7HqOD4= zYy^*KV6SQfKfu5q(Fnd@1AFI4AAs**V2@=4k7{7AW(0qUfg>z0(!gHLctN|FfjyQH ze3J(DYDVzw3>;zkRt@acjAuRPGqA@pg0I!UUd;&p90NyKzFq@+HRBr}^BCA;8NpX* zV6SEbe}aJ{EZcs9vs|m?J0BNl>)W#kCHg!K?NKe!mol_dwnSf~p*^uqCg{D7QyAJ~ zo6sj~Xs>QUpUKcswolj4UfuM(a0EkpY!mu$4eixU=;IhV%JwlD+N(QAz!cnL&ET3>{_rAcgin=iprzbZ@JnJQUZ^6(}wl~)v{m1l!>5r%PO|P2zU20isZfaI)Qt~x8>wkW-1#kJk46>TbHl!~ar0~;z_zJlB z4Fv6}y@la|ZbJ;X)P*!=C_%)ZU!&nwq7FJ`~+DxD;6l_%WWot>2 ze6hhhDwwjA-Zhyci##*E^<`@?M=p{GpK{a(95@OIqPm!UinKZ-SsdxX6QugG)tEYe z>=b8JjbqKNHuV%|6^#=$^Au;Q#)+DEg40+w1vn~lR&BN*OlFR{2|{Dp%FI!h(O!u; zvXHb1q@u8*;=oO^yT~<`O;X}q99tAt=*p2kQR~YlDvoQSYEz+4uA&K=IBQyM;>IgS z;!(k|T*Vq!ksH?)hYzTxI5Z$vh6G0qsHz6!3W7c$L8>pSFh~A5ryP};Ba1kjqY`su zA!&0?i7RRx>nbwRT3=RR9G4#+xx6+Ys~>Yfjb%ATvN$qH^<`P6uA6Yzmt{1L^%+2m z0_>sT7ExaoXdLV0wnRIvaoj6hL{9i=EK31LUFWRY^dKm4N#@8O1m!5f97RN1I$C-K zb7UcDQBa)AHI8*In9*K(8RNM8u*fZ)qYcRF$BbNK>7|Thab%L}OD|#Sx(RoEsraO{ z=gzN10cs#P=a!03N()ZZoKw*j-;`ExW-cPRcS@CI5J7~ zrQ);Fie&Mm%^wv7@m*=fu{g4D#D}E?$2u2`DAbpV4@)bK%a53IDhOw>>0=p>8HC1C z@mXn)Ba>8LD!wbNNET0)D2T603y$?#qD28}STyIvXQh=NR}{qkSY=3jS6caTaYW>V zpT<)0VQIy&j7JZGB8e|cE0V>LNvbaupO#i6izh8|DhlG;(u!koWZ{U9OAAiaoKt?p z$E6j=<%dTOzb*}pE!;cUPFDM{8x8JomWppnD@T?fn2~EN6(5%to+3u1JmLBOy;3(P zg584E(tl2WFa1U6$iGW^mDHb7->tn|TU5KEwtsDU^^!?IM>B7?N(i+eK@F_S0aDH+3;_8L>3g0W-QaG!y zV`1g|AMy|9KbJo#zg2!*?pL`7a-Yr}1yzE4_Gi!;;Ogwb*$uOa%uAWOGIKI}XVwlr z2%ZjZ56(;7oH`@5eQL$zo6rOB`s4}8Et1v5FXa!|x!cTNveOIMe@i~V{N5=LwfcPpg|D@Ew8GHFFJVxpRfLXdP>)uGew9JJR_{|#e_YY(*BR7n^=m4#w1c$A z6-?4e!0j2DD2J*>$kg;!osf7l`&;^cZT)b-A%(r>D`lI{dV_ISbu!! zRAGZ*opuRZ*RUSFgq6LHlGt+rc2d^012H4)Ol8*}U&3y|uztInYuG5g+c2!(?$!$H zk1w6ZTa#g(b_pwc9m$wE*9BpxX?8vFCG0v1>yIyCWzQ$N>cS4jl{dmp*X(-YOW2JW z)^B$sh4sf5Pf$;oz_3ocgdMM8J$ebdBE$OaPEuHZe95ltlNA+T!pc5b>bcRC3&P6Y zS5bFM!mdh}YIwBt#~1Fd6H*N73w{@9|`B7=IZ7Bpyt)+&Q~ ztyTyMPa*z0JA8k7{JRWlw+c@o2>p`=b!nB*zcQ%T>R%Mpe`iMle`8Ru)ekjjgw}sC zsMqR071STs0JQ#+L7i3+`U?%}(TdRDFsRq+uNBlESG4*jgL2heVakOR^L)k ze_WxX*!UM1)M*u=&udVRR)qe5LA_RAR#1Oj(dtha)NA#}8Z<)ds|@P3`ig@3HhW{TFsXbMBo^X5n|3qSLZ~qTLn9$q*w*rhq zZ~rgq3cdY*tGEBBm(N?Y@9pjXMI3tj|K9$;xBu_$|9kuY-v0kFJpaFYVqv28bo>1O zqt(Icq19>doxcYwpQs!F@A{Z!4vMXhNnOU4UANu{5f|rBaf|G-R z^gq*&r>{>Ro?aKu8a$Z#SZc4-mNx%!1yorHk98$I}mFHeq$50PreE4Mc55g#K}EI1evVuclgtHy}<8mS_gt}LYHi1-{S zkmxr&(~~hO_ypy^i1;3qM6RZ3c*)%M0}A{kxXAMVU4@55`ow2Rfkdms^rY*3>5OE$vXGi1>nVL*tSuG6fsu6?%Z#8gDv_;eN}HAvH((l)f(37H&1g+FG5l%n0hE zB9_S3YD%HQnWj+rYL2YRNT#naNn~pkO`$DH!4lb8Q7Lpd3oE3xHHnc-UtyBS)(V>2#~V8QYNN%lrqXrj&ZuoPF86Xjv};ypZZ9KQM$`cplRziJ88!0E;}hr zTbJ2MGD;WOX^bRDnK<_fzX?M=c|zOsMjQ~q+fsA*3Pv(7K4B6~>*32uo!gaKJ;D=i zrW(VSF^=ge#6d@m;W?T-h+O2DV460DFJ&a0rT#$R+#bF}lV|f3l1H428OL;FavH-I zDRFQy=sHUmGLjiPdzLOx@*J*0@*qoM{}1o~KUuqh-v9rg`km^0*#ECx`6KNAKVI3l zvTFH_^0M;f<=x7YO1~(52~PNLU#b>=R2(jzQQW*36rL^IR5-4%asI>nqxr%7q4{-k zf6RS7cXe*B+?4FEv-e~#&hC({LT|r?nbR_xW|F~E(An>(U^={Q@U8SG)BC4ar?>wv zhfaSh$hZHug}47-g17$@iN;8a0-<&&=5?+e2$(*&kHi!1xV}#H|&`0LH8ph&o)%T0wvdxH%HHRv@Ag zw^kqmAG1~v(7cFQD?n2GT7k$`+**OmR?J#~$X3i+fy`FiT7k$`+**OiR?J#~$X3i+ zfgpuy1>PrS+`rRRFjOk=ZfKAs?pOb{N1qLZ34;$_3ii86YWc%^*#jcr^p$ z#I6~LEXAxDP?m82ziZ-)iQ40}&(uCrTc`SV_5SL->a6Od%4?OoDrZ-=tYpehmv1N^ zR$jaG7X11@54!)YP<*9$XYuUf7R6-Y$-;GoLker<-^$;gzaqaðnyxuM)?xkmPH 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�^| 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%0AwXFp00$Y+5pjqBWsUIowxh%M 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 z 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

$X&gggFE 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 From e92f7d1bd88c70770a182d4b64f26f06d430fc90 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 15 Jul 2024 17:18:57 -0500 Subject: [PATCH 49/51] track aotriton-hyperjump branch in third_party/triton --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index 9a37e3cc..5ce5d5a1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,7 @@ [submodule "third_party/triton"] path = third_party/triton url = https://github.com/ROCmSoftwarePlatform/triton.git + branch = aotriton-hyperjump [submodule "third_party/incbin"] path = third_party/incbin url = https://github.com/graphitemaster/incbin.git From 7ed9ac6d17a928e18d75d2362b63b619a5495c33 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Mon, 15 Jul 2024 23:29:06 +0000 Subject: [PATCH 50/51] Fix test/performance_forward.py --- test/performance_forward.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/performance_forward.py b/test/performance_forward.py index 32fbf7a2..8dbb856b 100644 --- a/test/performance_forward.py +++ b/test/performance_forward.py @@ -6,7 +6,7 @@ import torch import triton -from attn_torch_function import attention +from attn_torch_function import attention, AttentionExtraArgs try: from flash_attn.flash_attn_interface import \ @@ -62,10 +62,12 @@ def bench_flash_attention(BATCH, H, N_CTX, D_HEAD, causal, mode, provider, dtype k = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) v = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) sm_scale = 1.3 - autotune = False - return_encoded_softmax = False + dropout_p = 0.0 b = None - fn = lambda: attention(q, k, v, b, causal, sm_scale, split_kernel, return_encoded_softmax, autotune) + ext = AttentionExtraArgs(return_encoded_softmax=causal, + autotune=False, + return_autotune=False) + fn = lambda: attention(q, k, v, b, causal, sm_scale, dropout_p, ext) if mode == 'bwd': o = fn() do = torch.randn_like(o) From bb1a5e88e7bb22764812be733afd4fd40c20c0f6 Mon Sep 17 00:00:00 2001 From: Xinya Zhang Date: Tue, 16 Jul 2024 02:07:48 +0000 Subject: [PATCH 51/51] Remove old_compile.py --- v2python/old_compile.py | 134 ---------------------------------------- 1 file changed, 134 deletions(-) delete mode 100755 v2python/old_compile.py diff --git a/v2python/old_compile.py b/v2python/old_compile.py deleted file mode 100755 index 8d5be9fc..00000000 --- a/v2python/old_compile.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -# Copyright © 2023-2024 Advanced Micro Devices, Inc. -# SPDX-License-Identifier: MIT - -import hashlib -import importlib.util -import sys -from argparse import ArgumentParser -from pathlib import Path -from typing import List - -import triton - -import shutil -import subprocess -import json - -desc = """ -Triton ahead-of-time compiler: -""" - -def main(): - # command-line arguments - parser = ArgumentParser(description=desc) - parser.add_argument("path", help="Path to Python source containing desired kernel in its scope. File will be executed.") - parser.add_argument("--target", type=str, default=None, help="Ahead of Time (AOT) Compile Architecture. PyTorch is required for autodetection if --target is missing.") - parser.add_argument("--kernel_name", "-n", type=str, default="", help="Name of the kernel to compile", required=True) - parser.add_argument("--num_warps", "-w", type=int, default=1, help="Number of warps to launch the kernel") - parser.add_argument("--num_stages", "-ns", type=int, default=3, help="Number of stages (meta-parameter of the kernel)") - parser.add_argument("--waves_per_eu", type=int, default=0) - parser.add_argument("--out_path", "-o", type=Path, default=None, help="Out filename", required=True) - parser.add_argument("--signature", "-s", type=str, help="Signature of the kernel", required=True) - parser.add_argument("--grid", "-g", type=str, help="Launch grid of the kernel", required=True) - parser.add_argument("--verbose", "-v", help="Enable vebose output", action='store_true') - parser.add_argument("--nostrip", help="Keep debugging symbols", action='store_true') - args = parser.parse_args() - - out_path = args.out_path - out_path = out_path.with_suffix('') - - # execute python sources and extract functions wrapped in JITFunction - arg_path = Path(args.path) - sys.path.insert(0, str(arg_path.parent)) - ''' - spec = importlib.util.spec_from_file_location(arg_path.stem, arg_path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - kernel = getattr(mod, args.kernel_name) - ''' - if True: - exec_string = f'import {arg_path.stem}' - # print(exec_string) - exec(exec_string, globals()) # importlib code path miss things - # print(globals()) - # kernel = globals()[f"{arg_path.stem}.{args.kernel_name}"] - mod = globals()[arg_path.stem] - kernel = getattr(mod, args.kernel_name) - # print(fused_attention_trimmed.attn_fwd) - if False: - mod = importlib.import_module(arg_path.stem) - print(mod.attn_fwd) - # print(fused_attention_trimmed.attn_fwd) - kernel = globals()[f"{arg_path.stem}.{args.kernel_name}"] - print(f"{kernel=}") - - grid = args.grid.split(",") - assert len(grid) == 3 - - # validate and parse signature - signature = list(map(lambda s: s.strip(" "), args.signature.split(","))) - - def hash_signature(signature: List[str]): - m = hashlib.sha256() - m.update(" ".join(signature).encode()) - return m.hexdigest()[:8] - - meta_sig = f"warps{args.num_warps}xstages{args.num_stages}" - sig_hash = hash_signature(signature + [meta_sig]) - - def constexpr(s): - try: - ret = int(s) - return ret - except ValueError: - pass - try: - ret = float(s) - return ret - except ValueError: - pass - if s == 'True': - return True - if s == 'False': - return False - return None - - hints = {i: constexpr(s.split(":")[1]) for i, s in enumerate(signature) if ":" in s} - hints = {k: v for k, v in hints.items() if v is not None} - constexprs = {i: constexpr(s) for i, s in enumerate(signature)} - constexprs = {k: v for k, v in constexprs.items() if v is not None} - # print(f"{constexprs=}") - signature = {i: s.split(":")[0] for i, s in enumerate(signature) if i not in constexprs} - const_sig = 'x'.join([str(v) for v in constexprs.values()]) - doc_string = [f"{kernel.arg_names[i]}={constexprs[i]}" for i in constexprs.keys()] - doc_string += [f"num_warps={args.num_warps}", f"num_stages={args.num_stages}"] - - # compile ast into cubin - for h in hints.values(): - assert h in [1, 16], f"Only 1 and 16 are valid hints, got {h}" - divisible_by_16 = [i for i, h in hints.items() if h == 16] - equal_to_1 = [i for i, h in hints.items() if h == 1] - config = triton.compiler.instance_descriptor(divisible_by_16=divisible_by_16, equal_to_1=equal_to_1) - for i in equal_to_1: - constexprs.update({i: 1}) - # print(f'{kernel=}') - ccinfo = triton.compile(kernel, single_cpu=True, signature=signature, constants=constexprs, configs=[config], num_warps=args.num_warps, num_stages=args.num_stages, waves_per_eu=args.waves_per_eu, aot_arch=args.target) - hsaco_path = ccinfo.asm.get('hsaco_path', None) - if args.verbose: - print(dir(ccinfo)) - print(f'{ccinfo.asm.keys()=}') - print(f'{ccinfo.fn=}') - print(f'{hsaco_path=}') - - if hsaco_path is not None: - if args.nostrip: - shutil.copy(hsaco_path, out_path.with_suffix('.hsaco')) - else: - subprocess.run(['/opt/rocm/llvm/bin/llvm-objcopy', '--remove-section', '.debug_*', str(hsaco_path), str(out_path.with_suffix('.hsaco'))]) - - with out_path.with_suffix('.json').open("w") as fp: - json.dump(ccinfo.metadata, fp, indent=2) - -if __name__ == "__main__": - main()