Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 15 additions & 19 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ else
exit 1
fi
METALLIB_BUILD_DIR=".build/metallib_build"
METALLIB_DEST=".build/arm64-apple-macosx/release"
# Ask SwiftPM for the real bin dir: Swift 6.4+ builds into .build/out/Products/Release
# instead of .build/arm64-apple-macosx/release.
METALLIB_DEST="$(swift build -c release --show-bin-path)"

rm -rf "$METALLIB_BUILD_DIR"
mkdir -p "$METALLIB_BUILD_DIR"
Expand All @@ -77,25 +79,19 @@ fi

popd > /dev/null

# Copy the freshly built metallib next to the binary, explicitly naming it default.metallib for mlx-c
# Copy the freshly built metallib next to the binary. MLX loads a colocated
# mlx.metallib before anything else, so that name guarantees the full kernel set
# wins over the partial default.metallib SwiftPM puts in mlx-swift_Cmlx.bundle.
# default.metallib is kept for mlx-c.
mkdir -p "$METALLIB_DEST"
if [ -f "$METALLIB_BUILD_DIR/lib/mlx.metallib" ]; then
cp "$METALLIB_BUILD_DIR/lib/mlx.metallib" "$METALLIB_DEST/default.metallib"
echo "✅ Built and copied default.metallib to $METALLIB_DEST/"
elif [ -f "$METALLIB_BUILD_DIR/mlx.metallib" ]; then
cp "$METALLIB_BUILD_DIR/mlx.metallib" "$METALLIB_DEST/default.metallib"
echo "✅ Built and copied default.metallib to $METALLIB_DEST/"
else
# Search for it anywhere in the build dir
BUILT=$(find "$METALLIB_BUILD_DIR" -name "mlx.metallib" | head -1)
if [ -n "$BUILT" ]; then
cp "$BUILT" "$METALLIB_DEST/default.metallib"
echo "✅ Built and copied default.metallib to $METALLIB_DEST/"
else
echo "❌ Failed to build mlx.metallib. Check cmake output above."
exit 1
fi
BUILT=$(find "$METALLIB_BUILD_DIR" -name "mlx.metallib" | head -1)
if [ -z "$BUILT" ]; then
echo "❌ Failed to build mlx.metallib. Check cmake output above."
exit 1
fi
cp "$BUILT" "$METALLIB_DEST/mlx.metallib"
cp "$BUILT" "$METALLIB_DEST/default.metallib"
echo "✅ Built and copied mlx.metallib + default.metallib to $METALLIB_DEST/"

# --- 4. Build SwiftLM ---
echo ""
Expand All @@ -105,6 +101,6 @@ swift build -c release
echo ""
echo "=============================================="
echo "✅ Build complete!"
echo " Binary: .build/release/SwiftLM"
echo " Binary: $METALLIB_DEST/SwiftLM"
echo " Metallib: $METALLIB_DEST/mlx.metallib"
echo "=============================================="
2 changes: 1 addition & 1 deletion mlx-swift
Submodule mlx-swift updated 86 files
+43 −41 Source/Cmlx/mlx-generated/binary_ops.cpp
+77 −63 Source/Cmlx/mlx-generated/conv.cpp
+40 −39 Source/Cmlx/mlx-generated/fft.cpp
+20 −20 Source/Cmlx/mlx-generated/fp_quantized.cpp
+20 −20 Source/Cmlx/mlx-generated/fp_quantized_nax.cpp
+64 −50 Source/Cmlx/mlx-generated/gemm.cpp
+42 −41 Source/Cmlx/mlx-generated/gemm_nax.cpp
+2 −2 Source/Cmlx/mlx-generated/gemv_masked.cpp
+4 −4 Source/Cmlx/mlx-generated/metal/arg_reduce.metal
+6 −6 Source/Cmlx/mlx-generated/metal/atomic.h
+43 −41 Source/Cmlx/mlx-generated/metal/binary_ops.h
+3 −2 Source/Cmlx/mlx-generated/metal/complex.h
+40 −39 Source/Cmlx/mlx-generated/metal/fft/readwrite.h
+4 −4 Source/Cmlx/mlx-generated/metal/fp4.h
+7 −7 Source/Cmlx/mlx-generated/metal/fp8.h
+9 −9 Source/Cmlx/mlx-generated/metal/fp_quantized.h
+9 −9 Source/Cmlx/mlx-generated/metal/fp_quantized_nax.h
+2 −2 Source/Cmlx/mlx-generated/metal/gemv_masked.h
+1 −1 Source/Cmlx/mlx-generated/metal/logging.h
+7 −7 Source/Cmlx/mlx-generated/metal/quantized.h
+14 −14 Source/Cmlx/mlx-generated/metal/quantized_nax.h
+42 −33 Source/Cmlx/mlx-generated/metal/reduction/ops.h
+22 −22 Source/Cmlx/mlx-generated/metal/scan.h
+2 −2 Source/Cmlx/mlx-generated/metal/steel/attn/kernels/steel_attention_nax.h
+14 −14 Source/Cmlx/mlx-generated/metal/steel/attn/loader.h
+32 −26 Source/Cmlx/mlx-generated/metal/steel/attn/mma.h
+35 −35 Source/Cmlx/mlx-generated/metal/steel/attn/nax.h
+4 −4 Source/Cmlx/mlx-generated/metal/steel/attn/transforms.h
+12 −12 Source/Cmlx/mlx-generated/metal/steel/conv/loaders/loader_channel_l.h
+8 −8 Source/Cmlx/mlx-generated/metal/steel/conv/loaders/loader_channel_n.h
+10 −10 Source/Cmlx/mlx-generated/metal/steel/conv/loaders/loader_general.h
+2 −2 Source/Cmlx/mlx-generated/metal/steel/gemm/kernels/steel_gemm_masked.h
+7 −7 Source/Cmlx/mlx-generated/metal/steel/gemm/loader.h
+50 −37 Source/Cmlx/mlx-generated/metal/steel/gemm/mma.h
+35 −35 Source/Cmlx/mlx-generated/metal/steel/gemm/nax.h
+4 −4 Source/Cmlx/mlx-generated/metal/steel/gemm/transforms.h
+3 −2 Source/Cmlx/mlx-generated/metal/steel/utils/integral_constant.h
+1 −1 Source/Cmlx/mlx-generated/metal/ternary_ops.h
+82 −82 Source/Cmlx/mlx-generated/metal/unary_ops.h
+15 −12 Source/Cmlx/mlx-generated/metal/utils.h
+7 −7 Source/Cmlx/mlx-generated/quantized.cpp
+14 −14 Source/Cmlx/mlx-generated/quantized_nax.cpp
+48 −39 Source/Cmlx/mlx-generated/reduce_utils.cpp
+65 −63 Source/Cmlx/mlx-generated/scan.cpp
+53 −46 Source/Cmlx/mlx-generated/steel_attention.cpp
+44 −43 Source/Cmlx/mlx-generated/steel_attention_nax.cpp
+10 −10 Source/Cmlx/mlx-generated/steel_conv_general.cpp
+2 −2 Source/Cmlx/mlx-generated/steel_gemm_masked.cpp
+1 −1 Source/Cmlx/mlx-generated/ternary_ops.cpp
+89 −89 Source/Cmlx/mlx-generated/unary_ops.cpp
+19 −15 Source/Cmlx/mlx-generated/utils.cpp
+2 −1 Source/Cmlx/mlx/cmake/extension.cmake
+26 −0 Source/Cmlx/mlx/docs/src/dev/extensions.rst
+2 −1 Source/Cmlx/mlx/mlx/backend/metal/kernels/CMakeLists.txt
+4 −4 Source/Cmlx/mlx/mlx/backend/metal/kernels/arg_reduce.metal
+6 −6 Source/Cmlx/mlx/mlx/backend/metal/kernels/atomic.h
+43 −41 Source/Cmlx/mlx/mlx/backend/metal/kernels/binary_ops.h
+3 −2 Source/Cmlx/mlx/mlx/backend/metal/kernels/complex.h
+40 −39 Source/Cmlx/mlx/mlx/backend/metal/kernels/fft/readwrite.h
+4 −4 Source/Cmlx/mlx/mlx/backend/metal/kernels/fp4.h
+7 −7 Source/Cmlx/mlx/mlx/backend/metal/kernels/fp8.h
+9 −9 Source/Cmlx/mlx/mlx/backend/metal/kernels/fp_quantized.h
+9 −9 Source/Cmlx/mlx/mlx/backend/metal/kernels/fp_quantized_nax.h
+2 −2 Source/Cmlx/mlx/mlx/backend/metal/kernels/gemv_masked.h
+1 −1 Source/Cmlx/mlx/mlx/backend/metal/kernels/logging.h
+7 −7 Source/Cmlx/mlx/mlx/backend/metal/kernels/quantized.h
+14 −14 Source/Cmlx/mlx/mlx/backend/metal/kernels/quantized_nax.h
+42 −33 Source/Cmlx/mlx/mlx/backend/metal/kernels/reduction/ops.h
+22 −22 Source/Cmlx/mlx/mlx/backend/metal/kernels/scan.h
+2 −2 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/attn/kernels/steel_attention_nax.h
+14 −14 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/attn/loader.h
+32 −26 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/attn/mma.h
+35 −35 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/attn/nax.h
+4 −4 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/attn/transforms.h
+12 −12 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/conv/loaders/loader_channel_l.h
+8 −8 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/conv/loaders/loader_channel_n.h
+10 −10 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/conv/loaders/loader_general.h
+2 −2 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/gemm/kernels/steel_gemm_masked.h
+7 −7 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/gemm/loader.h
+50 −37 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/gemm/mma.h
+35 −35 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/gemm/nax.h
+4 −4 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/gemm/transforms.h
+3 −2 Source/Cmlx/mlx/mlx/backend/metal/kernels/steel/utils/integral_constant.h
+1 −1 Source/Cmlx/mlx/mlx/backend/metal/kernels/ternary_ops.h
+82 −82 Source/Cmlx/mlx/mlx/backend/metal/kernels/unary_ops.h
+15 −12 Source/Cmlx/mlx/mlx/backend/metal/kernels/utils.h
7 changes: 3 additions & 4 deletions run_benchmark.sh
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ print_server_log() {
fi
}

export METAL_LIBRARY_PATH="$(pwd)/.build/arm64-apple-macosx/release"
export METAL_LIBRARY_PATH="$(cd .build/release 2>/dev/null && pwd -P)"

if [ -n "${SUITE_OPT:-}" ]; then
# Sub-process invocation from automated matrix — skip interactive menu
Expand Down Expand Up @@ -302,9 +302,8 @@ if { [ "$suite_opt" == "5" ] || [ "$suite_opt" == "6" ]; } && [[ "$FULL_MODEL" =
fi

# Quick sanity check
if [ -f ".build/arm64-apple-macosx/release/SwiftLM" ]; then
BIN=".build/arm64-apple-macosx/release/SwiftLM"
elif [ -f ".build/release/SwiftLM" ]; then
# .build/release is a symlink to the real bin dir on every SwiftPM layout
if [ -f ".build/release/SwiftLM" ]; then
BIN=".build/release/SwiftLM"
else
echo "⚠️ SwiftLM release binary not found! Please compile the project by running ./build.sh first."
Expand Down
2 changes: 1 addition & 1 deletion scripts/profiling/mtp_bench.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import urllib.request
import urllib.error

SWIFTLM_PATH = ".build/arm64-apple-macosx/release/SwiftLM"
SWIFTLM_PATH = ".build/release/SwiftLM"
PORT = 5430

CONFIGS = [
Expand Down
2 changes: 1 addition & 1 deletion scripts/profiling/profile_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
{"name": "MTP + TurboQuant", "flags": ["--stream-experts", "--mtp", "--num-mtp-tokens", "4", "--turbo-kv"]},
]

SWIFTLM_PATH = ".build/arm64-apple-macosx/release/SwiftLM"
SWIFTLM_PATH = ".build/release/SwiftLM"

def get_physical_ram_gb():
try:
Expand Down
2 changes: 1 addition & 1 deletion scripts/profiling/profile_speculative.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import subprocess, time, json, urllib.request, os, signal

SWIFTLM_PATH = ".build/arm64-apple-macosx/release/SwiftLM"
SWIFTLM_PATH = ".build/release/SwiftLM"
MAIN_MODEL = "mlx-community/gemma-4-26b-a4b-it-4bit"
DRAFT_MODEL = "mlx-community/gemma-4-e4b-it-4bit"

Expand Down
2 changes: 1 addition & 1 deletion tests/SwiftBuddyTests/AudioTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ final class AudioTests: XCTestCase {
.deletingLastPathComponent() // SwiftLM

let debugExecutableURL = projectRoot.appendingPathComponent(".build/arm64-apple-macosx/debug/SwiftLM")
let releaseExecutableURL = projectRoot.appendingPathComponent(".build/arm64-apple-macosx/release/SwiftLM")
let releaseExecutableURL = projectRoot.appendingPathComponent(".build/release/SwiftLM")

let executableURL = FileManager.default.fileExists(atPath: debugExecutableURL.path)
? debugExecutableURL
Expand Down
2 changes: 1 addition & 1 deletion tests/SwiftBuddyTests/VLMTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ final class VLMTests: XCTestCase {
.deletingLastPathComponent()

let debugExecutableURL = projectRoot.appendingPathComponent(".build/arm64-apple-macosx/debug/SwiftLM")
let releaseExecutableURL = projectRoot.appendingPathComponent(".build/arm64-apple-macosx/release/SwiftLM")
let releaseExecutableURL = projectRoot.appendingPathComponent(".build/release/SwiftLM")
let executableURL = FileManager.default.fileExists(atPath: debugExecutableURL.path)
? debugExecutableURL
: releaseExecutableURL
Expand Down
Loading