From c974dee36995e62a300430a7258256e03e2f3aab Mon Sep 17 00:00:00 2001 From: Ivar Flakstad <69173633+ivarflakstad@users.noreply.github.com> Date: Mon, 18 Mar 2024 14:38:40 +0100 Subject: [PATCH] working bfloat matmul --- candle-core/benches/bench_main.rs | 6 +-- candle-core/benches/benchmarks/matmul.rs | 4 +- candle-core/src/metal_backend.rs | 1 + candle-metal-kernels/src/lib.rs | 1 + .../src/libMetalFlashAttention.metallib | Bin 116184 -> 127000 bytes candle-metal-kernels/src/tests.rs | 36 ++++++++++++------ 6 files changed, 32 insertions(+), 16 deletions(-) diff --git a/candle-core/benches/bench_main.rs b/candle-core/benches/bench_main.rs index 162e3f2b..661bdd2a 100644 --- a/candle-core/benches/bench_main.rs +++ b/candle-core/benches/bench_main.rs @@ -2,8 +2,8 @@ mod benchmarks; use criterion::criterion_main; criterion_main!( - benchmarks::affine::benches, + //benchmarks::affine::benches, benchmarks::matmul::benches, - benchmarks::random::benches, - benchmarks::where_cond::benches + //benchmarks::random::benches, + //benchmarks::where_cond::benches ); diff --git a/candle-core/benches/benchmarks/matmul.rs b/candle-core/benches/benchmarks/matmul.rs index 9d67e642..fa19ecfa 100644 --- a/candle-core/benches/benchmarks/matmul.rs +++ b/candle-core/benches/benchmarks/matmul.rs @@ -13,11 +13,11 @@ fn run_bench(c: &mut Criterion, device: &Device) { let n = 2048; let k = 2048; - let dtype = DType::F32; + let dtype = DType::BF16; let lhs = Tensor::zeros((b, m, k), dtype, device).unwrap(); let rhs = Tensor::zeros((b, n, k), dtype, device).unwrap(); - let flops = b * m * n * k; + let flops = b * m * n * k * dtype.size_in_bytes(); let mut group = c.benchmark_group(device.bench_name("matmul")); group.throughput(Throughput::Bytes(flops as u64)); diff --git a/candle-core/src/metal_backend.rs b/candle-core/src/metal_backend.rs index 6e1ecc5e..abd647af 100644 --- a/candle-core/src/metal_backend.rs +++ b/candle-core/src/metal_backend.rs @@ -1254,6 +1254,7 @@ impl BackendStorage for MetalStorage { let name = match self.dtype { DType::F32 => "sgemm", DType::F16 => "hgemm", + DType::BF16 => "bgemm", dtype => { return Err(MetalError::Message(format!("matmul doesn't support {dtype:?}")).into()) } diff --git a/candle-metal-kernels/src/lib.rs b/candle-metal-kernels/src/lib.rs index 33bc3453..f76af4cb 100644 --- a/candle-metal-kernels/src/lib.rs +++ b/candle-metal-kernels/src/lib.rs @@ -1340,6 +1340,7 @@ pub fn call_gemm( let bytes = match name { "sgemm" => 4, "hgemm" => 2, + "bgemm" => 2, other => { return Err(MetalKernelError::LoadLibraryError(format!( "{other} is not a valid kernel for gemm" diff --git a/candle-metal-kernels/src/libMetalFlashAttention.metallib b/candle-metal-kernels/src/libMetalFlashAttention.metallib index 1e2d1acf3dbaf4a94abc7c735fa3a5d6d7f2287f..57634be8cab4db319df5b775f92b92785270f774 100644 GIT binary patch delta 57798 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%0Al$p7lzbQ;Unv1*yyMN_B!lcOS6? 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 diff --git a/candle-metal-kernels/src/tests.rs b/candle-metal-kernels/src/tests.rs index 459c8edb..0da8619c 100644 --- a/candle-metal-kernels/src/tests.rs +++ b/candle-metal-kernels/src/tests.rs @@ -857,7 +857,20 @@ fn where_cond() { assert_eq!(approx(results, 4), vec![-1.0f32, 2.0, -3.0, -4.0, 5.0, 6.0]); } -fn run_gemm( +trait Gemmable: Clone { + const gemm_name: &'static str; +} +impl Gemmable for f32 { + const gemm_name: &'static str = "sgemm"; +} +impl Gemmable for f16 { + const gemm_name: &'static str = "hgemm"; +} +impl Gemmable for bf16 { + const gemm_name: &'static str = "bgemm"; +} + +fn run_gemm( (b, m, n, k): (usize, usize, usize, usize), lhs: &[T], lhs_stride: Vec, @@ -866,6 +879,7 @@ fn run_gemm( rhs_stride: Vec, rhs_offset: usize, ) -> Vec { + let device = device(); let kernels = Kernels::new(); let command_queue = device.new_command_queue(); @@ -888,7 +902,7 @@ fn run_gemm( &device, command_buffer, &kernels, - "sgemm", + T::gemm_name, (b, m, n, k), &lhs_stride, lhs_offset, @@ -909,23 +923,23 @@ fn run_gemm( fn gemm() { let (b, m, n, k) = (1, 2, 4, 3); let lhs_stride = vec![m * k, k, 1]; - let lhs: Vec = (0..b * m * k).map(|f| f as f32).collect(); + let lhs: Vec = (0..b * m * k).map(|f| bf16::from_f32(f as f32)).collect(); let rhs_stride = vec![n * k, n, 1]; - let rhs: Vec = (0..b * n * k).map(|f| f as f32).collect(); + let rhs: Vec = (0..b * n * k).map(|f| bf16::from_f32(f as f32)).collect(); let results = run_gemm((b, m, n, k), &lhs, lhs_stride, 0, &rhs, rhs_stride, 0); assert_eq!( - approx(results, 4), + approx_bf16(results, 4), vec![20.0, 23.0, 26.0, 29.0, 56.0, 68.0, 80.0, 92.0] ); let (b, m, n, k) = (2, 2, 4, 3); let lhs_stride = vec![m * k, k, 1]; - let lhs: Vec = (0..b * m * k).map(|f| f as f32).collect(); + let lhs: Vec = (0..b * m * k).map(|f| bf16::from_f32(f as f32)).collect(); let rhs_stride = vec![n * k, n, 1]; - let rhs: Vec = (0..b * n * k).map(|f| f as f32).collect(); + let rhs: Vec = (0..b * n * k).map(|f| bf16::from_f32(f as f32)).collect(); let results = run_gemm((b, m, n, k), &lhs, lhs_stride, 0, &rhs, rhs_stride, 0); assert_eq!( - approx(results, 4), + approx_bf16(results, 4), vec![ 20.0, 23.0, 26.0, 29.0, 56.0, 68.0, 80.0, 92.0, 344.0, 365.0, 386.0, 407.0, 488.0, 518.0, 548.0, 578.0 @@ -935,13 +949,13 @@ fn gemm() { // OFFSET let (b, m, n, k) = (2, 2, 4, 3); let lhs_stride = vec![m * k, k, 1]; - let lhs: Vec = (0..b * m * k).map(|f| f as f32).collect(); + let lhs: Vec = (0..b * m * k).map(|f| bf16::from_f32(f as f32)).collect(); let rhs_stride = vec![n * k, n, 1]; - let rhs: Vec = (0..b * n * k).map(|f| f as f32).collect(); + let rhs: Vec = (0..b * n * k).map(|f| bf16::from_f32(f as f32)).collect(); // Manually set batch_size=1 and offset 12 elements * 4 the number of bytes for f32 let results = run_gemm((1, m, n, k), &lhs, lhs_stride, 0, &rhs, rhs_stride, 12 * 4); assert_eq!( - approx(results, 4), + approx_bf16(results, 4), vec![56.0, 59.0, 62.0, 65.0, 200.0, 212.0, 224.0, 236.0] ); }