From 125ddfa2a5ed8ad582b7be550d933bd5ca12c3ec Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 31 May 2026 19:36:54 +0530 Subject: [PATCH 1/8] docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 --- assets/run_20260530_165216 (1).png | Bin 0 -> 641389 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/run_20260530_165216 (1).png diff --git a/assets/run_20260530_165216 (1).png b/assets/run_20260530_165216 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..cb719afd3d37f66ed3bc624cc844ce71f797639d GIT binary patch literal 641389 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�kBj*| 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

ffp69^nmxJHl9u_J^(t$wcp86H9{)Q1?iJaYj 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

dqod&@S6P0R%~zydz>C0UHNgkzz9k? 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

4z>^1F;IebrO3C}C!)`#S$)||{3ODm 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 $B$KhXWvd@$}=LQ;~; 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 Date: Sun, 31 May 2026 22:12:57 +0530 Subject: [PATCH 2/8] docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max From 212b311dfa71eab4abfe57c3a102e74e0e05656d Mon Sep 17 00:00:00 2001 From: Eamon Date: Mon, 1 Jun 2026 00:12:49 +0530 Subject: [PATCH 3/8] feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --- CUDA/includes/attention.cuh | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 CUDA/includes/attention.cuh diff --git a/CUDA/includes/attention.cuh b/CUDA/includes/attention.cuh new file mode 100644 index 0000000..7feac08 --- /dev/null +++ b/CUDA/includes/attention.cuh @@ -0,0 +1,29 @@ +#pragma once + +#include "tensor.cuh" + +#include + +namespace quadtrix { +namespace cuda { + +Status attention_forward( + const TensorView& input_qkv, + TensorView preatt, + TensorView att, + TensorView output, + int num_heads, + cudaStream_t stream = nullptr); + +Status attention_backward( + const TensorView& grad_output, + const TensorView& input_qkv, + const TensorView& att, + TensorView grad_input_qkv, + TensorView grad_preatt, + TensorView grad_att, + int num_heads, + cudaStream_t stream = nullptr); + +} // namespace cuda +} // namespace quadtrix From aef3e1e81a25ceba53e7492beee9440923ed6102 Mon Sep 17 00:00:00 2001 From: Eamon Sippy Date: Mon, 1 Jun 2026 22:57:33 +0530 Subject: [PATCH 4/8] CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- Co-authored-by: Max --- CUDA/includes/checkpoint.h | 25 +++++++ CUDA/includes/common.h | 120 ++++++++++++++++++++++++++++++++++ CUDA/includes/dataloader.h | 29 ++++++++ CUDA/includes/gelu.cuh | 31 +++++++++ CUDA/includes/global_norm.cuh | 26 ++++++++ 5 files changed, 231 insertions(+) create mode 100644 CUDA/includes/checkpoint.h create mode 100644 CUDA/includes/common.h create mode 100644 CUDA/includes/dataloader.h create mode 100644 CUDA/includes/gelu.cuh create mode 100644 CUDA/includes/global_norm.cuh diff --git a/CUDA/includes/checkpoint.h b/CUDA/includes/checkpoint.h new file mode 100644 index 0000000..ba91b0f --- /dev/null +++ b/CUDA/includes/checkpoint.h @@ -0,0 +1,25 @@ +#pragma once + +#include "tensor.cuh" + +namespace quadtrix { +namespace cuda { + +struct CheckpointMetadata { + int vocab_size = 0; + int max_sequence_length = 0; + int num_layers = 0; + int num_heads = 0; + int channels = 0; +}; + +inline bool load_checkpoint_metadata(const char*, CheckpointMetadata*) { + return false; +} + +inline bool save_tensor_checkpoint(const char*, const TensorView&) { + return false; +} + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/common.h b/CUDA/includes/common.h new file mode 100644 index 0000000..36df155 --- /dev/null +++ b/CUDA/includes/common.h @@ -0,0 +1,120 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include + +namespace quadtrix { +namespace cuda { + +enum class DType : std::uint8_t { + F32, + F16, + BF16, + I32, + U8, +}; + +enum class DeviceKind : std::uint8_t { + CPU, + CUDA, +}; + +struct Status { + bool ok; + cudaError_t cuda_error; + const char* message; + + static Status success() { + return {true, cudaSuccess, "ok"}; + } + + static Status failure(cudaError_t error, const char* message) { + return {false, error, message}; + } +}; + +inline const char* dtype_name(DType dtype) { + switch (dtype) { + case DType::F32: + return "f32"; + case DType::F16: + return "f16"; + case DType::BF16: + return "bf16"; + case DType::I32: + return "i32"; + case DType::U8: + return "u8"; + } + return "unknown"; +} + +inline std::size_t dtype_size(DType dtype) { + switch (dtype) { + case DType::F32: + return 4; + case DType::F16: + return 2; + case DType::BF16: + return 2; + case DType::I32: + return 4; + case DType::U8: + return 1; + } + + std::fprintf(stderr, "Unknown CUDA dtype value %u\n", static_cast(dtype)); + std::abort(); +} + +inline bool checked_mul(std::size_t lhs, std::size_t rhs, std::size_t* out) { + if (lhs != 0 && rhs > std::numeric_limits::max() / lhs) { + return false; + } + *out = lhs * rhs; + return true; +} + +inline Status check_cuda(cudaError_t error, const char* expression, const char* file, int line) { + if (error == cudaSuccess) { + return Status::success(); + } + + std::fprintf( + stderr, + "CUDA error at %s:%d: %s failed with %s\n", + file, + line, + expression, + cudaGetErrorString(error)); + return Status::failure(error, expression); +} + +inline void abort_on_cuda(cudaError_t error, const char* expression, const char* file, int line) { + if (error == cudaSuccess) { + return; + } + + std::fprintf( + stderr, + "Fatal CUDA error at %s:%d: %s failed with %s\n", + file, + line, + expression, + cudaGetErrorString(error)); + std::abort(); +} + +} // namespace cuda +} // namespace quadtrix + +#define QUADTRIX_CUDA_CHECK(expr) \ + ::quadtrix::cuda::check_cuda((expr), #expr, __FILE__, __LINE__) + +#define QUADTRIX_CUDA_ABORT(expr) \ + ::quadtrix::cuda::abort_on_cuda((expr), #expr, __FILE__, __LINE__) diff --git a/CUDA/includes/dataloader.h b/CUDA/includes/dataloader.h new file mode 100644 index 0000000..fd3c47d --- /dev/null +++ b/CUDA/includes/dataloader.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +namespace quadtrix { +namespace cuda { + +struct TokenBatchView { + const std::int32_t* inputs = nullptr; + const std::int32_t* targets = nullptr; + int batch_size = 0; + int sequence_length = 0; +}; + +class DataLoader { +public: + DataLoader() = default; + + bool next(TokenBatchView* batch) { + if (batch != nullptr) { + *batch = {}; + } + return false; + } +}; + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/gelu.cuh b/CUDA/includes/gelu.cuh new file mode 100644 index 0000000..af87e64 --- /dev/null +++ b/CUDA/includes/gelu.cuh @@ -0,0 +1,31 @@ +#pragma once + +#include "tensor.cuh" + +#include + +#include + +namespace quadtrix { +namespace cuda { + +enum class GeluMode : std::uint8_t { + Exact, + Approximate, +}; + +Status gelu_forward( + const TensorView& input, + TensorView output, + GeluMode mode = GeluMode::Approximate, + cudaStream_t stream = nullptr); + +Status gelu_backward( + const TensorView& grad_output, + const TensorView& input, + TensorView grad_input, + GeluMode mode = GeluMode::Approximate, + cudaStream_t stream = nullptr); + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/global_norm.cuh b/CUDA/includes/global_norm.cuh new file mode 100644 index 0000000..f418ab7 --- /dev/null +++ b/CUDA/includes/global_norm.cuh @@ -0,0 +1,26 @@ +#pragma once + +#include "tensor.cuh" + +#include + +namespace quadtrix { +namespace cuda { + +Status global_norm_squared( + const TensorView& grads, + TensorView partial_sums, + cudaStream_t stream = nullptr); + +Status clip_gradients_by_global_norm( + TensorView grads, + float global_norm, + float max_norm, + cudaStream_t stream = nullptr); + +inline float clip_scale(float global_norm, float max_norm) { + return global_norm > max_norm && global_norm > 0.0f ? max_norm / global_norm : 1.0f; +} + +} // namespace cuda +} // namespace quadtrix From e4850cc96ba48c327516a3cc986298dad2b8a7df Mon Sep 17 00:00:00 2001 From: Eamon Sippy Date: Mon, 8 Jun 2026 13:11:30 +0530 Subject: [PATCH 5/8] Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- Co-authored-by: Max * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv Co-Authored-By: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-Authored-By: Eamon Sippy * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .devops/Dockerfile.dev.frontend | 12 + .devops/Dockerfile.frontend | 22 + .github/workflows/ci.yml | 84 +++- .github/workflows/docker-publish.yml | 212 +++++---- .github/workflows/pr-check.yml | 16 +- .github/workflows/release.yml | 263 +++++++++++ CUDA/includes/layernorm.cuh | 32 ++ CUDA/includes/logger.h | 37 ++ CUDA/includes/matmul.cuh | 99 ++++ CUDA/includes/memory.cuh | 120 +++++ CUDA/includes/nccl_all_reduce.cuh | 96 ++++ CUDA/includes/tensor.cuh | 168 +++++++ CUDA/llmcpp/adamw.cuh | 98 ++++ CUDA/llmcpp/cuda_utils.cuh | 286 ++++++++++++ CUDA/llmcpp/cudnn_att.cpp | 297 ++++++++++++ CUDA/llmcpp/dataloader.h | 496 ++++++++++++++++++++ CUDA/llmcpp/layernorm.cuh | 505 +++++++++++++++++++++ CUDA/llmcpp/mfu.h | 244 ++++++++++ CUDA/llmcpp/rand.h | 240 ++++++++++ CUDA/llmcpp/utils.h | 223 +++++++++ CUDA/llmcpp/zero.cuh | 597 +++++++++++++++++++++++++ README.md | 10 +- benchmark/results/python_benchmark.csv | 13 + init.py | 113 +++++ 24 files changed, 4164 insertions(+), 119 deletions(-) create mode 100644 .devops/Dockerfile.dev.frontend create mode 100644 .devops/Dockerfile.frontend create mode 100644 .github/workflows/release.yml create mode 100644 CUDA/includes/layernorm.cuh create mode 100644 CUDA/includes/logger.h create mode 100644 CUDA/includes/matmul.cuh create mode 100644 CUDA/includes/memory.cuh create mode 100644 CUDA/includes/nccl_all_reduce.cuh create mode 100644 CUDA/includes/tensor.cuh create mode 100644 CUDA/llmcpp/adamw.cuh create mode 100644 CUDA/llmcpp/cuda_utils.cuh create mode 100644 CUDA/llmcpp/cudnn_att.cpp create mode 100644 CUDA/llmcpp/dataloader.h create mode 100644 CUDA/llmcpp/layernorm.cuh create mode 100644 CUDA/llmcpp/mfu.h create mode 100644 CUDA/llmcpp/rand.h create mode 100644 CUDA/llmcpp/utils.h create mode 100644 CUDA/llmcpp/zero.cuh create mode 100644 benchmark/results/python_benchmark.csv create mode 100644 init.py diff --git a/.devops/Dockerfile.dev.frontend b/.devops/Dockerfile.dev.frontend new file mode 100644 index 0000000..de054d6 --- /dev/null +++ b/.devops/Dockerfile.dev.frontend @@ -0,0 +1,12 @@ +FROM node:20-alpine + +WORKDIR /app + +COPY frontend/package*.json ./ +RUN npm ci + +COPY frontend/ ./ + +EXPOSE 5173 + +CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] diff --git a/.devops/Dockerfile.frontend b/.devops/Dockerfile.frontend new file mode 100644 index 0000000..70ca5aa --- /dev/null +++ b/.devops/Dockerfile.frontend @@ -0,0 +1,22 @@ +FROM node:20-alpine AS build + +WORKDIR /app + +COPY frontend/package*.json ./ +RUN npm ci + +COPY frontend/ ./ + +ARG VITE_API_BASE_URL=/api +ENV VITE_API_BASE_URL=${VITE_API_BASE_URL} + +RUN npm run build + +FROM nginx:1.27-alpine AS runtime + +COPY .devops/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /app/dist /usr/share/nginx/html + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf49286..992ef59 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,10 @@ name: CI on: - push: - branches: [master, dev] workflow_dispatch: inputs: image: - description: "Which image to build?" + description: "Which image to build? (cpp=C++ engine, cpu=PyTorch CPU, cuda=PyTorch CUDA, all=all three)" required: true type: choice options: @@ -14,7 +12,7 @@ on: - cpu - cuda - all - push: + push_image: description: "Push to ghcr.io?" required: true default: "true" @@ -23,10 +21,10 @@ on: env: REGISTRY: ghcr.io - IMAGE_PREFIX: ghcr.io/${{ github.repository_owner }}/quadtrix jobs: + file-integrity: name: File integrity if: github.event_name == 'push' @@ -44,9 +42,9 @@ jobs: failed=0 for f in "${files[@]}"; do if [ -f "$f" ]; then - echo "✅ $f" + echo "PASS: $f" else - echo "❌ $f — MISSING" + echo "FAIL: $f -- MISSING" failed=1 fi done @@ -66,8 +64,8 @@ jobs: args: "check engine/ --ignore E501 --exit-zero" - build-cpp: - name: C++ compile check + build-binary-linux: + name: Binary (ubuntu-latest) if: github.event_name == 'push' runs-on: ubuntu-latest steps: @@ -85,10 +83,43 @@ jobs: - name: Smoke test run: ./quadtrix --help || true + - name: Upload binary + uses: actions/upload-artifact@v4 + with: + name: quadtrix-linux-amd64 + path: quadtrix + retention-days: 7 + + + build-binary-macos: + name: Binary (macos-14) + if: github.event_name == 'push' + runs-on: macos-14 + steps: + - uses: actions/checkout@v4 + + - name: Compile main.cpp + run: | + g++ -std=c++17 -O3 \ + -I. -Iinclude \ + -o quadtrix main.cpp + + - name: Smoke test + run: ./quadtrix --help || true + + - name: Package binary + run: tar -czf quadtrix-macos-arm64.tar.gz quadtrix + + - name: Upload binary + uses: actions/upload-artifact@v4 + with: + name: quadtrix-macos-arm64 + path: quadtrix-macos-arm64.tar.gz + retention-days: 7 build-cpp-image: - name: Build — cpp - if: github.event_name == 'workflow_dispatch' && (inputs.image == 'cpp' || inputs.image == 'all') + name: "Build -- cpp (C++ engine - linux/amd64 + arm64)" + if: ${{ github.event_name == 'workflow_dispatch' && (inputs.image == 'cpp' || inputs.image == 'all') }} runs-on: ubuntu-latest permissions: contents: read @@ -99,8 +130,11 @@ jobs: - uses: docker/setup-qemu-action@v3 - uses: docker/setup-buildx-action@v3 + - name: Set lowercase image prefix + run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV + - name: Login to GHCR - if: inputs.push == 'true' + if: ${{ inputs.push_image == 'true' }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} @@ -123,7 +157,7 @@ jobs: context: . file: .devops/Dockerfile.cpp platforms: linux/amd64,linux/arm64 - push: ${{ inputs.push == 'true' }} + push: ${{ inputs.push_image == 'true' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha,scope=cpp @@ -131,8 +165,8 @@ jobs: build-cpu-image: - name: Build — cpu - if: github.event_name == 'workflow_dispatch' && (inputs.image == 'cpu' || inputs.image == 'all') + name: "Build -- cpu (PyTorch CPU - linux/amd64 + arm64)" + if: ${{ github.event_name == 'workflow_dispatch' && (inputs.image == 'cpu' || inputs.image == 'all') }} runs-on: ubuntu-latest permissions: contents: read @@ -143,8 +177,11 @@ jobs: - uses: docker/setup-qemu-action@v3 - uses: docker/setup-buildx-action@v3 + - name: Set lowercase image prefix + run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV + - name: Login to GHCR - if: inputs.push == 'true' + if: ${{ inputs.push_image == 'true' }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} @@ -167,7 +204,7 @@ jobs: context: . file: .devops/Dockerfile platforms: linux/amd64,linux/arm64 - push: ${{ inputs.push == 'true' }} + push: ${{ inputs.push_image == 'true' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha,scope=cpu @@ -175,8 +212,8 @@ jobs: build-cuda-image: - name: Build — cuda - if: github.event_name == 'workflow_dispatch' && (inputs.image == 'cuda' || inputs.image == 'all') + name: "Build -- cuda (PyTorch CUDA - linux/amd64 only)" + if: ${{ github.event_name == 'workflow_dispatch' && (inputs.image == 'cuda' || inputs.image == 'all') }} runs-on: ubuntu-latest permissions: contents: read @@ -186,8 +223,11 @@ jobs: - uses: docker/setup-buildx-action@v3 + - name: Set lowercase image prefix + run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV + - name: Login to GHCR - if: inputs.push == 'true' + if: ${{ inputs.push_image == 'true' }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} @@ -210,8 +250,8 @@ jobs: context: . file: .devops/Dockerfile.backend platforms: linux/amd64 - push: ${{ inputs.push == 'true' }} + push: ${{ inputs.push_image == 'true' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha,scope=cuda - cache-to: type=gha,mode=max,scope=cuda \ No newline at end of file + cache-to: type=gha,mode=max,scope=cuda diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index ca9493f..0986534 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -1,66 +1,86 @@ -name: Release +name: Docker Images on: workflow_dispatch: inputs: + image: + description: "Image variant to build" + required: true + type: choice + options: + - cpp + - cpu + - cuda + - all version: - description: "Version tag (e.g. 1.2.3)" + description: "Optional image tag for manual runs" + required: false + push_image: + description: "Push to ghcr.io" required: true + default: "true" + type: choice + options: ["true", "false"] + +concurrency: + group: docker-images-${{ github.ref }} + cancel-in-progress: true env: REGISTRY: ghcr.io IMAGE_PREFIX: ghcr.io/${{ github.repository_owner }}/quadtrix jobs: - - build-binaries: - name: Binary (${{ matrix.os }}) - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-22.04, macos-14] - include: - - os: ubuntu-22.04 - artifact_name: quadtrix-linux-x64 - binary: quadtrix - - os: macos-14 - artifact_name: quadtrix-macos-arm64 - binary: quadtrix + build-cpp-image: + name: Docker cpp + if: ${{ inputs.image == 'cpp' || inputs.image == 'all' }} + runs-on: ubuntu-latest + permissions: + contents: read + packages: write steps: - uses: actions/checkout@v4 - - name: Compile (Linux) - if: runner.os == 'Linux' - run: | - sudo apt-get update && sudo apt-get install -y g++ - g++ -std=c++17 -O3 -march=native \ - -I. -Iinclude \ - -o ${{ matrix.binary }} main.cpp - strip ${{ matrix.binary }} - - - name: Compile (macOS) - if: runner.os == 'macOS' - run: | - g++ -std=c++17 -O3 -march=native \ - -I. -Iinclude \ - -o ${{ matrix.binary }} main.cpp - - - name: Package - run: | - mkdir dist - cp ${{ matrix.binary }} dist/ - cp README.md LICENSE dist/ - tar -czf ${{ matrix.artifact_name }}.tar.gz -C dist . - - - name: Upload to Release - uses: softprops/action-gh-release@v2 + - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-buildx-action@v3 + + - name: Set lowercase image prefix + run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> "$GITHUB_ENV" + + - name: Login to GHCR + if: ${{ inputs.push_image == 'true' }} + uses: docker/login-action@v3 with: - tag_name: v${{ github.event.inputs.version }} - files: ${{ matrix.artifact_name }}.tar.gz - generate_release_notes: true + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.IMAGE_PREFIX }}-cpp + tags: | + type=ref,event=tag + type=sha,prefix=sha- + type=raw,value=${{ inputs.version }},enable=${{ inputs.version != '' }} + type=raw,value=latest,enable=${{ inputs.push_image == 'true' }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: .devops/Dockerfile.cpp + platforms: linux/amd64,linux/arm64 + push: ${{ inputs.push_image == 'true' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha,scope=cpp + cache-to: type=gha,mode=max,scope=cpp - publish-images: - name: Publish Docker images + build-cpu-image: + name: Docker cpu + if: ${{ inputs.image == 'cpu' || inputs.image == 'all' }} runs-on: ubuntu-latest permissions: contents: read @@ -71,62 +91,82 @@ jobs: - uses: docker/setup-qemu-action@v3 - uses: docker/setup-buildx-action@v3 + - name: Set lowercase image prefix + run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> "$GITHUB_ENV" + - name: Login to GHCR + if: ${{ inputs.push_image == 'true' }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Parse tag - id: tag - run: echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT - - - name: Build & push backend - uses: docker/build-push-action@v6 + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 with: - context: . - file: .devops/Dockerfile.backend - platforms: linux/amd64,linux/arm64 - push: true + images: ${{ env.IMAGE_PREFIX }}-cpu tags: | - ${{ env.IMAGE_PREFIX }}-backend:latest - ${{ env.IMAGE_PREFIX }}-backend:${{ steps.tag.outputs.VERSION }} - cache-from: type=gha,scope=backend - cache-to: type=gha,mode=max,scope=backend + type=ref,event=tag + type=sha,prefix=sha- + type=raw,value=${{ inputs.version }},enable=${{ inputs.version != '' }} + type=raw,value=latest,enable=${{ inputs.push_image == 'true' }} - - name: Build & push frontend + - name: Build and push uses: docker/build-push-action@v6 with: context: . - file: .devops/Dockerfile.frontend + file: .devops/Dockerfile platforms: linux/amd64,linux/arm64 - push: true + push: ${{ inputs.push_image == 'true' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha,scope=cpu + cache-to: type=gha,mode=max,scope=cpu + + build-cuda-image: + name: Docker cuda + if: ${{ inputs.image == 'cuda' || inputs.image == 'all' }} + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v4 + + - uses: docker/setup-buildx-action@v3 + + - name: Set lowercase image prefix + run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> "$GITHUB_ENV" + + - name: Login to GHCR + if: ${{ inputs.push_image == 'true' }} + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.IMAGE_PREFIX }}-cuda tags: | - ${{ env.IMAGE_PREFIX }}-frontend:latest - ${{ env.IMAGE_PREFIX }}-frontend:${{ steps.tag.outputs.VERSION }} - cache-from: type=gha,scope=frontend - cache-to: type=gha,mode=max,scope=frontend + type=ref,event=tag + type=sha,prefix=sha- + type=raw,value=${{ inputs.version }},enable=${{ inputs.version != '' }} + type=raw,value=latest,enable=${{ inputs.push_image == 'true' }} - - name: Build & push cpp + - name: Build and push uses: docker/build-push-action@v6 with: context: . - file: .devops/Dockerfile.cpp - platforms: linux/amd64,linux/arm64 - push: true - tags: | - ${{ env.IMAGE_PREFIX }}-cpp:latest - ${{ env.IMAGE_PREFIX }}-cpp:${{ steps.tag.outputs.VERSION }} - cache-from: type=gha,scope=cpp - cache-to: type=gha,mode=max,scope=cpp - - - name: Create Release summary - run: | - echo "## Docker images published" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Image | Tags |" >> $GITHUB_STEP_SUMMARY - echo "|-------|------|" >> $GITHUB_STEP_SUMMARY - echo "| \`quadtrix-backend\` | \`latest\`, \`${{ steps.tag.outputs.VERSION }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| \`quadtrix-frontend\` | \`latest\`, \`${{ steps.tag.outputs.VERSION }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| \`quadtrix-cpp\` | \`latest\`, \`${{ steps.tag.outputs.VERSION }}\` |" >> $GITHUB_STEP_SUMMARY + file: .devops/Dockerfile.backend + platforms: linux/amd64 + push: ${{ inputs.push_image == 'true' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha,scope=cuda + cache-to: type=gha,mode=max,scope=cuda diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 4824b9e..b50de6b 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -15,7 +15,7 @@ jobs: pr-sha: ${{ steps.get-sha.outputs.sha }} steps: - name: Check commenter permission - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const { data } = await github.rest.repos.getCollaboratorPermissionLevel({ @@ -34,7 +34,7 @@ jobs: } - name: React with rocket - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | await github.rest.reactions.createForIssueComment({ @@ -46,7 +46,7 @@ jobs: - name: Get PR head SHA id: get-sha - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const { data: pr } = await github.rest.pulls.get({ @@ -57,7 +57,7 @@ jobs: core.setOutput('sha', pr.head.sha); - name: Set checks to pending - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const sha = '${{ steps.get-sha.outputs.sha }}'; @@ -96,7 +96,7 @@ jobs: - name: Report status if: always() - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | await github.rest.repos.createCommitStatus({ @@ -158,7 +158,7 @@ jobs: - name: Report status if: always() - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | await github.rest.repos.createCommitStatus({ @@ -218,7 +218,7 @@ jobs: - name: Report status if: always() - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | await github.rest.repos.createCommitStatus({ @@ -237,7 +237,7 @@ jobs: runs-on: ubuntu-latest if: always() steps: - - uses: actions/github-script@v7 + - uses: actions/github-script@v9 with: script: | const jobs = ${{ toJSON(needs) }}; diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e92b486 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,263 @@ +name: Release + +on: + workflow_dispatch: + inputs: + version: + description: "Release version, for example v1.2.3 or 1.2.3" + required: true + +concurrency: + group: release + cancel-in-progress: false + +env: + ARTIFACT_ROOT: release-assets + +jobs: + release-metadata: + name: Release metadata + runs-on: ubuntu-latest + outputs: + tag_name: ${{ steps.tag.outputs.tag_name }} + steps: + - id: tag + shell: bash + run: | + set -euo pipefail + raw_tag="${{ inputs.version }}" + if [[ "${raw_tag}" == v* ]]; then + tag_name="${raw_tag}" + else + tag_name="v${raw_tag}" + fi + echo "tag_name=${tag_name}" >> "$GITHUB_OUTPUT" + + ubuntu-cpu: + name: Ubuntu ${{ matrix.build }} CPU + needs: release-metadata + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - build: x64 + os: ubuntu-22.04 + - build: arm64 + os: ubuntu-24.04-arm + steps: + - name: Clone + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Dependencies + shell: bash + run: | + set -euo pipefail + sudo apt-get update + sudo apt-get install -y build-essential file + + - name: Toolchain workaround + if: ${{ contains(matrix.os, 'ubuntu-24.04') }} + shell: bash + run: | + set -euo pipefail + sudo apt-get install -y gcc-14 g++-14 + echo "CC=gcc-14" >> "$GITHUB_ENV" + echo "CXX=g++-14" >> "$GITHUB_ENV" + + - name: Build + shell: bash + run: | + set -euo pipefail + ${CXX:-g++} -std=c++17 -O3 -DNDEBUG \ + -I. -Iinclude \ + -o quadtrix main.cpp + file quadtrix + + - name: Smoke test + shell: bash + run: | + set +e + ./quadtrix --chat >/dev/null 2>&1 + exit 0 + + - name: Pack artifacts + shell: bash + run: | + set -euo pipefail + package="quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-ubuntu-${{ matrix.build }}-cpu" + mkdir -p "${ARTIFACT_ROOT}/${package}" + cp quadtrix README.md LICENSE "${ARTIFACT_ROOT}/${package}/" + tar -czf "${package}.tar.gz" -C "${ARTIFACT_ROOT}" "${package}" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: quadtrix-bin-ubuntu-${{ matrix.build }}-cpu + path: quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-ubuntu-${{ matrix.build }}-cpu.tar.gz + if-no-files-found: error + retention-days: 30 + + windows-cpu: + name: Windows ${{ matrix.arch }} CPU + needs: release-metadata + runs-on: windows-2022 + strategy: + fail-fast: false + matrix: + include: + - arch: x64 + vcvars: x64 + - arch: arm64 + vcvars: amd64_arm64 + steps: + - name: Clone + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Build + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.vcvars }} + cl /nologo /std:c++17 /O2 /DNDEBUG /EHsc /Iinclude /I. main.cpp /Fe:quadtrix.exe + + - name: Smoke test + if: ${{ matrix.arch == 'x64' }} + shell: pwsh + run: | + $ErrorActionPreference = 'Continue' + & .\quadtrix.exe --chat | Out-Null + exit 0 + + - name: Pack artifacts + shell: pwsh + run: | + $package = "quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-windows-${{ matrix.arch }}-cpu" + New-Item -ItemType Directory -Force "${env:ARTIFACT_ROOT}\${package}" | Out-Null + Copy-Item quadtrix.exe "${env:ARTIFACT_ROOT}\${package}\" + Copy-Item README.md, LICENSE "${env:ARTIFACT_ROOT}\${package}\" + Compress-Archive -Path "${env:ARTIFACT_ROOT}\${package}\*" -DestinationPath "${package}.zip" -Force + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: quadtrix-bin-windows-${{ matrix.arch }}-cpu + path: quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-windows-${{ matrix.arch }}-cpu.zip + if-no-files-found: error + retention-days: 30 + + macos-cpu: + name: macOS ${{ matrix.build }} CPU + needs: release-metadata + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - build: arm64 + arch: arm64 + os: macos-14 + steps: + - name: Clone + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Build + shell: bash + run: | + set -euo pipefail + clang++ -std=c++17 -O3 -DNDEBUG -arch ${{ matrix.arch }} \ + -I. -Iinclude \ + -o quadtrix main.cpp + file quadtrix + + - name: Smoke test + shell: bash + run: | + set +e + ./quadtrix --chat >/dev/null 2>&1 + exit 0 + + - name: Pack artifacts + shell: bash + run: | + set -euo pipefail + package="quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-macos-${{ matrix.build }}-cpu" + mkdir -p "${ARTIFACT_ROOT}/${package}" + cp quadtrix README.md LICENSE "${ARTIFACT_ROOT}/${package}/" + tar -czf "${package}.tar.gz" -C "${ARTIFACT_ROOT}" "${package}" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: quadtrix-bin-macos-${{ matrix.build }}-cpu + path: quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-macos-${{ matrix.build }}-cpu.tar.gz + if-no-files-found: error + retention-days: 30 + + publish-release: + name: Publish GitHub release + needs: + - release-metadata + - ubuntu-cpu + - windows-cpu + - macos-cpu + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: dist + merge-multiple: true + + - name: Write release notes + shell: bash + run: | + cat > release-notes.md <<'EOF' + macOS/iOS: + + macOS Apple Silicon (arm64) + macOS Apple Silicon (arm64, KleidiAI enabled) DISABLED + macOS Intel (x64) SKIPPED + iOS XCFramework DISABLED + + Linux: + + Ubuntu x64 (CPU) + Ubuntu arm64 (CPU) + Ubuntu s390x (CPU) SKIPPED + Ubuntu x64 (Vulkan) DISABLED + Ubuntu arm64 (Vulkan) DISABLED + Ubuntu x64 (ROCm 7.2) DISABLED + Ubuntu x64 (OpenVINO) DISABLED + Ubuntu x64 (SYCL FP32) DISABLED + + Android: + + Android arm64 (CPU) DISABLED + + Windows: + + Windows x64 (CPU) + Windows arm64 (CPU) + Windows x64 (CUDA 12) - CUDA 12.4 DLLs DISABLED + Windows x64 (CUDA 13) - CUDA 13.3 DLLs DISABLED + Windows x64 (Vulkan) DISABLED + Windows x64 (SYCL) DISABLED + Windows x64 (HIP) DISABLED + EOF + + - name: Publish release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ needs.release-metadata.outputs.tag_name }} + target_commitish: ${{ github.sha }} + prerelease: false + body_path: release-notes.md + files: dist/* diff --git a/CUDA/includes/layernorm.cuh b/CUDA/includes/layernorm.cuh new file mode 100644 index 0000000..2645537 --- /dev/null +++ b/CUDA/includes/layernorm.cuh @@ -0,0 +1,32 @@ +#pragma once + +#include "tensor.cuh" + +#include + +namespace quadtrix { +namespace cuda { + +Status layernorm_forward( + const TensorView& input, + const TensorView& gamma, + const TensorView& beta, + TensorView output, + TensorView mean, + TensorView rstd, + float epsilon = 1.0e-5f, + cudaStream_t stream = nullptr); + +Status layernorm_backward( + const TensorView& grad_output, + const TensorView& input, + const TensorView& gamma, + const TensorView& mean, + const TensorView& rstd, + TensorView grad_input, + TensorView grad_gamma, + TensorView grad_beta, + cudaStream_t stream = nullptr); + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/logger.h b/CUDA/includes/logger.h new file mode 100644 index 0000000..219c50f --- /dev/null +++ b/CUDA/includes/logger.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +namespace quadtrix { +namespace cuda { + +enum class LogLevel { + Info, + Warn, + Error, +}; + +inline const char* log_level_name(LogLevel level) { + switch (level) { + case LogLevel::Info: + return "info"; + case LogLevel::Warn: + return "warn"; + case LogLevel::Error: + return "error"; + } + return "unknown"; +} + +inline void log_message(LogLevel level, const char* format, ...) { + std::fprintf(level == LogLevel::Error ? stderr : stdout, "[cuda:%s] ", log_level_name(level)); + va_list args; + va_start(args, format); + std::vfprintf(level == LogLevel::Error ? stderr : stdout, format, args); + va_end(args); + std::fprintf(level == LogLevel::Error ? stderr : stdout, "\n"); +} + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/matmul.cuh b/CUDA/includes/matmul.cuh new file mode 100644 index 0000000..12dd4b2 --- /dev/null +++ b/CUDA/includes/matmul.cuh @@ -0,0 +1,99 @@ +#pragma once + +#include "tensor.cuh" + +#include +#include + +#include + +namespace quadtrix { +namespace cuda { + +enum class MatmulTranspose : std::uint8_t { + None, + Transpose, +}; + +struct BlasStatus { + bool ok; + cublasStatus_t cublas_status; + const char* message; + + static BlasStatus success() { + return {true, CUBLAS_STATUS_SUCCESS, "ok"}; + } + + static BlasStatus failure(cublasStatus_t status, const char* message) { + return {false, status, message}; + } +}; + +const char* cublas_status_name(cublasStatus_t status); + +class BlasHandle { +public: + explicit BlasHandle(int device_id = 0); + ~BlasHandle(); + + BlasHandle(const BlasHandle&) = delete; + BlasHandle& operator=(const BlasHandle&) = delete; + + BlasHandle(BlasHandle&& other) noexcept; + BlasHandle& operator=(BlasHandle&& other) noexcept; + + cublasHandle_t get() const { + return handle_; + } + + int device_id() const { + return device_id_; + } + + BlasStatus set_stream(cudaStream_t stream); + +private: + cublasHandle_t handle_ = nullptr; + int device_id_ = 0; +}; + +BlasStatus matmul( + BlasHandle& handle, + const TensorView& a, + MatmulTranspose op_a, + const TensorView& b, + MatmulTranspose op_b, + TensorView c, + float alpha = 1.0f, + float beta = 0.0f, + cudaStream_t stream = nullptr); + +BlasStatus matmul_forward( + BlasHandle& handle, + const TensorView& input, + const TensorView& weight, + TensorView output, + cudaStream_t stream = nullptr, + float alpha = 1.0f, + float beta = 0.0f); + +BlasStatus matmul_backward_input( + BlasHandle& handle, + const TensorView& grad_output, + const TensorView& weight, + TensorView grad_input, + cudaStream_t stream = nullptr, + float alpha = 1.0f, + float beta = 0.0f); + +BlasStatus matmul_backward_weight( + BlasHandle& handle, + const TensorView& input, + const TensorView& grad_output, + TensorView grad_weight, + cudaStream_t stream = nullptr, + float alpha = 1.0f, + float beta = 0.0f); + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/memory.cuh b/CUDA/includes/memory.cuh new file mode 100644 index 0000000..e08fa4a --- /dev/null +++ b/CUDA/includes/memory.cuh @@ -0,0 +1,120 @@ +#pragma once + +#include "common.h" +#include "runtime.cuh" + +#include + +#include +#include + +namespace quadtrix { +namespace cuda { + +class DeviceBuffer { +public: + DeviceBuffer() = default; + + explicit DeviceBuffer(std::size_t bytes, int device_id = -1) { + allocate(bytes, device_id); + } + + ~DeviceBuffer() { + release(); + } + + DeviceBuffer(const DeviceBuffer&) = delete; + DeviceBuffer& operator=(const DeviceBuffer&) = delete; + + DeviceBuffer(DeviceBuffer&& other) noexcept { + swap(other); + } + + DeviceBuffer& operator=(DeviceBuffer&& other) noexcept { + if (this != &other) { + release(); + swap(other); + } + return *this; + } + + void allocate(std::size_t bytes, int device_id = -1) { + release(); + if (bytes == 0) { + return; + } + if (device_id >= 0) { + device_id_ = device_id; + DeviceGuard guard(device_id); + QUADTRIX_CUDA_ABORT(cudaMalloc(&ptr_, bytes)); + } else { + device_id_ = current_device(); + QUADTRIX_CUDA_ABORT(cudaMalloc(&ptr_, bytes)); + } + bytes_ = bytes; + } + + void release() { + if (ptr_ != nullptr) { + if (device_id_ >= 0) { + DeviceGuard guard(device_id_); + cudaFree(ptr_); + } else { + cudaFree(ptr_); + } + ptr_ = nullptr; + bytes_ = 0; + device_id_ = -1; + } + } + + void* data() { + return ptr_; + } + + const void* data() const { + return ptr_; + } + + std::size_t bytes() const { + return bytes_; + } + + bool empty() const { + return ptr_ == nullptr || bytes_ == 0; + } + + int device_id() const { + return device_id_; + } + + void swap(DeviceBuffer& other) noexcept { + std::swap(ptr_, other.ptr_); + std::swap(bytes_, other.bytes_); + std::swap(device_id_, other.device_id_); + } + +private: + void* ptr_ = nullptr; + std::size_t bytes_ = 0; + int device_id_ = -1; +}; + +inline Status copy_h2d(void* dst_device, const void* src_host, std::size_t bytes, cudaStream_t stream = nullptr) { + return QUADTRIX_CUDA_CHECK(cudaMemcpyAsync(dst_device, src_host, bytes, cudaMemcpyHostToDevice, stream)); +} + +inline Status copy_d2h(void* dst_host, const void* src_device, std::size_t bytes, cudaStream_t stream = nullptr) { + return QUADTRIX_CUDA_CHECK(cudaMemcpyAsync(dst_host, src_device, bytes, cudaMemcpyDeviceToHost, stream)); +} + +inline Status copy_d2d(void* dst_device, const void* src_device, std::size_t bytes, cudaStream_t stream = nullptr) { + return QUADTRIX_CUDA_CHECK(cudaMemcpyAsync(dst_device, src_device, bytes, cudaMemcpyDeviceToDevice, stream)); +} + +inline Status memset_device(void* dst_device, int value, std::size_t bytes, cudaStream_t stream = nullptr) { + return QUADTRIX_CUDA_CHECK(cudaMemsetAsync(dst_device, value, bytes, stream)); +} + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/nccl_all_reduce.cuh b/CUDA/includes/nccl_all_reduce.cuh new file mode 100644 index 0000000..c712a6a --- /dev/null +++ b/CUDA/includes/nccl_all_reduce.cuh @@ -0,0 +1,96 @@ +#pragma once + +#include "tensor.cuh" + +#include + +#ifdef QUADTRIX_ENABLE_NCCL +#include +#else +typedef struct { + char internal[128]; +} ncclUniqueId; +typedef struct ncclComm* ncclComm_t; +typedef enum { + ncclSuccess = 0, + ncclUnhandledCudaError = 1, + ncclSystemError = 2, + ncclInternalError = 3, + ncclInvalidArgument = 4, + ncclInvalidUsage = 5, + ncclNumResults = 6 +} ncclResult_t; +#endif + +namespace quadtrix { +namespace cuda { + +struct NcclStatus { + bool ok; + ncclResult_t nccl_status; + const char* message; + + static NcclStatus success() { + return {true, ncclSuccess, "ok"}; + } + + static NcclStatus failure(ncclResult_t status, const char* message) { + return {false, status, message}; + } +}; + +const char* nccl_status_name(ncclResult_t status); + +class NcclCommunicator { +public: + NcclCommunicator() = default; + NcclCommunicator(ncclUniqueId unique_id, int world_size, int rank, int device_id); + ~NcclCommunicator(); + + NcclCommunicator(const NcclCommunicator&) = delete; + NcclCommunicator& operator=(const NcclCommunicator&) = delete; + + NcclCommunicator(NcclCommunicator&& other) noexcept; + NcclCommunicator& operator=(NcclCommunicator&& other) noexcept; + + ncclComm_t get() const { + return comm_; + } + + int world_size() const { + return world_size_; + } + + int rank() const { + return rank_; + } + + int device_id() const { + return device_id_; + } + + bool valid() const { + return comm_ != nullptr; + } + +private: + ncclComm_t comm_ = nullptr; + int world_size_ = 1; + int rank_ = 0; + int device_id_ = 0; +}; + +NcclStatus create_unique_id(ncclUniqueId* unique_id); + +NcclStatus all_reduce_sum( + NcclCommunicator& communicator, + TensorView tensor, + cudaStream_t stream = nullptr); + +NcclStatus all_reduce_average( + NcclCommunicator& communicator, + TensorView tensor, + cudaStream_t stream = nullptr); + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/includes/tensor.cuh b/CUDA/includes/tensor.cuh new file mode 100644 index 0000000..c61d77e --- /dev/null +++ b/CUDA/includes/tensor.cuh @@ -0,0 +1,168 @@ +#pragma once + +#include "common.h" +#include "memory.cuh" + +#include +#include +#include + +namespace quadtrix { +namespace cuda { + +constexpr int kMaxTensorDims = 8; + +struct TensorShape { + int rank = 0; + std::array dims{}; + std::array strides{}; + + static TensorShape contiguous(const std::int64_t* sizes, int ndim) { + if (ndim < 1 || ndim > kMaxTensorDims) { + std::fprintf(stderr, "Tensor rank %d is outside supported range [1, %d]\n", ndim, kMaxTensorDims); + std::abort(); + } + + TensorShape shape; + shape.rank = ndim; + for (int i = 0; i < ndim; ++i) { + if (sizes[i] <= 0) { + std::fprintf(stderr, "Tensor dimension %d must be positive, got %lld\n", i, static_cast(sizes[i])); + std::abort(); + } + shape.dims[i] = sizes[i]; + } + + std::int64_t stride = 1; + for (int i = ndim - 1; i >= 0; --i) { + shape.strides[i] = stride; + stride *= shape.dims[i]; + } + return shape; + } + + std::size_t numel() const { + std::size_t total = 1; + for (int i = 0; i < rank; ++i) { + if (dims[i] <= 0) { + return 0; + } + std::size_t next = 0; + if (!checked_mul(total, static_cast(dims[i]), &next)) { + return 0; + } + total = next; + } + return rank == 0 ? 0 : total; + } + + bool is_contiguous() const { + std::int64_t expected = 1; + for (int i = rank - 1; i >= 0; --i) { + if (strides[i] != expected) { + return false; + } + expected *= dims[i]; + } + return true; + } +}; + +struct TensorView { + void* data = nullptr; + TensorShape shape; + DType dtype = DType::F32; + DeviceKind device = DeviceKind::CUDA; + int device_id = 0; + + std::size_t numel() const { + return shape.numel(); + } + + std::size_t bytes() const { + std::size_t out = 0; + if (!checked_mul(numel(), dtype_size(dtype), &out)) { + return 0; + } + return out; + } + + template + T* data_as() { + return static_cast(data); + } + + template + const T* data_as() const { + return static_cast(data); + } +}; + +class Tensor { +public: + Tensor() = default; + + Tensor(const std::int64_t* dims, int rank, DType dtype, int device_id = 0) + : shape_(TensorShape::contiguous(dims, rank)), dtype_(dtype), device_id_(device_id) { + allocate(); + } + + Tensor(const Tensor&) = delete; + Tensor& operator=(const Tensor&) = delete; + Tensor(Tensor&&) noexcept = default; + Tensor& operator=(Tensor&&) noexcept = default; + + TensorView view() { + return {storage_.data(), shape_, dtype_, DeviceKind::CUDA, device_id_}; + } + + TensorView view() const { + return {const_cast(storage_.data()), shape_, dtype_, DeviceKind::CUDA, device_id_}; + } + + const TensorShape& shape() const { + return shape_; + } + + DType dtype() const { + return dtype_; + } + + int device_id() const { + return device_id_; + } + + std::size_t numel() const { + return shape_.numel(); + } + + std::size_t bytes() const { + return storage_.bytes(); + } + + void* data() { + return storage_.data(); + } + + const void* data() const { + return storage_.data(); + } + +private: + void allocate() { + std::size_t bytes = 0; + if (!checked_mul(shape_.numel(), dtype_size(dtype_), &bytes)) { + std::fprintf(stderr, "Tensor allocation size overflow\n"); + std::abort(); + } + storage_.allocate(bytes, device_id_); + } + + TensorShape shape_; + DType dtype_ = DType::F32; + int device_id_ = 0; + DeviceBuffer storage_; +}; + +} // namespace cuda +} // namespace quadtrix diff --git a/CUDA/llmcpp/adamw.cuh b/CUDA/llmcpp/adamw.cuh new file mode 100644 index 0000000..4453576 --- /dev/null +++ b/CUDA/llmcpp/adamw.cuh @@ -0,0 +1,98 @@ +/* +AdamW kernel +*/ + +// llmc internal imports +#include "cuda_common.h" +#include "cuda_utils.cuh" + +// ---------------------------------------------------------------------------- +// CUDA kernels + +// Implements linear interpolation using only two floating-point operations (as opposed to three in a naive implementation). +// Reference: https://developer.nvidia.com/blog/lerp-faster-cuda +__device__ float lerp(float start, float end, float weight) { + return fma(weight, end, fma(-weight, start, start)); +} + +template +__device__ void adamw_update(Tp* params_memory, float* master_params_memory, Tg* grads_memory, float* m_memory, float* v_memory, size_t num_parameters, + float learning_rate, float beta1, float beta2, float beta1_correction, float beta2_correction, float eps, float weight_decay, + float grad_scale, unsigned int seed) { + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx >= num_parameters) { return; } // guard + + // get the gradient, m, and v for this parameter + float grad = grad_scale * (float)grads_memory[idx]; + float m = m_memory[idx]; + float v = v_memory[idx]; + // update the first moment (momentum) + m = lerp(grad, m, beta1); + m_memory[idx] = m; + // update the second moment (RMSprop) + v = lerp(grad * grad, v, beta2); + v_memory[idx] = v; + m /= beta1_correction; // m_hat + v /= beta2_correction; // v_hat + // fetch the old value of this parameter as a float, from either source + float old_param = (master_params_memory != NULL) ? master_params_memory[idx] : (float)params_memory[idx]; + // update this parameter + float param = old_param - (learning_rate * (m / (sqrtf(v) + eps) + weight_decay * old_param)); + // update our low precision version of the parameters using stochastic rounding + // this will be used in the next forward pass + stochastic_rounding(param, ¶ms_memory[idx], seed); + // write the full, float version of the param into our master copy, if we maintain one + // this will be used in the next update + if (master_params_memory != NULL) { master_params_memory[idx] = param; } +} + +template +__global__ void adamw_kernel3(Tp* params_memory, float* master_params_memory, Tg* grads_memory, float* m_memory, float* v_memory, size_t num_parameters, + ptrdiff_t w_stride, ptrdiff_t g_stride, ptrdiff_t s_stride, + float learning_rate, float beta1, float beta2, float beta1_correction, float beta2_correction, float eps, float weight_decay, + float grad_scale, unsigned int seed) { + adamw_update(params_memory + blockIdx.y * w_stride, + master_params_memory ? master_params_memory + blockIdx.y * s_stride : NULL, + grads_memory + blockIdx.y * g_stride, + m_memory + blockIdx.y * s_stride, + v_memory + blockIdx.y * s_stride, + num_parameters, learning_rate, beta1, beta2, beta1_correction, beta2_correction, eps, weight_decay, grad_scale, + seed + ); +} + +template +__global__ void init_from_master_kernel(Tp* params_memory, float* master_params_memory, size_t num_parameters, + ptrdiff_t w_stride, ptrdiff_t s_stride, unsigned int seed) { + size_t idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx >= num_parameters) { return; } + params_memory += blockIdx.y * w_stride; // adjust for layer offset + master_params_memory += blockIdx.y * s_stride; + stochastic_rounding(master_params_memory[idx], ¶ms_memory[idx], seed); +} + +template +void adamw_update(Tp* params_memory, float* master_params_memory, Tg* grads_memory, float* m_memory, float* v_memory, size_t num_parameters, + ptrdiff_t w_stride, ptrdiff_t g_stride, ptrdiff_t s_stride, int num_slices, float learning_rate, float beta1, float beta2, int t, float eps, float weight_decay, + float grad_scale, unsigned int seed, cudaStream_t stream) { + // AdamW update + int block_size = 512; + int num_blocks = CEIL_DIV(num_parameters, block_size); + float beta1_correction = 1.0f - powf(beta1, t); + float beta2_correction = 1.0f - powf(beta2, t); + adamw_kernel3<<>>(params_memory, master_params_memory, grads_memory, + m_memory, v_memory, num_parameters, w_stride, g_stride, s_stride, + learning_rate, beta1, beta2, beta1_correction, beta2_correction, eps, weight_decay, + grad_scale, seed); + cudaCheck(cudaGetLastError()); +} + +template +void init_from_master(Tp* params_memory, float* master_params_memory, size_t num_parameters, + ptrdiff_t w_stride, ptrdiff_t s_stride, int num_slices, unsigned int seed, cudaStream_t stream) { + int block_size = 512; // must match block size of adamw_update so that RNG also matches + int num_blocks = CEIL_DIV(num_parameters, block_size); + init_from_master_kernel<<>> + (params_memory, master_params_memory, num_parameters, w_stride, s_stride, seed); + cudaCheck(cudaGetLastError()); +} diff --git a/CUDA/llmcpp/cuda_utils.cuh b/CUDA/llmcpp/cuda_utils.cuh new file mode 100644 index 0000000..030ec07 --- /dev/null +++ b/CUDA/llmcpp/cuda_utils.cuh @@ -0,0 +1,286 @@ +// Utilities for use in __device__ code + +#ifndef CUDA_UTILS_CUH +#define CUDA_UTILS_CUH + +#include "cuda_common.h" + +// ---------------------------------------------------------------------------- +// Packed128 data structure that forces the compiler to use 128-bit loads/stores +// in GPUs that support (the LDG.128 and STS.128 instructions) +// This is a bit similar to the use of float4 in the case of 32-bit floats, but +// supports arbitrary precision. + +template +struct alignas(16) Packed128 { + Packed128() = default; + __device__ explicit Packed128(int4 bits) { + static_assert(sizeof(bits) == sizeof(payload), "Size mismatch."); + memcpy(&payload, &bits, sizeof(bits)); + } + + __device__ static Packed128 constant(ElementType value) { + Packed128 result; + for(int k = 0; k < size; ++k) { + result.payload[k] = value; + } + return result; + } + __device__ static Packed128 zeros() { + return constant(0.f); + } + __device__ static Packed128 ones() { + return constant(1.f); + } + + __device__ ElementType& operator[](int index) { + return payload[index]; + } + __device__ const ElementType& operator[](int index) const { + return payload[index]; + } + __device__ int4 get_bits() const { + int4 bits; + static_assert(sizeof(bits) == sizeof(payload), "Size mismatch."); + memcpy(&bits, &payload, sizeof(bits)); + return bits; + } + static constexpr const size_t size = sizeof(int4) / sizeof(ElementType); + ElementType payload[size]; +}; + +// load a Packed128 from an aligned memory address +template +__device__ Packed128 load128(const ElementType* address) { + return Packed128{*reinterpret_cast(address)}; +} +// load a Packed128 from an aligned memory address with streaming cache hint +template +__device__ Packed128 load128cs(const ElementType* address) { + return Packed128{__ldcs(reinterpret_cast(address))}; +} +// store a Packed128 to an aligned memory address +template +__device__ void store128(ElementType* target, Packed128 value) { + *reinterpret_cast(target) = value.get_bits(); +} +// store a Packed128 to an aligned memory address with streaming cache hint +template +__device__ void store128cs(ElementType* target, Packed128 value) { + __stcs(reinterpret_cast(target), value.get_bits()); +} +// store a Packed128 to an aligned memory address while caching in L2 but bypassing L1 +template +__device__ void store128cg(ElementType* target, Packed128 value) { + __stcg(reinterpret_cast(target), value.get_bits()); +} + +// short-form typedefs +typedef Packed128 f128; +typedef Packed128 x128; + +// ---------------------------------------------------------------------------- +// DType support + +// enumerator to indentify the datatype of a tensor. +enum class DType : uint8_t { + FP32, FP16, BF16 +}; + +// Given a datatype enum, returns the underlying number of bytes +// for a scalar of that type +size_t sizeof_dtype(DType type) { + switch (type) { + case DType::FP32: + return sizeof(float); + case DType::FP16: + return sizeof(half); + case DType::BF16: + return sizeof(nv_bfloat16); + default: // handle or get compiler warning + fprintf(stderr, "Unknown datatype\n"); + exit(EXIT_FAILURE); + } +} + +DType dtype_of(float* f) { return DType::FP32; } +DType dtype_of(nv_bfloat16 * f) { return DType::BF16; } +DType dtype_of(half * f) { return DType::FP16; } + + + +// ---------------------------------------------------------------------------- +// Copy, cast functions + +// device functions and the kernel to cast data between types +template +__device__ Td cast_value(Ts val); + +template<> +__device__ float cast_value(float val) { + return val; +} + +template<> +__device__ float cast_value(half val) { + return __half2float(val); +} + +template<> +__device__ float cast_value(__nv_bfloat16 val) { + return __bfloat162float(val); +} + +template +__global__ void copy_and_cast_kernel(Td* dst, const Ts* src, size_t n, ptrdiff_t stride_dst, ptrdiff_t stride_src) { + int idx = blockIdx.x * blockDim.x + threadIdx.x; + // need to try grid stride looping for more perf later + if (idx < n) { + dst[idx + stride_dst * blockIdx.y] = cast_value(src[idx + stride_src * blockIdx.y]); + } +} + +// ---------------------------------------------------------------------------- +// Warp/Block communication primitives + +// warp-level reduction for summing values +__device__ inline float warpReduceSum(float val) { + for (int offset = 16; offset > 0; offset /= 2) { + val += __shfl_xor_sync(0xFFFFFFFF, val, offset); + } + return val; +} +// warp-level reduction for finding the maximum value +__device__ inline float warpReduceMax(float val) { + for (int offset = 16; offset > 0; offset /= 2) { + val = fmaxf(val, __shfl_xor_sync(0xFFFFFFFF, val, offset)); + } + return val; +} +// requires all 32 threads in the warp to be active, but should work for any block size +// uses non-dynamic shared memory so every call increases shared memory requirements by 128 bytes +// the fact it's unique shared memory allows us to avoid an extra __syncthreads() call at the end +// but if called inside a loop, the shared memory will be implicitly reused, so set final_sync to 1 +using reduction_func_t = float (*) (float); +template +__device__ inline float blockReduce(float val, bool final_sync=false, float out_of_bounds=0.0f) { + // two reductions of up to 1024 threads: + // 1) inside warp (shuffle), 2) cross-warp (shared memory), 3) inside warp (shuffle) + __shared__ float shared_val[WARP_SIZE]; + const int lane_id = threadIdx.x % WARP_SIZE; + const int warp_id = threadIdx.x / WARP_SIZE; + const int num_warps = blockDim.x / WARP_SIZE; + + float warp_val = warp_reduction(val); + if (lane_id == 0) { shared_val[warp_id] = warp_val; } + __syncthreads(); + warp_val = (lane_id < num_warps) ? shared_val[lane_id] : out_of_bounds; + float block_val = warp_reduction(warp_val); + + if (final_sync) { + __syncthreads(); // only needed in loops when effectively reusing shared memory etc. + } + return block_val; +} + +// Performs a _deterministic_ sum reduction. determinism is achieved by requiring that only +// a single block be used. +template +__global__ void global_sum_single_block_kernel(float* result, const Float* values, size_t count) { + assert(gridDim.x == 1); // only a single block! + float thread_sum = 0; + for(size_t index = threadIdx.x; index < count; index += blockDim.x) { + thread_sum += (float)values[index]; + } + + float reduction = blockReduce(thread_sum, true); + if(threadIdx.x == 0) { + *result = reduction; + } +} + +template +void global_sum_deterministic(float* result, const Float* values, int count, cudaStream_t stream) { + global_sum_single_block_kernel<<<1, 1024, 0, stream>>>(result, values, count); + cudaCheck(cudaGetLastError()); +} + +// ---------------------------------------------------------------------------- +// memory management + +// allocate memory, preferrably on the device +// returns a status code. 0 = OK, 1 = fell back to managed memory +int cudaMallocConditionallyManaged(void** out, size_t bytes, const char *file, int line) { + // try to allocate + cudaError_t err = cudaMalloc(out, bytes); + if(err == cudaErrorMemoryAllocation) { + // if we OOM, fallback to a managed allocation. slower but at least won't crash. + cudaGetLastError(); // reset the error before the next API call + cudaCheck_(cudaMallocManaged(out, bytes), file, line); + cudaCheck_(cudaMemAdvise(*out, bytes, cudaMemAdviseSetPreferredLocation, cudaCpuDeviceId), file, line); + return 1; + } else { + cudaCheck_(err, file, line); + return 0; + } +} + +#define cudaMallocConditionallyManaged(out, bytes)\ +(cudaMallocConditionallyManaged((void**)out, bytes, __FILE__, __LINE__)) + +// ---------------------------------------------------------------------------- +// Random Number Generation used in Stochastic Rounding + +// SquirrelNoise5 - Squirrel's Raw Noise utilities (version 5) +// This gives us a random number from threadIdx/blockIdx + a single seed for the entire GPU +// todo - possibly overkill and we don't need such high quality random numbers? (tbd) +// http://eiserloh.net/noise/SquirrelNoise5.hpp +__device__ __host__ constexpr unsigned int SquirrelNoise5(unsigned int positionX, unsigned int seed) +{ + constexpr unsigned int SQ5_BIT_NOISE1 = 0xd2a80a3f; // 11010010101010000000101000111111 + constexpr unsigned int SQ5_BIT_NOISE2 = 0xa884f197; // 10101000100001001111000110010111 + constexpr unsigned int SQ5_BIT_NOISE3 = 0x6C736F4B; // 01101100011100110110111101001011 + constexpr unsigned int SQ5_BIT_NOISE4 = 0xB79F3ABB; // 10110111100111110011101010111011 + constexpr unsigned int SQ5_BIT_NOISE5 = 0x1b56c4f5; // 00011011010101101100010011110101 + unsigned int mangledBits = positionX; + mangledBits *= SQ5_BIT_NOISE1; + mangledBits += seed; + mangledBits ^= (mangledBits >> 9); + mangledBits += SQ5_BIT_NOISE2; + mangledBits ^= (mangledBits >> 11); + mangledBits *= SQ5_BIT_NOISE3; + mangledBits ^= (mangledBits >> 13); + mangledBits += SQ5_BIT_NOISE4; + mangledBits ^= (mangledBits >> 15); + mangledBits *= SQ5_BIT_NOISE5; + mangledBits ^= (mangledBits >> 17); + return mangledBits; +} +__device__ __host__ constexpr unsigned int Get2dNoiseUint(int indexX, int indexY, unsigned int seed) +{ + constexpr unsigned int PRIME_NUMBER = 198491317u; // Large prime number with non-boring bits + unsigned int x = static_cast(indexX); + unsigned int y = static_cast(indexY); + + return SquirrelNoise5(x + (PRIME_NUMBER * y), seed); +} + +// stochastic rounding built on top of Squirel Noise above (with seed updated per step via xorshift) +__device__ __forceinline__ void stochastic_rounding(float in, __nv_bfloat16 *out, unsigned int seed) { + // todo - is this stochastic rounding *too good*? can we cut any corners? + // makes sure each thread gets a different random number + unsigned int random = Get2dNoiseUint(threadIdx.x, blockIdx.x * blockDim.x + blockIdx.y, seed); + unsigned int threshold = random & 0xFFFF; + unsigned int float_bits = __float_as_uint(in); + unsigned int rounded_bits = float_bits & 0x0000FFFF; + float_bits = (rounded_bits > threshold) ? (float_bits | 0xFFFF) : (float_bits & ~0xFFFF); + *out = __float2bfloat16_rn(__uint_as_float(float_bits)); +} +__device__ __forceinline__ void stochastic_rounding(float in, half *out, unsigned int random) { + *out = (float)in; // todo - implement this... +} +__device__ __forceinline__ void stochastic_rounding(float in, float *out, unsigned int random) { + *out = in; // dummy function for when floatX is float (FP32 mode) +} + +#endif \ No newline at end of file diff --git a/CUDA/llmcpp/cudnn_att.cpp b/CUDA/llmcpp/cudnn_att.cpp new file mode 100644 index 0000000..0330abe --- /dev/null +++ b/CUDA/llmcpp/cudnn_att.cpp @@ -0,0 +1,297 @@ +// all cudnn-related functions are in this file, so that they don't need to be recompiled everytime +// we change some unrelated piece of the code. +// TODO this currently duplicates some of the utilities from the main file + +#define NOMINMAX +#include +#include "cudnn_att.h" +#include + +namespace fe = cudnn_frontend; + +// Specific configurations based on the enabled precision +#if defined(ENABLE_FP32) +static_assert(false, "cuDNN is not supported in FP32 mode.") +// use fp16 (note: this may require gradient scaler, currently not implemented!) +#elif defined(ENABLE_FP16) +#define CUDNN_16BIT fe::DataType_t::HALF +#else // Default to bfloat16 +#define CUDNN_16BIT fe::DataType_t::BFLOAT16 +#endif + +static cudnnHandle_t cudnn_handle; +static size_t cudnn_workspace_size = 0; // dynamically allocated as needed (up to 256MiB!) +static void* cudnn_workspace = NULL; + +static void cuDNNCheck(cudnnStatus_t error, const char *file, int line) { + if (error != CUDNN_STATUS_SUCCESS) { + printf("[CUDNN ERROR] at file %s:%d:\n%s\n", file, line, cudnnGetErrorString(error)); + exit(EXIT_FAILURE); + } +}; +#define cuDNNCheck(err) (cuDNNCheck(err, __FILE__, __LINE__)) + +static void checkCudnnFE(const fe::error_object& e, const char *file, int line) { + if(!e.is_good()) { + printf("[CUDNN ERROR] at file %s:%d:\n%s\n", file, line, e.err_msg.c_str()); + exit(EXIT_FAILURE); + } +} +#define checkCudnnFE(err) checkCudnnFE(err, __FILE__, __LINE__) + +enum UIDs { + Q_UID, + K_UID, + V_UID, + Attn_scale_UID, + O_UID, + Stats_UID, + dO_UID, + dQ_UID, + dK_UID, + dV_UID +}; + +// Need a cache because graph->build_operation_graph() is slow but everything else seems fast +using cache_type_fwd = std::map, std::shared_ptr>; +using cache_type_bwd = std::map, std::shared_ptr>; + +// Loosely based on cuDNN frontend samples functions and massively simplified +auto lookup_cache_or_build_graph_fwd(int B,int H,int T,int HS, int is_inference_only) { + + static cache_type_fwd user_maintained_cache_fwd; + + auto key = std::make_tuple(B, H, T, HS, is_inference_only); + + auto it = user_maintained_cache_fwd.find(key); + if (it != user_maintained_cache_fwd.end()) { + return it->second; + } + + auto graph = std::make_shared(); + graph->set_io_data_type(CUDNN_16BIT) + .set_intermediate_data_type(fe::DataType_t::FLOAT) + .set_compute_data_type(fe::DataType_t::FLOAT); + + // QKV is (B, T, 3, NH, HS) which cuDNN can handle directly without an external permute + auto Q = graph->tensor(fe::graph::Tensor_attributes().set_name("Q") + .set_dim({B, H, T, HS}) + .set_uid(Q_UID) + .set_stride({3 * H * HS * T, HS, 3 * H * HS, 1})); + auto K = graph->tensor(fe::graph::Tensor_attributes().set_name("K") + .set_dim({B, H, T, HS}) + .set_uid(K_UID) + .set_stride({3 * H * HS * T, HS, 3 * H * HS, 1})); + auto V = graph->tensor(fe::graph::Tensor_attributes().set_name("V") + .set_dim({B, H, T, HS}) + .set_uid(V_UID) + .set_stride({3 * H * HS * T, HS, 3 * H * HS, 1})); + auto attn_scale = graph->tensor(fe::graph::Tensor_attributes().set_name("attn_scale") + .set_dim({1, 1, 1, 1}) + .set_stride({1, 1, 1, 1}) + .set_uid(Attn_scale_UID) + .set_is_pass_by_value(true) + .set_data_type(fe::DataType_t::FLOAT)); + + auto sdpa_options = fe::graph::SDPA_attributes().set_name("flash_attention"); + sdpa_options.set_is_inference(is_inference_only); + sdpa_options.set_attn_scale(attn_scale); + sdpa_options.set_causal_mask(true); + + // Create the graph operation and get the output tensors back + auto [O, stats] = graph->sdpa(Q, K, V, sdpa_options); + + // Output is (B, T, NH, HS) BF16/FP16 and stats for backward pass is (B, NH, T) FP32 + O->set_output(true).set_dim({B, H, T, HS}).set_stride({H * HS * T, HS, H * HS, 1}).set_uid(O_UID); + + assert(stats == nullptr || is_inference_only == false); + if (is_inference_only == false) { + stats->set_output(true).set_data_type(fe::DataType_t::FLOAT) + .set_dim({B, H, T, 1}) + .set_stride({H * T, T, 1, 1}) + .set_uid(Stats_UID); + } + + checkCudnnFE(graph->validate()); + + // Build the operation graph and execution part (this is the VERY SLOW PART) + checkCudnnFE(graph->build_operation_graph(cudnn_handle)); + auto plans = graph->create_execution_plans({fe::HeurMode_t::A}); + checkCudnnFE(graph->check_support(cudnn_handle)); + checkCudnnFE(graph->build_plans(cudnn_handle)); + // Reallocate the workspace if the required size is greater than the current workspace + // In H100 this may be around 16B + if (graph->get_workspace_size() > cudnn_workspace_size) { + if (cudnn_workspace_size > 0) { + cudaCheck(cudaFree(cudnn_workspace)); + } + cudnn_workspace_size = graph->get_workspace_size(); + cudaCheck(cudaMalloc(&cudnn_workspace, cudnn_workspace_size)); + } + + user_maintained_cache_fwd.insert({key, graph}); + + return graph; +} + +auto lookup_cache_or_build_graph_bwd(int B, int NH, int T, int HS) { + static cache_type_bwd user_maintained_cache_bwd; + + auto key = std::make_tuple(B, NH, T, HS); + + auto it = user_maintained_cache_bwd.find(key); + if (it != user_maintained_cache_bwd.end()) { + return it->second; + } + + auto graph = std::make_shared(); + graph->set_io_data_type(CUDNN_16BIT) + .set_intermediate_data_type(fe::DataType_t::FLOAT) + .set_compute_data_type(fe::DataType_t::FLOAT); + + // (B, N, 3, NH, HS) + // must come from inp (which means we also need to convert THAT to FP16) + auto Q = graph->tensor(fe::graph::Tensor_attributes().set_name("Q") + .set_dim({B, NH, T, HS}) + .set_uid(Q_UID) + .set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1})); + auto K = graph->tensor(fe::graph::Tensor_attributes().set_name("K") + .set_dim({B, NH, T, HS}) + .set_uid(K_UID) + .set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1})); + auto V = graph->tensor(fe::graph::Tensor_attributes().set_name("V") + .set_dim({B, NH, T, HS}) + .set_uid(V_UID) + .set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1})); + auto O = graph->tensor(fe::graph::Tensor_attributes().set_name("O") + .set_dim({B, NH, T, HS}) + .set_uid(O_UID) + .set_stride({NH * HS * T, HS, NH * HS, 1})); + auto dO = graph->tensor(fe::graph::Tensor_attributes().set_name("dO") + .set_dim({B, NH, T, HS}) + .set_uid(dO_UID) + .set_stride({NH * HS * T, HS, NH * HS, 1})); + + auto stats = graph->tensor(fe::graph::Tensor_attributes().set_name("stats") + .set_dim({B, NH, T, 1}) + .set_uid(Stats_UID) + .set_stride({NH * T, T, 1, 1}) + .set_data_type(fe::DataType_t::FLOAT)); + auto attn_scale = graph->tensor(fe::graph::Tensor_attributes().set_name("attn_scale") + .set_dim({1, 1, 1, 1}) + .set_stride({1, 1, 1, 1}) + .set_is_pass_by_value(true) + .set_uid(Attn_scale_UID) + .set_data_type(fe::DataType_t::FLOAT)); + auto sdpa_backward_options = fe::graph::SDPA_backward_attributes().set_name("flash_attention_backward") +#if CUDNN_FRONTEND_MAJOR_VERSION > 1 || CUDNN_FRONTEND_MINOR_VERSION >= 5 + .set_deterministic_algorithm(true) // 1.5+ needs this for determinism +#endif + .set_causal_mask(true) + .set_attn_scale(attn_scale); + + // Create the graph operation and get the output tensors back + auto [dQ, dK, dV] = graph->sdpa_backward(Q, K, V, O, dO, stats, sdpa_backward_options); + + dQ->set_output(true).set_dim({B, NH, T, HS}).set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1}).set_uid(dQ_UID); + dK->set_output(true).set_dim({B, NH, T, HS}).set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1}).set_uid(dK_UID); + dV->set_output(true).set_dim({B, NH, T, HS}).set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1}).set_uid(dV_UID); + + checkCudnnFE(graph->validate()); + + // Build the operation graph and execution part (this is the VERY SLOW PART) + checkCudnnFE(graph->build_operation_graph(cudnn_handle)); + auto plans = graph->create_execution_plans({fe::HeurMode_t::A}); + checkCudnnFE(graph->check_support(cudnn_handle)); + checkCudnnFE(graph->build_plans(cudnn_handle)); + + // Reallocate the workspace if the required size is greater than the current workspace + // By default, cuDNN uses up to 256MiB of workspace, so we don't want to just allocate the maximum + if (graph->get_workspace_size() > cudnn_workspace_size) { + if (cudnn_workspace_size > 0) { + cudaCheck(cudaFree(cudnn_workspace)); + } + cudnn_workspace_size = graph->get_workspace_size(); + cudaCheck(cudaMalloc(&cudnn_workspace, cudnn_workspace_size)); + } + + user_maintained_cache_bwd.insert({key, graph}); + return graph; +} + +void attention_forward_cudnn(floatX* out, // output: (B, T, NH, HS) + float* stats, // output for backward pass: (B, NH, T) + floatX* inp, // input: (B, T, 3, NH, HS) QKV + int B, int T, int NH, int C, cudaStream_t stream) { + NVTX_RANGE_FN(); + int HS = C / NH; // number of features per head + bool is_inference_only = (stats == nullptr); + + cuDNNCheck(cudnnSetStream(cudnn_handle, stream)); + + // Get graph and tensors from cache (or generate it on first use) + auto graph = lookup_cache_or_build_graph_fwd(B, NH, T, HS, is_inference_only); + + // Prepare all the tensor pointers for executing the graph + void* devPtrQ = inp; + void* devPtrK = (inp + C); + void* devPtrV = (inp + 2 * C); + float attn_scale_cpu = 1.0 / sqrtf(HS); + void* devPtrO = out; + + // Build variant pack + std::unordered_map variant_pack = { + {Q_UID, devPtrQ}, {K_UID, devPtrK}, {V_UID, devPtrV}, {Attn_scale_UID, &attn_scale_cpu}, {O_UID, devPtrO}}; + + // Add the stats tensor unless we are only doing inference (only needed for backward pass) + if (is_inference_only == false) { + variant_pack[Stats_UID] = stats; + } + + // Execute graph + checkCudnnFE(graph->execute(cudnn_handle, variant_pack, cudnn_workspace)); + cudaCheck(cudaGetLastError()); +} + +void attention_backward_cudnn(floatX* dqkvr, // output + floatX* dout, floatX* qkvr, floatX* o, float* stats, // inputs + int B, int T, int NH, int C, cudaStream_t stream) { + NVTX_RANGE_FN(); + int HS = C / NH; // number of features per head + + // Get graph and tensors from cache (or generate it on first use) + auto graph = lookup_cache_or_build_graph_bwd(B, NH, T, HS); + + // Prepare all the tensor pointers for executing the graph + void* devPtrQ = qkvr; + void* devPtrK = (qkvr + NH * HS); + void* devPtrV = (qkvr + 2 * NH * HS); + void* devPtrO = o; + void* devPtrdO = dout; + void* devPtrStats = stats; + float attn_scale_cpu = 1.0 / sqrtf(HS); + + void* devPtrdQ = dqkvr; + void* devPtrdK = (dqkvr + NH * HS); + void* devPtrdV = (dqkvr + 2 * NH * HS); + + // Build variant pack that links each tensor to its data pointer + std::unordered_map variant_pack = { + {Q_UID, devPtrQ}, {K_UID, devPtrK}, {V_UID, devPtrV}, {O_UID, devPtrO}, {dO_UID, devPtrdO}, {Stats_UID, devPtrStats}, + {dQ_UID, devPtrdQ}, {dK_UID, devPtrdK}, {dV_UID, devPtrdV}, + {Attn_scale_UID, &attn_scale_cpu}}; + + // Execute graph + cuDNNCheck(cudnnSetStream(cudnn_handle, stream)); + checkCudnnFE(graph->execute(cudnn_handle, variant_pack, cudnn_workspace)); + cudaCheck(cudaGetLastError()); +} + +void create_cudnn() { + cuDNNCheck(cudnnCreate(&cudnn_handle)); +} + +void destroy_cudnn() { + if (cudnn_workspace != NULL) { cudaCheck(cudaFree(cudnn_workspace)); } + cuDNNCheck(cudnnDestroy(cudnn_handle)); +} \ No newline at end of file diff --git a/CUDA/llmcpp/dataloader.h b/CUDA/llmcpp/dataloader.h new file mode 100644 index 0000000..0ee0588 --- /dev/null +++ b/CUDA/llmcpp/dataloader.h @@ -0,0 +1,496 @@ +#ifndef DATALOADER_H +#define DATALOADER_H + +#include +#include +#include +#include +#include +#include +#include "utils.h" +#include "rand.h" +#ifndef _WIN32 +#include +#endif +#define HEADER_SIZE 256 + +typedef struct +{ + + int process_rank; + int num_processes; + + size_t B; + size_t T; + size_t num_tokens; + size_t shard_num_samples; + + glob_t glob_result; + size_t current_shard_idx; + size_t current_sample_idx; + + FILE *tokens_file; + + uint16_t *buffer; + int *inputs; + int *targets; + + mt19937_state shuffle_rng; + int should_shuffle; + int *shard_indices; + int *intra_shard_indices; + + size_t total_batch_size_bytes; + size_t local_batch_offset_bytes; + size_t header_bytes; + int64_t file_size_bytes; +} DataLoader; + +int64_t dataloader_load_shard_(DataLoader *loader, int shard_index) +{ + if (loader->should_shuffle) + { + shard_index = loader->shard_indices[shard_index]; + } + + const char *filename = loader->glob_result.gl_pathv[shard_index]; + + if (loader->tokens_file != NULL) + { + fcloseCheck(loader->tokens_file); + } + loader->tokens_file = fopenCheck(filename, "rb"); + + int header[HEADER_SIZE]; + freadCheck(header, sizeof(int), HEADER_SIZE, loader->tokens_file); + if (header[0] != 20240520) + { + + printf("---> HINT: Are you passing in a correct file?\n"); + printf("---> HINT: The data encoding may have changed, re-run data prepro or refer again to README.\n"); + exit(EXIT_FAILURE); + } + if (header[1] != 1) + { + printf("Bad version in data file\n"); + exit(EXIT_FAILURE); + } + int64_t ntok = header[2]; // + assert(ntok > 0); + fseekCheck(loader->tokens_file, 0, SEEK_END); + loader->file_size_bytes = ftell(loader->tokens_file); + fseekCheck(loader->tokens_file, 0, SEEK_SET); + int64_t expected_file_size = HEADER_SIZE * sizeof(int) + ntok * sizeof(uint16_t); + if (loader->file_size_bytes != expected_file_size) + { + printf("Error: file size is not as expected\n"); + exit(EXIT_FAILURE); + } + + loader->shard_num_samples = (ntok * sizeof(uint16_t) - sizeof(uint16_t)) / loader->total_batch_size_bytes; + return ntok; +} + +void prepare_intra_shard_indices_(DataLoader *loader) +{ + + if (loader->intra_shard_indices != NULL) + { + + free(loader->intra_shard_indices); + } + loader->intra_shard_indices = (int *)mallocCheck(loader->shard_num_samples * sizeof(int)); + init_identity_permutation(loader->intra_shard_indices, (int)loader->shard_num_samples); + random_permutation(loader->intra_shard_indices, (int)loader->shard_num_samples, &loader->shuffle_rng); +} + +void dataloader_reset(DataLoader *loader) +{ + loader->current_shard_idx = 0; + loader->current_sample_idx = 0; + + if (loader->should_shuffle) + { + random_permutation(loader->shard_indices, (int)loader->glob_result.gl_pathc, &loader->shuffle_rng); + } + + dataloader_load_shard_(loader, (int)loader->current_shard_idx); + + if (loader->should_shuffle) + { + prepare_intra_shard_indices_(loader); + } +} + +void dataloader_advance_(DataLoader *loader) +{ + if (loader->current_shard_idx == loader->glob_result.gl_pathc - 1) + { + + dataloader_reset(loader); + return; + } + + loader->current_shard_idx = (loader->current_shard_idx + 1) % loader->glob_result.gl_pathc; + loader->current_sample_idx = 0; + dataloader_load_shard_(loader, (int)loader->current_shard_idx); + + if (loader->should_shuffle) + { + prepare_intra_shard_indices_(loader); + } +} + +void dataloader_init(DataLoader *loader, + const char *filename_pattern, + size_t B, + size_t T, + int process_rank, + int num_processes, + int should_shuffle) +{ + loader->process_rank = process_rank; + loader->num_processes = num_processes; + loader->B = B; + loader->T = T; + loader->tokens_file = NULL; + loader->should_shuffle = should_shuffle; + loader->header_bytes = HEADER_SIZE * sizeof(int); + loader->total_batch_size_bytes = ((loader->num_processes * (loader->B * loader->T)) * sizeof(uint16_t)); + loader->local_batch_offset_bytes = loader->process_rank * loader->B * loader->T * sizeof(uint16_t); + + int glob_status = glob(filename_pattern, 0, NULL, &loader->glob_result); + if (glob_status != 0) + { + printf("Error: failed to glob pattern: %s\n", filename_pattern); + exit(EXIT_FAILURE); + } + if (loader->glob_result.gl_pathc == 0) + { + printf("Error: no files found matching the pattern: %s\n", filename_pattern); + exit(EXIT_FAILURE); + } + + if (should_shuffle) + { + mt19937_state shuffle_rng; + manual_seed(&shuffle_rng, 42 + process_rank); + loader->shuffle_rng = shuffle_rng; + loader->shard_indices = (int *)mallocCheck(loader->glob_result.gl_pathc * sizeof(int)); + init_identity_permutation(loader->shard_indices, (int)loader->glob_result.gl_pathc); + loader->intra_shard_indices = NULL; + } + + int64_t ntok_total = 0; + for (int shard_index = 0; shard_index < loader->glob_result.gl_pathc; shard_index++) + { + int64_t shard_ntok = dataloader_load_shard_(loader, shard_index); + + assert(shard_ntok >= (int64_t)(num_processes * B * T + 1)); + ntok_total += shard_ntok; + } + + loader->buffer = (uint16_t *)mallocCheck((B * T + 1) * sizeof(uint16_t)); + loader->inputs = (int *)mallocCheck(B * T * sizeof(int)); + loader->targets = (int *)mallocCheck(B * T * sizeof(int)); + loader->num_tokens = ntok_total; + + dataloader_reset(loader); +} + +void dataloader_load_batch(DataLoader *loader) +{ + assert(!loader->should_shuffle || (loader->should_shuffle && loader->intra_shard_indices != NULL)); + assert(loader->current_sample_idx < loader->shard_num_samples); + size_t idx = loader->should_shuffle ? loader->intra_shard_indices[loader->current_sample_idx] : loader->current_sample_idx; + size_t global_batch_offset_bytes = idx * loader->total_batch_size_bytes; + int64_t current_offset = loader->header_bytes + global_batch_offset_bytes + loader->local_batch_offset_bytes; + + size_t B = loader->B; + size_t T = loader->T; + + fseekCheck(loader->tokens_file, (int)current_offset, SEEK_SET); + freadCheck(loader->buffer, sizeof(uint16_t), B * T + 1, loader->tokens_file); + + for (int i = 0; i < B * T; i++) + { + loader->inputs[i] = (int)loader->buffer[i]; + loader->targets[i] = (int)loader->buffer[i + 1]; + } +} + +void dataloader_next_batch(DataLoader *loader) +{ + + if (loader->current_sample_idx >= loader->shard_num_samples) + { + dataloader_advance_(loader); + } + dataloader_load_batch(loader); + loader->current_sample_idx += 1; +} + +void dataloader_resume(DataLoader *loader, size_t current_shard_idx, size_t current_sample_idx) +{ + + loader->current_shard_idx = current_shard_idx; + loader->current_sample_idx = current_sample_idx; + dataloader_load_shard_(loader, (int)loader->current_shard_idx); +} + +void dataloader_free(DataLoader *loader) +{ + free(loader->buffer); + free(loader->inputs); + free(loader->targets); + if (loader->should_shuffle) + { + free(loader->shard_indices); + free(loader->intra_shard_indices); + } + fcloseCheck(loader->tokens_file); + globfree(&loader->glob_result); +} + +#define ASSUMED_NUM_COMPLETIONS 4 +#define CEIL_DIV(M, N) (((M) + (N) - 1) / (N)) + +typedef struct +{ + + int process_rank; + int num_processes; + + size_t B; + size_t T; + FILE *eval_file; + uint16_t *buffer; + int num_examples; + int num_batches; + int start_example_index; + int end_example_index; + int current_example_index; + int *inputs; + int *targets; + char *mask; + int *label; + int num_completions; +} EvalLoader; + +void evalloader_reset(EvalLoader *loader) +{ + int examples_per_process = CEIL_DIV(loader->num_examples, loader->num_processes); + int can_fit_examples = (int)(loader->B / ASSUMED_NUM_COMPLETIONS); + if (can_fit_examples == 0) + { + + printf("HellaSwag EvalLoader: batch size %zu is < %d\n", loader->B, ASSUMED_NUM_COMPLETIONS); + printf("---> HINT: Disable HellaSwag eval with -h 0, or increase batch size with -b\n"); + exit(EXIT_FAILURE); + } + loader->num_batches = CEIL_DIV(examples_per_process, can_fit_examples); + + loader->start_example_index = examples_per_process * loader->process_rank; + loader->end_example_index = examples_per_process * (loader->process_rank + 1); + + if (loader->end_example_index > loader->num_examples) + { + loader->end_example_index = loader->num_examples; + } + + int64_t header_bytes = HEADER_SIZE * sizeof(int); + fseekCheck(loader->eval_file, (int)header_bytes, SEEK_SET); + for (int i = 0; i < loader->start_example_index; i++) + { + uint16_t example_header[3]; + // read 3 uint16_t values: , , + freadCheck(&example_header[0], sizeof(uint16_t), 3, loader->eval_file); + // validate the delimiter + assert(example_header[0] == 65535); // delimiter + // validate the + assert(example_header[2] == i); // should match the loop index + // skip to the next example, keeping in mind that we already read the header + size_t remaining_bytes = example_header[1] - sizeof(uint16_t) * 3; + assert(remaining_bytes > 0); // we expect some bytes in the example + fseekCheck(loader->eval_file, (int)remaining_bytes, SEEK_CUR); + } + // now we are at the start of the example we want to start at, pointing at + loader->current_example_index = loader->start_example_index; +} + +void evalloader_init(EvalLoader *loader, + const char *filename, + size_t B, + size_t T, + int process_rank, + int num_processes) +{ + loader->process_rank = process_rank; + loader->num_processes = num_processes; + loader->B = B; + loader->T = T; + + // open the file and validate the header + loader->eval_file = fopenCheck(filename, "rb"); + // validate the header + int header[HEADER_SIZE]; + freadCheck(header, sizeof(int), HEADER_SIZE, loader->eval_file); + if (header[0] != 20240522) + { + printf("Bad magic in eval file\n"); + exit(EXIT_FAILURE); + } + if (header[1] != 1) + { + printf("Bad version in data file\n"); + exit(EXIT_FAILURE); + } + loader->num_examples = header[2]; // number of examples in the file + assert(loader->num_examples >= num_processes); // avoid headaches for now + size_t longest_example_bytes = header[3]; // longest example in the file + // basic sensibility check we could relax later. but roughly each example + // contains the prompt (or "context") and 4 completions, all of these have to be + // up to T tokens, and their tokens are uint16_t (so 2 bytes/token). + // There's a few more things in each example but they are minor. + // So longest example should be roughly this. Just trying to make sure it's sensible. + assert(longest_example_bytes > 0 && longest_example_bytes < (1 + ASSUMED_NUM_COMPLETIONS) * T * 2); + + // allocate all the space we'll need + int can_fit_examples = (int)(B / ASSUMED_NUM_COMPLETIONS); + loader->buffer = (uint16_t *)mallocCheck(longest_example_bytes); + loader->inputs = (int *)calloc(B * T, sizeof(int)); + loader->targets = (int *)calloc(B * T, sizeof(int)); + loader->mask = (char *)mallocCheck(B * T * sizeof(char)); + loader->label = (int *)mallocCheck(can_fit_examples * sizeof(int)); + + // reset the loader, to initialize it + evalloader_reset(loader); +} + +void evalloader_next_example_(EvalLoader *loader, int example_batch_index) +{ + size_t B = loader->B; + size_t T = loader->T; + int batch_dim_offset = example_batch_index * ASSUMED_NUM_COMPLETIONS; + uint16_t example_header[3]; + freadCheck(&example_header[0], sizeof(uint16_t), 3, loader->eval_file); + assert(example_header[0] == 65535); + assert(example_header[2] == loader->current_example_index); + assert(example_header[2] >= loader->start_example_index && example_header[2] < loader->end_example_index); + + size_t example_bytes = example_header[1] - sizeof(uint16_t) * 3; + freadCheck(loader->buffer, sizeof(char), example_bytes, loader->eval_file); + int label = (int)loader->buffer[0]; + int can_fit_examples = (int)(loader->B / ASSUMED_NUM_COMPLETIONS); + assert(label >= 0 && label < ASSUMED_NUM_COMPLETIONS); + assert(example_batch_index >= 0 && example_batch_index < can_fit_examples); + loader->label[example_batch_index] = label; + int num_completions = (int)loader->buffer[1]; + assert(num_completions == ASSUMED_NUM_COMPLETIONS); + assert(batch_dim_offset + num_completions <= B); + loader->num_completions = num_completions; + + int context_length = (int)loader->buffer[2]; + uint16_t *context_tokens_start = &loader->buffer[3]; + assert(context_length > 0 && context_length < T); + for (int b = 0; b < num_completions; b++) + { + for (int i = 0; i < context_length; i++) + { + int boff = batch_dim_offset + b; + int tok_cur = (int)context_tokens_start[i]; + loader->inputs[boff * T + i] = tok_cur; + } + } + uint16_t *completions_iter = loader->buffer + 3 + context_length; + for (int c = 0; c < num_completions; c++) + { + int coff = batch_dim_offset + c; + int completion_length = (int)completions_iter[0]; + uint16_t *completion_tokens_start = completions_iter + 1; + assert(completion_length > 0 && context_length + completion_length < T); + for (int i = 0; i < completion_length; i++) + { + int tok_cur = (int)completion_tokens_start[i]; + + loader->inputs[coff * T + context_length + i] = tok_cur; + + loader->targets[coff * T + context_length + i - 1] = tok_cur; + + loader->mask[coff * T + context_length + i - 1] = 1; + } + completions_iter += 1 + completion_length; + loader->current_example_index += 1; + } + + void evalloader_next_batch(EvalLoader * loader) + { + size_t B = loader->B; + size_t T = loader->T; + memset(loader->mask, 0, B * T * sizeof(char)); + int can_fit_examples = (int)(B / ASSUMED_NUM_COMPLETIONS); + for (int i = 0; i < can_fit_examples; i++) + { + if (loader->current_example_index >= loader->end_example_index) + { + break; + } + evalloader_next_example_(loader, i); + } + } + + int evalloader_stat_losses(EvalLoader * loader, float *losses) + { + int correct = 0; + size_t B = loader->B; + size_t T = loader->T; + int can_fit_examples = (int)(B / ASSUMED_NUM_COMPLETIONS); + for (int i = 0; i < can_fit_examples; i++) + { + float min_loss = 0.0f; + int min_loss_index = -1; + char active = 0; + for (int b = 0; b < ASSUMED_NUM_COMPLETIONS; b++) + { + int boff = i * ASSUMED_NUM_COMPLETIONS + b; + float average_loss = 0.0f; + int count = 0; + for (int t = 0; t < T; t++) + { + char mask = loader->mask[boff * T + t]; + if (mask == 1) + { + active = 1; + average_loss += losses[boff * T + t]; + count++; + } + } + if (count > 0) + { + average_loss /= count; + } + if (b == 0 || average_loss < min_loss) + { + min_loss = average_loss; + min_loss_index = b; + } + } + if (active && (min_loss_index == loader->label[i])) + { + correct += 1; + } + } + return correct; + } + + void evalloader_free(EvalLoader * loader) + { + free(loader->buffer); + free(loader->inputs); + free(loader->targets); + free(loader->mask); + free(loader->label); + fcloseCheck(loader->eval_file); + } + +#endif \ No newline at end of file diff --git a/CUDA/llmcpp/layernorm.cuh b/CUDA/llmcpp/layernorm.cuh new file mode 100644 index 0000000..9777d06 --- /dev/null +++ b/CUDA/llmcpp/layernorm.cuh @@ -0,0 +1,505 @@ +/* +LayerNorm CUDA kernel, and also Residual, because sometimes they are fused + +Note in llm.c we try to be clever in the backward pass to conserve memory. +All parameters use a += in the backward pass, so we can do gradient accumulation. +But all activations have = instead of += because these are faster (just read, no write). +This is okay for all activations except for those in the residual stream, where the +gradients have to add. We make sure that we do a += as necessary. +E.g., the layernorms are connected to the residuals so we += in layernorm backward. +*/ + +#include +// llmc internal imports +#include "cuda_common.h" +#include "cuda_utils.cuh" + +// ---------------------------------------------------------------------------- +// CUDA kernels + +__global__ void layernorm_forward_kernel3(floatX* __restrict__ out, float* __restrict__ mean, float* __restrict__ rstd, + const floatX* __restrict__ inp, const floatX* __restrict__ weight, + const floatX* __restrict__ bias, int N, int C) { + int lane_id = threadIdx.x % WARP_SIZE; + int warp_id = threadIdx.x / WARP_SIZE; + int num_warps = blockDim.x / WARP_SIZE; + + int idx = blockIdx.x * num_warps + warp_id; + if(idx >= N) { return; } // guard + + // the row of input that this group of threads is responsible for + const floatX* x = inp + idx * C; + + // mean + float sum = 0.0f; + for (int i = lane_id; i < C; i += WARP_SIZE) { + sum += (float)x[i]; + } + sum = warpReduceSum(sum); + float m = sum / C; + if(lane_id == 0 && mean != nullptr) { + __stcs(mean + idx, m); + } + + // rstd + sum = 0.0f; + for (int i = lane_id; i < C; i += WARP_SIZE) { + float diff = (float)x[i] - m; + sum += diff * diff; + } + sum = warpReduceSum(sum); + float s = rsqrtf(sum / C + 1e-5f); + if(lane_id == 0 && rstd != nullptr) { + __stcs(rstd + idx, s); + } + + // final normalization and scaling by weight/bias + floatX* o = out + idx * C; + for (int c = lane_id; c < C; c += WARP_SIZE) { + // load and store using the .cs "streaming" hint to the compiler, + // indicating that this data will not be reused soon, and can be streamed through the caches + // this allows the threads to get more cache-hits for the (shared) weight and bias parameters + float n = s * ((float)__ldcs(x+c) - m); + __stcs(o+c, (floatX)(n * (float)weight[c] + (float)bias[c])); + } +} + +__global__ void layernorm_forward_kernel6(floatX* __restrict__ out, float* __restrict__ mean, float* __restrict__ rstd, + const floatX* __restrict__ inp, const floatX* __restrict__ weight, + const floatX* __restrict__ bias, int N, int C) { + assert(blockDim.x == WARP_SIZE); + + // load weights and biases into shared memory + // do this before we allow any threads to exit! + extern __shared__ char* params[]; + // load128/store128 sometimes generated multiple instructions when the types here were floatX*, so + // let's keep everything as x128 + x128* s_weight = reinterpret_cast(params); + x128* s_bias = reinterpret_cast(params) + (C / x128::size); + x128* s_in = reinterpret_cast(params) + ((2 + threadIdx.y) * C / x128::size); + + int sidx = (threadIdx.x + WARP_SIZE * threadIdx.y) * x128::size; + for(int i = sidx; i < C; i += blockDim.y * WARP_SIZE * x128::size) { + s_weight[i/x128::size] = load128(weight + i); + s_bias[i/x128::size] = load128(bias + i); + } + __syncthreads(); + + int idx = blockIdx.x * blockDim.y + threadIdx.y; + if(idx >= N) { return; } // guard + + // adjust pointers to current token + inp += idx * C; + out += idx * C; + + const float eps = 1e-5f; + float sum = 0.0f; + for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { + const x128 in_data = load128cs(inp + c); + for(int k = 0; k < x128::size; ++k) { + sum += (float)in_data[k]; + } + s_in[c / x128::size] = in_data; + } + + sum = warpReduceSum(sum); + float m = sum / C; + float v = 0.f; + + for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { + const x128 in_data = s_in[c / x128::size]; + for(int k = 0; k < x128::size; ++k) { + v += ((float)in_data[k] - m) * ((float)in_data[k] - m); + } + } + + v = warpReduceSum(v) / C; + float s = rsqrtf(v + eps); + + for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { + const x128 in_data = s_in[c / x128::size]; + const x128 w = s_weight[c / x128::size]; + const x128 b = s_bias[c / x128::size]; + x128 out_data; + for(int k = 0; k < x128::size; ++k) { + float n = s * ((float)in_data[k] - m); // normalized output + float o = n * (float)w[k] + (float)b[k]; // scale and shift it + out_data[k] = (floatX)o; + } + + store128cs(out + c, out_data); + } + // cache the mean and rstd for the backward pass later + if(threadIdx.x == 0 && mean != nullptr) { + __stcs(mean + idx, m); + } + // store the rstd, no need to cache it + if(threadIdx.x == 0 && rstd != nullptr) { + __stcs(rstd + idx, s); + } +} + +__global__ void fused_residual_forward_kernel5(floatX* residual, floatX* normed, float* mean, float* rstd, + const floatX* inp1, const floatX* inp2, + const floatX* weight, const floatX* bias, + int N, int C) { + assert(blockDim.x == WARP_SIZE); + + // load weights and biases into shared memory + // do this before we allow any threads to exit! + extern __shared__ char* params[]; + // load128/store128 sometimes generated multiple instructions when the types here were floatX*, so + // let's keep everything as x128 + x128* s_weight = reinterpret_cast(params); + x128* s_bias = reinterpret_cast(params) + (C / x128::size); + x128* s_res = reinterpret_cast(params) + ((2 + threadIdx.y) * C / x128::size); + + int sidx = (threadIdx.x + WARP_SIZE * threadIdx.y) * x128::size; + for(int i = sidx; i < C; i += blockDim.y * WARP_SIZE * x128::size) { + s_weight[i/x128::size] = load128(weight + i); + s_bias[i/x128::size] = load128(bias + i); + } + __syncthreads(); + + int idx = blockIdx.x * blockDim.y + threadIdx.y; + if(idx > N) return; + + // adjust pointers to current token + residual += C * idx; + normed += C * idx; + inp1 += C * idx; + inp2 += C * idx; + + const float eps = 1e-5f; + float sum = 0.0f; + for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { + const x128 in1 = load128cs(inp1 + c); + const x128 in2 = load128cs(inp2 + c); + x128 out; + for(int k = 0; k < x128::size; ++k) { + out[k] = (float)in1[k] + (float)in2[k]; + sum += (float)out[k]; + } + store128cs(residual + c, out); + s_res[c / x128::size] = out; + } + + sum = warpReduceSum(sum); + float m = sum / C; + float v = 0.f; + + for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { + const x128 res = s_res[c / x128::size]; + for(int k = 0; k < x128::size; ++k) { + v += ((float)res[k] - m) * ((float)res[k] - m); + } + } + + v = warpReduceSum(v) / C; + float s = rsqrtf(v + eps); + + for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { + const x128 res = s_res[c / x128::size]; + const x128 w = s_weight[c / x128::size]; + const x128 b = s_bias[c / x128::size]; + x128 out; + for(int k = 0; k < x128::size; ++k) { + float n = s * ((float)res[k] - m); // normalized output + float o = n * (float)w[k] + (float)b[k]; // scale and shift it + out[k] = o; + } + + store128cs(normed + c, out); + } + // cache the mean and rstd for the backward pass later + if(threadIdx.x == 0) { + mean[idx] = m; + rstd[idx] = s; + } +} + +__global__ void residual_forward_kernel(floatX* out, const floatX* inp1, const floatX* inp2) { + int idx = (blockIdx.x * blockDim.x + threadIdx.x) * x128::size; + + x128 packed_out; + x128 packed_inp1 = load128cs(inp1 + idx); + x128 packed_inp2 = load128cs(inp2 + idx); + for (int k = 0; k < packed_inp1.size; k++) { + packed_out[k] = (floatX)((float)packed_inp1[k] + (float)packed_inp2[k]); + } + store128(out + idx, packed_out); +} + +__global__ void __launch_bounds__(512, 2) // todo - any warnings on Turing with only 1024 threads? + layernorm_backward_kernel10(floatX* dinp, floatX* dweight, floatX* dbias, float* scratch, + const floatX* dout, const floatX* inp, const floatX* weight, + const float* mean, const float* rstd, + int B, int T, int C) { + int BLOCK_SIZE = blockDim.x; + int warpsInBlock = BLOCK_SIZE / WARP_SIZE; //number of warps in block + extern __shared__ float shared[]; + + int warpId = threadIdx.x / WARP_SIZE; // warp index within a block + int baseIdx = blockIdx.x * warpsInBlock + warpId; + int warpThreadIdx = threadIdx.x % WARP_SIZE; // Thread index within the warp + int warpsInGrid = gridDim.x * warpsInBlock; + int C_per_iteration = WARP_SIZE * x128::size; + int iterations_C = CEIL_DIV(C, C_per_iteration); // + 2; + + // the first half of shared memory is bias, second is weight + size_t rounded_C = CEIL_DIV(C, (32 * x128::size)) * (32 * x128::size); + float* dbias_shared = shared; + float* dweight_shared = shared + rounded_C; + // warp zero doesn't actually write to the _tmp_shared memory locations, so we don't need to reserve memory + // the obvious solution is to change the addressing below to use (threadId.x-32) as offset, but that causes + // register spills, so instead we mess with the base pointer here, which doesn't increase register usage. + float* dbias_tmp_shared = shared + 2 * rounded_C - WARP_SIZE * f128::size; + float* dweight_tmp_shared = shared + 2 * rounded_C + f128::size * BLOCK_SIZE - 2 * WARP_SIZE * f128::size; + + // init shared memory to zero + for(int i = threadIdx.x * f128::size; i < rounded_C; i += BLOCK_SIZE * f128::size) { + store128(dbias_shared + i, f128::zeros()); + store128(dweight_shared + i, f128::zeros()); + } + __syncthreads(); + + for (int bt = baseIdx; bt < B * T; bt += warpsInGrid) { + const floatX* dout_bt = dout + bt * C; + const floatX* inp_bt = inp +bt * C; + floatX* dinp_bt = dinp + bt * C; + + // first: two reduce operations + float dnorm_mean = 0.0f; + float dnorm_norm_mean = 0.0f; + for (int i = warpThreadIdx * x128::size; i < C; i += WARP_SIZE * x128::size) { + x128 dout128_i = load128(dout_bt + i); + x128 inp128_i = load128(inp_bt + i); + x128 weight128_i = load128(weight + i); + for (int k = 0; k < x128::size; k++) { + float dnorm_i = (float)weight128_i[k] * (float)dout128_i[k]; + dnorm_mean += dnorm_i; + dnorm_norm_mean += dnorm_i * (float)inp128_i[k]; + } + } + + const float mean_bt = mean[bt]; + const float rstd_bt = rstd[bt]; + dnorm_mean = warpReduceSum(dnorm_mean) / C; + dnorm_norm_mean = warpReduceSum(dnorm_norm_mean) / C * rstd_bt - dnorm_mean * mean_bt * rstd_bt; + + for (int c = 0; c < iterations_C; c++) { + int global_index = (warpThreadIdx * x128::size) + (c * C_per_iteration); + + x128 dout128 = x128::zeros(); + x128 inp128 = x128::zeros(); + x128 dinp128 = x128::zeros(); + x128 weight128 = x128::zeros(); + + if(global_index < C) { + dout128 = load128cs(dout_bt + global_index); + inp128 = load128cs(inp_bt + global_index); + dinp128 = load128(dinp_bt + global_index); + weight128 = load128(weight + global_index); + } + + for(int o = 0; o < x128::size / f128::size; ++o) { + f128 dbias_f; + f128 dweight_f; + for(int i = 0; i < f128::size; ++i) { + int x = o * f128::size + i; + float dout_i = (float)dout128[x]; + float norm_bti = ((float)inp128[x] - mean_bt) * rstd_bt; + dbias_f[i] = dout_i; + dweight_f[i] = norm_bti * dout_i; + + float dval = 0.0f; + dval += (float) weight128[x] * (float)dout128[x]; // term 1 + dval -= dnorm_mean; // term 2 + dval -= norm_bti * dnorm_norm_mean; // term 3 + dval *= rstd_bt; // final scale + dinp128[x] = (floatX) ((float) dinp128[x] + dval); + } + + if (warpId != 0) { + store128(dbias_tmp_shared + threadIdx.x * f128::size, dbias_f); + // this seems to generate a 64-bit store, instead of 128-bit. + // however, forcing 128-bit (e.g., using inline ptx), results in register + // spilling and much worse performance, so we'll keep it like this for now + // but ideally, we could reduce the register pressure a little. + store128(dweight_tmp_shared + threadIdx.x * f128::size, dweight_f); + } + __syncthreads(); + if (warpId == 0) { + for (int j = 1; j < warpsInBlock; j++) { + f128 dbias_tmp = load128(dbias_tmp_shared + f128::size * (threadIdx.x + j * WARP_SIZE)); + f128 dweight_tmp = load128(dweight_tmp_shared + f128::size * (threadIdx.x + j * WARP_SIZE)); + for(int i = 0; i < f128::size; ++i) { + dbias_f[i] += dbias_tmp[i]; + dweight_f[i] += dweight_tmp[i]; + } + } + } + __syncthreads(); + if (warpId == 0) { + f128 db_old = load128(dbias_shared + global_index + f128::size * o); + f128 dw_old = load128(dweight_shared + global_index + f128::size * o); + for(int i = 0; i < f128::size; ++i) { + dbias_f[i] += db_old[i]; + dweight_f[i] += dw_old[i]; + } + store128(dbias_shared + global_index + f128::size * o, dbias_f); + store128(dweight_shared + global_index + f128::size * o, dweight_f); + } + } + if(global_index < C) { + // cache in L2 as this is read by the next kernel, but bypass L1 to minimise thrashing + store128cg(dinp_bt + global_index, dinp128); + } + } + } + __syncthreads(); + // Each block writes its partial sum to global memory + // The last block to finish becomes responsible for summing up all the partial sums + // This is done by atomically incrementing a flag (cleared to 0 before launching the kernel) + unsigned int* scratchFlag = (unsigned int*)(scratch); + // Increment scratch pointer by a full cacheline so that everything remains cacheline aligned + scratch += 32; + float* scratch_dbias = scratch; + float* scratch_dweight = scratch + C; + for(int i = threadIdx.x * f128::size; i < C; i += BLOCK_SIZE * f128::size) { + // Write to global memory in the same "shared memory banking friendly" order + store128(scratch_dbias + i + 2*C*blockIdx.x, load128(dbias_shared + i)); + store128(scratch_dweight + i + 2*C*blockIdx.x, load128(dweight_shared + i)); + } + __syncthreads(); + // that portion of shared memory is no longer used, so we can repurpose it for the scratch flag. + unsigned int *tmp_flag = (unsigned int*)(shared + 2*rounded_C); + if (threadIdx.x == 0) { + *tmp_flag = atomicInc(scratchFlag, gridDim.x); + } + __syncthreads(); + if (*tmp_flag == gridDim.x-1) { + // Reduction of the partial sums by the final block + // todo - there isn't enough parallelism even inside that single SM... + // ==> so could maybe split into another kernel with YET ANOTHER level of reduction?! + for(int i = threadIdx.x * f128::size; i < C; i += BLOCK_SIZE * f128::size) { + f128 dbias_accum = f128::zeros(); + f128 dweight_accum = f128::zeros(); + + for (int read_block_idx = 0; read_block_idx < gridDim.x; read_block_idx++) { + int offset = i + 2*C*read_block_idx; + f128 dbias128 = load128(scratch_dbias + offset); + f128 dweight128 = load128(scratch_dweight + offset); + for(int k = 0; k < f128::size; k++) { + dbias_accum[k] += dbias128[k]; + dweight_accum[k] += dweight128[k]; + } + } + store128(dbias_shared + i, dbias_accum); + store128(dweight_shared + i, dweight_accum); + } + __syncthreads(); + + // convert from float/FP32 to floatX/BF16 for the final write + // this is separate because it cannot use as many warps as the above (f128 vs x128) + // todo - if we split this code into another kernel, we could maybe do it at the same time? + for (int c = warpId; c < iterations_C; c += warpsInBlock) { + int global_index = (warpThreadIdx * x128::size) + (c * C_per_iteration); + if (global_index >= C) { + break; + } + + x128 dbias128 = load128(dbias + global_index); + x128 dweight128 = load128(dweight + global_index); + for(int o = 0; o < x128::size / f128::size; ++o) { + f128 s_db = load128(dbias_shared + global_index + o * f128::size); + f128 s_dw = load128(dweight_shared + global_index + o * f128::size); + for(int i = 0; i < f128::size; ++i) { + int x = o * f128::size + i; + dbias128[x] = (floatX)(s_db[i] + (float)dbias128[x]); + dweight128[x] = (floatX)(s_dw[i] + (float)dweight128[x]); + } + } + store128(dbias + global_index, dbias128); + store128(dweight + global_index, dweight128); + } + } +} + +// ---------------------------------------------------------------------------- +// kernel launchers + +// similar to `fused_residual_forward5` +void layernorm_forward(floatX* out, float* mean, float* rstd, + floatX* inp, const floatX* weight, const floatX* bias, + int B, int T, int C, cudaStream_t stream) { + NVTX_RANGE_FN(); + const int block_size = 256; + int block_y = block_size / WARP_SIZE; + const int N = B * T; + const int grid_size = CEIL_DIV(N, block_y); + size_t smem = (2 + block_y) * C * sizeof(floatX); + + // in order to use more than 48 KiB of smem, need to call cudaFuncSetAttribute + // this may fail, in which case we fall back to the smem free implementation. + cudaCheck(cudaGetLastError()); + auto status = cudaFuncSetAttribute(layernorm_forward_kernel6, cudaFuncAttributeMaxDynamicSharedMemorySize, smem); + cudaCheck(cudaGetLastError()); + if (status == cudaSuccess) { + layernorm_forward_kernel6<<>>(out, mean, rstd, inp, weight, bias, N, C); + } else { + // fall back to the version without shared memory + const int grid_size_fb = CEIL_DIV(N * WARP_SIZE, block_size); + layernorm_forward_kernel3<<>>(out, mean, rstd, inp, weight, bias, N, C); + } + cudaCheck(cudaGetLastError()); +} + +void residual_forward(floatX* out, const floatX* inp1, const floatX* inp2, int N, cudaStream_t stream) { + NVTX_RANGE_FN(); + const int block_size = 256; + assert(N % (block_size * x128::size) == 0); + const int grid_size = CEIL_DIV(N, block_size * x128::size); + residual_forward_kernel<<>>(out, inp1, inp2); + cudaCheck(cudaGetLastError()); +} + +void fused_residual_forward5(floatX* residual, floatX* normed, float* mean, float* rstd, + const floatX* inp1, const floatX* inp2, + const floatX* weight, const floatX* bias, + int N, int C, cudaStream_t stream) { + const int block_size = 256; + int block_y = block_size / WARP_SIZE; + const int grid_size = CEIL_DIV(N, block_y); + size_t smem = (2 + block_y) * C * sizeof(floatX); + + // in order to use more than 48 KiB of smem, need to call cudaFuncSetAttribute + // this may fail, in which case we fall back to the smem free implementation. + cudaCheck(cudaGetLastError()); + auto status = cudaFuncSetAttribute(fused_residual_forward_kernel5, cudaFuncAttributeMaxDynamicSharedMemorySize, smem); + cudaCheck(cudaGetLastError()); + if(status == cudaSuccess) { + fused_residual_forward_kernel5<<>>(residual, normed, + mean, rstd, inp1, inp2, + weight, bias, N, C); + } else { + residual_forward(residual, inp1, inp2, N*C, stream); + layernorm_forward(normed, mean, rstd, residual, weight, bias, N, 1, C, stream); + } + cudaCheck(cudaGetLastError()); +} + +void layernorm_backward(floatX* dinp, floatX* dweight, floatX* dbias, float* scratch, + const floatX* dout, const floatX* inp, const floatX* weight, const float* mean, const float* rstd, + int B, int T, int C, cudaStream_t stream) { + NVTX_RANGE_FN(); + const int block_size = 512; + const int blocks_per_sm = 2; // supported on every architecture and less cache thrashing than 3 + const int grid_size = blocks_per_sm * deviceProp.multiProcessorCount; + size_t rounded_C = CEIL_DIV(C, (32 * x128::size)) * (32 * x128::size); + size_t shared_mem_size = (2 * rounded_C + 2 * (block_size - 32) * f128::size) * sizeof(float); + + cudaCheck(cudaMemsetAsync(scratch, 0, 1 * sizeof(float), stream)); // only need to reset the flag to 0 + layernorm_backward_kernel10<<>>(dinp, dweight, dbias, scratch, dout, inp, weight, mean, rstd, B, T, C); + cudaCheck(cudaGetLastError()); +} diff --git a/CUDA/llmcpp/mfu.h b/CUDA/llmcpp/mfu.h new file mode 100644 index 0000000..1c40b7b --- /dev/null +++ b/CUDA/llmcpp/mfu.h @@ -0,0 +1,244 @@ +#ifndef MFU_H +#define MFU_H + +#include +#include +#include +#if __has_include() +#define USE_NVML 1 +#include +#else +#define USE_NVML 0 +#endif + +// tied to enum PrecisionMode, in a future refactor make them the same +#define MFUH_PRECISION_FP32 0 +#define MFUH_PRECISION_FP16 1 +#define MFUH_PRECISION_BF16 2 + +#if USE_NVML +inline void nvml_check(nvmlReturn_t status, const char *file, int line) { + if (status != NVML_SUCCESS) { + printf("[NVML ERROR] at file %s:%d:\n%s\n", file, line, nvmlErrorString(status)); + exit(EXIT_FAILURE); + } +}; +#define nvmlCheck(err) (nvml_check(err, __FILE__, __LINE__)) +#endif + + +typedef struct { + float TF_32; // tensor-core performance 32 bit + float BF_16_32; // bf16 with 32 bit accumulate + float FP_16_32; // fp16 with 32 bit accumulate + float FP_16_16; // fp16 with 16 bit accumulate + float FP_8_32; // and so on + float FP_8_16; + float CLOCK; // clock frequency from the spec sheet + float CORES; // #TCs from the spec sheet +} PerfData; + +// basic default data from the nvidia whitepapers +static const PerfData VOLTA = {125.0f, -1.f, 125.f, -1.f, -1.f, -1.f, 1530.f, 640.f}; +static const PerfData AMPERE_DATACENTER = {156.f, 312.f, 312.f, 312.f, -1.f, -1.f, 1410.f, 432.f}; +static const PerfData AMPERE_CONSUMER = {40.f, 80.f, 80.f, 160.f, -1.f, -1.f, 1860.f, 336.f}; +static const PerfData HOPPER = {378.f, 756.f, 756.f, 756.f, 1513.f, 1513.f, 1620.f, 456.f}; +static const PerfData ADA = {82.6f, 165.2f, 165.2f, 330.3f, 330.3f, 660.6f, 2520.f, 512.f}; + +typedef struct { + const char* name; + const PerfData* perf_data; + float new_cores; + float new_mhz; +} GPUEntry; + +// the overrides for each specific GPU +static GPUEntry gpu_db[] = { + {"Tesla V100-SXM2-16GB", &VOLTA, 640, 1530}, + {"Tesla V100-PCIE-32GB", &VOLTA, 640, 1530}, + {"NVIDIA A100-PCIE-40GB", &ERE_DATACENTER, 432, 1410}, + {"NVIDIA A100-PCIE-80GB", &ERE_DATACENTER, 432, 1410}, + {"NVIDIA A100-SXM4-40GB", &ERE_DATACENTER, 432, 1410}, + {"NVIDIA A100-SXM4-80GB", &ERE_DATACENTER, 432, 1410}, + {"NVIDIA RTX A2000", &ERE_CONSUMER, 104, 1200}, + {"NVIDIA RTX A4000", &ERE_CONSUMER, 192, 1560}, + {"NVIDIA RTX A4500", &ERE_CONSUMER, 224, 1650}, + {"NVIDIA RTX A5000", &ERE_CONSUMER, 256, 1695}, + {"NVIDIA RTX A5500", &ERE_CONSUMER, 320, 1770}, + {"NVIDIA RTX A6000", &ERE_CONSUMER, 336, 1800}, + {"NVIDIA GeForce RTX 3090 Ti", &ERE_CONSUMER, 336, 1860}, + {"NVIDIA GeForce RTX 3090", &ERE_CONSUMER, 328, 1695}, + {"NVIDIA GeForce RTX 3080 Ti", &ERE_CONSUMER, 320, 1665}, + {"NVIDIA GeForce RTX 3080", &ERE_CONSUMER, 272, 1710}, + {"NVIDIA GeForce RTX 3070 Ti", &ERE_CONSUMER, 192, 1770}, + {"NVIDIA GeForce RTX 3070", &ERE_CONSUMER, 184, 1725}, + {"NVIDIA GeForce RTX 3060 Ti", &ERE_CONSUMER, 152, 1665}, + {"NVIDIA GeForce RTX 3060", &ERE_CONSUMER, 112, 1777}, + {"NVIDIA RTX A2000 ADA", &ADA, 88, 2130}, + {"NVIDIA RTX A4000 ADA", &ADA, 192, 2175}, + {"NVIDIA RTX A4500 ADA", &ADA, 224, 2580}, + {"NVIDIA RTX A5000 ADA", &ADA, 400, 2550}, + {"NVIDIA RTX A5880 ADA", &ADA, 440, 2460}, + {"NVIDIA RTX A6000 ADA", &ADA, 568, 2505}, + {"NVIDIA GeForce RTX 4090", &ADA, 512, 2520}, + {"NVIDIA GeForce RTX 4080 SUPER", &ADA, 320, 2550}, + {"NVIDIA GeForce RTX 4080", &ADA, 304, 2505}, + {"NVIDIA GeForce RTX 4070 Ti SUPER", &ADA, 264, 2610}, + {"NVIDIA GeForce RTX 4070 Ti", &ADA, 240, 2610}, + {"NVIDIA GeForce RTX 4070 SUPER", &ADA, 224, 2475}, + {"NVIDIA GeForce RTX 4070", &ADA, 184, 2475}, + {"NVIDIA GeForce RTX 4070", &ADA, 184, 2475}, + {"NVIDIA GeForce RTX 4060 Ti", &ADA, 136, 2535}, + {"NVIDIA GeForce RTX 4060", &ADA, 96, 2460}, + {"NVIDIA H100 PCIe", &HOPPER, 456, 1620}, + {"NVIDIA H100 80GB HBM3", &HOPPER, 528, 1830}, // HBM3 = SXM5 +}; + +float get_flops_promised(const char* device, int precision_mode) { + /* + This function is used to estimate the Model Flops Utilization (MFU) + basically we have to figure out how many flops the GPU can do per second. + Note that this is not a simple endeavor and may well go wrong! The details are tricky. + The returned value is in units of 1e12. + + For the non-top models, actual performance numbers aren't that easy to find, e.g., + here https://www.techpowerup.com/gpu-specs/rtx-a4000.c3756, does "Theoretical Performance" + seems to be without tensor cores. + + So, instead we use that all these cards just use the same types of tensor cores in different + numbers and at different frequencies. Then we just need to look up these two easily accesible + numbers for all the other GPUs. + linear scaling seems to work: comparing spec sheet and calculation: + 4080: 304TCs, 2505 GHz; 97.5TFlops = 165.2/512*304 /2520 * 2505 + + Original numbers for the top GPUS are from. + https://resources.nvidia.com/en-us-tensor-core + https://images.nvidia.com/aem-dam/Solutions/geforce/ada/nvidia-ada-gpu-architecture.pdf + */ + + // validate the precision mode as one of the three possible values + if (!(precision_mode == MFUH_PRECISION_FP32 || precision_mode == MFUH_PRECISION_FP16 || precision_mode == MFUH_PRECISION_BF16)) { + fprintf(stderr, "Invalid precision mode: %d\n", precision_mode); + return -1.0f; + } + + // do a linear search until you find our GPU, then calculate the flops promised + int num_gpu_entries = sizeof(gpu_db) / sizeof(gpu_db[0]); + for (int i = 0; i < num_gpu_entries; i++) { + if (strcmp(gpu_db[i].name, device) == 0) { + const PerfData* perf_data = gpu_db[i].perf_data; + + // look up the default flops value for the given precision mode + float value = -1.0f; + if (precision_mode == MFUH_PRECISION_BF16) { value = perf_data->BF_16_32; } + if (precision_mode == MFUH_PRECISION_FP32) { value = perf_data->TF_32; } + if (precision_mode == MFUH_PRECISION_FP16) { value = perf_data->FP_16_32; } + + // we'd get here if we're e.g. trying to use BF16 on Volta GPU or something... + if (value < 0.0f) { + fprintf(stderr, "No data for GPU %s and precision mode %d\n", device, precision_mode); + return -1.0f; + } + + // adjust flops based on the specific core count and clock frequency of this GPU + float new_cores = gpu_db[i].new_cores; + float new_mhz = gpu_db[i].new_mhz; + float adjusted = value * (new_cores / perf_data->CORES) * (new_mhz / perf_data->CLOCK); + return adjusted; + } + } + + return -1.0f; // ¯\_(ツ)_/¯ +} + +struct GPUUtilInfo { + unsigned int clock; + unsigned int max_clock; + unsigned int power; + unsigned int power_limit; + unsigned int fan; + unsigned int temperature; + unsigned int temp_slowdown; + + float gpu_utilization; + float mem_utilization; + const char* throttle_reason; +}; + +// lazily initialize nvml and generate a handle to the GPU +#if USE_NVML +nvmlDevice_t nvml_get_device() { + static bool needs_init = true; + static nvmlDevice_t device; + if(needs_init) { + needs_init = false; + nvmlCheck(nvmlInit()); + nvmlCheck(nvmlDeviceGetHandleByIndex_v2(0, &device)); + } + return device; +} + +// convert throttle reason bitfield into a text reason. +// this is a lossy conversion; we just want to give some idea of what is happening +const char* get_throttle_reason(unsigned long long bits) { + if(bits & (nvmlClocksThrottleReasonSwPowerCap | nvmlClocksThrottleReasonHwPowerBrakeSlowdown)) { + return "power cap"; + } else if (bits & (nvmlClocksThrottleReasonSwThermalSlowdown | nvmlClocksThrottleReasonHwThermalSlowdown)) { + return "thermal cap"; + } else if (bits & (nvmlClocksThrottleReasonAll)) { + return "other cap"; + } else { + return "no cap"; + } +} + +// gather data for a GPUUtilInfo object +GPUUtilInfo get_gpu_utilization_info() { + GPUUtilInfo info; + nvmlDevice_t device = nvml_get_device(); + // query different infos directly + nvmlCheck(nvmlDeviceGetClockInfo(device, NVML_CLOCK_SM, &info.clock)); + nvmlCheck(nvmlDeviceGetMaxClockInfo(device, NVML_CLOCK_SM, &info.max_clock)); + nvmlCheck(nvmlDeviceGetPowerManagementLimit(device, &info.power_limit)); + nvmlCheck(nvmlDeviceGetPowerUsage(device, &info.power)); + nvmlCheck(nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &info.temperature)); + nvmlCheck(nvmlDeviceGetTemperatureThreshold(device, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, &info.temp_slowdown)); + unsigned long long throttle; + nvmlCheck(nvmlDeviceGetCurrentClocksThrottleReasons(device, &throttle)); + info.throttle_reason = get_throttle_reason(throttle); + nvmlCheck(nvmlDeviceGetFanSpeed(device, &info.fan)); + + // for "utilization", we look at recorded samples. In principle, we could query the driver for how many samples + // to request, but then we'd need to dynamically allocate sufficient space. Let's just hard-code a limit of 128, + // and have no memory management required + constexpr const int BUFFER_LIMIT = 128; + nvmlSample_t buffer[BUFFER_LIMIT]; + nvmlValueType_t v_type; + unsigned int sample_count = BUFFER_LIMIT; + nvmlCheck(nvmlDeviceGetSamples(device, NVML_GPU_UTILIZATION_SAMPLES, 0, &v_type, &sample_count, buffer)); + float gpu_utilization = 0.f; + for(unsigned i = 0; i < sample_count; ++i) { + gpu_utilization += (float)buffer[i].sampleValue.uiVal; + } + gpu_utilization /= (float)sample_count; + + // sample count may have been modified by the query above; reset back to buffer size + sample_count = BUFFER_LIMIT; + nvmlCheck(nvmlDeviceGetSamples(device, NVML_MEMORY_UTILIZATION_SAMPLES, 0, &v_type, &sample_count, buffer)); + float mem_utilization = 0.f; + for(unsigned i = 0; i < sample_count; ++i) { + mem_utilization += (float)buffer[i].sampleValue.uiVal; + } + mem_utilization /= (float)sample_count; + + info.gpu_utilization = gpu_utilization; + info.mem_utilization = mem_utilization; + return info; +} +#else +GPUUtilInfo get_gpu_utilization_info() { + fprintf(stderr, "Error: Compiled without nvml support. Cannot perform additional GPU state tracking."); + exit(EXIT_FAILURE); +} +#endif +#endif // MFU_H diff --git a/CUDA/llmcpp/rand.h b/CUDA/llmcpp/rand.h new file mode 100644 index 0000000..b66aa04 --- /dev/null +++ b/CUDA/llmcpp/rand.h @@ -0,0 +1,240 @@ +/* +Mersenne Twisters implementation, numerically identical to torch. + +Example usage: + + mt19937_state state; + manual_seed(&state, 137); + printf("%u\n", randint32(&state)); + printf("%u\n", randint32(&state)); + printf("%u\n", randint32(&state)); + printf("%u\n", randint32(&state)); + printf("%u\n", randint32(&state)); + + float t8[8]; + normal_(t8, 8, 0, 1, &state); + for (int i = 0; i < 8; i++) { + printf("%f\n", t8[i]); + } + printf("%u\n", randint32(&state)); + + float t16[16]; + normal_(t16, 16, 0, 1, &state); + for (int i = 0; i < 16; i++) { + printf("%f\n", t16[i]); + } + printf("%u\n", randint32(&state)); + +PyTorch reference (producing identical results): + + import torch + torch.manual_seed(137) + print(torch.randint(0, 0xFFFFFFFF, [1]).item()) + print(torch.randint(0, 0xFFFFFFFF, [1]).item()) + print(torch.randint(0, 0xFFFFFFFF, [1]).item()) + print(torch.randint(0, 0xFFFFFFFF, [1]).item()) + print(torch.randint(0, 0xFFFFFFFF, [1]).item()) + t = torch.zeros(8); + t.normal_() + for i in range(len(t)) : + print(t[i].item()) + print(torch.randint(0, 0xFFFFFFFF, [1]).item()) + t = torch.zeros(16); + t.normal_() + for i in range(len(t)) : + print(t[i].item()) + print(torch.randint(0, 0xFFFFFFFF, [1]).item()) + +Both output: + + 4053805790 + 2173880614 + 380293709 + 1237255315 + 2986595568 + 0.7947664260864258 + 1.4369317293167114 + - 0.2292192131280899 + 0.47556325793266296 + - 0.6334410905838013 + - 0.5791953802108765 + - 0.0925704762339592 + - 0.8659197092056274 + 2186503452 + - 1.2813878059387207 + - 2.646395683288574 + - 0.06569503247737885 + 0.2180829495191574 + - 0.46536165475845337 + - 0.33108410239219666 + 2.5485482215881348 + 0.10425379872322083 + 0.8460659980773926 + 0.9462448358535767 + - 0.2913765013217926 + 0.34313806891441345 + - 1.1186704635620117 + - 0.18305328488349915 + - 2.3153159618377686 + 0.3961987793445587 + 2756748748 +*/ + +#ifndef RAND_H +#define RAND_H + +#include + +#define MERSENNE_STATE_M 397u +#define MERSENNE_STATE_N 624u + +#define LMASK 0x7ffffffful +#define UMASK 0x80000000ul + +// Copyright(c) Makoto Matsumoto and Takuji Nishimura + +// This implementation follows PyTorch so that we are numerically identical when running verification tests. + +typedef struct { + unsigned long long seed_; + int left_; + unsigned int next_; + unsigned int state_[MERSENNE_STATE_N]; + unsigned int MATRIX_A[2]; +} mt19937_state; + +void manual_seed(mt19937_state* state, unsigned int seed) { + state->MATRIX_A[0] = 0x0u; + state->MATRIX_A[1] = 0x9908b0df; + state->state_[0] = seed & 0xffffffff; + for (unsigned int j = 1; j < MERSENNE_STATE_N; j++) { + state->state_[j] = 1812433253 * (state->state_[j - 1] ^ (state->state_[j - 1] >> 30)) + j; + state->state_[j] &= 0xffffffff; + } + state->left_ = 1; + state->next_ = 0; +} + +void next_state(mt19937_state* state) { + state->left_ = MERSENNE_STATE_N; + state->next_ = 0; + unsigned int y, j; + for (j = 0; j < MERSENNE_STATE_N - MERSENNE_STATE_M; j++) { + y = (state->state_[j] & UMASK) | (state->state_[j + 1] & LMASK); + state->state_[j] = state->state_[j + MERSENNE_STATE_M] ^ (y >> 1) ^ state->MATRIX_A[y & 0x1]; + } + for (; j < MERSENNE_STATE_N - 1; j++) { + y = (state->state_[j] & UMASK) | (state->state_[j + 1] & LMASK); + state->state_[j] = state->state_[j + (MERSENNE_STATE_M - MERSENNE_STATE_N)] ^ (y >> 1) ^ state->MATRIX_A[y & 0x1]; + } + y = (state->state_[MERSENNE_STATE_N - 1] & UMASK) | (state->state_[0] & LMASK); + state->state_[MERSENNE_STATE_N - 1] = state->state_[MERSENNE_STATE_M - 1] ^ (y >> 1) ^ state->MATRIX_A[y & 0x1]; +} + +unsigned int randint32(mt19937_state* state) { + if (!state) return 0; + if (state->MATRIX_A[0] != 0 || state->MATRIX_A[1] != 0x9908b0df) manual_seed(state, 5489); // auto-initialize + if (--state->left_ <= 0) { + next_state(state); + } + unsigned int y = state->state_[state->next_++]; + y ^= y >> 11; + y ^= (y << 7) & 0x9d2c5680; + y ^= (y << 15) & 0xefc60000; + y ^= y >> 18; + return y; +} + +inline unsigned long long randint64(mt19937_state* state) { + return (((unsigned long long)(randint32(state)) << 32) | randint32(state)); +} + +inline float randfloat32(mt19937_state* state) { + return (randint32(state) & ((1ull << 24) - 1)) * (1.0f / (1ull << 24)); +} + +inline double randfloat64(mt19937_state* state) { + return (randint64(state) & ((1ull << 53) - 1)) * (1.0 / (1ull << 53)); +} + +void uniform_(float* data, unsigned int numel, float from, float to, mt19937_state* state) { + for (unsigned int t = 0; t < numel; t++) { + data[t] = randfloat32(state) * (to - from) + from; + } +} + +// Box-Muller transform: maps uniform random numbers to Gaussian distributed numbers +// https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform +void normal_fill_16(float* data, float mean, float std) { + #define EPSILONE 1e-12f + for (unsigned int t = 0; t < 8; t++) { + float u1 = 1 - data[t]; + float u2 = data[t + 8]; + float radius = sqrtf(-2 * logf(u1 + EPSILONE)); + float theta = (float) (2.0 * M_PI * u2); + data[t] = (radius * cosf(theta) * std + mean); + data[t + 8] = (radius * sinf(theta) * std + mean); + } +} + +void normal_fill(float* data, unsigned int numel, float mean, float std, mt19937_state* state) { + for (unsigned int t = 0; t < numel; t++) { + data[t] = randfloat32(state); + } + for (unsigned int i = 0; i < numel - 15; i += 16) { + normal_fill_16(data + i, mean, std); + } + if (numel % 16 != 0) { + // recompute the last 16 values + data = data + numel - 16; + for (unsigned int i = 0; i < 16; i++) { + data[i] = randfloat32(state); + } + normal_fill_16(data, mean, std); + } +} + +void normal_(float* data, unsigned int numel, float mean, float std, mt19937_state* state) { + #define EPSILONE 1e-12f + if (numel >= 16) { + normal_fill(data, numel, mean, std, state); + } + else { + double next_double_normal_sample = 0.0; // make compiler warning happy, won't be used + int has_next_double_normal_sample = 0; + for (unsigned int t = 0; t < numel; t++) { + if (has_next_double_normal_sample) { + data[t] = (float)(next_double_normal_sample * std + mean); + has_next_double_normal_sample = 0; + continue; + } + // for numel < 16 we draw a double (float64) + float u1 = (float) randfloat64(state); + float u2 = (float) randfloat64(state); + float radius = sqrtf(-2 * logf(1 - u2 + EPSILONE)); + float theta = (float) (2.0 * M_PI * u1); + next_double_normal_sample = radius * sinf(theta); + has_next_double_normal_sample = 1; + data[t] = (radius * cosf(theta) * std + mean); + } + } +} + +void init_identity_permutation(int *data, int numel) { + for (int i = 0; i < numel; i++) { + data[i] = i; + } +} + +void random_permutation(int* data, int numel, mt19937_state* state) { + for (int i = numel - 1; i > 0; i--) { + // pick an index j in [0, i] with equal probability + int j = randint32(state) % (i + 1); + // swap i <-> j + int tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; + } +} + +#endif \ No newline at end of file diff --git a/CUDA/llmcpp/utils.h b/CUDA/llmcpp/utils.h new file mode 100644 index 0000000..775534c --- /dev/null +++ b/CUDA/llmcpp/utils.h @@ -0,0 +1,223 @@ +/* + This file contains utilities shared between the different training scripts. + In particular, we define a series of macros xxxCheck that call the corresponding + C standard library function and check its return code. If an error was reported, + the program prints some debug information and exits. +*/ +#ifndef UTILS_H +#define UTILS_H + +#include +#include +#include +#include +#include +// implementation of dirent for Windows is in dev/unistd.h +#ifndef _WIN32 +#include +#include +#endif + +// ---------------------------------------------------------------------------- +// fread convenience utils, with nice handling of error checking using macros +// simple replace fopen, fread, fclose, fseek +// with fopenCheck, freadCheck, fcloseCheck, fseekCheck + +extern inline FILE *fopen_check(const char *path, const char *mode, const char *file, int line) { + FILE *fp = fopen(path, mode); + if (fp == NULL) { + fprintf(stderr, "Error: Failed to open file '%s' at %s:%d\n", path, file, line); + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + fprintf(stderr, " Path: %s\n", path); + fprintf(stderr, " Mode: %s\n", mode); + fprintf(stderr, "---> HINT 1: dataset files/code have moved to dev/data recently (May 20, 2024). You may have to mv them from the legacy data/ dir to dev/data/(dataset), or re-run the data preprocessing script. Refer back to the main README\n"); + fprintf(stderr, "---> HINT 2: possibly try to re-run `python train_gpt2.py`\n"); + exit(EXIT_FAILURE); + } + return fp; +} + +#define fopenCheck(path, mode) fopen_check(path, mode, __FILE__, __LINE__) + +extern inline void fread_check(void *ptr, size_t size, size_t nmemb, FILE *stream, const char *file, int line) { + size_t result = fread(ptr, size, nmemb, stream); + if (result != nmemb) { + if (feof(stream)) { + fprintf(stderr, "Error: Unexpected end of file at %s:%d\n", file, line); + } else if (ferror(stream)) { + fprintf(stderr, "Error: File read error at %s:%d\n", file, line); + } else { + fprintf(stderr, "Error: Partial read at %s:%d. Expected %zu elements, read %zu\n", + file, line, nmemb, result); + } + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + fprintf(stderr, " Expected elements: %zu\n", nmemb); + fprintf(stderr, " Read elements: %zu\n", result); + exit(EXIT_FAILURE); + } +} + +#define freadCheck(ptr, size, nmemb, stream) fread_check(ptr, size, nmemb, stream, __FILE__, __LINE__) + +extern inline void fclose_check(FILE *fp, const char *file, int line) { + if (fclose(fp) != 0) { + fprintf(stderr, "Error: Failed to close file at %s:%d\n", file, line); + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + exit(EXIT_FAILURE); + } +} + +#define fcloseCheck(fp) fclose_check(fp, __FILE__, __LINE__) + +extern inline void sclose_check(int sockfd, const char *file, int line) { + if (close(sockfd) != 0) { + fprintf(stderr, "Error: Failed to close socket at %s:%d\n", file, line); + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + exit(EXIT_FAILURE); + } +} + +#define scloseCheck(sockfd) sclose_check(sockfd, __FILE__, __LINE__) + +#ifdef _WIN32 +extern inline void closesocket_check(int sockfd, const char *file, int line) { + if (closesocket(sockfd) != 0) { + fprintf(stderr, "Error: Failed to close socket at %s:%d\n", file, line); + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + exit(EXIT_FAILURE); + } +} + +#define closesocketCheck(sockfd) closesocket_check(sockfd, __FILE__, __LINE__) +#endif + +extern inline void fseek_check(FILE *fp, long off, int whence, const char *file, int line) { + if (fseek(fp, off, whence) != 0) { + fprintf(stderr, "Error: Failed to seek in file at %s:%d\n", file, line); + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " Offset: %ld\n", off); + fprintf(stderr, " Whence: %d\n", whence); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + exit(EXIT_FAILURE); + } +} + +#define fseekCheck(fp, off, whence) fseek_check(fp, off, whence, __FILE__, __LINE__) + +extern inline void fwrite_check(void *ptr, size_t size, size_t nmemb, FILE *stream, const char *file, int line) { + size_t result = fwrite(ptr, size, nmemb, stream); + if (result != nmemb) { + if (feof(stream)) { + fprintf(stderr, "Error: Unexpected end of file at %s:%d\n", file, line); + } else if (ferror(stream)) { + fprintf(stderr, "Error: File write error at %s:%d\n", file, line); + } else { + fprintf(stderr, "Error: Partial write at %s:%d. Expected %zu elements, wrote %zu\n", + file, line, nmemb, result); + } + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + fprintf(stderr, " Expected elements: %zu\n", nmemb); + fprintf(stderr, " Written elements: %zu\n", result); + exit(EXIT_FAILURE); + } +} + +#define fwriteCheck(ptr, size, nmemb, stream) fwrite_check(ptr, size, nmemb, stream, __FILE__, __LINE__) + +// ---------------------------------------------------------------------------- +// malloc error-handling wrapper util + +extern inline void *malloc_check(size_t size, const char *file, int line) { + void *ptr = malloc(size); + if (ptr == NULL) { + fprintf(stderr, "Error: Memory allocation failed at %s:%d\n", file, line); + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + fprintf(stderr, " Size: %zu bytes\n", size); + exit(EXIT_FAILURE); + } + return ptr; +} + +#define mallocCheck(size) malloc_check(size, __FILE__, __LINE__) + + +// ---------------------------------------------------------------------------- +// check that all tokens are within range +extern inline void token_check(const int* tokens, int token_count, int vocab_size, const char *file, int line) { + for(int i = 0; i < token_count; i++) { + if(!(0 <= tokens[i] && tokens[i] < vocab_size)) { + fprintf(stderr, "Error: Token out of vocabulary at %s:%d\n", file, line); + fprintf(stderr, "Error details:\n"); + fprintf(stderr, " File: %s\n", file); + fprintf(stderr, " Line: %d\n", line); + fprintf(stderr, " Token: %d\n", tokens[i]); + fprintf(stderr, " Position: %d\n", i); + fprintf(stderr, " Vocab: %d\n", vocab_size); + exit(EXIT_FAILURE); + } + } +} +#define tokenCheck(tokens, count, vocab) token_check(tokens, count, vocab, __FILE__, __LINE__) + +// ---------------------------------------------------------------------------- +// I/O ops + +extern inline void create_dir_if_not_exists(const char *dir) { + if (dir == NULL) { return; } + struct stat st = {0}; + if (stat(dir, &st) == -1) { + if (mkdir(dir, 0700) == -1) { + printf("ERROR: could not create directory: %s\n", dir); + exit(EXIT_FAILURE); + } + printf("created directory: %s\n", dir); + } +} + +extern inline int find_max_step(const char* output_log_dir) { + // find the DONE file in the log dir with highest step count + if (output_log_dir == NULL) { return -1; } + DIR* dir; + struct dirent* entry; + int max_step = -1; + dir = opendir(output_log_dir); + if (dir == NULL) { return -1; } + while ((entry = readdir(dir)) != NULL) { + if (strncmp(entry->d_name, "DONE_", 5) == 0) { + int step = atoi(entry->d_name + 5); + if (step > max_step) { + max_step = step; + } + } + } + closedir(dir); + return max_step; +} + +extern inline int ends_with_bin(const char* str) { + // checks if str ends with ".bin". could be generalized in the future. + if (str == NULL) { return 0; } + size_t len = strlen(str); + const char* suffix = ".bin"; + size_t suffix_len = strlen(suffix); + if (len < suffix_len) { return 0; } + int suffix_matches = strncmp(str + len - suffix_len, suffix, suffix_len) == 0; + return suffix_matches; +} + +#endif \ No newline at end of file diff --git a/CUDA/llmcpp/zero.cuh b/CUDA/llmcpp/zero.cuh new file mode 100644 index 0000000..e6c5b6e --- /dev/null +++ b/CUDA/llmcpp/zero.cuh @@ -0,0 +1,597 @@ +/* +Utilities for ZeRO sharding +*/ + +#ifndef LLMC_ZERO_CUH +#define LLMC_ZERO_CUH + +#include +#include +#include +#include +#include + +#ifdef MULTI_GPU +#include +#ifdef USE_MPI +#include +#endif +#endif + +// defines: fcloseCheck, fwriteCheck, scloseCheck, sclosesocketCheck +#include "utils.h" + +// ---------------------------------------------------------------------------- +// Multi-GPU related +#ifdef MULTI_GPU + +#if defined(ENABLE_FP32) +const ncclDataType_t ncclFloatX = ncclFloat; +#elif defined(ENABLE_FP16) +const ncclDataType_t ncclFloatX = ncclHalf; +#else // Default to bfloat16 +const ncclDataType_t ncclFloatX = ncclBfloat16; +#endif + +void nccl_check(ncclResult_t status, const char *file, int line) { + if (status != ncclSuccess) { + printf("[NCCL ERROR] at file %s:%d:\n%s\n", file, line, ncclGetErrorString(status)); + exit(EXIT_FAILURE); + } +} +#define ncclCheck(err) (nccl_check(err, __FILE__, __LINE__)) + +#ifdef USE_MPI +void mpi_check(int status, const char *file, int line) { + if (status != MPI_SUCCESS) { + char mpi_error[4096]; + int mpi_error_len = 0; + assert(MPI_Error_string(status, &mpi_error[0], &mpi_error_len) == MPI_SUCCESS); + printf("[MPI ERROR] at file %s:%d:\n%.*s\n", file, line, mpi_error_len, mpi_error); + exit(EXIT_FAILURE); + } +} +#define mpiCheck(err) (mpi_check(err, __FILE__, __LINE__)) +#endif + +#endif // MULTI_GPU + +// ---------------------------------------------------------------------------- +// Parameters specific to training on multiple GPUs. +typedef struct { + int process_rank; // Rank of this process among all processes. 0 if no multi-GPU. + int num_processes; // Total number of processes. 1 if no multi-GPU. + int local_device_idx; // This process GPU index on current machine. 0 if no multi-GPU. + + // Zero Redundancy Optimizer stage - https://fairscale.readthedocs.io/en/stable/deep_dive/oss_sdp_fsdp.html + // 0-Disabled + // 1-Optimizer State Sharding (OSS) + // 2-Optimizer + Gradient State Sharding (SDP) + // 3-Optimizer + Gradient + Horizontal Model Sharding (FSDP) + int zero_stage; + size_t shard_num_parameters; +#ifdef MULTI_GPU + ncclComm_t nccl_comm; // NCCL communication primitive, used for collective multi-GPU work. + cudaStream_t nccl_stream; // CUDA Stream to perform NCCL operations. + cudaEvent_t compute_nccl_sync; // Event used to synchronize NCCL with the compute + float* unified_buffer; +#endif +} MultiGpuConfig; + +// one global variable to hold the multi-GPU configuration for this process +// inline, so we can include this header multiple times without getting multiple definitions +inline MultiGpuConfig multi_gpu_config; + +#ifdef MULTI_GPU + +#ifdef _WIN32 +void send_nccl_id_to_clients_windows(ncclUniqueId *nccl_id, SOCKET client_sockets[], int num_clients) { + for (int i = 0; i < num_clients; ++i) { + if (send(client_sockets[i], (const char *)nccl_id, sizeof(*nccl_id), 0) == SOCKET_ERROR) { + printf("Failed to send nccl_id"); + WSACleanup(); + exit(EXIT_FAILURE); + } + closesocketCheck(client_sockets[i]); + } +} +#else +void send_nccl_id_to_clients(ncclUniqueId *nccl_id, int client_sockets[], int num_clients) { + for (int i = 0; i < num_clients; ++i) { + if (send(client_sockets[i], nccl_id, sizeof(*nccl_id), 0) == -1) { + printf("Failed to send nccl_id"); + exit(EXIT_FAILURE); + } + scloseCheck(client_sockets[i]); + } +} +#endif + +#ifdef _WIN32 +// Same as get_nccl_id_via_tcp but for Windows +ncclUniqueId get_nccl_id_via_tcp_windows(MultiGpuConfig* result, const char* server_ip) { + ncclUniqueId nccl_id; + + int SERVER_PORT = 12345; // hardcoded an arbitrary port number between 1024 and 49151 (registered ports) + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { + printf("WSAStartup failed"); + exit(EXIT_FAILURE); + } + + if (result->process_rank == 0) { + ncclCheck(ncclGetUniqueId(&nccl_id)); + + int MAX_CLIENTS = result->num_processes - 1; + SOCKET client_sockets[MAX_CLIENTS]; + int num_clients = 0; + SOCKET server_socket, new_socket; + struct sockaddr_in address; + int addrlen = sizeof(address); + + // Step 1) create a server TCP socket + if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { + printf("Socket failed"); + WSACleanup(); + exit(EXIT_FAILURE); + } + + // Step 2) set the server address and port + address.sin_family = AF_INET; // IPv4 + address.sin_addr.s_addr = inet_addr(server_ip); + address.sin_port = htons(SERVER_PORT); + + // Step 3) bind the socket to the address and port + if (bind(server_socket, (struct sockaddr *)&address, sizeof(address)) == SOCKET_ERROR) { + printf("Bind failed"); + closesocketCheck(server_socket); + WSACleanup(); + exit(EXIT_FAILURE); + } + + // Step 4) MAX_CLIENTS specifies the maximum number of clients that can be queued for this server + if (listen(server_socket, MAX_CLIENTS) == SOCKET_ERROR) { + printf("Listen failed"); + closesocketCheck(server_socket); + WSACleanup(); + exit(EXIT_FAILURE); + } + + // Step 5) accept connections from clients + printf("Waiting for clients to connect...\n"); + while (num_clients < MAX_CLIENTS) { + if ((new_socket = accept(server_socket, (struct sockaddr *)&address, &addrlen)) == INVALID_SOCKET) { + printf("Accept failed"); + closesocketCheck(server_socket); + WSACleanup(); + exit(EXIT_FAILURE); + } + client_sockets[num_clients++] = new_socket; + printf("Client %d connected\n", num_clients); + } + + // Step 6) send the NCCL ID to all clients + send_nccl_id_to_clients_windows(&nccl_id, client_sockets, num_clients); + printf("NCCL ID sent to all clients\n"); + + closesocketCheck(server_socket); + } else { + int num_connection_attempts = 5; + int time_to_sleep = 2; + SOCKET client_socket; + struct sockaddr_in serv_addr; + + // Step 1) create a client TCP socket + if ((client_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { + printf("Socket creation error"); + WSACleanup(); + exit(EXIT_FAILURE); + } + + // Step 2) set the server address and port + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(SERVER_PORT); + if (inet_pton(AF_INET, server_ip, &serv_addr.sin_addr) <= 0) { + printf("Invalid address or address not supported"); + closesocketCheck(client_socket); + WSACleanup(); + exit(EXIT_FAILURE); + } + + // Step 3) Try to connect to the server - retry up to `num_connection_attempts` times if the connection fails + while (connect(client_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR) { + printf("%d Connection failed, retrying in %d seconds\n", result->process_rank, time_to_sleep); + if (--num_connection_attempts == 0) { + printf("Failed to connect to the server\n"); + closesocketCheck(client_socket); + WSACleanup(); + exit(EXIT_FAILURE); + } + Sleep(time_to_sleep * 1000); + } + + // Step 4) receive the NCCL ID from the server + if (recv(client_socket, (char *)&nccl_id, sizeof(nccl_id), 0) <= 0) { + printf("Failed to receive nccl_id"); + closesocketCheck(client_socket); + WSACleanup(); + exit(EXIT_FAILURE); + } + + printf("Received NCCL ID\n"); + closesocketCheck(client_socket); + } + + WSACleanup(); + return nccl_id; +} +#else +ncclUniqueId get_nccl_id_via_tcp(MultiGpuConfig* result, const char* server_ip) { + ncclUniqueId nccl_id; + + int SERVER_PORT = 12345; // hardcoded an arbitrary port number between 1024 and 49151 (registered ports) + if (result->process_rank == 0) { + ncclCheck(ncclGetUniqueId(&nccl_id)); + + int MAX_CLIENTS = result->num_processes - 1; + int client_sockets[MAX_CLIENTS]; + int num_clients = 0; + int server_socket, new_socket; + struct sockaddr_in address; + int addrlen = sizeof(address); + int opt = 1; + + // Step 1) create a server TCP socket + if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + printf("Socket failed"); + exit(EXIT_FAILURE); + } + + // Step 2) set socket options + // SOL_SOCKET - means that option is configured at socket level + // SO_REUSEADDR - allows to bind to an address which is in a TIME_WAIT state (already used by another socket) - useful when restarting the server + // SO_REUSEPORT - allows to bind to the same port multiple times + if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)) < 0) { + printf("Setsockopt failed"); + exit(EXIT_FAILURE); + } + + // Step 3) set the server address and port + address.sin_family = AF_INET; // IPv4 + address.sin_addr.s_addr = inet_addr(server_ip); // alternatively use INADDR_ANY to bind to all interfaces, currently we only allow ethernet + address.sin_port = htons(SERVER_PORT); + + // Step 4) bind the socket to the address and port + if (bind(server_socket, (struct sockaddr *)&address, sizeof(address)) < 0) { + printf("Bind failed"); + exit(EXIT_FAILURE); + } + + // Step 5) MAX_CLIENTS specifies the maximum number of clients that can be queued for this server + if (listen(server_socket, MAX_CLIENTS) < 0) { + printf("Listen failed"); + exit(EXIT_FAILURE); + } + + // Step 6) accept connections from clients + printf("Waiting for clients to connect...\n"); + while (num_clients < MAX_CLIENTS) { + if ((new_socket = accept(server_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { + printf("Accept failed"); + exit(EXIT_FAILURE); + } + client_sockets[num_clients++] = new_socket; + printf("Client %d connected\n", num_clients); + } + + // Step 7) send the NCCL ID to all clients + send_nccl_id_to_clients(&nccl_id, client_sockets, num_clients); + printf("NCCL ID sent to all clients\n"); + + scloseCheck(server_socket); + } else { + int num_connection_attempts = 5; + int time_to_sleep = 2; + int client_socket; + struct sockaddr_in serv_addr; + + // Step 1) create a client TCP socket + if ((client_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + printf("Socket creation error"); + exit(EXIT_FAILURE); + } + + // Step 2) set the server address and port + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(SERVER_PORT); + if (inet_pton(AF_INET, server_ip, &serv_addr.sin_addr) <= 0) { + printf("Invalid address or address not supported"); + exit(EXIT_FAILURE); + } + + // Step 3) Try to connect to the server - retry up to `num_connection_attempts` times if the connection fails + while (connect(client_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { + printf("%d Connection failed, retrying in %d seconds\n", result->process_rank, time_to_sleep); + if (--num_connection_attempts == 0) { + printf("Failed to connect to the server\n"); + exit(EXIT_FAILURE); + } + sleep(time_to_sleep); + } + + // Step 4) receive the NCCL ID from the server + if (recv(client_socket, &nccl_id, sizeof(nccl_id), 0) <= 0) { + printf("Failed to receive nccl_id"); + exit(EXIT_FAILURE); + } + + printf("Received NCCL ID\n"); + scloseCheck(client_socket); + } + + return nccl_id; +} +#endif + +ncclUniqueId get_nccl_id_via_fs(MultiGpuConfig* result, char* fs_path) { + // Works assuming that the filesystem is shared among all processes + ncclUniqueId nccl_id; + FILE* idFile; + static char filename[1024]; + snprintf(filename, sizeof(filename), "%s/ncclUniqueId.sync", fs_path); + + if (result->process_rank != 0) { // client processse should wait for the server to write to the file + // This is a naive and not 100% robust way to synchronize the processes but it should work almost always + sleep(2); + } + + if (result->process_rank == 0) { + ncclCheck(ncclGetUniqueId(&nccl_id)); + idFile = fopen(filename, "wb"); + assert(idFile != NULL); + fwriteCheck(&nccl_id, sizeof(nccl_id), 1, idFile); + fcloseCheck(idFile); + } else { + // Other ranks wait until the file is available and read the unique ID + do { + sleep(1); // 1 second + idFile = fopen(filename, "rb"); + if (idFile != NULL) break; + } while (idFile == NULL); + freadCheck(&nccl_id, sizeof(nccl_id), 1, idFile); + fcloseCheck(idFile); + } + + return nccl_id; +} + +#ifdef USE_MPI +// Determine which GPU this process should use. +// Processes on the same machines use different GPU indicies. Processes on other machines don't. +// Copied from NCCL examples: https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/examples.html#example-2-one-device-per-process-or-thread +int multi_gpu_get_local_device_idx(int process_rank, int num_processes) { + char hostname[1024]; + hostname[1023] = '\0'; + // All processes on the same machine will share the same hostname. + gethostname(hostname, 1023); + for (int i=0; i < 1024; i++) { + if (hostname[i] == '.') { + hostname[i] = '\0'; + break; + } + } + uint64_t hostname_hash = 5381u; + for (int c = 0; hostname[c] != '\0'; c++){ hostname_hash = ((hostname_hash << 5u) + hostname_hash) ^ hostname[c]; } + + // Distribute all hostname hashes to all processes. + uint64_t* all_hostsname_hashes = (uint64_t*)malloc(num_processes * sizeof(uint64_t)); + all_hostsname_hashes[process_rank] = hostname_hash; + mpiCheck(MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, all_hostsname_hashes, sizeof(uint64_t), MPI_BYTE, MPI_COMM_WORLD)); + + // Identify which GPU we need to use. + int local_device_idx = 0; + for (int current_process = 0; current_process < num_processes; ++current_process) { + if (current_process == process_rank) { + // Found my gpu, local_device_idx now has my target GPU index. + break; + } + if (all_hostsname_hashes[current_process] == all_hostsname_hashes[process_rank]) { + // This process ID runs on the same machine, but it's not me, skip this GPU + local_device_idx++; + } + } + + free(all_hostsname_hashes); + return local_device_idx; +} +#endif + +#endif + +MultiGpuConfig multi_gpu_config_init(int num_processes, int process_rank, int gpus_per_node, char* server_ip, char* fs_path, char* init_method) { +#ifdef MULTI_GPU + MultiGpuConfig result; + ncclUniqueId nccl_id; + // Get nccl_id using MPI, TCP, or FS (file system synchronization) methods + // On newer slurm versions (slurm-wlm package) PMIx is disabled so we can not use MPI for NCCL init in multi node setup + if (strcmp(init_method, "mpi") == 0) { + #ifdef USE_MPI + mpiCheck(MPI_Init(NULL, NULL)); + mpiCheck(MPI_Comm_rank(MPI_COMM_WORLD, &result.process_rank)); + mpiCheck(MPI_Comm_size(MPI_COMM_WORLD, &result.num_processes)); + result.local_device_idx = multi_gpu_get_local_device_idx(result.process_rank, result.num_processes); + if (result.process_rank == 0) { + ncclCheck(ncclGetUniqueId(&nccl_id)); + } + mpiCheck(MPI_Bcast(&nccl_id, sizeof(nccl_id), MPI_BYTE, 0, MPI_COMM_WORLD)); + #else + printf("MPI support is disabled. Please enable MPI support to use MPI-based NCCL-init method.\n"); + exit(EXIT_FAILURE); + #endif + } else { + result.process_rank = process_rank; + result.num_processes = num_processes; + result.local_device_idx = process_rank % gpus_per_node; + if (strcmp(init_method, "tcp") == 0) { + #ifdef _WIN32 + nccl_id = get_nccl_id_via_tcp_windows(&result, server_ip); + #else + nccl_id = get_nccl_id_via_tcp(&result, server_ip); + #endif + } else if (strcmp(init_method, "fs") == 0) { + nccl_id = get_nccl_id_via_fs(&result, fs_path); + } else { + printf("Invalid NCCL-init method\n"); + exit(EXIT_FAILURE); + } + } + cudaCheck(cudaSetDevice(result.local_device_idx)); + ncclCheck(ncclCommInitRank(&result.nccl_comm, result.num_processes, nccl_id, result.process_rank)); + cudaCheck(cudaStreamCreate(&result.nccl_stream)); + // event without timing for maximum performance + cudaCheck(cudaEventCreate(&result.compute_nccl_sync, cudaEventDisableTiming)); + nvtxNameCudaStreamA(result.nccl_stream, "nccl stream"); + nvtxNameCudaEventA(result.compute_nccl_sync, "nccl compute sync"); + cudaCheck(cudaMallocManaged(&result.unified_buffer, sizeof(float))); + return result; +#else + printf("Multi-GPU support is disabled. Using a single GPU.\n"); + cudaCheck(cudaSetDevice(0)); + MultiGpuConfig result; + result.process_rank = 0; + result.num_processes = 1; + result.local_device_idx = 0; + return result; +#endif +} + +void multi_gpu_config_free(MultiGpuConfig* config) { +#ifdef MULTI_GPU + ncclCheck(ncclCommDestroy(config->nccl_comm)); + cudaCheck(cudaStreamDestroy(config->nccl_stream)); + cudaCheck(cudaEventDestroy(config->compute_nccl_sync)); + cudaCheck(cudaFree(config->unified_buffer)); + #ifdef USE_MPI + mpiCheck(MPI_Finalize()); + #endif +#endif +} + +void multi_gpu_barrier(const MultiGpuConfig* config) { +#ifdef MULTI_GPU + if (config->num_processes > 1) { + ncclCheck(ncclAllReduce(config->unified_buffer, config->unified_buffer, sizeof(float), ncclFloat, ncclSum, config->nccl_comm, config->nccl_stream)); + } + cudaCheck(cudaDeviceSynchronize()); +#endif +} + +// Offset and size of a tensor shard +typedef struct { + ptrdiff_t offset; + size_t size; +} ShardInfo; + +// Get info about sharding for a tensor of elements many numbers +ShardInfo multi_gpu_get_shard_offset(size_t elements, const MultiGpuConfig* config, int shard_at_stage) { + const int nproc = config->num_processes; + if(config->zero_stage >= shard_at_stage) { + if (elements % nproc != 0) { + fprintf(stderr, "Number of elements %zu must be a multiple of the number of processes %d\n", elements, nproc); + exit(EXIT_FAILURE); + } + return {(ptrdiff_t) (config->process_rank * (elements / nproc)), elements / nproc}; + } else { + return {0, elements}; + } +} + +// Block NCCL stream until computations on compute_stream are done, then aggregate multiple pointers in an NCCL group. +// This can work either as an all-reduce (i.e., no ZeRo), or a reduce-scatter (ZeRO 1). +// The awkward `(&pointers)[N]` syntax ensures we are capturing the parameters as sized arrays, so that it becomes impossible +// to call this function if pointers and pointers_sizes do not match. +template +void multi_gpu_async_reduce_gradient( + floatX* const (&pointers)[N], const size_t (&pointers_sizes)[N], + MultiGpuConfig* config, cudaStream_t compute_stream) { + if (config->num_processes == 1) { + return; // no multi-GPU, just exit. + } + +#ifdef MULTI_GPU + NVTX_RANGE_FN(); + // mark an event on the compute stream, and immediately wait on this in the nccl stream + // this means that the nccl stream won't start executing before all compute kernels that + // have been submitted before this point have finished. + // by using an event instead of cudaSyncStream, we avoid having to synchronize the host, and + // can enqueue new work to the GPU right away. + cudaCheck(cudaEventRecord(config->compute_nccl_sync, compute_stream)); + cudaCheck(cudaStreamWaitEvent(config->nccl_stream, config->compute_nccl_sync)); + ncclCheck(ncclGroupStart()); // NCCL group: aggregate all pointers in a single NCCL GPU kernel. + for (int i = 0; i < N; ++i) { + if(config->zero_stage == 0) { + ncclCheck(ncclAllReduce( + pointers[i], pointers[i], + pointers_sizes[i], + ncclFloatX, ncclAvg, + config->nccl_comm, config->nccl_stream + )); + } else if(config->zero_stage == 1) { + assert(pointers_sizes[i] % config->num_processes == 0); + size_t shard_size = pointers_sizes[i] / config->num_processes; + ptrdiff_t shard_offset = (ptrdiff_t)shard_size * config->process_rank; + ncclCheck(ncclReduceScatter( + pointers[i], pointers[i] + shard_offset, + shard_size, + ncclFloatX, ncclAvg, + config->nccl_comm, config->nccl_stream + )); + } + } + ncclCheck(ncclGroupEnd()); +#endif +} + +// convenience macro that only prints if the rank of process is zero +#define printf0(...) if (::multi_gpu_config.process_rank == 0) { printf(__VA_ARGS__); } + +void set_zero_configs(MultiGpuConfig* config, int zero_stage, size_t total_parameters) { + config->zero_stage = 0; + config->shard_num_parameters = total_parameters; + // Check the Zero Stage and define sharding parameters + if (zero_stage == 0) { + printf0("| Zero Optimization is disabled |\n"); + } + else if (zero_stage == 1) { + if (total_parameters % config->num_processes != 0) { + printf0("| Zero Optimization is disabled, Can't equally partition parameters |\n"); + config->zero_stage = 0; + } + else { + config->zero_stage = 1; + config->shard_num_parameters = total_parameters / config->num_processes; + } + } + else{ + printf0("| Disabling Zero Optimization, Zero Stage2 and Stage3 are not yet supported |\n"); + config->zero_stage = 0; + } +} + +// Compute sum of a single CPU value across all GPU processes. No-op when multi-GPU is disabled. +float multi_gpu_cpu_float_sum(float value, MultiGpuConfig* config) { +#ifdef MULTI_GPU + if (config->num_processes == 1) return value; + + float* unified_buffer = config->unified_buffer; + *unified_buffer = value; + ncclCheck(ncclAllReduce(unified_buffer, unified_buffer, sizeof(float), ncclFloat, ncclSum, config->nccl_comm, config->nccl_stream)); + cudaCheck(cudaDeviceSynchronize()); + return *unified_buffer; +#else + return value; +#endif +} + +#endif + diff --git a/README.md b/README.md index 56f99cc..b441cf4 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ -# Quadtrix.cpp +# Quadtrix.cpp (llm.cpp) -

+

image -

+


+ + + [![Release](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/release.yml/badge.svg)](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/release.yml) [![Package](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/docker-publish.yml) + [![CI](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/ci.yml/badge.svg)](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/ci.yml) A local large language model with a modular, multi-path execution architecture. Train, run inference, and serve a chat interface — all from a single repository, across bare-metal C++, PyTorch, and a React frontend. diff --git a/benchmark/results/python_benchmark.csv b/benchmark/results/python_benchmark.csv new file mode 100644 index 0000000..c264086 --- /dev/null +++ b/benchmark/results/python_benchmark.csv @@ -0,0 +1,13 @@ +suite,name,backend,batch_size,sequence_length,tokens,avg_ms,median_ms,min_ms,max_ms,p90_ms,p95_ms,std_ms,tokens_per_sec,samples,loss,memory_mb,notes +data,tokenizer_encode,python,0,0,220975,169.76018999121152,164.62069997214712,124.44350001169369,211.44290000665933,204.09656001720577,207.76973001193255,29.81756930091779,1301689.165236207,10,,188.39453125, +data,batch_sample_to_device,python,4,32,128,0.34600000944919884,0.2575500402599573,0.2452000044286251,0.8668999653309584,0.48601999878883345,0.6764599820598955,0.1852238791693057,369942.18642873614,10,,189.2734375, +primitive,matmul_3d_1x16,python,1,16,16,0.028490001568570733,0.026749970857053995,0.024800014216452837,0.04350004019215703,0.03351001651026308,0.038505028351210044,0.005415998067507546,561600.5306805843,10,,181.234375, +primitive,matmul_3d_4x32,python,4,32,128,0.047069991705939174,0.043849984649568796,0.03890000516548753,0.07130001904442906,0.05185997579246759,0.06157999741844831,0.008578937902311791,2719354.632557738,10,,181.296875, +primitive,attention_scores_4x32,python,4,32,128,0.11958999675698578,0.10689999908208847,0.10410003596916795,0.20840001525357366,0.12946999049745497,0.16893500287551425,0.030181239200475163,1070323.6346774376,10,,181.93359375, +forward,batch1_seq8,python,1,8,8,16.073119995417073,15.318600024329498,14.594200009014457,20.715299993753433,17.489159997785464,19.102229995769445,1.798887105385644,497.7253950870173,10,10.797359466552734,166.43359375, +forward,batch1_seq32,python,1,32,32,21.528740011854097,21.653899981174618,20.405600022058934,22.147400013636798,22.095200035255402,22.1213000244461,0.548371285312407,1486.3851754622074,10,10.882255554199219,190.01171875, +forward,batch4_seq32,python,4,32,128,44.681840017437935,45.51370002445765,37.46199997840449,54.08870003884658,48.26489001279697,51.17679502582177,4.5654932173684655,2864.6984983171146,10,10.885703086853027,253.171875, +training,adamw_step_b4_s32,python,4,32,128,229.80256001465023,207.2436999878846,200.93890000134706,321.9230000395328,279.9100400414318,300.9165200404823,46.404669570312535,556.9998871720134,5,10.602718353271484,392.30078125, +generation,empty,python,1,1,32,563.3423800056335,548.9804000244476,466.00820001913235,704.8150000046007,643.7829400005285,674.2989700025645,72.57013670803387,56.80382150492566,10,,218.44140625, +generation,short,python,1,6,32,524.1239399998449,524.1038500098512,493.7280000303872,561.7482999805361,549.8817999905441,555.8150499855401,20.612269243289685,61.054261326070076,10,,218.47265625, +generation,long,python,1,32,32,561.3779200008139,560.0390000035986,545.9933000383899,574.2078999755904,570.0918399612419,572.1498699684162,7.699534842668483,57.00259817834233,10,,218.14453125, diff --git a/init.py b/init.py new file mode 100644 index 0000000..e870447 --- /dev/null +++ b/init.py @@ -0,0 +1,113 @@ +from __future__ import annotations + +import os +import signal +import subprocess +import sys +import time +import webbrowser +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent +BACKEND = ROOT / "backend" +FRONTEND = ROOT / "frontend" +DEFAULT_CHECKPOINT = ROOT / "engine" / "best_model.pt" + + +def npm_command() -> str: + return "npm.cmd" if os.name == "nt" else "npm" + + +def python_command() -> str: + venv_python = ROOT / ".venv" / ("Scripts/python.exe" if os.name == "nt" else "bin/python") + return str(venv_python) if venv_python.exists() else sys.executable + + +def start_process(name: str, command: list[str], cwd: Path, env: dict[str, str]) -> subprocess.Popen: + print(f"[start] {name}: {' '.join(command)}") + return subprocess.Popen(command, cwd=str(cwd), env=env) + + +def stop_process(process: subprocess.Popen) -> None: + if process.poll() is not None: + return + if os.name == "nt": + process.terminate() + else: + process.send_signal(signal.SIGTERM) + try: + process.wait(timeout=8) + except subprocess.TimeoutExpired: + process.kill() + + +def main() -> int: + api_port = os.environ.get("API_PORT", "3001") + frontend_port = os.environ.get("FRONTEND_PORT", "5173") + checkpoint = Path(os.environ.get("TORCH_CHECKPOINT_PATH", str(DEFAULT_CHECKPOINT))).resolve() + + if not checkpoint.exists(): + print(f"[error] .pt checkpoint not found: {checkpoint}") + print(" Set TORCH_CHECKPOINT_PATH to your best_model.pt file.") + return 1 + + backend_env = os.environ.copy() + backend_env.update( + { + "API_PORT": api_port, + "CORS_ORIGINS": f"http://localhost:{frontend_port},http://127.0.0.1:{frontend_port}", + "TORCH_CHECKPOINT_PATH": str(checkpoint), + } + ) + + frontend_env = os.environ.copy() + frontend_env.update( + { + "VITE_API_BASE_URL": f"http://localhost:{api_port}", + "VITE_TORCH_ONLY": "1", + } + ) + + backend = start_process( + "backend (.pt)", + [python_command(), "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", api_port, "--reload"], + BACKEND, + backend_env, + ) + frontend = start_process( + "frontend", + [npm_command(), "run", "dev", "--", "--port", frontend_port], + FRONTEND, + frontend_env, + ) + + url = f"http://localhost:{frontend_port}" + print(f"[ready] frontend: {url}") + print(f"[ready] backend : http://localhost:{api_port}") + print("[mode] PyTorch .pt only") + print("[stop] Press Ctrl+C to stop both servers.") + + if os.environ.get("NO_BROWSER") != "1": + time.sleep(2) + webbrowser.open(url) + + try: + while True: + if backend.poll() is not None: + print(f"[exit] backend stopped with code {backend.returncode}") + return backend.returncode or 1 + if frontend.poll() is not None: + print(f"[exit] frontend stopped with code {frontend.returncode}") + return frontend.returncode or 1 + time.sleep(1) + except KeyboardInterrupt: + print("\n[stop] stopping servers...") + return 0 + finally: + stop_process(frontend) + stop_process(backend) + + +if __name__ == "__main__": + raise SystemExit(main()) From 54ce5669496543aa7735babafcc5ec509e3ac92b Mon Sep 17 00:00:00 2001 From: Eamon Sippy Date: Tue, 9 Jun 2026 00:44:49 +0530 Subject: [PATCH 6/8] merge branch master (#78) * Add CUDA kernels, optimize CI, and update documentation (#74) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- Co-authored-by: Max * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- Co-authored-by: Max * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv Co-Authored-By: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-Authored-By: Eamon Sippy * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: Eamon Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Optimize CI workflow and Docker configurations with refactoring (#72) (#76) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp * docs:report [run_20260530_165216](~791 tok/s) (#60) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs: report [run_20260530_165216] (~791 tok/s) (#62) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 --------- * chore: clang-format configuration file based on LLVM (#63) * ci: add manual PR checks workflow with slash command support * ci: add manual PR checks workflow with slash command support * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. * Refactor core architecture and optimize CUDA features (#75) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- * Add CUDA kernels, optimize CI, and update documentation (#74) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- --------- --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Refactor .dockerignore for improved clarity Removed unnecessary entries to streamline the build context. * Enhance .gitignore with additional exclusions Expanded .gitignore to include more file types and directories. * Modify training configuration parameters (#80) Updated training parameters including batch size, iterations, evaluation interval, learning rate, and dropout rate. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .dockerignore | 43 ------------------------------------------- .gitignore | 43 +++++++++++++++++++++++++++++++++++++++++++ config/config.h | 17 +++++++++-------- 3 files changed, 52 insertions(+), 51 deletions(-) diff --git a/.dockerignore b/.dockerignore index 603874e..6c7b69a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,44 +1 @@ - -.git .gitignore -.github -.venv -__pycache__ -*.pyc -*.pyo -*.pyd -*.egg-info -.pytest_cache -.ruff_cache -dist/ -build/ -*.egg -node_modules -frontend/node_modules -frontend/dist -frontend/.vite -*.npm-cache -.npmignore -*.o -*.a -*.so -*.dylib -quadtrix.exe -quadtrix -build/ -cmake-build-*/ -.vscode -*.bin -*.pt -*.gguf -*.safetensors -engine/best_model.pt -engine/logs/ -engine/fineweb_30mb.txt -data/input.txt -.DS_Store -Thumbs.db -*.swp -*.swo -.idea -docker-compose.override.yml diff --git a/.gitignore b/.gitignore index 82e644e..0dfdee5 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,46 @@ engine/fine-tune/input.txt *best_model.pt *.pt *exe +.git +.gitignore +.github +.venv +__pycache__ +*.pyc +*.pyo +*.pyd +*.egg-info +.pytest_cache +.ruff_cache +dist/ +build/ +*.egg +node_modules +frontend/node_modules +frontend/dist +frontend/.vite +*.npm-cache +.npmignore +*.o +*.a +*.so +*.dylib +quadtrix.exe +quadtrix +build/ +cmake-build-*/ +.vscode +*.bin +*.pt +*.gguf +*.safetensors +engine/best_model.pt +engine/logs/ +engine/fineweb_30mb.txt +data/input.txt +.DS_Store +Thumbs.db +*.swp +*.swo +.idea +docker-compose.override.yml diff --git a/config/config.h b/config/config.h index 844efeb..e917c38 100644 --- a/config/config.h +++ b/config/config.h @@ -1,18 +1,19 @@ #pragma once #include + static const std::string DEFAULT_CLEANED_PATH = "data/input.txt"; static const std::string DATA_PATH_ENV_VAR = "GPT_DATA_PATH"; static const unsigned int SEED = 1337; -static const double TRAIN_SPLIT = 0.9; // 90 % train, 10 % val -static const int BATCH_SIZE = 4; -static const int BLOCK_SIZE = 64; // context length -static const int MAX_ITERS = 10000; -static const int EVAL_INTERVAL = 20; -static const float LEARNING_RATE = 3e-4f; -static const int EVAL_ITERS = 1; +static const double TRAIN_SPLIT = 0.9; // 90% train, 10% val +static const int BATCH_SIZE = 16; +static const int BLOCK_SIZE = 64; // Context length +static const int MAX_ITERS = 5000; +static const int EVAL_INTERVAL = 250; +static const float LEARNING_RATE = 5e-4f; +static const int EVAL_ITERS = 100; static const int N_EMBD = 128; static const int N_HEAD = 4; static const int N_LAYER = 4; -static const float DROPOUT = 0.2f; // applied during training only +static const float DROPOUT = 0.05f; static const std::string BEST_MODEL_PATH = "best_model.bin"; static const std::string MODEL_PATH_ENV_VAR = "GPT_MODEL_PATH"; From ad4389ba876293296f1e729279de82dd2bf81521 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 15 Jun 2026 02:03:31 +0530 Subject: [PATCH 7/8] Add optimize CI, and update documentation (#84) * merge branch master of codeaddict (#77) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- Co-authored-by: Max * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- Co-authored-by: Max * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv Co-Authored-By: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-Authored-By: Eamon Sippy * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * merge branch master (#78) * Add CUDA kernels, optimize CI, and update documentation (#74) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- Co-authored-by: Max * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- Co-authored-by: Max * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv Co-Authored-By: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-Authored-By: Eamon Sippy * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: Eamon Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Optimize CI workflow and Docker configurations with refactoring (#72) (#76) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp * docs:report [run_20260530_165216](~791 tok/s) (#60) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs: report [run_20260530_165216] (~791 tok/s) (#62) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 --------- * chore: clang-format configuration file based on LLVM (#63) * ci: add manual PR checks workflow with slash command support * ci: add manual PR checks workflow with slash command support * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. * Refactor core architecture and optimize CUDA features (#75) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- * Add CUDA kernels, optimize CI, and update documentation (#74) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- --------- --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Refactor .dockerignore for improved clarity Removed unnecessary entries to streamline the build context. * Enhance .gitignore with additional exclusions Expanded .gitignore to include more file types and directories. * Modify training configuration parameters (#80) Updated training parameters including batch size, iterations, evaluation interval, learning rate, and dropout rate. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update main.py * Delete quadtrix_training_report.png * Delete docker-compose.yml * Delete docker-compose.gpu.yml * Delete docker-compose.dev.yml * Delete benchmark_results.csv * Delete SECURITY.md * refactor: switch tokenizer from gpt2 to tiktoken o200k * Delete contributing.md * Delete CUDA/llmcpp directory * Delete CUDA directory * Optimization (#82) * Modify training configuration parameters Updated training parameters including batch size, iterations, evaluation interval, learning rate, and dropout rate. * Refactor training configuration and optimize CI workflows (#81) * Modify training configuration parameters (#80) Updated training parameters including batch size, iterations, evaluation interval, learning rate, and dropout rate. * merge branch master of codeaddict (#77) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- Co-authored-by: Max * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- Co-authored-by: Max * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv Co-Authored-By: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-Authored-By: Eamon Sippy * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * merge branch master (#78) * Add CUDA kernels, optimize CI, and update documentation (#74) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- Co-authored-by: Max * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- Co-authored-by: Max * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 Co-authored-by: Max * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- Co-authored-by: Max * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv Co-Authored-By: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-Authored-By: Eamon Sippy * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: Eamon Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Optimize CI workflow and Docker configurations with refactoring (#72) (#76) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp * docs:report [run_20260530_165216](~791 tok/s) (#60) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs: report [run_20260530_165216] (~791 tok/s) (#62) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 --------- * chore: clang-format configuration file based on LLVM (#63) * ci: add manual PR checks workflow with slash command support * ci: add manual PR checks workflow with slash command support * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. * Refactor core architecture and optimize CUDA features (#75) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- * Add CUDA kernels, optimize CI, and update documentation (#74) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. * CUDA header declarations for (LayerNorm) forward and backward (#66) * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces --------- * Add CUDA attention kernels, gradient norms, and CI improvements (#69) * exp(#58) * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * feat(ci): optimize workflow pipeline and update docker configurations * refactor(ci): optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * refactor : optimize workflow pipeline and update docker configurations * Added MIT LICENSE to this project Quadtrix.cpp * Refactor Dockerfile to use ARG for CUDA version * Refactor Dockerfile for backend dependencies * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * Delete .devops/Dockerfile.frontend * Delete .devops/Dockerfile.dev.frontend * refactor : Dockerfile.backend optimize workflow pipeline * refactor : Dockerfile.backend optimize workflow pipeline * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactored (CI): consolidated manual Docker build jobs into a matrix strategy to reduce duplication * refactor(ui): rewrite ThinkingIndicator to use inline styles and CSS keyframes * refactor : message bubble layout to use inline styles * refactor(ui): complete inline-style migration and update auto-scroll implementation * refactor(ui): complete inline-style migration for MessageAvatar component * refactor(ui): rewrite EmptyState component using pure inline styles * refactored(tensor): vectorize element-wise addition and scalar scaling using AVX/SSE - Added SIMD vectorization support (`__AVX__` and `__SSE__`) for element-wise `add`, `add_inplace`, and `scale` operations. - Maintained scalar fallback paths for non-vectorized bounds and platforms lacking hardware extensions. - Explicitly defined rule-of-five constructors (`default` and `noexcept` moves) within the `Tensor` struct layout. - Optimized vector initialization across the core construct layer via `std::move` and `std::vector::reserve`. * refactor(main): redesign training loop to log per-step and sample during evaluation - Replaced the periodic block evaluation layout with standard, per-step logging metrics (`loss`, `ms`, and `tok/s`). - Shifted initial validation loss calculation out of the iteration cycle to establish a zero-state baseline. - Restructured token streaming so that generations are triggered conditionally inside the training loop post-evaluation windows. - Streamlined architecture parameter reporting and consolidated command-line configuration visual prints. * feat: implement GPT training loop with multi-GPU and memory optimizations - Add advanced memory footprint optimization using forward-activation recomputation for LayerNorm and GeLU. - Optimize layer-wise activation buffer layout using a centralized `TensorSpec` registry to support large batch scaling. - Integrate cuBLASLt matmul fusions, optional cuDNN attention layers, and stochastic rounding options. - Fall back gracefully to `cudaMallocManaged` under heavy loads to prevent Outlier/OOM crashes. * Update README.md with new banner for qudtrix.cpp --------- * ci: add manual PR checks workflow with slash command support * feat(cuda): add attention forward backward kernel declarations (#64) * docs: report [run_20260530_165216] (~791 tok/s) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * docs:report [run_20260530_165216](~791 tok/s) (#61) Includes metrics for generalization gap, throughput (~791 tok/s), and gradient norms. Parameters: 6.68M | lr: 1e-3 | batch: 16 | steps: 6000 - Achieved best validation loss of 4.1319 at step 3900 * feat(cuda): add attention forward and backward kernel declarations Introduces the header declarations for `attention_forward` and `attention_backward` operations inside the `quadtrix::cuda` namespace. Configured with support for custom CUDA streams and head partitioning. --------- * feat(cuda): add checkpoint metadata struct and stub functions * feat(cuda): introduce core type definitions and error handling utilities - Defines `DType` and `DeviceKind` enums supporting standard types (F32, F16, BF16, I32, U8). - Implements `dtype_name` and `dtype_size` metadata helper functions. - Adds an explicit `Status` struct for non-throwing error propagation alongside `checked_mul` for safe allocation size computation. - Introduces `check_cuda` and `abort_on_cuda` error macros and handling mechanisms, exposed via the `QUADTRIX_CUDA_CHECK` macro. * feat(cuda): add TokenBatchView struct and DataLoader stub class * feat(cuda): add GeLU activation forward and backward declarations - Introduces the `GeluMode` enum to toggle between `Exact` and `Approximate` mathematical variants. - Declares the `gelu_forward` and `gelu_backward` kernel entrypoints. - Configures both signatures with optional stream execution and a default mode of `GeluMode::Approximate`. * feat(cuda): add gradient norm calculation and clipping interfaces * feat(cuda): add LayerNorm forward and backward kernel declarations * refactor(ci): organize workflow into push-triggered QA and manual docker builds Updated CI workflow to restrict branches for push events and improved input descriptions for image selection and push options. * Fix formatting and update CI workflow steps * Enhance CI with macOS binary build and release Added macOS binary build and release steps to CI workflow. * feat(docker): add Dockerfile for frontend application * feat(docker): add Dockerfile for frontend application * refactor(ci): remove release job from GitHub actions * ci: add unified release and docker build workflow * ci: add unified release and docker build workflow * Refactor macOS build workflow for arm64 architecture * Update release workflow to remove macOS x64 build Removed dependency on build-macos-x64 for the release job. * perf: update execution time benchmarks in csv * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * ci(docker): refactor image build workflow and add frontend job * Remove frontend job from Docker Images workflow * Update release workflow to remove s390x and add notes Removed s390x build configurations and added a step to write detailed release notes. * feat: add local orchestration script for frontend and backend servers Introduces a central Python execution script to concurrently manage and orchestrate the development environment for both the frontend and backend. - Detects system OS to invoke correct `npm` and `python` (virtualenv) binary variants. - Verifies existence of the local PyTorch `.pt` model checkpoint before starting. - Configures environment variables dynamically for Uvicorn (FastAPI) and Vite. - Handles cross-origin setups (CORS) linking ports interactively. - Gracefully handles process termination (`Ctrl+C`) by forwarding termination signals. - Automatically launches the frontend application in the system web browser. * chore(deps): bump actions/github-script from 7 to 9 (#71) Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... * feat(cuda): introduce log_message utility and LogLevel enum * feat(cuda): add cuBLAS handle wrapper and matmul operations * feat(cuda): implement core Tensor, TensorShape, and TensorView abstractions * refactor: untie embedding and lm_head weights and to quadtrix * feat(cuda): add NCCL communicator wrapper and all-reduce primitives * Update README.md with workflow badges Added badges for release, package, and CI workflows. * kernels: add AdamW optimization kernel with stochastic rounding Introduces the AdamW fused CUDA kernel including linear interpolation optimizations (`lerp`), multi-slice batching support via 2D grids, and `init_from_master` utility functions for low-precision parameter handling. * cudnn: implement cached SDPA forward graph using cuDNN frontend * feat(cuda): implement Packed128 memory vectorization utilities * feat: add distributed sharded DataLoader for binary token files * feat(multi-gpu): add foundational utilities for ZeRO sharding * feat(utils): add I/O and memory error-checking wrappers * feat : add PyTorch-compatible Mersenne Twister random utilities * README : Enhance README with header and workflow badges Updated README to include a header and badges for release, package, and CI workflows. * utils:`fopenCheck`, `freadCheck`, `fwriteCheck`, `fcloseCheck`, and `fseekCheck` with explicit crash details and project-specific troubleshooting hints. - Add cross-platform socket closure wrappers (`scloseCheck` and `closesocketCheck`) for Linux and Windows. * mfu: add GPU specifications database and utilities for MFU estimation * Modify project title in README.md Changed the project title to include 'llm.cpp' for clarity. * Update README to remove image and clean up content Removed image from README and adjusted formatting. --------- --------- --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Refactor .dockerignore for improved clarity Removed unnecessary entries to streamline the build context. * Enhance .gitignore with additional exclusions Expanded .gitignore to include more file types and directories. * Modify training configuration parameters (#80) Updated training parameters including batch size, iterations, evaluation interval, learning rate, and dropout rate. --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update main.py * Delete quadtrix_training_report.png * Delete docker-compose.yml * Delete docker-compose.gpu.yml * Delete docker-compose.dev.yml * Delete benchmark_results.csv * Delete SECURITY.md * refactor: switch tokenizer from gpt2 to tiktoken o200k * Delete contributing.md * Delete CUDA/llmcpp directory * Delete CUDA directory --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: Max Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: implement Head and MultiHeadAttention modules in C++ * feat: add core Tensor class with SIMD-accelerated math operations * add inference sampler parameters and repetition penalty * Linear layer with binary serialization Added Linear struct mimicking torch.nn.Linear with conditional bias support. * FeedForward network module Added FeedForward struct mirroring the standard Transformer position-wise MLP block * LayerNorm module with serialization Added LayerNorm struct mirroring torch.nn.LayerNorm(n_embd). * gradient and activation tracking structures for backpropagation * single Transformer Block with Pre-LN architecture Added Block struct mirroring the standard Transformer layer composition. * character-level DataLoader with batch sampling Added DataLoader struct for character-level tokenization and text processing. * Embedding layer with token and position mapping Added Embedding struct mirroring torch.nn.Embedding. * BPE tokenizer and training pipeline in DataLoader Upgraded DataLoader from character-level to a Byte Pair Encoding (BPE) subword tokenizer. * GPTLanguageModel, cross-entropy loss, and AdamW optimizer * GPTLanguageModel forward pass and training loop integration Completed GPTLanguageModel::forward by implementing parallel token and positional embedding addition. * Add train.cpp training & inference CLI Introduce llm.cpp/train.cpp implementing a complete CLI for Quadtrix: training loop, evaluation, model save/load, streaming generation and interactive chat. Adds signal handling, path resolution helpers, timing/utilities, sampling and chat utilities, loss estimation, and dataset loading via DataLoader. Instantiates GPTLanguageModel, builds optimizer (AdamW), runs training with periodic evaluation and best-model checkpointing, and supports --generate and --chat modes plus sampler/system prompt configuration and environment variable overrides. * Add config header with default hyperparameters Introduce llm.cpp/config/config.h to centralize default training and model configuration. The header defines default paths and env var names (data and model), RNG seed, dataset split, batch/block sizes, training/eval settings (learning rate, max iters, eval interval/iters), and model architecture params (n_embd, n_head, n_layer, dropout). This provides a single place for tuning defaults used across the codebase. * docker setup frontend, backend, and redis services for development * docker setup frontend, backend, and redis services for development * add compose configuration with job profiles * docs: update project README with setup guides and architecture specs * LibTorch bidirectional tensor conversion utilities * add automatic hardware detection and WSL2 validation * Refactor README for clarity and structure Updated project description and improved formatting. * Add .gitattributes to mark frontend as vendored * Add initial C inference engine for transformer model * Update README.md for improved clarity and accuracy Refined project description for clarity and corrected minor typos. --------- Signed-off-by: dependabot[bot] Co-authored-by: Eamon Sippy Co-authored-by: codeenthusiasm23 <273188204+codeenthusiasm23@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../docker-compose.dev.yml | 0 .../docker-compose.gpu.yml | 0 .../docker-compose.yml | 0 .gitattributes | 1 + CUDA/KERNAL/adamw.cu | 94 - CUDA/includes/adamw.cuh | 29 - CUDA/includes/attention.cuh | 29 - CUDA/includes/checkpoint.h | 25 - CUDA/includes/common.h | 120 - CUDA/includes/dataloader.h | 29 - CUDA/includes/gelu.cuh | 31 - CUDA/includes/global_norm.cuh | 26 - CUDA/includes/layernorm.cuh | 32 - CUDA/includes/logger.h | 37 - CUDA/includes/matmul.cuh | 99 - CUDA/includes/memory.cuh | 120 - CUDA/includes/nccl_all_reduce.cuh | 96 - CUDA/includes/tensor.cuh | 168 -- CUDA/llmcpp/adamw.cuh | 98 - CUDA/llmcpp/cuda_common.h | 209 -- CUDA/llmcpp/cuda_utils.cuh | 286 --- CUDA/llmcpp/cudnn_att.cpp | 297 --- CUDA/llmcpp/dataloader.h | 496 ---- CUDA/llmcpp/layernorm.cuh | 505 ---- CUDA/llmcpp/mfu.h | 244 -- CUDA/llmcpp/rand.h | 240 -- CUDA/llmcpp/utils.h | 223 -- CUDA/llmcpp/zero.cuh | 597 ----- CUDA/main.cu | 2070 ----------------- Documentation/docs.pdf | Bin 792822 -> 0 bytes Documentation/quadtrix_training_report.png | Bin 218171 -> 0 bytes README.md | 777 +------ SECURITY.md | 73 - benchmark_results.csv | 6 - contributing.md | 162 -- docker-entrypoint.sh | 58 +- docs/run.md | 492 ++++ engine/main.py | 19 +- llm.cpp/config/config.h | 19 + llm.cpp/include/attention.h | 121 + llm.cpp/include/backward.h | 1053 +++++++++ llm.cpp/include/block.h | 61 + llm.cpp/include/char_level.h | 131 ++ llm.cpp/include/dataloader.h | 237 ++ llm.cpp/include/embedding.h | 62 + llm.cpp/include/feedforward.h | 47 + llm.cpp/include/gpt.h | 261 +++ llm.cpp/include/layernorm.h | 45 + llm.cpp/include/linear.h | 60 + llm.cpp/include/quadtrix.h | 250 ++ llm.cpp/include/sampler.h | 50 + llm.cpp/include/tensor.h | 567 +++++ llm.cpp/include/torch_bridge.h | 34 + llm.cpp/train.cpp | 473 ++++ train_test/test.c | 416 ++++ 55 files changed, 4514 insertions(+), 7161 deletions(-) rename docker-compose.dev.yml => .devops/docker-compose.dev.yml (100%) rename docker-compose.gpu.yml => .devops/docker-compose.gpu.yml (100%) rename docker-compose.yml => .devops/docker-compose.yml (100%) create mode 100644 .gitattributes delete mode 100644 CUDA/KERNAL/adamw.cu delete mode 100644 CUDA/includes/adamw.cuh delete mode 100644 CUDA/includes/attention.cuh delete mode 100644 CUDA/includes/checkpoint.h delete mode 100644 CUDA/includes/common.h delete mode 100644 CUDA/includes/dataloader.h delete mode 100644 CUDA/includes/gelu.cuh delete mode 100644 CUDA/includes/global_norm.cuh delete mode 100644 CUDA/includes/layernorm.cuh delete mode 100644 CUDA/includes/logger.h delete mode 100644 CUDA/includes/matmul.cuh delete mode 100644 CUDA/includes/memory.cuh delete mode 100644 CUDA/includes/nccl_all_reduce.cuh delete mode 100644 CUDA/includes/tensor.cuh delete mode 100644 CUDA/llmcpp/adamw.cuh delete mode 100644 CUDA/llmcpp/cuda_common.h delete mode 100644 CUDA/llmcpp/cuda_utils.cuh delete mode 100644 CUDA/llmcpp/cudnn_att.cpp delete mode 100644 CUDA/llmcpp/dataloader.h delete mode 100644 CUDA/llmcpp/layernorm.cuh delete mode 100644 CUDA/llmcpp/mfu.h delete mode 100644 CUDA/llmcpp/rand.h delete mode 100644 CUDA/llmcpp/utils.h delete mode 100644 CUDA/llmcpp/zero.cuh delete mode 100644 CUDA/main.cu delete mode 100644 Documentation/docs.pdf delete mode 100644 Documentation/quadtrix_training_report.png delete mode 100644 SECURITY.md delete mode 100644 benchmark_results.csv delete mode 100644 contributing.md create mode 100644 docs/run.md create mode 100644 llm.cpp/config/config.h create mode 100644 llm.cpp/include/attention.h create mode 100644 llm.cpp/include/backward.h create mode 100644 llm.cpp/include/block.h create mode 100644 llm.cpp/include/char_level.h create mode 100644 llm.cpp/include/dataloader.h create mode 100644 llm.cpp/include/embedding.h create mode 100644 llm.cpp/include/feedforward.h create mode 100644 llm.cpp/include/gpt.h create mode 100644 llm.cpp/include/layernorm.h create mode 100644 llm.cpp/include/linear.h create mode 100644 llm.cpp/include/quadtrix.h create mode 100644 llm.cpp/include/sampler.h create mode 100644 llm.cpp/include/tensor.h create mode 100644 llm.cpp/include/torch_bridge.h create mode 100644 llm.cpp/train.cpp create mode 100644 train_test/test.c diff --git a/docker-compose.dev.yml b/.devops/docker-compose.dev.yml similarity index 100% rename from docker-compose.dev.yml rename to .devops/docker-compose.dev.yml diff --git a/docker-compose.gpu.yml b/.devops/docker-compose.gpu.yml similarity index 100% rename from docker-compose.gpu.yml rename to .devops/docker-compose.gpu.yml diff --git a/docker-compose.yml b/.devops/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to .devops/docker-compose.yml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..251a617 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +frontend/** linguist-vendored diff --git a/CUDA/KERNAL/adamw.cu b/CUDA/KERNAL/adamw.cu deleted file mode 100644 index 5660add..0000000 --- a/CUDA/KERNAL/adamw.cu +++ /dev/null @@ -1,94 +0,0 @@ -#include "../includes/adamw.cuh" - -#include "../includes/runtime.cuh" -#include "../includes/utils.cuh" - -#include - -namespace quadtrix { -namespace cuda { -namespace { - -bool valid_same_shape_f32(const TensorView& a, const TensorView& b) { - if (a.data == nullptr || b.data == nullptr || a.device != DeviceKind::CUDA || b.device != DeviceKind::CUDA || - a.device_id != b.device_id || a.dtype != DType::F32 || b.dtype != DType::F32 || - a.shape.rank != b.shape.rank || !a.shape.is_contiguous() || !b.shape.is_contiguous() || - a.numel() != b.numel()) { - return false; - } - for (int i = 0; i < a.shape.rank; ++i) { - if (a.shape.dims[i] != b.shape.dims[i]) { - return false; - } - } - return true; -} - -__global__ void adamw_kernel( - float* __restrict__ params, - const float* __restrict__ grads, - float* __restrict__ first_moment, - float* __restrict__ second_moment, - std::size_t n, - float learning_rate, - float beta1, - float beta2, - float beta1_correction, - float beta2_correction, - float epsilon, - float weight_decay, - float grad_scale) { - const std::size_t idx = static_cast(blockIdx.x) * blockDim.x + threadIdx.x; - if (idx >= n) { - return; - } - - const float param = params[idx]; - const float grad = grads[idx] * grad_scale; - const float m = beta1 * first_moment[idx] + (1.0f - beta1) * grad; - const float v = beta2 * second_moment[idx] + (1.0f - beta2) * grad * grad; - const float m_hat = m / beta1_correction; - const float v_hat = v / beta2_correction; - first_moment[idx] = m; - second_moment[idx] = v; - params[idx] = param - learning_rate * (m_hat / (sqrtf(v_hat) + epsilon) + weight_decay * param); -} - -} // namespace - -Status adamw_update( - TensorView params, - const TensorView& grads, - TensorView first_moment, - TensorView second_moment, - const AdamWConfig& config, - float grad_scale, - cudaStream_t stream) { - if (!valid_same_shape_f32(params, grads) || !valid_same_shape_f32(params, first_moment) || - !valid_same_shape_f32(params, second_moment) || config.step <= 0 || config.beta1 < 0.0f || - config.beta1 >= 1.0f || config.beta2 < 0.0f || config.beta2 >= 1.0f || config.epsilon <= 0.0f) { - return Status::failure(cudaErrorInvalidValue, "invalid adamw_update arguments"); - } - - const float beta1_correction = 1.0f - powf(config.beta1, static_cast(config.step)); - const float beta2_correction = 1.0f - powf(config.beta2, static_cast(config.step)); - DeviceGuard guard(params.device_id); - adamw_kernel<<>>( - params.data_as(), - grads.data_as(), - first_moment.data_as(), - second_moment.data_as(), - params.numel(), - config.learning_rate, - config.beta1, - config.beta2, - beta1_correction, - beta2_correction, - config.epsilon, - config.weight_decay, - grad_scale); - return QUADTRIX_CUDA_CHECK(cudaGetLastError()); -} - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/adamw.cuh b/CUDA/includes/adamw.cuh deleted file mode 100644 index d7afae8..0000000 --- a/CUDA/includes/adamw.cuh +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -#include - -namespace quadtrix { -namespace cuda { - -struct AdamWConfig { - float learning_rate = 1.0e-4f; - float beta1 = 0.9f; - float beta2 = 0.95f; - float epsilon = 1.0e-8f; - float weight_decay = 0.0f; - int step = 1; -}; - -Status adamw_update( - TensorView params, - const TensorView& grads, - TensorView first_moment, - TensorView second_moment, - const AdamWConfig& config, - float grad_scale = 1.0f, - cudaStream_t stream = nullptr); - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/attention.cuh b/CUDA/includes/attention.cuh deleted file mode 100644 index 7feac08..0000000 --- a/CUDA/includes/attention.cuh +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -#include - -namespace quadtrix { -namespace cuda { - -Status attention_forward( - const TensorView& input_qkv, - TensorView preatt, - TensorView att, - TensorView output, - int num_heads, - cudaStream_t stream = nullptr); - -Status attention_backward( - const TensorView& grad_output, - const TensorView& input_qkv, - const TensorView& att, - TensorView grad_input_qkv, - TensorView grad_preatt, - TensorView grad_att, - int num_heads, - cudaStream_t stream = nullptr); - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/checkpoint.h b/CUDA/includes/checkpoint.h deleted file mode 100644 index ba91b0f..0000000 --- a/CUDA/includes/checkpoint.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -namespace quadtrix { -namespace cuda { - -struct CheckpointMetadata { - int vocab_size = 0; - int max_sequence_length = 0; - int num_layers = 0; - int num_heads = 0; - int channels = 0; -}; - -inline bool load_checkpoint_metadata(const char*, CheckpointMetadata*) { - return false; -} - -inline bool save_tensor_checkpoint(const char*, const TensorView&) { - return false; -} - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/common.h b/CUDA/includes/common.h deleted file mode 100644 index 36df155..0000000 --- a/CUDA/includes/common.h +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once - -#include - -#include -#include -#include -#include -#include - -namespace quadtrix { -namespace cuda { - -enum class DType : std::uint8_t { - F32, - F16, - BF16, - I32, - U8, -}; - -enum class DeviceKind : std::uint8_t { - CPU, - CUDA, -}; - -struct Status { - bool ok; - cudaError_t cuda_error; - const char* message; - - static Status success() { - return {true, cudaSuccess, "ok"}; - } - - static Status failure(cudaError_t error, const char* message) { - return {false, error, message}; - } -}; - -inline const char* dtype_name(DType dtype) { - switch (dtype) { - case DType::F32: - return "f32"; - case DType::F16: - return "f16"; - case DType::BF16: - return "bf16"; - case DType::I32: - return "i32"; - case DType::U8: - return "u8"; - } - return "unknown"; -} - -inline std::size_t dtype_size(DType dtype) { - switch (dtype) { - case DType::F32: - return 4; - case DType::F16: - return 2; - case DType::BF16: - return 2; - case DType::I32: - return 4; - case DType::U8: - return 1; - } - - std::fprintf(stderr, "Unknown CUDA dtype value %u\n", static_cast(dtype)); - std::abort(); -} - -inline bool checked_mul(std::size_t lhs, std::size_t rhs, std::size_t* out) { - if (lhs != 0 && rhs > std::numeric_limits::max() / lhs) { - return false; - } - *out = lhs * rhs; - return true; -} - -inline Status check_cuda(cudaError_t error, const char* expression, const char* file, int line) { - if (error == cudaSuccess) { - return Status::success(); - } - - std::fprintf( - stderr, - "CUDA error at %s:%d: %s failed with %s\n", - file, - line, - expression, - cudaGetErrorString(error)); - return Status::failure(error, expression); -} - -inline void abort_on_cuda(cudaError_t error, const char* expression, const char* file, int line) { - if (error == cudaSuccess) { - return; - } - - std::fprintf( - stderr, - "Fatal CUDA error at %s:%d: %s failed with %s\n", - file, - line, - expression, - cudaGetErrorString(error)); - std::abort(); -} - -} // namespace cuda -} // namespace quadtrix - -#define QUADTRIX_CUDA_CHECK(expr) \ - ::quadtrix::cuda::check_cuda((expr), #expr, __FILE__, __LINE__) - -#define QUADTRIX_CUDA_ABORT(expr) \ - ::quadtrix::cuda::abort_on_cuda((expr), #expr, __FILE__, __LINE__) diff --git a/CUDA/includes/dataloader.h b/CUDA/includes/dataloader.h deleted file mode 100644 index fd3c47d..0000000 --- a/CUDA/includes/dataloader.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include - -namespace quadtrix { -namespace cuda { - -struct TokenBatchView { - const std::int32_t* inputs = nullptr; - const std::int32_t* targets = nullptr; - int batch_size = 0; - int sequence_length = 0; -}; - -class DataLoader { -public: - DataLoader() = default; - - bool next(TokenBatchView* batch) { - if (batch != nullptr) { - *batch = {}; - } - return false; - } -}; - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/gelu.cuh b/CUDA/includes/gelu.cuh deleted file mode 100644 index af87e64..0000000 --- a/CUDA/includes/gelu.cuh +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -#include - -#include - -namespace quadtrix { -namespace cuda { - -enum class GeluMode : std::uint8_t { - Exact, - Approximate, -}; - -Status gelu_forward( - const TensorView& input, - TensorView output, - GeluMode mode = GeluMode::Approximate, - cudaStream_t stream = nullptr); - -Status gelu_backward( - const TensorView& grad_output, - const TensorView& input, - TensorView grad_input, - GeluMode mode = GeluMode::Approximate, - cudaStream_t stream = nullptr); - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/global_norm.cuh b/CUDA/includes/global_norm.cuh deleted file mode 100644 index f418ab7..0000000 --- a/CUDA/includes/global_norm.cuh +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -#include - -namespace quadtrix { -namespace cuda { - -Status global_norm_squared( - const TensorView& grads, - TensorView partial_sums, - cudaStream_t stream = nullptr); - -Status clip_gradients_by_global_norm( - TensorView grads, - float global_norm, - float max_norm, - cudaStream_t stream = nullptr); - -inline float clip_scale(float global_norm, float max_norm) { - return global_norm > max_norm && global_norm > 0.0f ? max_norm / global_norm : 1.0f; -} - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/layernorm.cuh b/CUDA/includes/layernorm.cuh deleted file mode 100644 index 2645537..0000000 --- a/CUDA/includes/layernorm.cuh +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -#include - -namespace quadtrix { -namespace cuda { - -Status layernorm_forward( - const TensorView& input, - const TensorView& gamma, - const TensorView& beta, - TensorView output, - TensorView mean, - TensorView rstd, - float epsilon = 1.0e-5f, - cudaStream_t stream = nullptr); - -Status layernorm_backward( - const TensorView& grad_output, - const TensorView& input, - const TensorView& gamma, - const TensorView& mean, - const TensorView& rstd, - TensorView grad_input, - TensorView grad_gamma, - TensorView grad_beta, - cudaStream_t stream = nullptr); - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/logger.h b/CUDA/includes/logger.h deleted file mode 100644 index 219c50f..0000000 --- a/CUDA/includes/logger.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include -#include - -namespace quadtrix { -namespace cuda { - -enum class LogLevel { - Info, - Warn, - Error, -}; - -inline const char* log_level_name(LogLevel level) { - switch (level) { - case LogLevel::Info: - return "info"; - case LogLevel::Warn: - return "warn"; - case LogLevel::Error: - return "error"; - } - return "unknown"; -} - -inline void log_message(LogLevel level, const char* format, ...) { - std::fprintf(level == LogLevel::Error ? stderr : stdout, "[cuda:%s] ", log_level_name(level)); - va_list args; - va_start(args, format); - std::vfprintf(level == LogLevel::Error ? stderr : stdout, format, args); - va_end(args); - std::fprintf(level == LogLevel::Error ? stderr : stdout, "\n"); -} - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/matmul.cuh b/CUDA/includes/matmul.cuh deleted file mode 100644 index 12dd4b2..0000000 --- a/CUDA/includes/matmul.cuh +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -#include -#include - -#include - -namespace quadtrix { -namespace cuda { - -enum class MatmulTranspose : std::uint8_t { - None, - Transpose, -}; - -struct BlasStatus { - bool ok; - cublasStatus_t cublas_status; - const char* message; - - static BlasStatus success() { - return {true, CUBLAS_STATUS_SUCCESS, "ok"}; - } - - static BlasStatus failure(cublasStatus_t status, const char* message) { - return {false, status, message}; - } -}; - -const char* cublas_status_name(cublasStatus_t status); - -class BlasHandle { -public: - explicit BlasHandle(int device_id = 0); - ~BlasHandle(); - - BlasHandle(const BlasHandle&) = delete; - BlasHandle& operator=(const BlasHandle&) = delete; - - BlasHandle(BlasHandle&& other) noexcept; - BlasHandle& operator=(BlasHandle&& other) noexcept; - - cublasHandle_t get() const { - return handle_; - } - - int device_id() const { - return device_id_; - } - - BlasStatus set_stream(cudaStream_t stream); - -private: - cublasHandle_t handle_ = nullptr; - int device_id_ = 0; -}; - -BlasStatus matmul( - BlasHandle& handle, - const TensorView& a, - MatmulTranspose op_a, - const TensorView& b, - MatmulTranspose op_b, - TensorView c, - float alpha = 1.0f, - float beta = 0.0f, - cudaStream_t stream = nullptr); - -BlasStatus matmul_forward( - BlasHandle& handle, - const TensorView& input, - const TensorView& weight, - TensorView output, - cudaStream_t stream = nullptr, - float alpha = 1.0f, - float beta = 0.0f); - -BlasStatus matmul_backward_input( - BlasHandle& handle, - const TensorView& grad_output, - const TensorView& weight, - TensorView grad_input, - cudaStream_t stream = nullptr, - float alpha = 1.0f, - float beta = 0.0f); - -BlasStatus matmul_backward_weight( - BlasHandle& handle, - const TensorView& input, - const TensorView& grad_output, - TensorView grad_weight, - cudaStream_t stream = nullptr, - float alpha = 1.0f, - float beta = 0.0f); - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/memory.cuh b/CUDA/includes/memory.cuh deleted file mode 100644 index e08fa4a..0000000 --- a/CUDA/includes/memory.cuh +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once - -#include "common.h" -#include "runtime.cuh" - -#include - -#include -#include - -namespace quadtrix { -namespace cuda { - -class DeviceBuffer { -public: - DeviceBuffer() = default; - - explicit DeviceBuffer(std::size_t bytes, int device_id = -1) { - allocate(bytes, device_id); - } - - ~DeviceBuffer() { - release(); - } - - DeviceBuffer(const DeviceBuffer&) = delete; - DeviceBuffer& operator=(const DeviceBuffer&) = delete; - - DeviceBuffer(DeviceBuffer&& other) noexcept { - swap(other); - } - - DeviceBuffer& operator=(DeviceBuffer&& other) noexcept { - if (this != &other) { - release(); - swap(other); - } - return *this; - } - - void allocate(std::size_t bytes, int device_id = -1) { - release(); - if (bytes == 0) { - return; - } - if (device_id >= 0) { - device_id_ = device_id; - DeviceGuard guard(device_id); - QUADTRIX_CUDA_ABORT(cudaMalloc(&ptr_, bytes)); - } else { - device_id_ = current_device(); - QUADTRIX_CUDA_ABORT(cudaMalloc(&ptr_, bytes)); - } - bytes_ = bytes; - } - - void release() { - if (ptr_ != nullptr) { - if (device_id_ >= 0) { - DeviceGuard guard(device_id_); - cudaFree(ptr_); - } else { - cudaFree(ptr_); - } - ptr_ = nullptr; - bytes_ = 0; - device_id_ = -1; - } - } - - void* data() { - return ptr_; - } - - const void* data() const { - return ptr_; - } - - std::size_t bytes() const { - return bytes_; - } - - bool empty() const { - return ptr_ == nullptr || bytes_ == 0; - } - - int device_id() const { - return device_id_; - } - - void swap(DeviceBuffer& other) noexcept { - std::swap(ptr_, other.ptr_); - std::swap(bytes_, other.bytes_); - std::swap(device_id_, other.device_id_); - } - -private: - void* ptr_ = nullptr; - std::size_t bytes_ = 0; - int device_id_ = -1; -}; - -inline Status copy_h2d(void* dst_device, const void* src_host, std::size_t bytes, cudaStream_t stream = nullptr) { - return QUADTRIX_CUDA_CHECK(cudaMemcpyAsync(dst_device, src_host, bytes, cudaMemcpyHostToDevice, stream)); -} - -inline Status copy_d2h(void* dst_host, const void* src_device, std::size_t bytes, cudaStream_t stream = nullptr) { - return QUADTRIX_CUDA_CHECK(cudaMemcpyAsync(dst_host, src_device, bytes, cudaMemcpyDeviceToHost, stream)); -} - -inline Status copy_d2d(void* dst_device, const void* src_device, std::size_t bytes, cudaStream_t stream = nullptr) { - return QUADTRIX_CUDA_CHECK(cudaMemcpyAsync(dst_device, src_device, bytes, cudaMemcpyDeviceToDevice, stream)); -} - -inline Status memset_device(void* dst_device, int value, std::size_t bytes, cudaStream_t stream = nullptr) { - return QUADTRIX_CUDA_CHECK(cudaMemsetAsync(dst_device, value, bytes, stream)); -} - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/nccl_all_reduce.cuh b/CUDA/includes/nccl_all_reduce.cuh deleted file mode 100644 index c712a6a..0000000 --- a/CUDA/includes/nccl_all_reduce.cuh +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once - -#include "tensor.cuh" - -#include - -#ifdef QUADTRIX_ENABLE_NCCL -#include -#else -typedef struct { - char internal[128]; -} ncclUniqueId; -typedef struct ncclComm* ncclComm_t; -typedef enum { - ncclSuccess = 0, - ncclUnhandledCudaError = 1, - ncclSystemError = 2, - ncclInternalError = 3, - ncclInvalidArgument = 4, - ncclInvalidUsage = 5, - ncclNumResults = 6 -} ncclResult_t; -#endif - -namespace quadtrix { -namespace cuda { - -struct NcclStatus { - bool ok; - ncclResult_t nccl_status; - const char* message; - - static NcclStatus success() { - return {true, ncclSuccess, "ok"}; - } - - static NcclStatus failure(ncclResult_t status, const char* message) { - return {false, status, message}; - } -}; - -const char* nccl_status_name(ncclResult_t status); - -class NcclCommunicator { -public: - NcclCommunicator() = default; - NcclCommunicator(ncclUniqueId unique_id, int world_size, int rank, int device_id); - ~NcclCommunicator(); - - NcclCommunicator(const NcclCommunicator&) = delete; - NcclCommunicator& operator=(const NcclCommunicator&) = delete; - - NcclCommunicator(NcclCommunicator&& other) noexcept; - NcclCommunicator& operator=(NcclCommunicator&& other) noexcept; - - ncclComm_t get() const { - return comm_; - } - - int world_size() const { - return world_size_; - } - - int rank() const { - return rank_; - } - - int device_id() const { - return device_id_; - } - - bool valid() const { - return comm_ != nullptr; - } - -private: - ncclComm_t comm_ = nullptr; - int world_size_ = 1; - int rank_ = 0; - int device_id_ = 0; -}; - -NcclStatus create_unique_id(ncclUniqueId* unique_id); - -NcclStatus all_reduce_sum( - NcclCommunicator& communicator, - TensorView tensor, - cudaStream_t stream = nullptr); - -NcclStatus all_reduce_average( - NcclCommunicator& communicator, - TensorView tensor, - cudaStream_t stream = nullptr); - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/includes/tensor.cuh b/CUDA/includes/tensor.cuh deleted file mode 100644 index c61d77e..0000000 --- a/CUDA/includes/tensor.cuh +++ /dev/null @@ -1,168 +0,0 @@ -#pragma once - -#include "common.h" -#include "memory.cuh" - -#include -#include -#include - -namespace quadtrix { -namespace cuda { - -constexpr int kMaxTensorDims = 8; - -struct TensorShape { - int rank = 0; - std::array dims{}; - std::array strides{}; - - static TensorShape contiguous(const std::int64_t* sizes, int ndim) { - if (ndim < 1 || ndim > kMaxTensorDims) { - std::fprintf(stderr, "Tensor rank %d is outside supported range [1, %d]\n", ndim, kMaxTensorDims); - std::abort(); - } - - TensorShape shape; - shape.rank = ndim; - for (int i = 0; i < ndim; ++i) { - if (sizes[i] <= 0) { - std::fprintf(stderr, "Tensor dimension %d must be positive, got %lld\n", i, static_cast(sizes[i])); - std::abort(); - } - shape.dims[i] = sizes[i]; - } - - std::int64_t stride = 1; - for (int i = ndim - 1; i >= 0; --i) { - shape.strides[i] = stride; - stride *= shape.dims[i]; - } - return shape; - } - - std::size_t numel() const { - std::size_t total = 1; - for (int i = 0; i < rank; ++i) { - if (dims[i] <= 0) { - return 0; - } - std::size_t next = 0; - if (!checked_mul(total, static_cast(dims[i]), &next)) { - return 0; - } - total = next; - } - return rank == 0 ? 0 : total; - } - - bool is_contiguous() const { - std::int64_t expected = 1; - for (int i = rank - 1; i >= 0; --i) { - if (strides[i] != expected) { - return false; - } - expected *= dims[i]; - } - return true; - } -}; - -struct TensorView { - void* data = nullptr; - TensorShape shape; - DType dtype = DType::F32; - DeviceKind device = DeviceKind::CUDA; - int device_id = 0; - - std::size_t numel() const { - return shape.numel(); - } - - std::size_t bytes() const { - std::size_t out = 0; - if (!checked_mul(numel(), dtype_size(dtype), &out)) { - return 0; - } - return out; - } - - template - T* data_as() { - return static_cast(data); - } - - template - const T* data_as() const { - return static_cast(data); - } -}; - -class Tensor { -public: - Tensor() = default; - - Tensor(const std::int64_t* dims, int rank, DType dtype, int device_id = 0) - : shape_(TensorShape::contiguous(dims, rank)), dtype_(dtype), device_id_(device_id) { - allocate(); - } - - Tensor(const Tensor&) = delete; - Tensor& operator=(const Tensor&) = delete; - Tensor(Tensor&&) noexcept = default; - Tensor& operator=(Tensor&&) noexcept = default; - - TensorView view() { - return {storage_.data(), shape_, dtype_, DeviceKind::CUDA, device_id_}; - } - - TensorView view() const { - return {const_cast(storage_.data()), shape_, dtype_, DeviceKind::CUDA, device_id_}; - } - - const TensorShape& shape() const { - return shape_; - } - - DType dtype() const { - return dtype_; - } - - int device_id() const { - return device_id_; - } - - std::size_t numel() const { - return shape_.numel(); - } - - std::size_t bytes() const { - return storage_.bytes(); - } - - void* data() { - return storage_.data(); - } - - const void* data() const { - return storage_.data(); - } - -private: - void allocate() { - std::size_t bytes = 0; - if (!checked_mul(shape_.numel(), dtype_size(dtype_), &bytes)) { - std::fprintf(stderr, "Tensor allocation size overflow\n"); - std::abort(); - } - storage_.allocate(bytes, device_id_); - } - - TensorShape shape_; - DType dtype_ = DType::F32; - int device_id_ = 0; - DeviceBuffer storage_; -}; - -} // namespace cuda -} // namespace quadtrix diff --git a/CUDA/llmcpp/adamw.cuh b/CUDA/llmcpp/adamw.cuh deleted file mode 100644 index 4453576..0000000 --- a/CUDA/llmcpp/adamw.cuh +++ /dev/null @@ -1,98 +0,0 @@ -/* -AdamW kernel -*/ - -// llmc internal imports -#include "cuda_common.h" -#include "cuda_utils.cuh" - -// ---------------------------------------------------------------------------- -// CUDA kernels - -// Implements linear interpolation using only two floating-point operations (as opposed to three in a naive implementation). -// Reference: https://developer.nvidia.com/blog/lerp-faster-cuda -__device__ float lerp(float start, float end, float weight) { - return fma(weight, end, fma(-weight, start, start)); -} - -template -__device__ void adamw_update(Tp* params_memory, float* master_params_memory, Tg* grads_memory, float* m_memory, float* v_memory, size_t num_parameters, - float learning_rate, float beta1, float beta2, float beta1_correction, float beta2_correction, float eps, float weight_decay, - float grad_scale, unsigned int seed) { - int idx = blockIdx.x * blockDim.x + threadIdx.x; - if (idx >= num_parameters) { return; } // guard - - // get the gradient, m, and v for this parameter - float grad = grad_scale * (float)grads_memory[idx]; - float m = m_memory[idx]; - float v = v_memory[idx]; - // update the first moment (momentum) - m = lerp(grad, m, beta1); - m_memory[idx] = m; - // update the second moment (RMSprop) - v = lerp(grad * grad, v, beta2); - v_memory[idx] = v; - m /= beta1_correction; // m_hat - v /= beta2_correction; // v_hat - // fetch the old value of this parameter as a float, from either source - float old_param = (master_params_memory != NULL) ? master_params_memory[idx] : (float)params_memory[idx]; - // update this parameter - float param = old_param - (learning_rate * (m / (sqrtf(v) + eps) + weight_decay * old_param)); - // update our low precision version of the parameters using stochastic rounding - // this will be used in the next forward pass - stochastic_rounding(param, ¶ms_memory[idx], seed); - // write the full, float version of the param into our master copy, if we maintain one - // this will be used in the next update - if (master_params_memory != NULL) { master_params_memory[idx] = param; } -} - -template -__global__ void adamw_kernel3(Tp* params_memory, float* master_params_memory, Tg* grads_memory, float* m_memory, float* v_memory, size_t num_parameters, - ptrdiff_t w_stride, ptrdiff_t g_stride, ptrdiff_t s_stride, - float learning_rate, float beta1, float beta2, float beta1_correction, float beta2_correction, float eps, float weight_decay, - float grad_scale, unsigned int seed) { - adamw_update(params_memory + blockIdx.y * w_stride, - master_params_memory ? master_params_memory + blockIdx.y * s_stride : NULL, - grads_memory + blockIdx.y * g_stride, - m_memory + blockIdx.y * s_stride, - v_memory + blockIdx.y * s_stride, - num_parameters, learning_rate, beta1, beta2, beta1_correction, beta2_correction, eps, weight_decay, grad_scale, - seed - ); -} - -template -__global__ void init_from_master_kernel(Tp* params_memory, float* master_params_memory, size_t num_parameters, - ptrdiff_t w_stride, ptrdiff_t s_stride, unsigned int seed) { - size_t idx = blockIdx.x * blockDim.x + threadIdx.x; - if (idx >= num_parameters) { return; } - params_memory += blockIdx.y * w_stride; // adjust for layer offset - master_params_memory += blockIdx.y * s_stride; - stochastic_rounding(master_params_memory[idx], ¶ms_memory[idx], seed); -} - -template -void adamw_update(Tp* params_memory, float* master_params_memory, Tg* grads_memory, float* m_memory, float* v_memory, size_t num_parameters, - ptrdiff_t w_stride, ptrdiff_t g_stride, ptrdiff_t s_stride, int num_slices, float learning_rate, float beta1, float beta2, int t, float eps, float weight_decay, - float grad_scale, unsigned int seed, cudaStream_t stream) { - // AdamW update - int block_size = 512; - int num_blocks = CEIL_DIV(num_parameters, block_size); - float beta1_correction = 1.0f - powf(beta1, t); - float beta2_correction = 1.0f - powf(beta2, t); - adamw_kernel3<<>>(params_memory, master_params_memory, grads_memory, - m_memory, v_memory, num_parameters, w_stride, g_stride, s_stride, - learning_rate, beta1, beta2, beta1_correction, beta2_correction, eps, weight_decay, - grad_scale, seed); - cudaCheck(cudaGetLastError()); -} - -template -void init_from_master(Tp* params_memory, float* master_params_memory, size_t num_parameters, - ptrdiff_t w_stride, ptrdiff_t s_stride, int num_slices, unsigned int seed, cudaStream_t stream) { - int block_size = 512; // must match block size of adamw_update so that RNG also matches - int num_blocks = CEIL_DIV(num_parameters, block_size); - init_from_master_kernel<<>> - (params_memory, master_params_memory, num_parameters, w_stride, s_stride, seed); - cudaCheck(cudaGetLastError()); -} diff --git a/CUDA/llmcpp/cuda_common.h b/CUDA/llmcpp/cuda_common.h deleted file mode 100644 index 6f5bf65..0000000 --- a/CUDA/llmcpp/cuda_common.h +++ /dev/null @@ -1,209 +0,0 @@ -/* -Common utilities for CUDA code. -*/ -#ifndef CUDA_COMMON_H -#define CUDA_COMMON_H - -#include -#include -#include -#include -#include // std::bool_constant -#include -#include -#include -#include -#include -#include - -#include "utils.h" - -// ---------------------------------------------------------------------------- -// Global defines and settings - -// Device properties of the CUDA device used in this process -// defined as extern here because the individual kernels wish to use it -// but it is actually created and instantiated in the main program file -extern cudaDeviceProp deviceProp; - -// WarpSize is not a compile time constant -// Defining here like this possibly allows the compiler to optimize better -#define WARP_SIZE 32U - -// try to make sure that 2 blocks fit on A100/H100 to maximise latency tolerance -// this needs to be defines rather than queried to be used for __launch_bounds__ -#if __CUDA_ARCH__ == 800 || __CUDA_ARCH__ >= 900 -#define MAX_1024_THREADS_BLOCKS 2 -#else -#define MAX_1024_THREADS_BLOCKS 1 -#endif - -// convenience macro for calculating grid/block dimensions for kernels -#define CEIL_DIV(M, N) (((M) + (N)-1) / (N)) - -// short-cuts for compile-time boolean values that can be used as function arguments -constexpr std::bool_constant True; -constexpr std::bool_constant False; - -// ---------------------------------------------------------------------------- -// Error checking - -// CUDA error checking. Underscore added so this function can be called directly not just via macro -inline void cudaCheck_(cudaError_t error, const char *file, int line) { - if (error != cudaSuccess) { - printf("[CUDA ERROR] at file %s:%d:\n%s\n", file, line, cudaGetErrorString(error)); - exit(EXIT_FAILURE); - } -}; -#define cudaCheck(err) (cudaCheck_(err, __FILE__, __LINE__)) - -// like cudaFree, but checks for errors _and_ resets the pointer. -template -inline void cudaFreeCheck(T** ptr, const char *file, int line) { - cudaError_t error = cudaFree(*ptr); - if (error != cudaSuccess) { - printf("[CUDA ERROR] at file %s:%d:\n%s\n", file, line, cudaGetErrorString(error)); - exit(EXIT_FAILURE); - } - *ptr = nullptr; -} -#define cudaFreeCheck(ptr) (cudaFreeCheck(ptr, __FILE__, __LINE__)) - -// ---------------------------------------------------------------------------- -// CUDA Precision settings and defines - -enum PrecisionMode { - PRECISION_FP32, - PRECISION_FP16, - PRECISION_BF16 -}; - -// Specific configurations based on the enabled precision -#if defined(ENABLE_FP32) -typedef float floatX; -#define PRECISION_MODE PRECISION_FP32 -// use fp16 (note: this may require gradient scaler, currently not implemented!) -#elif defined(ENABLE_FP16) -typedef half floatX; -#define PRECISION_MODE PRECISION_FP16 -#else // Default to bfloat16 -typedef __nv_bfloat16 floatX; -#define PRECISION_MODE PRECISION_BF16 -#endif - -// ---------------------------------------------------------------------------- -// Load and store with streaming cache hints -// Older nvcc does not provide __ldcs and __stcs for bfloat16, despite these -// actually just being unsigned shorts. We need to be careful here to only define -// our own versions if none already exist, otherwise the compiler will complain. -// If not, you easily get "no viable overload" (for sm52) and "function already exists" (sm_80) - -#if defined(ENABLE_BF16) && (__CUDACC_VER_MAJOR__ < 12) && !((__CUDA_ARCH__ >= 800) || !defined(__CUDA_ARCH__)) -__device__ floatX __ldcs(const floatX* address) { - unsigned short bf = __ldcs(reinterpret_cast(address)); - return __nv_bfloat16_raw{bf}; -} - -__device__ void __stcs(floatX* address, floatX value) { - __stcs(reinterpret_cast(address), ((__nv_bfloat16_raw)value).x); -} -#endif - -// ---------------------------------------------------------------------------- -// Profiler utils - -class NvtxRange { - public: - NvtxRange(const char* s) { nvtxRangePush(s); } - NvtxRange(const std::string& base_str, int number) { - std::string range_string = base_str + " " + std::to_string(number); - nvtxRangePush(range_string.c_str()); - } - ~NvtxRange() { nvtxRangePop(); } -}; -#define NVTX_RANGE_FN() NvtxRange nvtx_range(__FUNCTION__) - -// ---------------------------------------------------------------------------- -// Utilities to Read & Write between CUDA memory <-> files - -// copy num_bytes from device pointer src into file dest, using double buffering running on the given stream. -inline void device_to_file(FILE* dest, void* src, size_t num_bytes, size_t buffer_size, cudaStream_t stream) { - // allocate pinned buffer for faster, async transfer - char* buffer_space; - cudaCheck(cudaMallocHost(&buffer_space, 2*buffer_size)); - // split allocation in two - void* read_buffer = buffer_space; - void* write_buffer = buffer_space + buffer_size; - - // prime the read buffer; first copy means we have to wait - char* gpu_read_ptr = (char*)src; - size_t copy_amount = std::min(buffer_size, num_bytes); - cudaCheck(cudaMemcpyAsync(read_buffer, gpu_read_ptr, copy_amount, cudaMemcpyDeviceToHost, stream)); - cudaCheck(cudaStreamSynchronize(stream)); - size_t rest_bytes = num_bytes - copy_amount; - size_t write_buffer_size = copy_amount; - gpu_read_ptr += copy_amount; - - std::swap(read_buffer, write_buffer); - // now the main loop; as long as there are bytes left - while(rest_bytes > 0) { - // initiate next read - copy_amount = std::min(buffer_size, rest_bytes); - cudaCheck(cudaMemcpyAsync(read_buffer, gpu_read_ptr, copy_amount, cudaMemcpyDeviceToHost, stream)); - // while this is going on, transfer the write buffer to disk - fwriteCheck(write_buffer, 1, write_buffer_size, dest); - cudaCheck(cudaStreamSynchronize(stream)); // wait for both buffers to be ready. - - std::swap(read_buffer, write_buffer); - rest_bytes -= copy_amount; - write_buffer_size = copy_amount; - gpu_read_ptr += copy_amount; - } - - // make sure to write the last remaining write buffer - fwriteCheck(write_buffer, 1, write_buffer_size, dest); - cudaCheck(cudaFreeHost(buffer_space)); -} - -// copy num_bytes from file src into device pointer dest, using double buffering running on the given stream. -inline void file_to_device(void* dest, FILE* src, size_t num_bytes, size_t buffer_size, cudaStream_t stream) { - // allocate pinned buffer for faster, async transfer - // from the docs (https://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/html/group__CUDART__HIGHLEVEL_ge439496de696b166ba457dab5dd4f356.html) - // WC memory is a good option for buffers that will be written by the CPU and read by the device via mapped pinned memory or host->device transfers. - char* buffer_space; - cudaCheck(cudaMallocHost(&buffer_space, 2*buffer_size, cudaHostAllocWriteCombined)); - // split allocation in two - void* read_buffer = buffer_space; - void* write_buffer = buffer_space + buffer_size; - - // prime the read buffer; - char* gpu_write_ptr = (char*)dest; - size_t copy_amount = std::min(buffer_size, num_bytes); - freadCheck(read_buffer, 1, copy_amount, src); - - size_t rest_bytes = num_bytes - copy_amount; - size_t write_buffer_size = copy_amount; - std::swap(read_buffer, write_buffer); - - // now the main loop; as long as there are bytes left - while(rest_bytes > 0) { - // initiate next read - copy_amount = std::min(buffer_size, rest_bytes); - cudaCheck(cudaMemcpyAsync(gpu_write_ptr, write_buffer, write_buffer_size, cudaMemcpyHostToDevice, stream)); - gpu_write_ptr += write_buffer_size; - // while this is going on, read from disk - freadCheck(read_buffer, 1, copy_amount, src); - cudaCheck(cudaStreamSynchronize(stream)); // wait for both buffers to be ready. - - std::swap(read_buffer, write_buffer); - rest_bytes -= copy_amount; - write_buffer_size = copy_amount; - } - - // copy the last remaining write buffer to gpu - cudaCheck(cudaMemcpyAsync(gpu_write_ptr, write_buffer, write_buffer_size, cudaMemcpyHostToDevice, stream)); - cudaCheck(cudaStreamSynchronize(stream)); - cudaCheck(cudaFreeHost(buffer_space)); -} - -#endif // CUDA_COMMON_H \ No newline at end of file diff --git a/CUDA/llmcpp/cuda_utils.cuh b/CUDA/llmcpp/cuda_utils.cuh deleted file mode 100644 index 030ec07..0000000 --- a/CUDA/llmcpp/cuda_utils.cuh +++ /dev/null @@ -1,286 +0,0 @@ -// Utilities for use in __device__ code - -#ifndef CUDA_UTILS_CUH -#define CUDA_UTILS_CUH - -#include "cuda_common.h" - -// ---------------------------------------------------------------------------- -// Packed128 data structure that forces the compiler to use 128-bit loads/stores -// in GPUs that support (the LDG.128 and STS.128 instructions) -// This is a bit similar to the use of float4 in the case of 32-bit floats, but -// supports arbitrary precision. - -template -struct alignas(16) Packed128 { - Packed128() = default; - __device__ explicit Packed128(int4 bits) { - static_assert(sizeof(bits) == sizeof(payload), "Size mismatch."); - memcpy(&payload, &bits, sizeof(bits)); - } - - __device__ static Packed128 constant(ElementType value) { - Packed128 result; - for(int k = 0; k < size; ++k) { - result.payload[k] = value; - } - return result; - } - __device__ static Packed128 zeros() { - return constant(0.f); - } - __device__ static Packed128 ones() { - return constant(1.f); - } - - __device__ ElementType& operator[](int index) { - return payload[index]; - } - __device__ const ElementType& operator[](int index) const { - return payload[index]; - } - __device__ int4 get_bits() const { - int4 bits; - static_assert(sizeof(bits) == sizeof(payload), "Size mismatch."); - memcpy(&bits, &payload, sizeof(bits)); - return bits; - } - static constexpr const size_t size = sizeof(int4) / sizeof(ElementType); - ElementType payload[size]; -}; - -// load a Packed128 from an aligned memory address -template -__device__ Packed128 load128(const ElementType* address) { - return Packed128{*reinterpret_cast(address)}; -} -// load a Packed128 from an aligned memory address with streaming cache hint -template -__device__ Packed128 load128cs(const ElementType* address) { - return Packed128{__ldcs(reinterpret_cast(address))}; -} -// store a Packed128 to an aligned memory address -template -__device__ void store128(ElementType* target, Packed128 value) { - *reinterpret_cast(target) = value.get_bits(); -} -// store a Packed128 to an aligned memory address with streaming cache hint -template -__device__ void store128cs(ElementType* target, Packed128 value) { - __stcs(reinterpret_cast(target), value.get_bits()); -} -// store a Packed128 to an aligned memory address while caching in L2 but bypassing L1 -template -__device__ void store128cg(ElementType* target, Packed128 value) { - __stcg(reinterpret_cast(target), value.get_bits()); -} - -// short-form typedefs -typedef Packed128 f128; -typedef Packed128 x128; - -// ---------------------------------------------------------------------------- -// DType support - -// enumerator to indentify the datatype of a tensor. -enum class DType : uint8_t { - FP32, FP16, BF16 -}; - -// Given a datatype enum, returns the underlying number of bytes -// for a scalar of that type -size_t sizeof_dtype(DType type) { - switch (type) { - case DType::FP32: - return sizeof(float); - case DType::FP16: - return sizeof(half); - case DType::BF16: - return sizeof(nv_bfloat16); - default: // handle or get compiler warning - fprintf(stderr, "Unknown datatype\n"); - exit(EXIT_FAILURE); - } -} - -DType dtype_of(float* f) { return DType::FP32; } -DType dtype_of(nv_bfloat16 * f) { return DType::BF16; } -DType dtype_of(half * f) { return DType::FP16; } - - - -// ---------------------------------------------------------------------------- -// Copy, cast functions - -// device functions and the kernel to cast data between types -template -__device__ Td cast_value(Ts val); - -template<> -__device__ float cast_value(float val) { - return val; -} - -template<> -__device__ float cast_value(half val) { - return __half2float(val); -} - -template<> -__device__ float cast_value(__nv_bfloat16 val) { - return __bfloat162float(val); -} - -template -__global__ void copy_and_cast_kernel(Td* dst, const Ts* src, size_t n, ptrdiff_t stride_dst, ptrdiff_t stride_src) { - int idx = blockIdx.x * blockDim.x + threadIdx.x; - // need to try grid stride looping for more perf later - if (idx < n) { - dst[idx + stride_dst * blockIdx.y] = cast_value(src[idx + stride_src * blockIdx.y]); - } -} - -// ---------------------------------------------------------------------------- -// Warp/Block communication primitives - -// warp-level reduction for summing values -__device__ inline float warpReduceSum(float val) { - for (int offset = 16; offset > 0; offset /= 2) { - val += __shfl_xor_sync(0xFFFFFFFF, val, offset); - } - return val; -} -// warp-level reduction for finding the maximum value -__device__ inline float warpReduceMax(float val) { - for (int offset = 16; offset > 0; offset /= 2) { - val = fmaxf(val, __shfl_xor_sync(0xFFFFFFFF, val, offset)); - } - return val; -} -// requires all 32 threads in the warp to be active, but should work for any block size -// uses non-dynamic shared memory so every call increases shared memory requirements by 128 bytes -// the fact it's unique shared memory allows us to avoid an extra __syncthreads() call at the end -// but if called inside a loop, the shared memory will be implicitly reused, so set final_sync to 1 -using reduction_func_t = float (*) (float); -template -__device__ inline float blockReduce(float val, bool final_sync=false, float out_of_bounds=0.0f) { - // two reductions of up to 1024 threads: - // 1) inside warp (shuffle), 2) cross-warp (shared memory), 3) inside warp (shuffle) - __shared__ float shared_val[WARP_SIZE]; - const int lane_id = threadIdx.x % WARP_SIZE; - const int warp_id = threadIdx.x / WARP_SIZE; - const int num_warps = blockDim.x / WARP_SIZE; - - float warp_val = warp_reduction(val); - if (lane_id == 0) { shared_val[warp_id] = warp_val; } - __syncthreads(); - warp_val = (lane_id < num_warps) ? shared_val[lane_id] : out_of_bounds; - float block_val = warp_reduction(warp_val); - - if (final_sync) { - __syncthreads(); // only needed in loops when effectively reusing shared memory etc. - } - return block_val; -} - -// Performs a _deterministic_ sum reduction. determinism is achieved by requiring that only -// a single block be used. -template -__global__ void global_sum_single_block_kernel(float* result, const Float* values, size_t count) { - assert(gridDim.x == 1); // only a single block! - float thread_sum = 0; - for(size_t index = threadIdx.x; index < count; index += blockDim.x) { - thread_sum += (float)values[index]; - } - - float reduction = blockReduce(thread_sum, true); - if(threadIdx.x == 0) { - *result = reduction; - } -} - -template -void global_sum_deterministic(float* result, const Float* values, int count, cudaStream_t stream) { - global_sum_single_block_kernel<<<1, 1024, 0, stream>>>(result, values, count); - cudaCheck(cudaGetLastError()); -} - -// ---------------------------------------------------------------------------- -// memory management - -// allocate memory, preferrably on the device -// returns a status code. 0 = OK, 1 = fell back to managed memory -int cudaMallocConditionallyManaged(void** out, size_t bytes, const char *file, int line) { - // try to allocate - cudaError_t err = cudaMalloc(out, bytes); - if(err == cudaErrorMemoryAllocation) { - // if we OOM, fallback to a managed allocation. slower but at least won't crash. - cudaGetLastError(); // reset the error before the next API call - cudaCheck_(cudaMallocManaged(out, bytes), file, line); - cudaCheck_(cudaMemAdvise(*out, bytes, cudaMemAdviseSetPreferredLocation, cudaCpuDeviceId), file, line); - return 1; - } else { - cudaCheck_(err, file, line); - return 0; - } -} - -#define cudaMallocConditionallyManaged(out, bytes)\ -(cudaMallocConditionallyManaged((void**)out, bytes, __FILE__, __LINE__)) - -// ---------------------------------------------------------------------------- -// Random Number Generation used in Stochastic Rounding - -// SquirrelNoise5 - Squirrel's Raw Noise utilities (version 5) -// This gives us a random number from threadIdx/blockIdx + a single seed for the entire GPU -// todo - possibly overkill and we don't need such high quality random numbers? (tbd) -// http://eiserloh.net/noise/SquirrelNoise5.hpp -__device__ __host__ constexpr unsigned int SquirrelNoise5(unsigned int positionX, unsigned int seed) -{ - constexpr unsigned int SQ5_BIT_NOISE1 = 0xd2a80a3f; // 11010010101010000000101000111111 - constexpr unsigned int SQ5_BIT_NOISE2 = 0xa884f197; // 10101000100001001111000110010111 - constexpr unsigned int SQ5_BIT_NOISE3 = 0x6C736F4B; // 01101100011100110110111101001011 - constexpr unsigned int SQ5_BIT_NOISE4 = 0xB79F3ABB; // 10110111100111110011101010111011 - constexpr unsigned int SQ5_BIT_NOISE5 = 0x1b56c4f5; // 00011011010101101100010011110101 - unsigned int mangledBits = positionX; - mangledBits *= SQ5_BIT_NOISE1; - mangledBits += seed; - mangledBits ^= (mangledBits >> 9); - mangledBits += SQ5_BIT_NOISE2; - mangledBits ^= (mangledBits >> 11); - mangledBits *= SQ5_BIT_NOISE3; - mangledBits ^= (mangledBits >> 13); - mangledBits += SQ5_BIT_NOISE4; - mangledBits ^= (mangledBits >> 15); - mangledBits *= SQ5_BIT_NOISE5; - mangledBits ^= (mangledBits >> 17); - return mangledBits; -} -__device__ __host__ constexpr unsigned int Get2dNoiseUint(int indexX, int indexY, unsigned int seed) -{ - constexpr unsigned int PRIME_NUMBER = 198491317u; // Large prime number with non-boring bits - unsigned int x = static_cast(indexX); - unsigned int y = static_cast(indexY); - - return SquirrelNoise5(x + (PRIME_NUMBER * y), seed); -} - -// stochastic rounding built on top of Squirel Noise above (with seed updated per step via xorshift) -__device__ __forceinline__ void stochastic_rounding(float in, __nv_bfloat16 *out, unsigned int seed) { - // todo - is this stochastic rounding *too good*? can we cut any corners? - // makes sure each thread gets a different random number - unsigned int random = Get2dNoiseUint(threadIdx.x, blockIdx.x * blockDim.x + blockIdx.y, seed); - unsigned int threshold = random & 0xFFFF; - unsigned int float_bits = __float_as_uint(in); - unsigned int rounded_bits = float_bits & 0x0000FFFF; - float_bits = (rounded_bits > threshold) ? (float_bits | 0xFFFF) : (float_bits & ~0xFFFF); - *out = __float2bfloat16_rn(__uint_as_float(float_bits)); -} -__device__ __forceinline__ void stochastic_rounding(float in, half *out, unsigned int random) { - *out = (float)in; // todo - implement this... -} -__device__ __forceinline__ void stochastic_rounding(float in, float *out, unsigned int random) { - *out = in; // dummy function for when floatX is float (FP32 mode) -} - -#endif \ No newline at end of file diff --git a/CUDA/llmcpp/cudnn_att.cpp b/CUDA/llmcpp/cudnn_att.cpp deleted file mode 100644 index 0330abe..0000000 --- a/CUDA/llmcpp/cudnn_att.cpp +++ /dev/null @@ -1,297 +0,0 @@ -// all cudnn-related functions are in this file, so that they don't need to be recompiled everytime -// we change some unrelated piece of the code. -// TODO this currently duplicates some of the utilities from the main file - -#define NOMINMAX -#include -#include "cudnn_att.h" -#include - -namespace fe = cudnn_frontend; - -// Specific configurations based on the enabled precision -#if defined(ENABLE_FP32) -static_assert(false, "cuDNN is not supported in FP32 mode.") -// use fp16 (note: this may require gradient scaler, currently not implemented!) -#elif defined(ENABLE_FP16) -#define CUDNN_16BIT fe::DataType_t::HALF -#else // Default to bfloat16 -#define CUDNN_16BIT fe::DataType_t::BFLOAT16 -#endif - -static cudnnHandle_t cudnn_handle; -static size_t cudnn_workspace_size = 0; // dynamically allocated as needed (up to 256MiB!) -static void* cudnn_workspace = NULL; - -static void cuDNNCheck(cudnnStatus_t error, const char *file, int line) { - if (error != CUDNN_STATUS_SUCCESS) { - printf("[CUDNN ERROR] at file %s:%d:\n%s\n", file, line, cudnnGetErrorString(error)); - exit(EXIT_FAILURE); - } -}; -#define cuDNNCheck(err) (cuDNNCheck(err, __FILE__, __LINE__)) - -static void checkCudnnFE(const fe::error_object& e, const char *file, int line) { - if(!e.is_good()) { - printf("[CUDNN ERROR] at file %s:%d:\n%s\n", file, line, e.err_msg.c_str()); - exit(EXIT_FAILURE); - } -} -#define checkCudnnFE(err) checkCudnnFE(err, __FILE__, __LINE__) - -enum UIDs { - Q_UID, - K_UID, - V_UID, - Attn_scale_UID, - O_UID, - Stats_UID, - dO_UID, - dQ_UID, - dK_UID, - dV_UID -}; - -// Need a cache because graph->build_operation_graph() is slow but everything else seems fast -using cache_type_fwd = std::map, std::shared_ptr>; -using cache_type_bwd = std::map, std::shared_ptr>; - -// Loosely based on cuDNN frontend samples functions and massively simplified -auto lookup_cache_or_build_graph_fwd(int B,int H,int T,int HS, int is_inference_only) { - - static cache_type_fwd user_maintained_cache_fwd; - - auto key = std::make_tuple(B, H, T, HS, is_inference_only); - - auto it = user_maintained_cache_fwd.find(key); - if (it != user_maintained_cache_fwd.end()) { - return it->second; - } - - auto graph = std::make_shared(); - graph->set_io_data_type(CUDNN_16BIT) - .set_intermediate_data_type(fe::DataType_t::FLOAT) - .set_compute_data_type(fe::DataType_t::FLOAT); - - // QKV is (B, T, 3, NH, HS) which cuDNN can handle directly without an external permute - auto Q = graph->tensor(fe::graph::Tensor_attributes().set_name("Q") - .set_dim({B, H, T, HS}) - .set_uid(Q_UID) - .set_stride({3 * H * HS * T, HS, 3 * H * HS, 1})); - auto K = graph->tensor(fe::graph::Tensor_attributes().set_name("K") - .set_dim({B, H, T, HS}) - .set_uid(K_UID) - .set_stride({3 * H * HS * T, HS, 3 * H * HS, 1})); - auto V = graph->tensor(fe::graph::Tensor_attributes().set_name("V") - .set_dim({B, H, T, HS}) - .set_uid(V_UID) - .set_stride({3 * H * HS * T, HS, 3 * H * HS, 1})); - auto attn_scale = graph->tensor(fe::graph::Tensor_attributes().set_name("attn_scale") - .set_dim({1, 1, 1, 1}) - .set_stride({1, 1, 1, 1}) - .set_uid(Attn_scale_UID) - .set_is_pass_by_value(true) - .set_data_type(fe::DataType_t::FLOAT)); - - auto sdpa_options = fe::graph::SDPA_attributes().set_name("flash_attention"); - sdpa_options.set_is_inference(is_inference_only); - sdpa_options.set_attn_scale(attn_scale); - sdpa_options.set_causal_mask(true); - - // Create the graph operation and get the output tensors back - auto [O, stats] = graph->sdpa(Q, K, V, sdpa_options); - - // Output is (B, T, NH, HS) BF16/FP16 and stats for backward pass is (B, NH, T) FP32 - O->set_output(true).set_dim({B, H, T, HS}).set_stride({H * HS * T, HS, H * HS, 1}).set_uid(O_UID); - - assert(stats == nullptr || is_inference_only == false); - if (is_inference_only == false) { - stats->set_output(true).set_data_type(fe::DataType_t::FLOAT) - .set_dim({B, H, T, 1}) - .set_stride({H * T, T, 1, 1}) - .set_uid(Stats_UID); - } - - checkCudnnFE(graph->validate()); - - // Build the operation graph and execution part (this is the VERY SLOW PART) - checkCudnnFE(graph->build_operation_graph(cudnn_handle)); - auto plans = graph->create_execution_plans({fe::HeurMode_t::A}); - checkCudnnFE(graph->check_support(cudnn_handle)); - checkCudnnFE(graph->build_plans(cudnn_handle)); - // Reallocate the workspace if the required size is greater than the current workspace - // In H100 this may be around 16B - if (graph->get_workspace_size() > cudnn_workspace_size) { - if (cudnn_workspace_size > 0) { - cudaCheck(cudaFree(cudnn_workspace)); - } - cudnn_workspace_size = graph->get_workspace_size(); - cudaCheck(cudaMalloc(&cudnn_workspace, cudnn_workspace_size)); - } - - user_maintained_cache_fwd.insert({key, graph}); - - return graph; -} - -auto lookup_cache_or_build_graph_bwd(int B, int NH, int T, int HS) { - static cache_type_bwd user_maintained_cache_bwd; - - auto key = std::make_tuple(B, NH, T, HS); - - auto it = user_maintained_cache_bwd.find(key); - if (it != user_maintained_cache_bwd.end()) { - return it->second; - } - - auto graph = std::make_shared(); - graph->set_io_data_type(CUDNN_16BIT) - .set_intermediate_data_type(fe::DataType_t::FLOAT) - .set_compute_data_type(fe::DataType_t::FLOAT); - - // (B, N, 3, NH, HS) - // must come from inp (which means we also need to convert THAT to FP16) - auto Q = graph->tensor(fe::graph::Tensor_attributes().set_name("Q") - .set_dim({B, NH, T, HS}) - .set_uid(Q_UID) - .set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1})); - auto K = graph->tensor(fe::graph::Tensor_attributes().set_name("K") - .set_dim({B, NH, T, HS}) - .set_uid(K_UID) - .set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1})); - auto V = graph->tensor(fe::graph::Tensor_attributes().set_name("V") - .set_dim({B, NH, T, HS}) - .set_uid(V_UID) - .set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1})); - auto O = graph->tensor(fe::graph::Tensor_attributes().set_name("O") - .set_dim({B, NH, T, HS}) - .set_uid(O_UID) - .set_stride({NH * HS * T, HS, NH * HS, 1})); - auto dO = graph->tensor(fe::graph::Tensor_attributes().set_name("dO") - .set_dim({B, NH, T, HS}) - .set_uid(dO_UID) - .set_stride({NH * HS * T, HS, NH * HS, 1})); - - auto stats = graph->tensor(fe::graph::Tensor_attributes().set_name("stats") - .set_dim({B, NH, T, 1}) - .set_uid(Stats_UID) - .set_stride({NH * T, T, 1, 1}) - .set_data_type(fe::DataType_t::FLOAT)); - auto attn_scale = graph->tensor(fe::graph::Tensor_attributes().set_name("attn_scale") - .set_dim({1, 1, 1, 1}) - .set_stride({1, 1, 1, 1}) - .set_is_pass_by_value(true) - .set_uid(Attn_scale_UID) - .set_data_type(fe::DataType_t::FLOAT)); - auto sdpa_backward_options = fe::graph::SDPA_backward_attributes().set_name("flash_attention_backward") -#if CUDNN_FRONTEND_MAJOR_VERSION > 1 || CUDNN_FRONTEND_MINOR_VERSION >= 5 - .set_deterministic_algorithm(true) // 1.5+ needs this for determinism -#endif - .set_causal_mask(true) - .set_attn_scale(attn_scale); - - // Create the graph operation and get the output tensors back - auto [dQ, dK, dV] = graph->sdpa_backward(Q, K, V, O, dO, stats, sdpa_backward_options); - - dQ->set_output(true).set_dim({B, NH, T, HS}).set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1}).set_uid(dQ_UID); - dK->set_output(true).set_dim({B, NH, T, HS}).set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1}).set_uid(dK_UID); - dV->set_output(true).set_dim({B, NH, T, HS}).set_stride({3 * NH * HS * T, HS, 3 * NH * HS, 1}).set_uid(dV_UID); - - checkCudnnFE(graph->validate()); - - // Build the operation graph and execution part (this is the VERY SLOW PART) - checkCudnnFE(graph->build_operation_graph(cudnn_handle)); - auto plans = graph->create_execution_plans({fe::HeurMode_t::A}); - checkCudnnFE(graph->check_support(cudnn_handle)); - checkCudnnFE(graph->build_plans(cudnn_handle)); - - // Reallocate the workspace if the required size is greater than the current workspace - // By default, cuDNN uses up to 256MiB of workspace, so we don't want to just allocate the maximum - if (graph->get_workspace_size() > cudnn_workspace_size) { - if (cudnn_workspace_size > 0) { - cudaCheck(cudaFree(cudnn_workspace)); - } - cudnn_workspace_size = graph->get_workspace_size(); - cudaCheck(cudaMalloc(&cudnn_workspace, cudnn_workspace_size)); - } - - user_maintained_cache_bwd.insert({key, graph}); - return graph; -} - -void attention_forward_cudnn(floatX* out, // output: (B, T, NH, HS) - float* stats, // output for backward pass: (B, NH, T) - floatX* inp, // input: (B, T, 3, NH, HS) QKV - int B, int T, int NH, int C, cudaStream_t stream) { - NVTX_RANGE_FN(); - int HS = C / NH; // number of features per head - bool is_inference_only = (stats == nullptr); - - cuDNNCheck(cudnnSetStream(cudnn_handle, stream)); - - // Get graph and tensors from cache (or generate it on first use) - auto graph = lookup_cache_or_build_graph_fwd(B, NH, T, HS, is_inference_only); - - // Prepare all the tensor pointers for executing the graph - void* devPtrQ = inp; - void* devPtrK = (inp + C); - void* devPtrV = (inp + 2 * C); - float attn_scale_cpu = 1.0 / sqrtf(HS); - void* devPtrO = out; - - // Build variant pack - std::unordered_map variant_pack = { - {Q_UID, devPtrQ}, {K_UID, devPtrK}, {V_UID, devPtrV}, {Attn_scale_UID, &attn_scale_cpu}, {O_UID, devPtrO}}; - - // Add the stats tensor unless we are only doing inference (only needed for backward pass) - if (is_inference_only == false) { - variant_pack[Stats_UID] = stats; - } - - // Execute graph - checkCudnnFE(graph->execute(cudnn_handle, variant_pack, cudnn_workspace)); - cudaCheck(cudaGetLastError()); -} - -void attention_backward_cudnn(floatX* dqkvr, // output - floatX* dout, floatX* qkvr, floatX* o, float* stats, // inputs - int B, int T, int NH, int C, cudaStream_t stream) { - NVTX_RANGE_FN(); - int HS = C / NH; // number of features per head - - // Get graph and tensors from cache (or generate it on first use) - auto graph = lookup_cache_or_build_graph_bwd(B, NH, T, HS); - - // Prepare all the tensor pointers for executing the graph - void* devPtrQ = qkvr; - void* devPtrK = (qkvr + NH * HS); - void* devPtrV = (qkvr + 2 * NH * HS); - void* devPtrO = o; - void* devPtrdO = dout; - void* devPtrStats = stats; - float attn_scale_cpu = 1.0 / sqrtf(HS); - - void* devPtrdQ = dqkvr; - void* devPtrdK = (dqkvr + NH * HS); - void* devPtrdV = (dqkvr + 2 * NH * HS); - - // Build variant pack that links each tensor to its data pointer - std::unordered_map variant_pack = { - {Q_UID, devPtrQ}, {K_UID, devPtrK}, {V_UID, devPtrV}, {O_UID, devPtrO}, {dO_UID, devPtrdO}, {Stats_UID, devPtrStats}, - {dQ_UID, devPtrdQ}, {dK_UID, devPtrdK}, {dV_UID, devPtrdV}, - {Attn_scale_UID, &attn_scale_cpu}}; - - // Execute graph - cuDNNCheck(cudnnSetStream(cudnn_handle, stream)); - checkCudnnFE(graph->execute(cudnn_handle, variant_pack, cudnn_workspace)); - cudaCheck(cudaGetLastError()); -} - -void create_cudnn() { - cuDNNCheck(cudnnCreate(&cudnn_handle)); -} - -void destroy_cudnn() { - if (cudnn_workspace != NULL) { cudaCheck(cudaFree(cudnn_workspace)); } - cuDNNCheck(cudnnDestroy(cudnn_handle)); -} \ No newline at end of file diff --git a/CUDA/llmcpp/dataloader.h b/CUDA/llmcpp/dataloader.h deleted file mode 100644 index 0ee0588..0000000 --- a/CUDA/llmcpp/dataloader.h +++ /dev/null @@ -1,496 +0,0 @@ -#ifndef DATALOADER_H -#define DATALOADER_H - -#include -#include -#include -#include -#include -#include -#include "utils.h" -#include "rand.h" -#ifndef _WIN32 -#include -#endif -#define HEADER_SIZE 256 - -typedef struct -{ - - int process_rank; - int num_processes; - - size_t B; - size_t T; - size_t num_tokens; - size_t shard_num_samples; - - glob_t glob_result; - size_t current_shard_idx; - size_t current_sample_idx; - - FILE *tokens_file; - - uint16_t *buffer; - int *inputs; - int *targets; - - mt19937_state shuffle_rng; - int should_shuffle; - int *shard_indices; - int *intra_shard_indices; - - size_t total_batch_size_bytes; - size_t local_batch_offset_bytes; - size_t header_bytes; - int64_t file_size_bytes; -} DataLoader; - -int64_t dataloader_load_shard_(DataLoader *loader, int shard_index) -{ - if (loader->should_shuffle) - { - shard_index = loader->shard_indices[shard_index]; - } - - const char *filename = loader->glob_result.gl_pathv[shard_index]; - - if (loader->tokens_file != NULL) - { - fcloseCheck(loader->tokens_file); - } - loader->tokens_file = fopenCheck(filename, "rb"); - - int header[HEADER_SIZE]; - freadCheck(header, sizeof(int), HEADER_SIZE, loader->tokens_file); - if (header[0] != 20240520) - { - - printf("---> HINT: Are you passing in a correct file?\n"); - printf("---> HINT: The data encoding may have changed, re-run data prepro or refer again to README.\n"); - exit(EXIT_FAILURE); - } - if (header[1] != 1) - { - printf("Bad version in data file\n"); - exit(EXIT_FAILURE); - } - int64_t ntok = header[2]; // - assert(ntok > 0); - fseekCheck(loader->tokens_file, 0, SEEK_END); - loader->file_size_bytes = ftell(loader->tokens_file); - fseekCheck(loader->tokens_file, 0, SEEK_SET); - int64_t expected_file_size = HEADER_SIZE * sizeof(int) + ntok * sizeof(uint16_t); - if (loader->file_size_bytes != expected_file_size) - { - printf("Error: file size is not as expected\n"); - exit(EXIT_FAILURE); - } - - loader->shard_num_samples = (ntok * sizeof(uint16_t) - sizeof(uint16_t)) / loader->total_batch_size_bytes; - return ntok; -} - -void prepare_intra_shard_indices_(DataLoader *loader) -{ - - if (loader->intra_shard_indices != NULL) - { - - free(loader->intra_shard_indices); - } - loader->intra_shard_indices = (int *)mallocCheck(loader->shard_num_samples * sizeof(int)); - init_identity_permutation(loader->intra_shard_indices, (int)loader->shard_num_samples); - random_permutation(loader->intra_shard_indices, (int)loader->shard_num_samples, &loader->shuffle_rng); -} - -void dataloader_reset(DataLoader *loader) -{ - loader->current_shard_idx = 0; - loader->current_sample_idx = 0; - - if (loader->should_shuffle) - { - random_permutation(loader->shard_indices, (int)loader->glob_result.gl_pathc, &loader->shuffle_rng); - } - - dataloader_load_shard_(loader, (int)loader->current_shard_idx); - - if (loader->should_shuffle) - { - prepare_intra_shard_indices_(loader); - } -} - -void dataloader_advance_(DataLoader *loader) -{ - if (loader->current_shard_idx == loader->glob_result.gl_pathc - 1) - { - - dataloader_reset(loader); - return; - } - - loader->current_shard_idx = (loader->current_shard_idx + 1) % loader->glob_result.gl_pathc; - loader->current_sample_idx = 0; - dataloader_load_shard_(loader, (int)loader->current_shard_idx); - - if (loader->should_shuffle) - { - prepare_intra_shard_indices_(loader); - } -} - -void dataloader_init(DataLoader *loader, - const char *filename_pattern, - size_t B, - size_t T, - int process_rank, - int num_processes, - int should_shuffle) -{ - loader->process_rank = process_rank; - loader->num_processes = num_processes; - loader->B = B; - loader->T = T; - loader->tokens_file = NULL; - loader->should_shuffle = should_shuffle; - loader->header_bytes = HEADER_SIZE * sizeof(int); - loader->total_batch_size_bytes = ((loader->num_processes * (loader->B * loader->T)) * sizeof(uint16_t)); - loader->local_batch_offset_bytes = loader->process_rank * loader->B * loader->T * sizeof(uint16_t); - - int glob_status = glob(filename_pattern, 0, NULL, &loader->glob_result); - if (glob_status != 0) - { - printf("Error: failed to glob pattern: %s\n", filename_pattern); - exit(EXIT_FAILURE); - } - if (loader->glob_result.gl_pathc == 0) - { - printf("Error: no files found matching the pattern: %s\n", filename_pattern); - exit(EXIT_FAILURE); - } - - if (should_shuffle) - { - mt19937_state shuffle_rng; - manual_seed(&shuffle_rng, 42 + process_rank); - loader->shuffle_rng = shuffle_rng; - loader->shard_indices = (int *)mallocCheck(loader->glob_result.gl_pathc * sizeof(int)); - init_identity_permutation(loader->shard_indices, (int)loader->glob_result.gl_pathc); - loader->intra_shard_indices = NULL; - } - - int64_t ntok_total = 0; - for (int shard_index = 0; shard_index < loader->glob_result.gl_pathc; shard_index++) - { - int64_t shard_ntok = dataloader_load_shard_(loader, shard_index); - - assert(shard_ntok >= (int64_t)(num_processes * B * T + 1)); - ntok_total += shard_ntok; - } - - loader->buffer = (uint16_t *)mallocCheck((B * T + 1) * sizeof(uint16_t)); - loader->inputs = (int *)mallocCheck(B * T * sizeof(int)); - loader->targets = (int *)mallocCheck(B * T * sizeof(int)); - loader->num_tokens = ntok_total; - - dataloader_reset(loader); -} - -void dataloader_load_batch(DataLoader *loader) -{ - assert(!loader->should_shuffle || (loader->should_shuffle && loader->intra_shard_indices != NULL)); - assert(loader->current_sample_idx < loader->shard_num_samples); - size_t idx = loader->should_shuffle ? loader->intra_shard_indices[loader->current_sample_idx] : loader->current_sample_idx; - size_t global_batch_offset_bytes = idx * loader->total_batch_size_bytes; - int64_t current_offset = loader->header_bytes + global_batch_offset_bytes + loader->local_batch_offset_bytes; - - size_t B = loader->B; - size_t T = loader->T; - - fseekCheck(loader->tokens_file, (int)current_offset, SEEK_SET); - freadCheck(loader->buffer, sizeof(uint16_t), B * T + 1, loader->tokens_file); - - for (int i = 0; i < B * T; i++) - { - loader->inputs[i] = (int)loader->buffer[i]; - loader->targets[i] = (int)loader->buffer[i + 1]; - } -} - -void dataloader_next_batch(DataLoader *loader) -{ - - if (loader->current_sample_idx >= loader->shard_num_samples) - { - dataloader_advance_(loader); - } - dataloader_load_batch(loader); - loader->current_sample_idx += 1; -} - -void dataloader_resume(DataLoader *loader, size_t current_shard_idx, size_t current_sample_idx) -{ - - loader->current_shard_idx = current_shard_idx; - loader->current_sample_idx = current_sample_idx; - dataloader_load_shard_(loader, (int)loader->current_shard_idx); -} - -void dataloader_free(DataLoader *loader) -{ - free(loader->buffer); - free(loader->inputs); - free(loader->targets); - if (loader->should_shuffle) - { - free(loader->shard_indices); - free(loader->intra_shard_indices); - } - fcloseCheck(loader->tokens_file); - globfree(&loader->glob_result); -} - -#define ASSUMED_NUM_COMPLETIONS 4 -#define CEIL_DIV(M, N) (((M) + (N) - 1) / (N)) - -typedef struct -{ - - int process_rank; - int num_processes; - - size_t B; - size_t T; - FILE *eval_file; - uint16_t *buffer; - int num_examples; - int num_batches; - int start_example_index; - int end_example_index; - int current_example_index; - int *inputs; - int *targets; - char *mask; - int *label; - int num_completions; -} EvalLoader; - -void evalloader_reset(EvalLoader *loader) -{ - int examples_per_process = CEIL_DIV(loader->num_examples, loader->num_processes); - int can_fit_examples = (int)(loader->B / ASSUMED_NUM_COMPLETIONS); - if (can_fit_examples == 0) - { - - printf("HellaSwag EvalLoader: batch size %zu is < %d\n", loader->B, ASSUMED_NUM_COMPLETIONS); - printf("---> HINT: Disable HellaSwag eval with -h 0, or increase batch size with -b\n"); - exit(EXIT_FAILURE); - } - loader->num_batches = CEIL_DIV(examples_per_process, can_fit_examples); - - loader->start_example_index = examples_per_process * loader->process_rank; - loader->end_example_index = examples_per_process * (loader->process_rank + 1); - - if (loader->end_example_index > loader->num_examples) - { - loader->end_example_index = loader->num_examples; - } - - int64_t header_bytes = HEADER_SIZE * sizeof(int); - fseekCheck(loader->eval_file, (int)header_bytes, SEEK_SET); - for (int i = 0; i < loader->start_example_index; i++) - { - uint16_t example_header[3]; - // read 3 uint16_t values: , , - freadCheck(&example_header[0], sizeof(uint16_t), 3, loader->eval_file); - // validate the delimiter - assert(example_header[0] == 65535); // delimiter - // validate the - assert(example_header[2] == i); // should match the loop index - // skip to the next example, keeping in mind that we already read the header - size_t remaining_bytes = example_header[1] - sizeof(uint16_t) * 3; - assert(remaining_bytes > 0); // we expect some bytes in the example - fseekCheck(loader->eval_file, (int)remaining_bytes, SEEK_CUR); - } - // now we are at the start of the example we want to start at, pointing at - loader->current_example_index = loader->start_example_index; -} - -void evalloader_init(EvalLoader *loader, - const char *filename, - size_t B, - size_t T, - int process_rank, - int num_processes) -{ - loader->process_rank = process_rank; - loader->num_processes = num_processes; - loader->B = B; - loader->T = T; - - // open the file and validate the header - loader->eval_file = fopenCheck(filename, "rb"); - // validate the header - int header[HEADER_SIZE]; - freadCheck(header, sizeof(int), HEADER_SIZE, loader->eval_file); - if (header[0] != 20240522) - { - printf("Bad magic in eval file\n"); - exit(EXIT_FAILURE); - } - if (header[1] != 1) - { - printf("Bad version in data file\n"); - exit(EXIT_FAILURE); - } - loader->num_examples = header[2]; // number of examples in the file - assert(loader->num_examples >= num_processes); // avoid headaches for now - size_t longest_example_bytes = header[3]; // longest example in the file - // basic sensibility check we could relax later. but roughly each example - // contains the prompt (or "context") and 4 completions, all of these have to be - // up to T tokens, and their tokens are uint16_t (so 2 bytes/token). - // There's a few more things in each example but they are minor. - // So longest example should be roughly this. Just trying to make sure it's sensible. - assert(longest_example_bytes > 0 && longest_example_bytes < (1 + ASSUMED_NUM_COMPLETIONS) * T * 2); - - // allocate all the space we'll need - int can_fit_examples = (int)(B / ASSUMED_NUM_COMPLETIONS); - loader->buffer = (uint16_t *)mallocCheck(longest_example_bytes); - loader->inputs = (int *)calloc(B * T, sizeof(int)); - loader->targets = (int *)calloc(B * T, sizeof(int)); - loader->mask = (char *)mallocCheck(B * T * sizeof(char)); - loader->label = (int *)mallocCheck(can_fit_examples * sizeof(int)); - - // reset the loader, to initialize it - evalloader_reset(loader); -} - -void evalloader_next_example_(EvalLoader *loader, int example_batch_index) -{ - size_t B = loader->B; - size_t T = loader->T; - int batch_dim_offset = example_batch_index * ASSUMED_NUM_COMPLETIONS; - uint16_t example_header[3]; - freadCheck(&example_header[0], sizeof(uint16_t), 3, loader->eval_file); - assert(example_header[0] == 65535); - assert(example_header[2] == loader->current_example_index); - assert(example_header[2] >= loader->start_example_index && example_header[2] < loader->end_example_index); - - size_t example_bytes = example_header[1] - sizeof(uint16_t) * 3; - freadCheck(loader->buffer, sizeof(char), example_bytes, loader->eval_file); - int label = (int)loader->buffer[0]; - int can_fit_examples = (int)(loader->B / ASSUMED_NUM_COMPLETIONS); - assert(label >= 0 && label < ASSUMED_NUM_COMPLETIONS); - assert(example_batch_index >= 0 && example_batch_index < can_fit_examples); - loader->label[example_batch_index] = label; - int num_completions = (int)loader->buffer[1]; - assert(num_completions == ASSUMED_NUM_COMPLETIONS); - assert(batch_dim_offset + num_completions <= B); - loader->num_completions = num_completions; - - int context_length = (int)loader->buffer[2]; - uint16_t *context_tokens_start = &loader->buffer[3]; - assert(context_length > 0 && context_length < T); - for (int b = 0; b < num_completions; b++) - { - for (int i = 0; i < context_length; i++) - { - int boff = batch_dim_offset + b; - int tok_cur = (int)context_tokens_start[i]; - loader->inputs[boff * T + i] = tok_cur; - } - } - uint16_t *completions_iter = loader->buffer + 3 + context_length; - for (int c = 0; c < num_completions; c++) - { - int coff = batch_dim_offset + c; - int completion_length = (int)completions_iter[0]; - uint16_t *completion_tokens_start = completions_iter + 1; - assert(completion_length > 0 && context_length + completion_length < T); - for (int i = 0; i < completion_length; i++) - { - int tok_cur = (int)completion_tokens_start[i]; - - loader->inputs[coff * T + context_length + i] = tok_cur; - - loader->targets[coff * T + context_length + i - 1] = tok_cur; - - loader->mask[coff * T + context_length + i - 1] = 1; - } - completions_iter += 1 + completion_length; - loader->current_example_index += 1; - } - - void evalloader_next_batch(EvalLoader * loader) - { - size_t B = loader->B; - size_t T = loader->T; - memset(loader->mask, 0, B * T * sizeof(char)); - int can_fit_examples = (int)(B / ASSUMED_NUM_COMPLETIONS); - for (int i = 0; i < can_fit_examples; i++) - { - if (loader->current_example_index >= loader->end_example_index) - { - break; - } - evalloader_next_example_(loader, i); - } - } - - int evalloader_stat_losses(EvalLoader * loader, float *losses) - { - int correct = 0; - size_t B = loader->B; - size_t T = loader->T; - int can_fit_examples = (int)(B / ASSUMED_NUM_COMPLETIONS); - for (int i = 0; i < can_fit_examples; i++) - { - float min_loss = 0.0f; - int min_loss_index = -1; - char active = 0; - for (int b = 0; b < ASSUMED_NUM_COMPLETIONS; b++) - { - int boff = i * ASSUMED_NUM_COMPLETIONS + b; - float average_loss = 0.0f; - int count = 0; - for (int t = 0; t < T; t++) - { - char mask = loader->mask[boff * T + t]; - if (mask == 1) - { - active = 1; - average_loss += losses[boff * T + t]; - count++; - } - } - if (count > 0) - { - average_loss /= count; - } - if (b == 0 || average_loss < min_loss) - { - min_loss = average_loss; - min_loss_index = b; - } - } - if (active && (min_loss_index == loader->label[i])) - { - correct += 1; - } - } - return correct; - } - - void evalloader_free(EvalLoader * loader) - { - free(loader->buffer); - free(loader->inputs); - free(loader->targets); - free(loader->mask); - free(loader->label); - fcloseCheck(loader->eval_file); - } - -#endif \ No newline at end of file diff --git a/CUDA/llmcpp/layernorm.cuh b/CUDA/llmcpp/layernorm.cuh deleted file mode 100644 index 9777d06..0000000 --- a/CUDA/llmcpp/layernorm.cuh +++ /dev/null @@ -1,505 +0,0 @@ -/* -LayerNorm CUDA kernel, and also Residual, because sometimes they are fused - -Note in llm.c we try to be clever in the backward pass to conserve memory. -All parameters use a += in the backward pass, so we can do gradient accumulation. -But all activations have = instead of += because these are faster (just read, no write). -This is okay for all activations except for those in the residual stream, where the -gradients have to add. We make sure that we do a += as necessary. -E.g., the layernorms are connected to the residuals so we += in layernorm backward. -*/ - -#include -// llmc internal imports -#include "cuda_common.h" -#include "cuda_utils.cuh" - -// ---------------------------------------------------------------------------- -// CUDA kernels - -__global__ void layernorm_forward_kernel3(floatX* __restrict__ out, float* __restrict__ mean, float* __restrict__ rstd, - const floatX* __restrict__ inp, const floatX* __restrict__ weight, - const floatX* __restrict__ bias, int N, int C) { - int lane_id = threadIdx.x % WARP_SIZE; - int warp_id = threadIdx.x / WARP_SIZE; - int num_warps = blockDim.x / WARP_SIZE; - - int idx = blockIdx.x * num_warps + warp_id; - if(idx >= N) { return; } // guard - - // the row of input that this group of threads is responsible for - const floatX* x = inp + idx * C; - - // mean - float sum = 0.0f; - for (int i = lane_id; i < C; i += WARP_SIZE) { - sum += (float)x[i]; - } - sum = warpReduceSum(sum); - float m = sum / C; - if(lane_id == 0 && mean != nullptr) { - __stcs(mean + idx, m); - } - - // rstd - sum = 0.0f; - for (int i = lane_id; i < C; i += WARP_SIZE) { - float diff = (float)x[i] - m; - sum += diff * diff; - } - sum = warpReduceSum(sum); - float s = rsqrtf(sum / C + 1e-5f); - if(lane_id == 0 && rstd != nullptr) { - __stcs(rstd + idx, s); - } - - // final normalization and scaling by weight/bias - floatX* o = out + idx * C; - for (int c = lane_id; c < C; c += WARP_SIZE) { - // load and store using the .cs "streaming" hint to the compiler, - // indicating that this data will not be reused soon, and can be streamed through the caches - // this allows the threads to get more cache-hits for the (shared) weight and bias parameters - float n = s * ((float)__ldcs(x+c) - m); - __stcs(o+c, (floatX)(n * (float)weight[c] + (float)bias[c])); - } -} - -__global__ void layernorm_forward_kernel6(floatX* __restrict__ out, float* __restrict__ mean, float* __restrict__ rstd, - const floatX* __restrict__ inp, const floatX* __restrict__ weight, - const floatX* __restrict__ bias, int N, int C) { - assert(blockDim.x == WARP_SIZE); - - // load weights and biases into shared memory - // do this before we allow any threads to exit! - extern __shared__ char* params[]; - // load128/store128 sometimes generated multiple instructions when the types here were floatX*, so - // let's keep everything as x128 - x128* s_weight = reinterpret_cast(params); - x128* s_bias = reinterpret_cast(params) + (C / x128::size); - x128* s_in = reinterpret_cast(params) + ((2 + threadIdx.y) * C / x128::size); - - int sidx = (threadIdx.x + WARP_SIZE * threadIdx.y) * x128::size; - for(int i = sidx; i < C; i += blockDim.y * WARP_SIZE * x128::size) { - s_weight[i/x128::size] = load128(weight + i); - s_bias[i/x128::size] = load128(bias + i); - } - __syncthreads(); - - int idx = blockIdx.x * blockDim.y + threadIdx.y; - if(idx >= N) { return; } // guard - - // adjust pointers to current token - inp += idx * C; - out += idx * C; - - const float eps = 1e-5f; - float sum = 0.0f; - for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { - const x128 in_data = load128cs(inp + c); - for(int k = 0; k < x128::size; ++k) { - sum += (float)in_data[k]; - } - s_in[c / x128::size] = in_data; - } - - sum = warpReduceSum(sum); - float m = sum / C; - float v = 0.f; - - for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { - const x128 in_data = s_in[c / x128::size]; - for(int k = 0; k < x128::size; ++k) { - v += ((float)in_data[k] - m) * ((float)in_data[k] - m); - } - } - - v = warpReduceSum(v) / C; - float s = rsqrtf(v + eps); - - for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { - const x128 in_data = s_in[c / x128::size]; - const x128 w = s_weight[c / x128::size]; - const x128 b = s_bias[c / x128::size]; - x128 out_data; - for(int k = 0; k < x128::size; ++k) { - float n = s * ((float)in_data[k] - m); // normalized output - float o = n * (float)w[k] + (float)b[k]; // scale and shift it - out_data[k] = (floatX)o; - } - - store128cs(out + c, out_data); - } - // cache the mean and rstd for the backward pass later - if(threadIdx.x == 0 && mean != nullptr) { - __stcs(mean + idx, m); - } - // store the rstd, no need to cache it - if(threadIdx.x == 0 && rstd != nullptr) { - __stcs(rstd + idx, s); - } -} - -__global__ void fused_residual_forward_kernel5(floatX* residual, floatX* normed, float* mean, float* rstd, - const floatX* inp1, const floatX* inp2, - const floatX* weight, const floatX* bias, - int N, int C) { - assert(blockDim.x == WARP_SIZE); - - // load weights and biases into shared memory - // do this before we allow any threads to exit! - extern __shared__ char* params[]; - // load128/store128 sometimes generated multiple instructions when the types here were floatX*, so - // let's keep everything as x128 - x128* s_weight = reinterpret_cast(params); - x128* s_bias = reinterpret_cast(params) + (C / x128::size); - x128* s_res = reinterpret_cast(params) + ((2 + threadIdx.y) * C / x128::size); - - int sidx = (threadIdx.x + WARP_SIZE * threadIdx.y) * x128::size; - for(int i = sidx; i < C; i += blockDim.y * WARP_SIZE * x128::size) { - s_weight[i/x128::size] = load128(weight + i); - s_bias[i/x128::size] = load128(bias + i); - } - __syncthreads(); - - int idx = blockIdx.x * blockDim.y + threadIdx.y; - if(idx > N) return; - - // adjust pointers to current token - residual += C * idx; - normed += C * idx; - inp1 += C * idx; - inp2 += C * idx; - - const float eps = 1e-5f; - float sum = 0.0f; - for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { - const x128 in1 = load128cs(inp1 + c); - const x128 in2 = load128cs(inp2 + c); - x128 out; - for(int k = 0; k < x128::size; ++k) { - out[k] = (float)in1[k] + (float)in2[k]; - sum += (float)out[k]; - } - store128cs(residual + c, out); - s_res[c / x128::size] = out; - } - - sum = warpReduceSum(sum); - float m = sum / C; - float v = 0.f; - - for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { - const x128 res = s_res[c / x128::size]; - for(int k = 0; k < x128::size; ++k) { - v += ((float)res[k] - m) * ((float)res[k] - m); - } - } - - v = warpReduceSum(v) / C; - float s = rsqrtf(v + eps); - - for(int c = threadIdx.x * x128::size; c < C; c += WARP_SIZE * x128::size) { - const x128 res = s_res[c / x128::size]; - const x128 w = s_weight[c / x128::size]; - const x128 b = s_bias[c / x128::size]; - x128 out; - for(int k = 0; k < x128::size; ++k) { - float n = s * ((float)res[k] - m); // normalized output - float o = n * (float)w[k] + (float)b[k]; // scale and shift it - out[k] = o; - } - - store128cs(normed + c, out); - } - // cache the mean and rstd for the backward pass later - if(threadIdx.x == 0) { - mean[idx] = m; - rstd[idx] = s; - } -} - -__global__ void residual_forward_kernel(floatX* out, const floatX* inp1, const floatX* inp2) { - int idx = (blockIdx.x * blockDim.x + threadIdx.x) * x128::size; - - x128 packed_out; - x128 packed_inp1 = load128cs(inp1 + idx); - x128 packed_inp2 = load128cs(inp2 + idx); - for (int k = 0; k < packed_inp1.size; k++) { - packed_out[k] = (floatX)((float)packed_inp1[k] + (float)packed_inp2[k]); - } - store128(out + idx, packed_out); -} - -__global__ void __launch_bounds__(512, 2) // todo - any warnings on Turing with only 1024 threads? - layernorm_backward_kernel10(floatX* dinp, floatX* dweight, floatX* dbias, float* scratch, - const floatX* dout, const floatX* inp, const floatX* weight, - const float* mean, const float* rstd, - int B, int T, int C) { - int BLOCK_SIZE = blockDim.x; - int warpsInBlock = BLOCK_SIZE / WARP_SIZE; //number of warps in block - extern __shared__ float shared[]; - - int warpId = threadIdx.x / WARP_SIZE; // warp index within a block - int baseIdx = blockIdx.x * warpsInBlock + warpId; - int warpThreadIdx = threadIdx.x % WARP_SIZE; // Thread index within the warp - int warpsInGrid = gridDim.x * warpsInBlock; - int C_per_iteration = WARP_SIZE * x128::size; - int iterations_C = CEIL_DIV(C, C_per_iteration); // + 2; - - // the first half of shared memory is bias, second is weight - size_t rounded_C = CEIL_DIV(C, (32 * x128::size)) * (32 * x128::size); - float* dbias_shared = shared; - float* dweight_shared = shared + rounded_C; - // warp zero doesn't actually write to the _tmp_shared memory locations, so we don't need to reserve memory - // the obvious solution is to change the addressing below to use (threadId.x-32) as offset, but that causes - // register spills, so instead we mess with the base pointer here, which doesn't increase register usage. - float* dbias_tmp_shared = shared + 2 * rounded_C - WARP_SIZE * f128::size; - float* dweight_tmp_shared = shared + 2 * rounded_C + f128::size * BLOCK_SIZE - 2 * WARP_SIZE * f128::size; - - // init shared memory to zero - for(int i = threadIdx.x * f128::size; i < rounded_C; i += BLOCK_SIZE * f128::size) { - store128(dbias_shared + i, f128::zeros()); - store128(dweight_shared + i, f128::zeros()); - } - __syncthreads(); - - for (int bt = baseIdx; bt < B * T; bt += warpsInGrid) { - const floatX* dout_bt = dout + bt * C; - const floatX* inp_bt = inp +bt * C; - floatX* dinp_bt = dinp + bt * C; - - // first: two reduce operations - float dnorm_mean = 0.0f; - float dnorm_norm_mean = 0.0f; - for (int i = warpThreadIdx * x128::size; i < C; i += WARP_SIZE * x128::size) { - x128 dout128_i = load128(dout_bt + i); - x128 inp128_i = load128(inp_bt + i); - x128 weight128_i = load128(weight + i); - for (int k = 0; k < x128::size; k++) { - float dnorm_i = (float)weight128_i[k] * (float)dout128_i[k]; - dnorm_mean += dnorm_i; - dnorm_norm_mean += dnorm_i * (float)inp128_i[k]; - } - } - - const float mean_bt = mean[bt]; - const float rstd_bt = rstd[bt]; - dnorm_mean = warpReduceSum(dnorm_mean) / C; - dnorm_norm_mean = warpReduceSum(dnorm_norm_mean) / C * rstd_bt - dnorm_mean * mean_bt * rstd_bt; - - for (int c = 0; c < iterations_C; c++) { - int global_index = (warpThreadIdx * x128::size) + (c * C_per_iteration); - - x128 dout128 = x128::zeros(); - x128 inp128 = x128::zeros(); - x128 dinp128 = x128::zeros(); - x128 weight128 = x128::zeros(); - - if(global_index < C) { - dout128 = load128cs(dout_bt + global_index); - inp128 = load128cs(inp_bt + global_index); - dinp128 = load128(dinp_bt + global_index); - weight128 = load128(weight + global_index); - } - - for(int o = 0; o < x128::size / f128::size; ++o) { - f128 dbias_f; - f128 dweight_f; - for(int i = 0; i < f128::size; ++i) { - int x = o * f128::size + i; - float dout_i = (float)dout128[x]; - float norm_bti = ((float)inp128[x] - mean_bt) * rstd_bt; - dbias_f[i] = dout_i; - dweight_f[i] = norm_bti * dout_i; - - float dval = 0.0f; - dval += (float) weight128[x] * (float)dout128[x]; // term 1 - dval -= dnorm_mean; // term 2 - dval -= norm_bti * dnorm_norm_mean; // term 3 - dval *= rstd_bt; // final scale - dinp128[x] = (floatX) ((float) dinp128[x] + dval); - } - - if (warpId != 0) { - store128(dbias_tmp_shared + threadIdx.x * f128::size, dbias_f); - // this seems to generate a 64-bit store, instead of 128-bit. - // however, forcing 128-bit (e.g., using inline ptx), results in register - // spilling and much worse performance, so we'll keep it like this for now - // but ideally, we could reduce the register pressure a little. - store128(dweight_tmp_shared + threadIdx.x * f128::size, dweight_f); - } - __syncthreads(); - if (warpId == 0) { - for (int j = 1; j < warpsInBlock; j++) { - f128 dbias_tmp = load128(dbias_tmp_shared + f128::size * (threadIdx.x + j * WARP_SIZE)); - f128 dweight_tmp = load128(dweight_tmp_shared + f128::size * (threadIdx.x + j * WARP_SIZE)); - for(int i = 0; i < f128::size; ++i) { - dbias_f[i] += dbias_tmp[i]; - dweight_f[i] += dweight_tmp[i]; - } - } - } - __syncthreads(); - if (warpId == 0) { - f128 db_old = load128(dbias_shared + global_index + f128::size * o); - f128 dw_old = load128(dweight_shared + global_index + f128::size * o); - for(int i = 0; i < f128::size; ++i) { - dbias_f[i] += db_old[i]; - dweight_f[i] += dw_old[i]; - } - store128(dbias_shared + global_index + f128::size * o, dbias_f); - store128(dweight_shared + global_index + f128::size * o, dweight_f); - } - } - if(global_index < C) { - // cache in L2 as this is read by the next kernel, but bypass L1 to minimise thrashing - store128cg(dinp_bt + global_index, dinp128); - } - } - } - __syncthreads(); - // Each block writes its partial sum to global memory - // The last block to finish becomes responsible for summing up all the partial sums - // This is done by atomically incrementing a flag (cleared to 0 before launching the kernel) - unsigned int* scratchFlag = (unsigned int*)(scratch); - // Increment scratch pointer by a full cacheline so that everything remains cacheline aligned - scratch += 32; - float* scratch_dbias = scratch; - float* scratch_dweight = scratch + C; - for(int i = threadIdx.x * f128::size; i < C; i += BLOCK_SIZE * f128::size) { - // Write to global memory in the same "shared memory banking friendly" order - store128(scratch_dbias + i + 2*C*blockIdx.x, load128(dbias_shared + i)); - store128(scratch_dweight + i + 2*C*blockIdx.x, load128(dweight_shared + i)); - } - __syncthreads(); - // that portion of shared memory is no longer used, so we can repurpose it for the scratch flag. - unsigned int *tmp_flag = (unsigned int*)(shared + 2*rounded_C); - if (threadIdx.x == 0) { - *tmp_flag = atomicInc(scratchFlag, gridDim.x); - } - __syncthreads(); - if (*tmp_flag == gridDim.x-1) { - // Reduction of the partial sums by the final block - // todo - there isn't enough parallelism even inside that single SM... - // ==> so could maybe split into another kernel with YET ANOTHER level of reduction?! - for(int i = threadIdx.x * f128::size; i < C; i += BLOCK_SIZE * f128::size) { - f128 dbias_accum = f128::zeros(); - f128 dweight_accum = f128::zeros(); - - for (int read_block_idx = 0; read_block_idx < gridDim.x; read_block_idx++) { - int offset = i + 2*C*read_block_idx; - f128 dbias128 = load128(scratch_dbias + offset); - f128 dweight128 = load128(scratch_dweight + offset); - for(int k = 0; k < f128::size; k++) { - dbias_accum[k] += dbias128[k]; - dweight_accum[k] += dweight128[k]; - } - } - store128(dbias_shared + i, dbias_accum); - store128(dweight_shared + i, dweight_accum); - } - __syncthreads(); - - // convert from float/FP32 to floatX/BF16 for the final write - // this is separate because it cannot use as many warps as the above (f128 vs x128) - // todo - if we split this code into another kernel, we could maybe do it at the same time? - for (int c = warpId; c < iterations_C; c += warpsInBlock) { - int global_index = (warpThreadIdx * x128::size) + (c * C_per_iteration); - if (global_index >= C) { - break; - } - - x128 dbias128 = load128(dbias + global_index); - x128 dweight128 = load128(dweight + global_index); - for(int o = 0; o < x128::size / f128::size; ++o) { - f128 s_db = load128(dbias_shared + global_index + o * f128::size); - f128 s_dw = load128(dweight_shared + global_index + o * f128::size); - for(int i = 0; i < f128::size; ++i) { - int x = o * f128::size + i; - dbias128[x] = (floatX)(s_db[i] + (float)dbias128[x]); - dweight128[x] = (floatX)(s_dw[i] + (float)dweight128[x]); - } - } - store128(dbias + global_index, dbias128); - store128(dweight + global_index, dweight128); - } - } -} - -// ---------------------------------------------------------------------------- -// kernel launchers - -// similar to `fused_residual_forward5` -void layernorm_forward(floatX* out, float* mean, float* rstd, - floatX* inp, const floatX* weight, const floatX* bias, - int B, int T, int C, cudaStream_t stream) { - NVTX_RANGE_FN(); - const int block_size = 256; - int block_y = block_size / WARP_SIZE; - const int N = B * T; - const int grid_size = CEIL_DIV(N, block_y); - size_t smem = (2 + block_y) * C * sizeof(floatX); - - // in order to use more than 48 KiB of smem, need to call cudaFuncSetAttribute - // this may fail, in which case we fall back to the smem free implementation. - cudaCheck(cudaGetLastError()); - auto status = cudaFuncSetAttribute(layernorm_forward_kernel6, cudaFuncAttributeMaxDynamicSharedMemorySize, smem); - cudaCheck(cudaGetLastError()); - if (status == cudaSuccess) { - layernorm_forward_kernel6<<>>(out, mean, rstd, inp, weight, bias, N, C); - } else { - // fall back to the version without shared memory - const int grid_size_fb = CEIL_DIV(N * WARP_SIZE, block_size); - layernorm_forward_kernel3<<>>(out, mean, rstd, inp, weight, bias, N, C); - } - cudaCheck(cudaGetLastError()); -} - -void residual_forward(floatX* out, const floatX* inp1, const floatX* inp2, int N, cudaStream_t stream) { - NVTX_RANGE_FN(); - const int block_size = 256; - assert(N % (block_size * x128::size) == 0); - const int grid_size = CEIL_DIV(N, block_size * x128::size); - residual_forward_kernel<<>>(out, inp1, inp2); - cudaCheck(cudaGetLastError()); -} - -void fused_residual_forward5(floatX* residual, floatX* normed, float* mean, float* rstd, - const floatX* inp1, const floatX* inp2, - const floatX* weight, const floatX* bias, - int N, int C, cudaStream_t stream) { - const int block_size = 256; - int block_y = block_size / WARP_SIZE; - const int grid_size = CEIL_DIV(N, block_y); - size_t smem = (2 + block_y) * C * sizeof(floatX); - - // in order to use more than 48 KiB of smem, need to call cudaFuncSetAttribute - // this may fail, in which case we fall back to the smem free implementation. - cudaCheck(cudaGetLastError()); - auto status = cudaFuncSetAttribute(fused_residual_forward_kernel5, cudaFuncAttributeMaxDynamicSharedMemorySize, smem); - cudaCheck(cudaGetLastError()); - if(status == cudaSuccess) { - fused_residual_forward_kernel5<<>>(residual, normed, - mean, rstd, inp1, inp2, - weight, bias, N, C); - } else { - residual_forward(residual, inp1, inp2, N*C, stream); - layernorm_forward(normed, mean, rstd, residual, weight, bias, N, 1, C, stream); - } - cudaCheck(cudaGetLastError()); -} - -void layernorm_backward(floatX* dinp, floatX* dweight, floatX* dbias, float* scratch, - const floatX* dout, const floatX* inp, const floatX* weight, const float* mean, const float* rstd, - int B, int T, int C, cudaStream_t stream) { - NVTX_RANGE_FN(); - const int block_size = 512; - const int blocks_per_sm = 2; // supported on every architecture and less cache thrashing than 3 - const int grid_size = blocks_per_sm * deviceProp.multiProcessorCount; - size_t rounded_C = CEIL_DIV(C, (32 * x128::size)) * (32 * x128::size); - size_t shared_mem_size = (2 * rounded_C + 2 * (block_size - 32) * f128::size) * sizeof(float); - - cudaCheck(cudaMemsetAsync(scratch, 0, 1 * sizeof(float), stream)); // only need to reset the flag to 0 - layernorm_backward_kernel10<<>>(dinp, dweight, dbias, scratch, dout, inp, weight, mean, rstd, B, T, C); - cudaCheck(cudaGetLastError()); -} diff --git a/CUDA/llmcpp/mfu.h b/CUDA/llmcpp/mfu.h deleted file mode 100644 index 1c40b7b..0000000 --- a/CUDA/llmcpp/mfu.h +++ /dev/null @@ -1,244 +0,0 @@ -#ifndef MFU_H -#define MFU_H - -#include -#include -#include -#if __has_include() -#define USE_NVML 1 -#include -#else -#define USE_NVML 0 -#endif - -// tied to enum PrecisionMode, in a future refactor make them the same -#define MFUH_PRECISION_FP32 0 -#define MFUH_PRECISION_FP16 1 -#define MFUH_PRECISION_BF16 2 - -#if USE_NVML -inline void nvml_check(nvmlReturn_t status, const char *file, int line) { - if (status != NVML_SUCCESS) { - printf("[NVML ERROR] at file %s:%d:\n%s\n", file, line, nvmlErrorString(status)); - exit(EXIT_FAILURE); - } -}; -#define nvmlCheck(err) (nvml_check(err, __FILE__, __LINE__)) -#endif - - -typedef struct { - float TF_32; // tensor-core performance 32 bit - float BF_16_32; // bf16 with 32 bit accumulate - float FP_16_32; // fp16 with 32 bit accumulate - float FP_16_16; // fp16 with 16 bit accumulate - float FP_8_32; // and so on - float FP_8_16; - float CLOCK; // clock frequency from the spec sheet - float CORES; // #TCs from the spec sheet -} PerfData; - -// basic default data from the nvidia whitepapers -static const PerfData VOLTA = {125.0f, -1.f, 125.f, -1.f, -1.f, -1.f, 1530.f, 640.f}; -static const PerfData AMPERE_DATACENTER = {156.f, 312.f, 312.f, 312.f, -1.f, -1.f, 1410.f, 432.f}; -static const PerfData AMPERE_CONSUMER = {40.f, 80.f, 80.f, 160.f, -1.f, -1.f, 1860.f, 336.f}; -static const PerfData HOPPER = {378.f, 756.f, 756.f, 756.f, 1513.f, 1513.f, 1620.f, 456.f}; -static const PerfData ADA = {82.6f, 165.2f, 165.2f, 330.3f, 330.3f, 660.6f, 2520.f, 512.f}; - -typedef struct { - const char* name; - const PerfData* perf_data; - float new_cores; - float new_mhz; -} GPUEntry; - -// the overrides for each specific GPU -static GPUEntry gpu_db[] = { - {"Tesla V100-SXM2-16GB", &VOLTA, 640, 1530}, - {"Tesla V100-PCIE-32GB", &VOLTA, 640, 1530}, - {"NVIDIA A100-PCIE-40GB", &ERE_DATACENTER, 432, 1410}, - {"NVIDIA A100-PCIE-80GB", &ERE_DATACENTER, 432, 1410}, - {"NVIDIA A100-SXM4-40GB", &ERE_DATACENTER, 432, 1410}, - {"NVIDIA A100-SXM4-80GB", &ERE_DATACENTER, 432, 1410}, - {"NVIDIA RTX A2000", &ERE_CONSUMER, 104, 1200}, - {"NVIDIA RTX A4000", &ERE_CONSUMER, 192, 1560}, - {"NVIDIA RTX A4500", &ERE_CONSUMER, 224, 1650}, - {"NVIDIA RTX A5000", &ERE_CONSUMER, 256, 1695}, - {"NVIDIA RTX A5500", &ERE_CONSUMER, 320, 1770}, - {"NVIDIA RTX A6000", &ERE_CONSUMER, 336, 1800}, - {"NVIDIA GeForce RTX 3090 Ti", &ERE_CONSUMER, 336, 1860}, - {"NVIDIA GeForce RTX 3090", &ERE_CONSUMER, 328, 1695}, - {"NVIDIA GeForce RTX 3080 Ti", &ERE_CONSUMER, 320, 1665}, - {"NVIDIA GeForce RTX 3080", &ERE_CONSUMER, 272, 1710}, - {"NVIDIA GeForce RTX 3070 Ti", &ERE_CONSUMER, 192, 1770}, - {"NVIDIA GeForce RTX 3070", &ERE_CONSUMER, 184, 1725}, - {"NVIDIA GeForce RTX 3060 Ti", &ERE_CONSUMER, 152, 1665}, - {"NVIDIA GeForce RTX 3060", &ERE_CONSUMER, 112, 1777}, - {"NVIDIA RTX A2000 ADA", &ADA, 88, 2130}, - {"NVIDIA RTX A4000 ADA", &ADA, 192, 2175}, - {"NVIDIA RTX A4500 ADA", &ADA, 224, 2580}, - {"NVIDIA RTX A5000 ADA", &ADA, 400, 2550}, - {"NVIDIA RTX A5880 ADA", &ADA, 440, 2460}, - {"NVIDIA RTX A6000 ADA", &ADA, 568, 2505}, - {"NVIDIA GeForce RTX 4090", &ADA, 512, 2520}, - {"NVIDIA GeForce RTX 4080 SUPER", &ADA, 320, 2550}, - {"NVIDIA GeForce RTX 4080", &ADA, 304, 2505}, - {"NVIDIA GeForce RTX 4070 Ti SUPER", &ADA, 264, 2610}, - {"NVIDIA GeForce RTX 4070 Ti", &ADA, 240, 2610}, - {"NVIDIA GeForce RTX 4070 SUPER", &ADA, 224, 2475}, - {"NVIDIA GeForce RTX 4070", &ADA, 184, 2475}, - {"NVIDIA GeForce RTX 4070", &ADA, 184, 2475}, - {"NVIDIA GeForce RTX 4060 Ti", &ADA, 136, 2535}, - {"NVIDIA GeForce RTX 4060", &ADA, 96, 2460}, - {"NVIDIA H100 PCIe", &HOPPER, 456, 1620}, - {"NVIDIA H100 80GB HBM3", &HOPPER, 528, 1830}, // HBM3 = SXM5 -}; - -float get_flops_promised(const char* device, int precision_mode) { - /* - This function is used to estimate the Model Flops Utilization (MFU) - basically we have to figure out how many flops the GPU can do per second. - Note that this is not a simple endeavor and may well go wrong! The details are tricky. - The returned value is in units of 1e12. - - For the non-top models, actual performance numbers aren't that easy to find, e.g., - here https://www.techpowerup.com/gpu-specs/rtx-a4000.c3756, does "Theoretical Performance" - seems to be without tensor cores. - - So, instead we use that all these cards just use the same types of tensor cores in different - numbers and at different frequencies. Then we just need to look up these two easily accesible - numbers for all the other GPUs. - linear scaling seems to work: comparing spec sheet and calculation: - 4080: 304TCs, 2505 GHz; 97.5TFlops = 165.2/512*304 /2520 * 2505 - - Original numbers for the top GPUS are from. - https://resources.nvidia.com/en-us-tensor-core - https://images.nvidia.com/aem-dam/Solutions/geforce/ada/nvidia-ada-gpu-architecture.pdf - */ - - // validate the precision mode as one of the three possible values - if (!(precision_mode == MFUH_PRECISION_FP32 || precision_mode == MFUH_PRECISION_FP16 || precision_mode == MFUH_PRECISION_BF16)) { - fprintf(stderr, "Invalid precision mode: %d\n", precision_mode); - return -1.0f; - } - - // do a linear search until you find our GPU, then calculate the flops promised - int num_gpu_entries = sizeof(gpu_db) / sizeof(gpu_db[0]); - for (int i = 0; i < num_gpu_entries; i++) { - if (strcmp(gpu_db[i].name, device) == 0) { - const PerfData* perf_data = gpu_db[i].perf_data; - - // look up the default flops value for the given precision mode - float value = -1.0f; - if (precision_mode == MFUH_PRECISION_BF16) { value = perf_data->BF_16_32; } - if (precision_mode == MFUH_PRECISION_FP32) { value = perf_data->TF_32; } - if (precision_mode == MFUH_PRECISION_FP16) { value = perf_data->FP_16_32; } - - // we'd get here if we're e.g. trying to use BF16 on Volta GPU or something... - if (value < 0.0f) { - fprintf(stderr, "No data for GPU %s and precision mode %d\n", device, precision_mode); - return -1.0f; - } - - // adjust flops based on the specific core count and clock frequency of this GPU - float new_cores = gpu_db[i].new_cores; - float new_mhz = gpu_db[i].new_mhz; - float adjusted = value * (new_cores / perf_data->CORES) * (new_mhz / perf_data->CLOCK); - return adjusted; - } - } - - return -1.0f; // ¯\_(ツ)_/¯ -} - -struct GPUUtilInfo { - unsigned int clock; - unsigned int max_clock; - unsigned int power; - unsigned int power_limit; - unsigned int fan; - unsigned int temperature; - unsigned int temp_slowdown; - - float gpu_utilization; - float mem_utilization; - const char* throttle_reason; -}; - -// lazily initialize nvml and generate a handle to the GPU -#if USE_NVML -nvmlDevice_t nvml_get_device() { - static bool needs_init = true; - static nvmlDevice_t device; - if(needs_init) { - needs_init = false; - nvmlCheck(nvmlInit()); - nvmlCheck(nvmlDeviceGetHandleByIndex_v2(0, &device)); - } - return device; -} - -// convert throttle reason bitfield into a text reason. -// this is a lossy conversion; we just want to give some idea of what is happening -const char* get_throttle_reason(unsigned long long bits) { - if(bits & (nvmlClocksThrottleReasonSwPowerCap | nvmlClocksThrottleReasonHwPowerBrakeSlowdown)) { - return "power cap"; - } else if (bits & (nvmlClocksThrottleReasonSwThermalSlowdown | nvmlClocksThrottleReasonHwThermalSlowdown)) { - return "thermal cap"; - } else if (bits & (nvmlClocksThrottleReasonAll)) { - return "other cap"; - } else { - return "no cap"; - } -} - -// gather data for a GPUUtilInfo object -GPUUtilInfo get_gpu_utilization_info() { - GPUUtilInfo info; - nvmlDevice_t device = nvml_get_device(); - // query different infos directly - nvmlCheck(nvmlDeviceGetClockInfo(device, NVML_CLOCK_SM, &info.clock)); - nvmlCheck(nvmlDeviceGetMaxClockInfo(device, NVML_CLOCK_SM, &info.max_clock)); - nvmlCheck(nvmlDeviceGetPowerManagementLimit(device, &info.power_limit)); - nvmlCheck(nvmlDeviceGetPowerUsage(device, &info.power)); - nvmlCheck(nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &info.temperature)); - nvmlCheck(nvmlDeviceGetTemperatureThreshold(device, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, &info.temp_slowdown)); - unsigned long long throttle; - nvmlCheck(nvmlDeviceGetCurrentClocksThrottleReasons(device, &throttle)); - info.throttle_reason = get_throttle_reason(throttle); - nvmlCheck(nvmlDeviceGetFanSpeed(device, &info.fan)); - - // for "utilization", we look at recorded samples. In principle, we could query the driver for how many samples - // to request, but then we'd need to dynamically allocate sufficient space. Let's just hard-code a limit of 128, - // and have no memory management required - constexpr const int BUFFER_LIMIT = 128; - nvmlSample_t buffer[BUFFER_LIMIT]; - nvmlValueType_t v_type; - unsigned int sample_count = BUFFER_LIMIT; - nvmlCheck(nvmlDeviceGetSamples(device, NVML_GPU_UTILIZATION_SAMPLES, 0, &v_type, &sample_count, buffer)); - float gpu_utilization = 0.f; - for(unsigned i = 0; i < sample_count; ++i) { - gpu_utilization += (float)buffer[i].sampleValue.uiVal; - } - gpu_utilization /= (float)sample_count; - - // sample count may have been modified by the query above; reset back to buffer size - sample_count = BUFFER_LIMIT; - nvmlCheck(nvmlDeviceGetSamples(device, NVML_MEMORY_UTILIZATION_SAMPLES, 0, &v_type, &sample_count, buffer)); - float mem_utilization = 0.f; - for(unsigned i = 0; i < sample_count; ++i) { - mem_utilization += (float)buffer[i].sampleValue.uiVal; - } - mem_utilization /= (float)sample_count; - - info.gpu_utilization = gpu_utilization; - info.mem_utilization = mem_utilization; - return info; -} -#else -GPUUtilInfo get_gpu_utilization_info() { - fprintf(stderr, "Error: Compiled without nvml support. Cannot perform additional GPU state tracking."); - exit(EXIT_FAILURE); -} -#endif -#endif // MFU_H diff --git a/CUDA/llmcpp/rand.h b/CUDA/llmcpp/rand.h deleted file mode 100644 index b66aa04..0000000 --- a/CUDA/llmcpp/rand.h +++ /dev/null @@ -1,240 +0,0 @@ -/* -Mersenne Twisters implementation, numerically identical to torch. - -Example usage: - - mt19937_state state; - manual_seed(&state, 137); - printf("%u\n", randint32(&state)); - printf("%u\n", randint32(&state)); - printf("%u\n", randint32(&state)); - printf("%u\n", randint32(&state)); - printf("%u\n", randint32(&state)); - - float t8[8]; - normal_(t8, 8, 0, 1, &state); - for (int i = 0; i < 8; i++) { - printf("%f\n", t8[i]); - } - printf("%u\n", randint32(&state)); - - float t16[16]; - normal_(t16, 16, 0, 1, &state); - for (int i = 0; i < 16; i++) { - printf("%f\n", t16[i]); - } - printf("%u\n", randint32(&state)); - -PyTorch reference (producing identical results): - - import torch - torch.manual_seed(137) - print(torch.randint(0, 0xFFFFFFFF, [1]).item()) - print(torch.randint(0, 0xFFFFFFFF, [1]).item()) - print(torch.randint(0, 0xFFFFFFFF, [1]).item()) - print(torch.randint(0, 0xFFFFFFFF, [1]).item()) - print(torch.randint(0, 0xFFFFFFFF, [1]).item()) - t = torch.zeros(8); - t.normal_() - for i in range(len(t)) : - print(t[i].item()) - print(torch.randint(0, 0xFFFFFFFF, [1]).item()) - t = torch.zeros(16); - t.normal_() - for i in range(len(t)) : - print(t[i].item()) - print(torch.randint(0, 0xFFFFFFFF, [1]).item()) - -Both output: - - 4053805790 - 2173880614 - 380293709 - 1237255315 - 2986595568 - 0.7947664260864258 - 1.4369317293167114 - - 0.2292192131280899 - 0.47556325793266296 - - 0.6334410905838013 - - 0.5791953802108765 - - 0.0925704762339592 - - 0.8659197092056274 - 2186503452 - - 1.2813878059387207 - - 2.646395683288574 - - 0.06569503247737885 - 0.2180829495191574 - - 0.46536165475845337 - - 0.33108410239219666 - 2.5485482215881348 - 0.10425379872322083 - 0.8460659980773926 - 0.9462448358535767 - - 0.2913765013217926 - 0.34313806891441345 - - 1.1186704635620117 - - 0.18305328488349915 - - 2.3153159618377686 - 0.3961987793445587 - 2756748748 -*/ - -#ifndef RAND_H -#define RAND_H - -#include - -#define MERSENNE_STATE_M 397u -#define MERSENNE_STATE_N 624u - -#define LMASK 0x7ffffffful -#define UMASK 0x80000000ul - -// Copyright(c) Makoto Matsumoto and Takuji Nishimura - -// This implementation follows PyTorch so that we are numerically identical when running verification tests. - -typedef struct { - unsigned long long seed_; - int left_; - unsigned int next_; - unsigned int state_[MERSENNE_STATE_N]; - unsigned int MATRIX_A[2]; -} mt19937_state; - -void manual_seed(mt19937_state* state, unsigned int seed) { - state->MATRIX_A[0] = 0x0u; - state->MATRIX_A[1] = 0x9908b0df; - state->state_[0] = seed & 0xffffffff; - for (unsigned int j = 1; j < MERSENNE_STATE_N; j++) { - state->state_[j] = 1812433253 * (state->state_[j - 1] ^ (state->state_[j - 1] >> 30)) + j; - state->state_[j] &= 0xffffffff; - } - state->left_ = 1; - state->next_ = 0; -} - -void next_state(mt19937_state* state) { - state->left_ = MERSENNE_STATE_N; - state->next_ = 0; - unsigned int y, j; - for (j = 0; j < MERSENNE_STATE_N - MERSENNE_STATE_M; j++) { - y = (state->state_[j] & UMASK) | (state->state_[j + 1] & LMASK); - state->state_[j] = state->state_[j + MERSENNE_STATE_M] ^ (y >> 1) ^ state->MATRIX_A[y & 0x1]; - } - for (; j < MERSENNE_STATE_N - 1; j++) { - y = (state->state_[j] & UMASK) | (state->state_[j + 1] & LMASK); - state->state_[j] = state->state_[j + (MERSENNE_STATE_M - MERSENNE_STATE_N)] ^ (y >> 1) ^ state->MATRIX_A[y & 0x1]; - } - y = (state->state_[MERSENNE_STATE_N - 1] & UMASK) | (state->state_[0] & LMASK); - state->state_[MERSENNE_STATE_N - 1] = state->state_[MERSENNE_STATE_M - 1] ^ (y >> 1) ^ state->MATRIX_A[y & 0x1]; -} - -unsigned int randint32(mt19937_state* state) { - if (!state) return 0; - if (state->MATRIX_A[0] != 0 || state->MATRIX_A[1] != 0x9908b0df) manual_seed(state, 5489); // auto-initialize - if (--state->left_ <= 0) { - next_state(state); - } - unsigned int y = state->state_[state->next_++]; - y ^= y >> 11; - y ^= (y << 7) & 0x9d2c5680; - y ^= (y << 15) & 0xefc60000; - y ^= y >> 18; - return y; -} - -inline unsigned long long randint64(mt19937_state* state) { - return (((unsigned long long)(randint32(state)) << 32) | randint32(state)); -} - -inline float randfloat32(mt19937_state* state) { - return (randint32(state) & ((1ull << 24) - 1)) * (1.0f / (1ull << 24)); -} - -inline double randfloat64(mt19937_state* state) { - return (randint64(state) & ((1ull << 53) - 1)) * (1.0 / (1ull << 53)); -} - -void uniform_(float* data, unsigned int numel, float from, float to, mt19937_state* state) { - for (unsigned int t = 0; t < numel; t++) { - data[t] = randfloat32(state) * (to - from) + from; - } -} - -// Box-Muller transform: maps uniform random numbers to Gaussian distributed numbers -// https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform -void normal_fill_16(float* data, float mean, float std) { - #define EPSILONE 1e-12f - for (unsigned int t = 0; t < 8; t++) { - float u1 = 1 - data[t]; - float u2 = data[t + 8]; - float radius = sqrtf(-2 * logf(u1 + EPSILONE)); - float theta = (float) (2.0 * M_PI * u2); - data[t] = (radius * cosf(theta) * std + mean); - data[t + 8] = (radius * sinf(theta) * std + mean); - } -} - -void normal_fill(float* data, unsigned int numel, float mean, float std, mt19937_state* state) { - for (unsigned int t = 0; t < numel; t++) { - data[t] = randfloat32(state); - } - for (unsigned int i = 0; i < numel - 15; i += 16) { - normal_fill_16(data + i, mean, std); - } - if (numel % 16 != 0) { - // recompute the last 16 values - data = data + numel - 16; - for (unsigned int i = 0; i < 16; i++) { - data[i] = randfloat32(state); - } - normal_fill_16(data, mean, std); - } -} - -void normal_(float* data, unsigned int numel, float mean, float std, mt19937_state* state) { - #define EPSILONE 1e-12f - if (numel >= 16) { - normal_fill(data, numel, mean, std, state); - } - else { - double next_double_normal_sample = 0.0; // make compiler warning happy, won't be used - int has_next_double_normal_sample = 0; - for (unsigned int t = 0; t < numel; t++) { - if (has_next_double_normal_sample) { - data[t] = (float)(next_double_normal_sample * std + mean); - has_next_double_normal_sample = 0; - continue; - } - // for numel < 16 we draw a double (float64) - float u1 = (float) randfloat64(state); - float u2 = (float) randfloat64(state); - float radius = sqrtf(-2 * logf(1 - u2 + EPSILONE)); - float theta = (float) (2.0 * M_PI * u1); - next_double_normal_sample = radius * sinf(theta); - has_next_double_normal_sample = 1; - data[t] = (radius * cosf(theta) * std + mean); - } - } -} - -void init_identity_permutation(int *data, int numel) { - for (int i = 0; i < numel; i++) { - data[i] = i; - } -} - -void random_permutation(int* data, int numel, mt19937_state* state) { - for (int i = numel - 1; i > 0; i--) { - // pick an index j in [0, i] with equal probability - int j = randint32(state) % (i + 1); - // swap i <-> j - int tmp = data[i]; - data[i] = data[j]; - data[j] = tmp; - } -} - -#endif \ No newline at end of file diff --git a/CUDA/llmcpp/utils.h b/CUDA/llmcpp/utils.h deleted file mode 100644 index 775534c..0000000 --- a/CUDA/llmcpp/utils.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - This file contains utilities shared between the different training scripts. - In particular, we define a series of macros xxxCheck that call the corresponding - C standard library function and check its return code. If an error was reported, - the program prints some debug information and exits. -*/ -#ifndef UTILS_H -#define UTILS_H - -#include -#include -#include -#include -#include -// implementation of dirent for Windows is in dev/unistd.h -#ifndef _WIN32 -#include -#include -#endif - -// ---------------------------------------------------------------------------- -// fread convenience utils, with nice handling of error checking using macros -// simple replace fopen, fread, fclose, fseek -// with fopenCheck, freadCheck, fcloseCheck, fseekCheck - -extern inline FILE *fopen_check(const char *path, const char *mode, const char *file, int line) { - FILE *fp = fopen(path, mode); - if (fp == NULL) { - fprintf(stderr, "Error: Failed to open file '%s' at %s:%d\n", path, file, line); - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - fprintf(stderr, " Path: %s\n", path); - fprintf(stderr, " Mode: %s\n", mode); - fprintf(stderr, "---> HINT 1: dataset files/code have moved to dev/data recently (May 20, 2024). You may have to mv them from the legacy data/ dir to dev/data/(dataset), or re-run the data preprocessing script. Refer back to the main README\n"); - fprintf(stderr, "---> HINT 2: possibly try to re-run `python train_gpt2.py`\n"); - exit(EXIT_FAILURE); - } - return fp; -} - -#define fopenCheck(path, mode) fopen_check(path, mode, __FILE__, __LINE__) - -extern inline void fread_check(void *ptr, size_t size, size_t nmemb, FILE *stream, const char *file, int line) { - size_t result = fread(ptr, size, nmemb, stream); - if (result != nmemb) { - if (feof(stream)) { - fprintf(stderr, "Error: Unexpected end of file at %s:%d\n", file, line); - } else if (ferror(stream)) { - fprintf(stderr, "Error: File read error at %s:%d\n", file, line); - } else { - fprintf(stderr, "Error: Partial read at %s:%d. Expected %zu elements, read %zu\n", - file, line, nmemb, result); - } - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - fprintf(stderr, " Expected elements: %zu\n", nmemb); - fprintf(stderr, " Read elements: %zu\n", result); - exit(EXIT_FAILURE); - } -} - -#define freadCheck(ptr, size, nmemb, stream) fread_check(ptr, size, nmemb, stream, __FILE__, __LINE__) - -extern inline void fclose_check(FILE *fp, const char *file, int line) { - if (fclose(fp) != 0) { - fprintf(stderr, "Error: Failed to close file at %s:%d\n", file, line); - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - exit(EXIT_FAILURE); - } -} - -#define fcloseCheck(fp) fclose_check(fp, __FILE__, __LINE__) - -extern inline void sclose_check(int sockfd, const char *file, int line) { - if (close(sockfd) != 0) { - fprintf(stderr, "Error: Failed to close socket at %s:%d\n", file, line); - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - exit(EXIT_FAILURE); - } -} - -#define scloseCheck(sockfd) sclose_check(sockfd, __FILE__, __LINE__) - -#ifdef _WIN32 -extern inline void closesocket_check(int sockfd, const char *file, int line) { - if (closesocket(sockfd) != 0) { - fprintf(stderr, "Error: Failed to close socket at %s:%d\n", file, line); - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - exit(EXIT_FAILURE); - } -} - -#define closesocketCheck(sockfd) closesocket_check(sockfd, __FILE__, __LINE__) -#endif - -extern inline void fseek_check(FILE *fp, long off, int whence, const char *file, int line) { - if (fseek(fp, off, whence) != 0) { - fprintf(stderr, "Error: Failed to seek in file at %s:%d\n", file, line); - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " Offset: %ld\n", off); - fprintf(stderr, " Whence: %d\n", whence); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - exit(EXIT_FAILURE); - } -} - -#define fseekCheck(fp, off, whence) fseek_check(fp, off, whence, __FILE__, __LINE__) - -extern inline void fwrite_check(void *ptr, size_t size, size_t nmemb, FILE *stream, const char *file, int line) { - size_t result = fwrite(ptr, size, nmemb, stream); - if (result != nmemb) { - if (feof(stream)) { - fprintf(stderr, "Error: Unexpected end of file at %s:%d\n", file, line); - } else if (ferror(stream)) { - fprintf(stderr, "Error: File write error at %s:%d\n", file, line); - } else { - fprintf(stderr, "Error: Partial write at %s:%d. Expected %zu elements, wrote %zu\n", - file, line, nmemb, result); - } - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - fprintf(stderr, " Expected elements: %zu\n", nmemb); - fprintf(stderr, " Written elements: %zu\n", result); - exit(EXIT_FAILURE); - } -} - -#define fwriteCheck(ptr, size, nmemb, stream) fwrite_check(ptr, size, nmemb, stream, __FILE__, __LINE__) - -// ---------------------------------------------------------------------------- -// malloc error-handling wrapper util - -extern inline void *malloc_check(size_t size, const char *file, int line) { - void *ptr = malloc(size); - if (ptr == NULL) { - fprintf(stderr, "Error: Memory allocation failed at %s:%d\n", file, line); - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - fprintf(stderr, " Size: %zu bytes\n", size); - exit(EXIT_FAILURE); - } - return ptr; -} - -#define mallocCheck(size) malloc_check(size, __FILE__, __LINE__) - - -// ---------------------------------------------------------------------------- -// check that all tokens are within range -extern inline void token_check(const int* tokens, int token_count, int vocab_size, const char *file, int line) { - for(int i = 0; i < token_count; i++) { - if(!(0 <= tokens[i] && tokens[i] < vocab_size)) { - fprintf(stderr, "Error: Token out of vocabulary at %s:%d\n", file, line); - fprintf(stderr, "Error details:\n"); - fprintf(stderr, " File: %s\n", file); - fprintf(stderr, " Line: %d\n", line); - fprintf(stderr, " Token: %d\n", tokens[i]); - fprintf(stderr, " Position: %d\n", i); - fprintf(stderr, " Vocab: %d\n", vocab_size); - exit(EXIT_FAILURE); - } - } -} -#define tokenCheck(tokens, count, vocab) token_check(tokens, count, vocab, __FILE__, __LINE__) - -// ---------------------------------------------------------------------------- -// I/O ops - -extern inline void create_dir_if_not_exists(const char *dir) { - if (dir == NULL) { return; } - struct stat st = {0}; - if (stat(dir, &st) == -1) { - if (mkdir(dir, 0700) == -1) { - printf("ERROR: could not create directory: %s\n", dir); - exit(EXIT_FAILURE); - } - printf("created directory: %s\n", dir); - } -} - -extern inline int find_max_step(const char* output_log_dir) { - // find the DONE file in the log dir with highest step count - if (output_log_dir == NULL) { return -1; } - DIR* dir; - struct dirent* entry; - int max_step = -1; - dir = opendir(output_log_dir); - if (dir == NULL) { return -1; } - while ((entry = readdir(dir)) != NULL) { - if (strncmp(entry->d_name, "DONE_", 5) == 0) { - int step = atoi(entry->d_name + 5); - if (step > max_step) { - max_step = step; - } - } - } - closedir(dir); - return max_step; -} - -extern inline int ends_with_bin(const char* str) { - // checks if str ends with ".bin". could be generalized in the future. - if (str == NULL) { return 0; } - size_t len = strlen(str); - const char* suffix = ".bin"; - size_t suffix_len = strlen(suffix); - if (len < suffix_len) { return 0; } - int suffix_matches = strncmp(str + len - suffix_len, suffix, suffix_len) == 0; - return suffix_matches; -} - -#endif \ No newline at end of file diff --git a/CUDA/llmcpp/zero.cuh b/CUDA/llmcpp/zero.cuh deleted file mode 100644 index e6c5b6e..0000000 --- a/CUDA/llmcpp/zero.cuh +++ /dev/null @@ -1,597 +0,0 @@ -/* -Utilities for ZeRO sharding -*/ - -#ifndef LLMC_ZERO_CUH -#define LLMC_ZERO_CUH - -#include -#include -#include -#include -#include - -#ifdef MULTI_GPU -#include -#ifdef USE_MPI -#include -#endif -#endif - -// defines: fcloseCheck, fwriteCheck, scloseCheck, sclosesocketCheck -#include "utils.h" - -// ---------------------------------------------------------------------------- -// Multi-GPU related -#ifdef MULTI_GPU - -#if defined(ENABLE_FP32) -const ncclDataType_t ncclFloatX = ncclFloat; -#elif defined(ENABLE_FP16) -const ncclDataType_t ncclFloatX = ncclHalf; -#else // Default to bfloat16 -const ncclDataType_t ncclFloatX = ncclBfloat16; -#endif - -void nccl_check(ncclResult_t status, const char *file, int line) { - if (status != ncclSuccess) { - printf("[NCCL ERROR] at file %s:%d:\n%s\n", file, line, ncclGetErrorString(status)); - exit(EXIT_FAILURE); - } -} -#define ncclCheck(err) (nccl_check(err, __FILE__, __LINE__)) - -#ifdef USE_MPI -void mpi_check(int status, const char *file, int line) { - if (status != MPI_SUCCESS) { - char mpi_error[4096]; - int mpi_error_len = 0; - assert(MPI_Error_string(status, &mpi_error[0], &mpi_error_len) == MPI_SUCCESS); - printf("[MPI ERROR] at file %s:%d:\n%.*s\n", file, line, mpi_error_len, mpi_error); - exit(EXIT_FAILURE); - } -} -#define mpiCheck(err) (mpi_check(err, __FILE__, __LINE__)) -#endif - -#endif // MULTI_GPU - -// ---------------------------------------------------------------------------- -// Parameters specific to training on multiple GPUs. -typedef struct { - int process_rank; // Rank of this process among all processes. 0 if no multi-GPU. - int num_processes; // Total number of processes. 1 if no multi-GPU. - int local_device_idx; // This process GPU index on current machine. 0 if no multi-GPU. - - // Zero Redundancy Optimizer stage - https://fairscale.readthedocs.io/en/stable/deep_dive/oss_sdp_fsdp.html - // 0-Disabled - // 1-Optimizer State Sharding (OSS) - // 2-Optimizer + Gradient State Sharding (SDP) - // 3-Optimizer + Gradient + Horizontal Model Sharding (FSDP) - int zero_stage; - size_t shard_num_parameters; -#ifdef MULTI_GPU - ncclComm_t nccl_comm; // NCCL communication primitive, used for collective multi-GPU work. - cudaStream_t nccl_stream; // CUDA Stream to perform NCCL operations. - cudaEvent_t compute_nccl_sync; // Event used to synchronize NCCL with the compute - float* unified_buffer; -#endif -} MultiGpuConfig; - -// one global variable to hold the multi-GPU configuration for this process -// inline, so we can include this header multiple times without getting multiple definitions -inline MultiGpuConfig multi_gpu_config; - -#ifdef MULTI_GPU - -#ifdef _WIN32 -void send_nccl_id_to_clients_windows(ncclUniqueId *nccl_id, SOCKET client_sockets[], int num_clients) { - for (int i = 0; i < num_clients; ++i) { - if (send(client_sockets[i], (const char *)nccl_id, sizeof(*nccl_id), 0) == SOCKET_ERROR) { - printf("Failed to send nccl_id"); - WSACleanup(); - exit(EXIT_FAILURE); - } - closesocketCheck(client_sockets[i]); - } -} -#else -void send_nccl_id_to_clients(ncclUniqueId *nccl_id, int client_sockets[], int num_clients) { - for (int i = 0; i < num_clients; ++i) { - if (send(client_sockets[i], nccl_id, sizeof(*nccl_id), 0) == -1) { - printf("Failed to send nccl_id"); - exit(EXIT_FAILURE); - } - scloseCheck(client_sockets[i]); - } -} -#endif - -#ifdef _WIN32 -// Same as get_nccl_id_via_tcp but for Windows -ncclUniqueId get_nccl_id_via_tcp_windows(MultiGpuConfig* result, const char* server_ip) { - ncclUniqueId nccl_id; - - int SERVER_PORT = 12345; // hardcoded an arbitrary port number between 1024 and 49151 (registered ports) - WSADATA wsaData; - if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { - printf("WSAStartup failed"); - exit(EXIT_FAILURE); - } - - if (result->process_rank == 0) { - ncclCheck(ncclGetUniqueId(&nccl_id)); - - int MAX_CLIENTS = result->num_processes - 1; - SOCKET client_sockets[MAX_CLIENTS]; - int num_clients = 0; - SOCKET server_socket, new_socket; - struct sockaddr_in address; - int addrlen = sizeof(address); - - // Step 1) create a server TCP socket - if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { - printf("Socket failed"); - WSACleanup(); - exit(EXIT_FAILURE); - } - - // Step 2) set the server address and port - address.sin_family = AF_INET; // IPv4 - address.sin_addr.s_addr = inet_addr(server_ip); - address.sin_port = htons(SERVER_PORT); - - // Step 3) bind the socket to the address and port - if (bind(server_socket, (struct sockaddr *)&address, sizeof(address)) == SOCKET_ERROR) { - printf("Bind failed"); - closesocketCheck(server_socket); - WSACleanup(); - exit(EXIT_FAILURE); - } - - // Step 4) MAX_CLIENTS specifies the maximum number of clients that can be queued for this server - if (listen(server_socket, MAX_CLIENTS) == SOCKET_ERROR) { - printf("Listen failed"); - closesocketCheck(server_socket); - WSACleanup(); - exit(EXIT_FAILURE); - } - - // Step 5) accept connections from clients - printf("Waiting for clients to connect...\n"); - while (num_clients < MAX_CLIENTS) { - if ((new_socket = accept(server_socket, (struct sockaddr *)&address, &addrlen)) == INVALID_SOCKET) { - printf("Accept failed"); - closesocketCheck(server_socket); - WSACleanup(); - exit(EXIT_FAILURE); - } - client_sockets[num_clients++] = new_socket; - printf("Client %d connected\n", num_clients); - } - - // Step 6) send the NCCL ID to all clients - send_nccl_id_to_clients_windows(&nccl_id, client_sockets, num_clients); - printf("NCCL ID sent to all clients\n"); - - closesocketCheck(server_socket); - } else { - int num_connection_attempts = 5; - int time_to_sleep = 2; - SOCKET client_socket; - struct sockaddr_in serv_addr; - - // Step 1) create a client TCP socket - if ((client_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { - printf("Socket creation error"); - WSACleanup(); - exit(EXIT_FAILURE); - } - - // Step 2) set the server address and port - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(SERVER_PORT); - if (inet_pton(AF_INET, server_ip, &serv_addr.sin_addr) <= 0) { - printf("Invalid address or address not supported"); - closesocketCheck(client_socket); - WSACleanup(); - exit(EXIT_FAILURE); - } - - // Step 3) Try to connect to the server - retry up to `num_connection_attempts` times if the connection fails - while (connect(client_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR) { - printf("%d Connection failed, retrying in %d seconds\n", result->process_rank, time_to_sleep); - if (--num_connection_attempts == 0) { - printf("Failed to connect to the server\n"); - closesocketCheck(client_socket); - WSACleanup(); - exit(EXIT_FAILURE); - } - Sleep(time_to_sleep * 1000); - } - - // Step 4) receive the NCCL ID from the server - if (recv(client_socket, (char *)&nccl_id, sizeof(nccl_id), 0) <= 0) { - printf("Failed to receive nccl_id"); - closesocketCheck(client_socket); - WSACleanup(); - exit(EXIT_FAILURE); - } - - printf("Received NCCL ID\n"); - closesocketCheck(client_socket); - } - - WSACleanup(); - return nccl_id; -} -#else -ncclUniqueId get_nccl_id_via_tcp(MultiGpuConfig* result, const char* server_ip) { - ncclUniqueId nccl_id; - - int SERVER_PORT = 12345; // hardcoded an arbitrary port number between 1024 and 49151 (registered ports) - if (result->process_rank == 0) { - ncclCheck(ncclGetUniqueId(&nccl_id)); - - int MAX_CLIENTS = result->num_processes - 1; - int client_sockets[MAX_CLIENTS]; - int num_clients = 0; - int server_socket, new_socket; - struct sockaddr_in address; - int addrlen = sizeof(address); - int opt = 1; - - // Step 1) create a server TCP socket - if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - printf("Socket failed"); - exit(EXIT_FAILURE); - } - - // Step 2) set socket options - // SOL_SOCKET - means that option is configured at socket level - // SO_REUSEADDR - allows to bind to an address which is in a TIME_WAIT state (already used by another socket) - useful when restarting the server - // SO_REUSEPORT - allows to bind to the same port multiple times - if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)) < 0) { - printf("Setsockopt failed"); - exit(EXIT_FAILURE); - } - - // Step 3) set the server address and port - address.sin_family = AF_INET; // IPv4 - address.sin_addr.s_addr = inet_addr(server_ip); // alternatively use INADDR_ANY to bind to all interfaces, currently we only allow ethernet - address.sin_port = htons(SERVER_PORT); - - // Step 4) bind the socket to the address and port - if (bind(server_socket, (struct sockaddr *)&address, sizeof(address)) < 0) { - printf("Bind failed"); - exit(EXIT_FAILURE); - } - - // Step 5) MAX_CLIENTS specifies the maximum number of clients that can be queued for this server - if (listen(server_socket, MAX_CLIENTS) < 0) { - printf("Listen failed"); - exit(EXIT_FAILURE); - } - - // Step 6) accept connections from clients - printf("Waiting for clients to connect...\n"); - while (num_clients < MAX_CLIENTS) { - if ((new_socket = accept(server_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { - printf("Accept failed"); - exit(EXIT_FAILURE); - } - client_sockets[num_clients++] = new_socket; - printf("Client %d connected\n", num_clients); - } - - // Step 7) send the NCCL ID to all clients - send_nccl_id_to_clients(&nccl_id, client_sockets, num_clients); - printf("NCCL ID sent to all clients\n"); - - scloseCheck(server_socket); - } else { - int num_connection_attempts = 5; - int time_to_sleep = 2; - int client_socket; - struct sockaddr_in serv_addr; - - // Step 1) create a client TCP socket - if ((client_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - printf("Socket creation error"); - exit(EXIT_FAILURE); - } - - // Step 2) set the server address and port - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(SERVER_PORT); - if (inet_pton(AF_INET, server_ip, &serv_addr.sin_addr) <= 0) { - printf("Invalid address or address not supported"); - exit(EXIT_FAILURE); - } - - // Step 3) Try to connect to the server - retry up to `num_connection_attempts` times if the connection fails - while (connect(client_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { - printf("%d Connection failed, retrying in %d seconds\n", result->process_rank, time_to_sleep); - if (--num_connection_attempts == 0) { - printf("Failed to connect to the server\n"); - exit(EXIT_FAILURE); - } - sleep(time_to_sleep); - } - - // Step 4) receive the NCCL ID from the server - if (recv(client_socket, &nccl_id, sizeof(nccl_id), 0) <= 0) { - printf("Failed to receive nccl_id"); - exit(EXIT_FAILURE); - } - - printf("Received NCCL ID\n"); - scloseCheck(client_socket); - } - - return nccl_id; -} -#endif - -ncclUniqueId get_nccl_id_via_fs(MultiGpuConfig* result, char* fs_path) { - // Works assuming that the filesystem is shared among all processes - ncclUniqueId nccl_id; - FILE* idFile; - static char filename[1024]; - snprintf(filename, sizeof(filename), "%s/ncclUniqueId.sync", fs_path); - - if (result->process_rank != 0) { // client processse should wait for the server to write to the file - // This is a naive and not 100% robust way to synchronize the processes but it should work almost always - sleep(2); - } - - if (result->process_rank == 0) { - ncclCheck(ncclGetUniqueId(&nccl_id)); - idFile = fopen(filename, "wb"); - assert(idFile != NULL); - fwriteCheck(&nccl_id, sizeof(nccl_id), 1, idFile); - fcloseCheck(idFile); - } else { - // Other ranks wait until the file is available and read the unique ID - do { - sleep(1); // 1 second - idFile = fopen(filename, "rb"); - if (idFile != NULL) break; - } while (idFile == NULL); - freadCheck(&nccl_id, sizeof(nccl_id), 1, idFile); - fcloseCheck(idFile); - } - - return nccl_id; -} - -#ifdef USE_MPI -// Determine which GPU this process should use. -// Processes on the same machines use different GPU indicies. Processes on other machines don't. -// Copied from NCCL examples: https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/examples.html#example-2-one-device-per-process-or-thread -int multi_gpu_get_local_device_idx(int process_rank, int num_processes) { - char hostname[1024]; - hostname[1023] = '\0'; - // All processes on the same machine will share the same hostname. - gethostname(hostname, 1023); - for (int i=0; i < 1024; i++) { - if (hostname[i] == '.') { - hostname[i] = '\0'; - break; - } - } - uint64_t hostname_hash = 5381u; - for (int c = 0; hostname[c] != '\0'; c++){ hostname_hash = ((hostname_hash << 5u) + hostname_hash) ^ hostname[c]; } - - // Distribute all hostname hashes to all processes. - uint64_t* all_hostsname_hashes = (uint64_t*)malloc(num_processes * sizeof(uint64_t)); - all_hostsname_hashes[process_rank] = hostname_hash; - mpiCheck(MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, all_hostsname_hashes, sizeof(uint64_t), MPI_BYTE, MPI_COMM_WORLD)); - - // Identify which GPU we need to use. - int local_device_idx = 0; - for (int current_process = 0; current_process < num_processes; ++current_process) { - if (current_process == process_rank) { - // Found my gpu, local_device_idx now has my target GPU index. - break; - } - if (all_hostsname_hashes[current_process] == all_hostsname_hashes[process_rank]) { - // This process ID runs on the same machine, but it's not me, skip this GPU - local_device_idx++; - } - } - - free(all_hostsname_hashes); - return local_device_idx; -} -#endif - -#endif - -MultiGpuConfig multi_gpu_config_init(int num_processes, int process_rank, int gpus_per_node, char* server_ip, char* fs_path, char* init_method) { -#ifdef MULTI_GPU - MultiGpuConfig result; - ncclUniqueId nccl_id; - // Get nccl_id using MPI, TCP, or FS (file system synchronization) methods - // On newer slurm versions (slurm-wlm package) PMIx is disabled so we can not use MPI for NCCL init in multi node setup - if (strcmp(init_method, "mpi") == 0) { - #ifdef USE_MPI - mpiCheck(MPI_Init(NULL, NULL)); - mpiCheck(MPI_Comm_rank(MPI_COMM_WORLD, &result.process_rank)); - mpiCheck(MPI_Comm_size(MPI_COMM_WORLD, &result.num_processes)); - result.local_device_idx = multi_gpu_get_local_device_idx(result.process_rank, result.num_processes); - if (result.process_rank == 0) { - ncclCheck(ncclGetUniqueId(&nccl_id)); - } - mpiCheck(MPI_Bcast(&nccl_id, sizeof(nccl_id), MPI_BYTE, 0, MPI_COMM_WORLD)); - #else - printf("MPI support is disabled. Please enable MPI support to use MPI-based NCCL-init method.\n"); - exit(EXIT_FAILURE); - #endif - } else { - result.process_rank = process_rank; - result.num_processes = num_processes; - result.local_device_idx = process_rank % gpus_per_node; - if (strcmp(init_method, "tcp") == 0) { - #ifdef _WIN32 - nccl_id = get_nccl_id_via_tcp_windows(&result, server_ip); - #else - nccl_id = get_nccl_id_via_tcp(&result, server_ip); - #endif - } else if (strcmp(init_method, "fs") == 0) { - nccl_id = get_nccl_id_via_fs(&result, fs_path); - } else { - printf("Invalid NCCL-init method\n"); - exit(EXIT_FAILURE); - } - } - cudaCheck(cudaSetDevice(result.local_device_idx)); - ncclCheck(ncclCommInitRank(&result.nccl_comm, result.num_processes, nccl_id, result.process_rank)); - cudaCheck(cudaStreamCreate(&result.nccl_stream)); - // event without timing for maximum performance - cudaCheck(cudaEventCreate(&result.compute_nccl_sync, cudaEventDisableTiming)); - nvtxNameCudaStreamA(result.nccl_stream, "nccl stream"); - nvtxNameCudaEventA(result.compute_nccl_sync, "nccl compute sync"); - cudaCheck(cudaMallocManaged(&result.unified_buffer, sizeof(float))); - return result; -#else - printf("Multi-GPU support is disabled. Using a single GPU.\n"); - cudaCheck(cudaSetDevice(0)); - MultiGpuConfig result; - result.process_rank = 0; - result.num_processes = 1; - result.local_device_idx = 0; - return result; -#endif -} - -void multi_gpu_config_free(MultiGpuConfig* config) { -#ifdef MULTI_GPU - ncclCheck(ncclCommDestroy(config->nccl_comm)); - cudaCheck(cudaStreamDestroy(config->nccl_stream)); - cudaCheck(cudaEventDestroy(config->compute_nccl_sync)); - cudaCheck(cudaFree(config->unified_buffer)); - #ifdef USE_MPI - mpiCheck(MPI_Finalize()); - #endif -#endif -} - -void multi_gpu_barrier(const MultiGpuConfig* config) { -#ifdef MULTI_GPU - if (config->num_processes > 1) { - ncclCheck(ncclAllReduce(config->unified_buffer, config->unified_buffer, sizeof(float), ncclFloat, ncclSum, config->nccl_comm, config->nccl_stream)); - } - cudaCheck(cudaDeviceSynchronize()); -#endif -} - -// Offset and size of a tensor shard -typedef struct { - ptrdiff_t offset; - size_t size; -} ShardInfo; - -// Get info about sharding for a tensor of elements many numbers -ShardInfo multi_gpu_get_shard_offset(size_t elements, const MultiGpuConfig* config, int shard_at_stage) { - const int nproc = config->num_processes; - if(config->zero_stage >= shard_at_stage) { - if (elements % nproc != 0) { - fprintf(stderr, "Number of elements %zu must be a multiple of the number of processes %d\n", elements, nproc); - exit(EXIT_FAILURE); - } - return {(ptrdiff_t) (config->process_rank * (elements / nproc)), elements / nproc}; - } else { - return {0, elements}; - } -} - -// Block NCCL stream until computations on compute_stream are done, then aggregate multiple pointers in an NCCL group. -// This can work either as an all-reduce (i.e., no ZeRo), or a reduce-scatter (ZeRO 1). -// The awkward `(&pointers)[N]` syntax ensures we are capturing the parameters as sized arrays, so that it becomes impossible -// to call this function if pointers and pointers_sizes do not match. -template -void multi_gpu_async_reduce_gradient( - floatX* const (&pointers)[N], const size_t (&pointers_sizes)[N], - MultiGpuConfig* config, cudaStream_t compute_stream) { - if (config->num_processes == 1) { - return; // no multi-GPU, just exit. - } - -#ifdef MULTI_GPU - NVTX_RANGE_FN(); - // mark an event on the compute stream, and immediately wait on this in the nccl stream - // this means that the nccl stream won't start executing before all compute kernels that - // have been submitted before this point have finished. - // by using an event instead of cudaSyncStream, we avoid having to synchronize the host, and - // can enqueue new work to the GPU right away. - cudaCheck(cudaEventRecord(config->compute_nccl_sync, compute_stream)); - cudaCheck(cudaStreamWaitEvent(config->nccl_stream, config->compute_nccl_sync)); - ncclCheck(ncclGroupStart()); // NCCL group: aggregate all pointers in a single NCCL GPU kernel. - for (int i = 0; i < N; ++i) { - if(config->zero_stage == 0) { - ncclCheck(ncclAllReduce( - pointers[i], pointers[i], - pointers_sizes[i], - ncclFloatX, ncclAvg, - config->nccl_comm, config->nccl_stream - )); - } else if(config->zero_stage == 1) { - assert(pointers_sizes[i] % config->num_processes == 0); - size_t shard_size = pointers_sizes[i] / config->num_processes; - ptrdiff_t shard_offset = (ptrdiff_t)shard_size * config->process_rank; - ncclCheck(ncclReduceScatter( - pointers[i], pointers[i] + shard_offset, - shard_size, - ncclFloatX, ncclAvg, - config->nccl_comm, config->nccl_stream - )); - } - } - ncclCheck(ncclGroupEnd()); -#endif -} - -// convenience macro that only prints if the rank of process is zero -#define printf0(...) if (::multi_gpu_config.process_rank == 0) { printf(__VA_ARGS__); } - -void set_zero_configs(MultiGpuConfig* config, int zero_stage, size_t total_parameters) { - config->zero_stage = 0; - config->shard_num_parameters = total_parameters; - // Check the Zero Stage and define sharding parameters - if (zero_stage == 0) { - printf0("| Zero Optimization is disabled |\n"); - } - else if (zero_stage == 1) { - if (total_parameters % config->num_processes != 0) { - printf0("| Zero Optimization is disabled, Can't equally partition parameters |\n"); - config->zero_stage = 0; - } - else { - config->zero_stage = 1; - config->shard_num_parameters = total_parameters / config->num_processes; - } - } - else{ - printf0("| Disabling Zero Optimization, Zero Stage2 and Stage3 are not yet supported |\n"); - config->zero_stage = 0; - } -} - -// Compute sum of a single CPU value across all GPU processes. No-op when multi-GPU is disabled. -float multi_gpu_cpu_float_sum(float value, MultiGpuConfig* config) { -#ifdef MULTI_GPU - if (config->num_processes == 1) return value; - - float* unified_buffer = config->unified_buffer; - *unified_buffer = value; - ncclCheck(ncclAllReduce(unified_buffer, unified_buffer, sizeof(float), ncclFloat, ncclSum, config->nccl_comm, config->nccl_stream)); - cudaCheck(cudaDeviceSynchronize()); - return *unified_buffer; -#else - return value; -#endif -} - -#endif - diff --git a/CUDA/main.cu b/CUDA/main.cu deleted file mode 100644 index 4b24fec..0000000 --- a/CUDA/main.cu +++ /dev/null @@ -1,2070 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "llmcpp/utils.h" - -#include "llmcpp/tokenizer.h" - -#include "llmcpp/dataloader.h" - -#include "llmcpp/rand.h" - -#include "llmcpp/schedulers.h" - -#include "llmcpp/sampler.h" - -#include "llmcpp/logger.h" - -#include "llmcpp/mfu.h" - -#include "llmcpp/outlier_detector.h" - -#include "llmcpp/cuda_common.h" - -#include "llmcpp/cuda_utils.cuh" - -#include "llmcpp/cublas_common.h" - -#include "llmcpp/encoder.cuh" - -#include "llmcpp/layernorm.cuh" - -#include "llmcpp/matmul.cuh" -#ifdef ENABLE_CUDNN - -#include "llmcpp/cudnn_att.h" -#else - -#include "llmcpp/attention.cuh" -#endif - -#include "llmcpp/fused_classifier.cuh" - -#include "llmcpp/adamw.cuh" - -#include "llmcpp/global_norm.cuh" - -#include "llmcpp/zero.cuh" - -char filename_buffer[512]; - -cudaDeviceProp deviceProp; -cudaStream_t main_stream; - -constexpr const size_t IO_BUF_SIZE = 32 * 1024 * 1024; - -typedef struct -{ - int max_seq_len; - int vocab_size; - int padded_vocab_size; - int num_layers; - int num_heads; - int channels; -} GPT2Config; - -constexpr const int NUM_PARAMETER_TENSORS = 16; -typedef struct -{ - floatX *wte; - floatX *wpe; - floatX *ln1w; - floatX *ln1b; - floatX *qkvw; - floatX *qkvb; - floatX *attprojw; - floatX *attprojb; - floatX *ln2w; - floatX *ln2b; - floatX *fcw; - floatX *fcb; - floatX *fcprojw; - floatX *fcprojb; - floatX *lnfw; - floatX *lnfb; -} ParameterTensors; -static_assert(sizeof(ParameterTensors) == NUM_PARAMETER_TENSORS * sizeof(void *), "Inconsistent sizes!"); - -void fill_in_parameter_sizes(size_t *param_sizes, size_t *param_sizeof, GPT2Config config) -{ - size_t Vp = config.padded_vocab_size; - size_t C = config.channels; - size_t maxT = config.max_seq_len; - size_t L = config.num_layers; - param_sizes[0] = Vp * C; - param_sizes[1] = maxT * C; - param_sizes[2] = L * C; - param_sizes[3] = L * C; - param_sizes[4] = L * (3 * C) * C; - param_sizes[5] = L * (3 * C); - param_sizes[6] = L * C * C; - param_sizes[7] = L * C; - param_sizes[8] = L * C; - param_sizes[9] = L * C; - param_sizes[10] = L * (4 * C) * C; - param_sizes[11] = L * (4 * C); - param_sizes[12] = L * C * (4 * C); - param_sizes[13] = L * C; - param_sizes[14] = C; - param_sizes[15] = C; - - for (int i = 0; i < NUM_PARAMETER_TENSORS; i++) - { - param_sizeof[i] = sizeof(floatX); - } -} - -void *malloc_and_point_parameters(ParameterTensors *params, size_t *param_elements, size_t *param_sizeof) -{ - - size_t num_parameters_bytes = 0; - for (int i = 0; i < NUM_PARAMETER_TENSORS; i++) - { - num_parameters_bytes += param_elements[i] * param_sizeof[i]; - } - - void *params_memory; - cudaCheck(cudaMalloc((void **)¶ms_memory, num_parameters_bytes)); - - floatX **ptrs[] = { - ¶ms->wte, ¶ms->wpe, ¶ms->ln1w, ¶ms->ln1b, ¶ms->qkvw, ¶ms->qkvb, - ¶ms->attprojw, ¶ms->attprojb, ¶ms->ln2w, ¶ms->ln2b, ¶ms->fcw, ¶ms->fcb, - ¶ms->fcprojw, ¶ms->fcprojb, ¶ms->lnfw, ¶ms->lnfb}; - char *params_memory_iterator = (char *)params_memory; - for (int i = 0; i < NUM_PARAMETER_TENSORS; i++) - { - *(ptrs[i]) = (floatX *)params_memory_iterator; - params_memory_iterator += param_elements[i] * param_sizeof[i]; - } - return params_memory; -} - -constexpr int NUM_ACTIVATION_TENSORS = 21; -typedef struct -{ - floatX *encoded; - floatX *ln1; - float *ln1_mean; - float *ln1_rstd; - floatX *atty; - -#if ENABLE_CUDNN - float *att; -#else - floatX *att; -#endif - - floatX *residual2; - floatX *ln2; - float *ln2_mean; - float *ln2_rstd; - floatX *fch; - floatX *fch_gelu; - floatX *residual3; - floatX *lnf; - float *lnf_mean; - float *lnf_rstd; - float *losses; - - floatX *qkvr; - - floatX *output; - - floatX *scratch_bt4c; - floatX *scratch_btc; -} ActivationTensors; - -struct TensorSpec -{ - void **ptr; - size_t size; - DType type; -}; - -#define TENSOR_SPEC(pointer, size) TensorSpec{(void **)(&pointer), (size), dtype_of(pointer)}; - -void fill_in_activation_sizes(const ActivationTensors *data, TensorSpec (&tensors)[NUM_ACTIVATION_TENSORS], size_t B, size_t T, GPT2Config config, int recompute) -{ - size_t Vp = config.padded_vocab_size; - size_t L = config.num_layers; - size_t NH = config.num_heads; - size_t C = config.channels; - tensors[0] = TENSOR_SPEC(data->encoded, B * T * C); - - tensors[1] = TENSOR_SPEC(data->ln1, (recompute < 2) ? L * B * T * C : 0); - tensors[2] = TENSOR_SPEC(data->ln1_mean, L * B * T); - tensors[3] = TENSOR_SPEC(data->ln1_rstd, L * B * T); - tensors[4] = TENSOR_SPEC(data->atty, L * B * T * C); -#ifdef ENABLE_CUDNN - - tensors[5] = TENSOR_SPEC(data->att, L * B * NH * T); -#else - tensors[5] = TENSOR_SPEC(data->att, L * B * NH * T * T); -#endif - tensors[6] = TENSOR_SPEC(data->residual2, L * B * T * C); - - tensors[7] = TENSOR_SPEC(data->ln2, (recompute < 2) ? L * B * T * C : 0); - tensors[8] = TENSOR_SPEC(data->ln2_mean, L * B * T); - tensors[9] = TENSOR_SPEC(data->ln2_rstd, L * B * T); - tensors[10] = TENSOR_SPEC(data->fch, L * B * T * 4 * C); - - tensors[11] = TENSOR_SPEC(data->fch_gelu, (recompute < 1) ? L * B * T * 4 * C : B * T * 4 * C); - tensors[12] = TENSOR_SPEC(data->residual3, L * B * T * C); - tensors[13] = TENSOR_SPEC(data->lnf, B * T * C); - tensors[14] = TENSOR_SPEC(data->lnf_mean, B * T); - tensors[15] = TENSOR_SPEC(data->lnf_rstd, B * T); - tensors[16] = TENSOR_SPEC(data->losses, B * T); - tensors[17] = TENSOR_SPEC(data->qkvr, L * B * T * 3 * C); - tensors[18] = TENSOR_SPEC(data->output, B * T * max(3 * C, max(NH * T, Vp))); - - tensors[19] = TENSOR_SPEC(data->scratch_bt4c, B * T * 4 * C); - tensors[20] = TENSOR_SPEC(data->scratch_btc, B * T * C); -} - -void *malloc_and_point_activations(TensorSpec (&tensors)[NUM_ACTIVATION_TENSORS]) -{ - size_t bytes = 0; - for (size_t i = 0; i < NUM_ACTIVATION_TENSORS; i++) - { - bytes += tensors[i].size * sizeof_dtype(tensors[i].type); - } - - printf0("allocating %d MiB for activations\n", (int)round(bytes / (1024 * 1024))); - - void *acts_memory; - cudaCheck(cudaMalloc((void **)&acts_memory, bytes)); - - cudaCheck(cudaMemset(acts_memory, 0, bytes)); - - char *acts_memory_iterator = (char *)acts_memory; - for (size_t i = 0; i < NUM_ACTIVATION_TENSORS; i++) - { - - if (tensors[i].size == 0) - { - *(tensors[i].ptr) = NULL; - } - else - { - *(tensors[i].ptr) = acts_memory_iterator; - acts_memory_iterator += tensors[i].size * sizeof_dtype(tensors[i].type); - } - } - return acts_memory; -} - -typedef struct -{ - GPT2Config config; - - ParameterTensors params; - size_t param_elements[NUM_PARAMETER_TENSORS]; - size_t param_sizeof[NUM_PARAMETER_TENSORS]; - void *params_memory; - size_t num_parameters; - size_t num_parameters_bytes; - - ParameterTensors grads; - void *grads_memory; - - float *m_memory; - float *v_memory; - float *master_weights; - - ActivationTensors acts; - TensorSpec acts_specs[NUM_ACTIVATION_TENSORS]; - void *acts_memory; - - int batch_size; - int seq_len; - int *inputs; - int *targets; - float mean_loss; - float *accumulated_mean_loss; - float *cpu_losses; - unsigned long long rng_state; - unsigned long long rng_state_last_update; - int use_master_weights; - bool init_state; - int gelu_fusion; - int recompute; - - int *workload_indices; - int4 *bucket_info; -} GPT2; - -void gpt2_init_common(GPT2 *model) -{ - - model->acts_memory = NULL; - model->inputs = NULL; - model->targets = NULL; - model->accumulated_mean_loss = NULL; - model->cpu_losses = NULL; - - model->batch_size = 0; - model->seq_len = 0; - model->mean_loss = -1.0f; - model->params_memory = NULL; - - model->grads_memory = NULL; - model->workload_indices = NULL; - model->bucket_info = NULL; - - model->m_memory = NULL; - model->v_memory = NULL; - model->master_weights = NULL; - - model->rng_state = 13371337 + multi_gpu_config.process_rank; - model->use_master_weights = 1; - model->init_state = true; - model->recompute = 1; - model->gelu_fusion = 0; -} - -void gpt2_allocate_weights(GPT2 *model) -{ - - fill_in_parameter_sizes(model->param_elements, model->param_sizeof, model->config); - model->num_parameters = 0; - model->num_parameters_bytes = 0; - for (int i = 0; i < NUM_PARAMETER_TENSORS; i++) - { - model->num_parameters += model->param_elements[i]; - model->num_parameters_bytes += model->param_elements[i] * model->param_sizeof[i]; - } - - assert(model->params_memory == nullptr); - model->params_memory = malloc_and_point_parameters(&model->params, model->param_elements, model->param_sizeof); -} - -void gpt2_allocate_state(GPT2 *model, int B, int T) -{ - printf0("allocating %d MiB for parameter gradients\n", (int)round(model->num_parameters * sizeof(floatX) / (1024 * 1024))); - assert(model->grads_memory == nullptr); - model->grads_memory = malloc_and_point_parameters(&model->grads, model->param_elements, model->param_sizeof); - - model->batch_size = B; - model->seq_len = T; - - fill_in_activation_sizes(&model->acts, model->acts_specs, B, T, model->config, model->recompute); - model->acts_memory = malloc_and_point_activations(model->acts_specs); - - cudaCheck(cudaMalloc((void **)&model->inputs, B * T * sizeof(int))); - cudaCheck(cudaMalloc((void **)&model->targets, B * T * sizeof(int))); - cudaCheck(cudaMalloc(((void **)&model->accumulated_mean_loss), sizeof(float))); - cudaCheck(cudaMallocHost((void **)&model->cpu_losses, B * T * sizeof(float))); - - size_t num_c_groups = CEIL_DIV(model->config.channels, (WARP_SIZE * x128::size)); - assert((size_t)(model->batch_size * model->seq_len) * num_c_groups < (1ULL << 31ULL)); - model->workload_indices = (int *)mallocCheck(sizeof(int) * model->batch_size * model->seq_len * num_c_groups); - model->bucket_info = (int4 *)mallocCheck(sizeof(int4) * model->batch_size * model->seq_len * num_c_groups); - - int memory_status = 0; - - size_t shard_num_parameters = multi_gpu_config.shard_num_parameters; - printf0("allocating %zu MiB for AdamW optimizer state m\n", (shard_num_parameters * sizeof(float)) >> 20); - printf0("allocating %zu MiB for AdamW optimizer state v\n", (shard_num_parameters * sizeof(float)) >> 20); - assert(model->m_memory == nullptr); - assert(model->v_memory == nullptr); - memory_status |= cudaMallocConditionallyManaged((void **)&model->m_memory, shard_num_parameters * sizeof(float)); - memory_status |= cudaMallocConditionallyManaged((void **)&model->v_memory, shard_num_parameters * sizeof(float)); - - if (model->use_master_weights == 1) - { - assert(model->master_weights == nullptr); - printf0("allocating %zu MiB for master copy of params\n", (shard_num_parameters * sizeof(float)) >> 20); - memory_status |= cudaMallocConditionallyManaged((void **)&model->master_weights, shard_num_parameters * sizeof(float)); - } - - int reduced_memory_status = (int)multi_gpu_cpu_float_sum((float)memory_status, &multi_gpu_config); - if (reduced_memory_status >= 1) - { - printf0("WARNING: Fell back to cudaMallocManaged when initializing m,v,master_weights on %d GPUs\n", reduced_memory_status); - printf0(" Prevents an OOM, but code may run much slower due to device <-> host memory movement\n"); - } - - size_t free, total; - cudaCheck(cudaMemGetInfo(&free, &total)); - printf0("device memory usage: %zd MiB / %zd MiB\n", (total - free) / 1024 / 1024, total / 1024 / 1024); - - size_t bytes_per_sequence = 0; - for (size_t i = 0; i < NUM_ACTIVATION_TENSORS; i++) - { - bytes_per_sequence += model->acts_specs[i].size * sizeof_dtype(model->acts_specs[i].type) / B; - } - printf0("memory per sequence: %zu MiB\n", bytes_per_sequence / 1024 / 1024); - printf0(" -> estimated maximum batch size: %zu\n", B + free / bytes_per_sequence); -} - -void gpt2_write_to_checkpoint(GPT2 *model, const char *checkpoint_path) -{ - - printf0("Writing model to %s\n", checkpoint_path); - FILE *model_file = fopenCheck(checkpoint_path, "wb"); - - int model_header[256]; - memset(model_header, 0, sizeof(model_header)); - model_header[0] = 20240326; - assert(PRECISION_MODE == PRECISION_FP32 || PRECISION_MODE == PRECISION_BF16); - model_header[1] = PRECISION_MODE == PRECISION_FP32 ? 3 : 5; - model_header[2] = model->config.max_seq_len; - model_header[3] = model->config.vocab_size; - model_header[4] = model->config.num_layers; - model_header[5] = model->config.num_heads; - model_header[6] = model->config.channels; - model_header[7] = model->config.padded_vocab_size; - fwriteCheck(model_header, sizeof(int), 256, model_file); - - device_to_file(model_file, model->params_memory, model->num_parameters_bytes, - IO_BUF_SIZE, main_stream); - - fcloseCheck(model_file); -} - -void gpt2_build_from_checkpoint(GPT2 *model, const char *checkpoint_path, bool weight_init = true) -{ - - if (PRECISION_MODE == PRECISION_FP16) - { - - fprintf(stderr, "build_from_checkpoint() does not support fp16 right now.\n"); - exit(EXIT_FAILURE); - } - - FILE *model_file = fopenCheck(checkpoint_path, "rb"); - int model_header[256]; - freadCheck(model_header, sizeof(int), 256, model_file); - if (model_header[0] != 20240326) - { - printf("Bad magic model file\n"); - exit(EXIT_FAILURE); - } - int version = model_header[1]; - if (!(version == 3 || version == 5)) - { - - fprintf(stderr, "Bad version in model file\n"); - fprintf(stderr, "---> HINT: try to re-run `python train_gpt2.py`\n"); - exit(EXIT_FAILURE); - } - - if (weight_init) - { - if (PRECISION_MODE == PRECISION_BF16 && version != 5) - { - fprintf(stderr, "Precision is configured as BF16 but model at %s is not.\n", checkpoint_path); - fprintf(stderr, "---> HINT: are you sure you're loading a _bf16.bin file?\n"); - exit(EXIT_FAILURE); - } - if (PRECISION_MODE == PRECISION_FP32 && version != 3) - { - fprintf(stderr, "Precision is configured as FP32 but model at %s is not.\n", checkpoint_path); - fprintf(stderr, "---> HINT: to turn on FP32 you have to compile like: `make train_gpt2cu PRECISION=FP32`\n"); - fprintf(stderr, "---> HINT: are you sure you're loading a .bin file without any _bf16 in the name?\n"); - exit(EXIT_FAILURE); - } - } - - model->config.max_seq_len = model_header[2]; - model->config.vocab_size = model_header[3]; - model->config.num_layers = model_header[4]; - model->config.num_heads = model_header[5]; - model->config.channels = model_header[6]; - model->config.padded_vocab_size = model_header[7]; - - gpt2_allocate_weights(model); - - if (weight_init) - { - assert(model->params_memory != NULL); - file_to_device(model->params_memory, model_file, model->num_parameters_bytes, IO_BUF_SIZE, main_stream); - } - fcloseCheck(model_file); - - cudaCheck(cudaDeviceSynchronize()); -} - -void gpt2_set_hyperparameters(GPT2Config *config, const char *depth_str) -{ - int depth = atoi(depth_str); - assert(depth > 0); - int channels, num_heads; - if (depth == 6) - { - channels = 384; - num_heads = 6; - } - else if (depth == 12) - { - channels = 768; - num_heads = 12; - } - else if (depth == 24) - { - channels = 1024; - num_heads = 16; - } - else if (depth == 36) - { - channels = 1280; - num_heads = 20; - } - else if (depth == 48) - { - channels = 1600; - num_heads = 25; - } - else if (depth == 60) - { - channels = 1920; - num_heads = 30; - } - else if (depth == 72) - { - channels = 2880; - num_heads = 30; - } - else if (depth == 84) - { - channels = 3456; - num_heads = 36; - } - else - { - fprintf(stderr, "Unsupported GPT-2 depth: %d\n", depth); - exit(EXIT_FAILURE); - } - config->num_layers = depth; - config->channels = channels; - config->num_heads = num_heads; - config->max_seq_len = 1024; -} - -void gpt3_set_hyperparameters(GPT2Config *config, const char *channels_str) -{ - - int channels = atoi(channels_str); - assert(channels > 0); - int depth, head_size; - if (channels == 384) - { - depth = 6; - head_size = 64; - } - else if (channels == 768) - { - depth = 12; - head_size = 64; - } - else if (channels == 1024) - { - depth = 24; - head_size = 64; - } - else if (channels == 1536) - { - depth = 24; - head_size = 96; - } - else if (channels == 2048) - { - depth = 24; - head_size = 128; - } - else if (channels == 2560) - { - depth = 32; - head_size = 80; - } - else if (channels == 4096) - { - depth = 32; - head_size = 128; - } - else if (channels == 5140) - { - depth = 40; - head_size = 128; - } - else if (channels == 12288) - { - depth = 96; - head_size = 128; - } - else - { - fprintf(stderr, "Unsupported GPT-3 channels: %d\n", channels); - exit(EXIT_FAILURE); - } - assert(channels % head_size == 0); - config->num_layers = depth; - config->channels = channels; - config->num_heads = channels / head_size; - config->max_seq_len = 2048; -} - -void gpt_build_from_descriptor(GPT2 *model, const char *descriptor) -{ - - assert(descriptor != NULL); - size_t len = strlen(descriptor); - if (len > 1 && descriptor[0] == 'd') - { - gpt2_set_hyperparameters(&model->config, descriptor + 1); - } - else if (len > 6 && strncmp(descriptor, "gpt2:d", 6) == 0) - { - gpt2_set_hyperparameters(&model->config, descriptor + 6); - } - else if (len > 6 && strncmp(descriptor, "gpt3:c", 6) == 0) - { - gpt3_set_hyperparameters(&model->config, descriptor + 6); - } - else - { - fprintf(stderr, "Unsupported model descriptor: %s\n", descriptor); - exit(EXIT_FAILURE); - } - - model->config.vocab_size = 50257; - model->config.padded_vocab_size = 50304; - - gpt2_allocate_weights(model); - - mt19937_state init_rng; - manual_seed(&init_rng, 42); - floatX *params_memory_cpu = (floatX *)mallocCheck(model->num_parameters_bytes); - memset(params_memory_cpu, 0, model->num_parameters_bytes); - - float residual_scale = 1.0f / sqrtf(2.0f * model->config.num_layers); - - size_t L = model->config.num_layers; - size_t offset = 0; - for (int l = 0; l < L; l++) - { - offset = 0; - for (int i = 0; i < NUM_PARAMETER_TENSORS; i++) - { - - if (l == 0 && (i == 2 || i == 8 || i == 14)) - { - for (size_t j = 0; j < model->param_elements[i]; j++) - { - params_memory_cpu[offset + j] = 1.0f; - } - } - - if ((l == 0 && (i == 0 || i == 1)) || i == 4 || i == 6 || i == 10 || i == 12) - { - size_t n = model->param_elements[i]; - size_t layer_offset = 0; - if (i == 0) - { - - n = model->config.vocab_size * model->config.channels; - } - if (i == 4 || i == 6 || i == 10 || i == 12) - { - - assert(n % L == 0); - n = n / L; - layer_offset = l * n; - } - - float scale = (i == 6 || i == 12) ? 0.02f * residual_scale : 0.02f; - - float *fp32_buffer = (float *)mallocCheck(n * sizeof(float)); - normal_(fp32_buffer, n, 0.0f, scale, &init_rng); - for (size_t j = 0; j < n; j++) - { - params_memory_cpu[offset + layer_offset + j] = (floatX)fp32_buffer[j]; - } - free(fp32_buffer); - } - offset += model->param_elements[i]; - } - } - - cudaCheck(cudaMemcpy(model->params_memory, params_memory_cpu, model->num_parameters_bytes, cudaMemcpyHostToDevice)); - free(params_memory_cpu); -} - -void gpt2_forward(GPT2 *model, const int *inputs, size_t B, size_t T) -{ - NVTX_RANGE_FN(); - - if (model->params_memory == NULL) - { - printf("Error: model was not initialized properly.\n"); - exit(EXIT_FAILURE); - } - - const size_t V = model->config.vocab_size; - const size_t Vp = model->config.padded_vocab_size; - const size_t L = model->config.num_layers; - const size_t NH = model->config.num_heads; - const size_t C = model->config.channels; - - if (B > model->batch_size || T > model->seq_len) - { - printf("Model: B=%d T=%d, Desired: B=%d T=%d\n", model->batch_size, model->seq_len, (int)B, (int)T); - exit(EXIT_FAILURE); - } - - cudaCheck(cudaMemcpy(model->inputs, inputs, B * T * sizeof(int), cudaMemcpyHostToDevice)); - - tokenCheck(inputs, B * T, V); - - ParameterTensors params = model->params; - ActivationTensors acts = model->acts; - encoder_forward(acts.encoded, model->inputs, params.wte, params.wpe, B, T, C, main_stream); - - layernorm_forward((model->recompute < 2) ? acts.ln1 : acts.lnf, acts.ln1_mean, acts.ln1_rstd, acts.encoded, params.ln1w, params.ln1b, B, T, C, main_stream); - - for (int l = 0; l < L; l++) - { - NvtxRange layer_range("Layer", l); - - floatX *residual = l == 0 ? acts.encoded : acts.residual3 + (l - 1) * B * T * C; - - floatX *l_qkvw = params.qkvw + l * 3 * C * C; - floatX *l_qkvb = params.qkvb + l * 3 * C; - floatX *l_attprojw = params.attprojw + l * C * C; - floatX *l_attprojb = params.attprojb + l * C; - floatX *l_ln2w = params.ln2w + l * C; - floatX *l_ln2b = params.ln2b + l * C; - floatX *l_fcw = params.fcw + l * 4 * C * C; - floatX *l_fcb = params.fcb + l * 4 * C; - floatX *l_fcprojw = params.fcprojw + l * C * 4 * C; - floatX *l_fcprojb = params.fcprojb + l * C; - - floatX *l_ln1 = (model->recompute < 2) ? acts.ln1 + l * B * T * C : acts.lnf; - floatX *l_qkvr = acts.qkvr + l * B * T * 3 * C; - floatX *l_atty = acts.atty + l * B * T * C; - floatX *l_residual2 = acts.residual2 + l * B * T * C; - floatX *l_ln2 = (model->recompute < 2) ? acts.ln2 + l * B * T * C : acts.lnf; - float *l_ln2_mean = acts.ln2_mean + l * B * T; - float *l_ln2_rstd = acts.ln2_rstd + l * B * T; - floatX *l_fch = acts.fch + l * B * T * 4 * C; - - floatX *l_fch_gelu = (model->recompute < 1) ? acts.fch_gelu + l * B * T * 4 * C : acts.fch_gelu; - floatX *l_residual3 = acts.residual3 + l * B * T * C; - floatX *scratch = (floatX *)acts.output; - -#ifdef ENABLE_CUDNN - float *l_att = (float *)acts.att + l * B * NH * T; - matmul_forward_cublaslt(l_qkvr, l_ln1, l_qkvw, l_qkvb, B, T, C, 3 * C, main_stream); - attention_forward_cudnn(l_atty, (float *)l_att, l_qkvr, B, T, NH, C, main_stream); -#else - floatX *l_att = acts.att + l * B * NH * T * T; - if (T != model->seq_len) - { - cudaCheck(cudaMemset(l_att, 0, B * NH * T * T * sizeof(floatX))); - } - - matmul_forward_cublaslt(scratch, l_ln1, l_qkvw, l_qkvb, B, T, C, 3 * C, main_stream); - attention_forward(l_atty, l_qkvr, l_att, scratch, B, T, C, NH, main_stream); -#endif - - matmul_forward_cublaslt(scratch, l_atty, l_attprojw, l_attprojb, B, T, C, C, main_stream); - fused_residual_forward5(l_residual2, l_ln2, l_ln2_mean, l_ln2_rstd, residual, scratch, l_ln2w, l_ln2b, B * T, C, main_stream); - matmul_forward_cublaslt(l_fch_gelu, l_ln2, l_fcw, l_fcb, B, T, C, 4 * C, main_stream, l_fch, model->gelu_fusion); - matmul_forward_cublaslt(scratch, l_fch_gelu, l_fcprojw, l_fcprojb, B, T, 4 * C, C, main_stream); - - if (l + 1 != L) - { - floatX *l_ln1 = (model->recompute < 2) ? acts.ln1 + (l + 1) * B * T * C : acts.lnf; - float *l_ln1_mean = acts.ln1_mean + (l + 1) * B * T; - float *l_ln1_rstd = acts.ln1_rstd + (l + 1) * B * T; - const floatX *l_ln1w = params.ln1w + (l + 1) * C; - const floatX *l_ln1b = params.ln1b + (l + 1) * C; - fused_residual_forward5(l_residual3, l_ln1, l_ln1_mean, l_ln1_rstd, l_residual2, scratch, l_ln1w, l_ln1b, - B * T, C, main_stream); - } - else - { - fused_residual_forward5(l_residual3, acts.lnf, acts.lnf_mean, acts.lnf_rstd, l_residual2, scratch, - params.lnfw, params.lnfb, - B * T, C, main_stream); - } - } - - matmul_forward_cublaslt(acts.output, acts.lnf, params.wte, NULL, B, T, C, Vp, main_stream); - cudaCheck(cudaDeviceSynchronize()); -} - -float gpt2_validate(GPT2 *model, const int *inputs, const int *targets, size_t B, size_t T) -{ - assert(targets != NULL); - - gpt2_forward(model, inputs, B, T); - - const size_t V = model->config.vocab_size; - const size_t Vp = model->config.padded_vocab_size; - - NvtxRange classifier_and_loss_range("classifier_and_loss"); - ActivationTensors acts = model->acts; - float mean_loss = 0.0f; - - const float dloss = 1.0f / (B * T); - - cudaCheck(cudaMemset(acts.losses, 0, B * T * sizeof(float))); - cudaCheck(cudaMemcpy(model->targets, targets, B * T * sizeof(int), cudaMemcpyHostToDevice)); - tokenCheck(targets, B * T, V); - fused_classifier(acts.output, acts.losses, dloss, model->targets, B, T, V, Vp, False, main_stream); - cudaCheck(cudaMemcpy(model->cpu_losses, acts.losses, B * T * sizeof(float), cudaMemcpyDeviceToHost)); - for (int i = 0; i < B * T; i++) - { - mean_loss += model->cpu_losses[i]; - } - mean_loss /= B * T; - cudaCheck(cudaDeviceSynchronize()); - return mean_loss; -} - -void gpt2_backward_and_reduce(GPT2 *model, int *inputs, const int *targets, int grad_accum_steps, int micro_step) -{ - if (model->grads_memory == nullptr) - { - fprintf(stderr, "Need to allocate gradients before backward"); - exit(EXIT_FAILURE); - } - NVTX_RANGE_FN(); - bool last_step = micro_step == grad_accum_steps - 1; - - if (micro_step == 0) - { - - cudaCheck(cudaMemsetAsync(model->acts.losses, 0, model->batch_size * model->seq_len * sizeof(float), main_stream)); - cudaCheck(cudaMemsetAsync(model->grads_memory, 0, model->num_parameters * sizeof(floatX), main_stream)); - } - - const size_t B = model->batch_size; - const size_t T = model->seq_len; - const size_t V = model->config.vocab_size; - const size_t Vp = model->config.padded_vocab_size; - const size_t L = model->config.num_layers; - const size_t NH = model->config.num_heads; - const size_t C = model->config.channels; - - ParameterTensors params = model->params; - ParameterTensors grads = model->grads; - ActivationTensors acts = model->acts; - - NvtxRange classifier_and_loss_range("classifier_and_loss"); - const float dloss = 1.0f / (float)(B * T * grad_accum_steps); - cudaCheck(cudaMemcpy(model->targets, targets, B * T * sizeof(int), cudaMemcpyHostToDevice)); - tokenCheck(targets, B * T, V); - fused_classifier(acts.output, acts.losses, dloss, model->targets, B, T, V, Vp, True, main_stream); - - floatX *dresidual = (floatX *)model->acts.scratch_btc; - cudaCheck(cudaMemset(dresidual, 0, B * T * C * sizeof(floatX))); - - float *scratchF = (float *)acts.output; - floatX *scratchX = (floatX *)acts.output; - - matmul_backward(model->acts.scratch_bt4c, grads.wte, NULL, acts.output, acts.lnf, params.wte, NULL, B, T, C, Vp, main_stream); - - floatX *residual = acts.residual3 + (L - 1) * B * T * C; - layernorm_backward(dresidual, grads.lnfw, grads.lnfb, scratchF, model->acts.scratch_bt4c, residual, params.lnfw, acts.lnf_mean, acts.lnf_rstd, B, T, C, main_stream); - - floatX *dl_btc = residual; - - for (int l = L - 1; l >= 0; l--) - { - NvtxRange layer_range("Layer", l); - - residual = l == 0 ? acts.encoded : acts.residual3 + (l - 1) * B * T * C; - - floatX *l_ln1w = params.ln1w + l * C; - floatX *l_ln1b = params.ln1b + l * C; - floatX *l_qkvw = params.qkvw + l * 3 * C * C; - floatX *l_attprojw = params.attprojw + l * C * C; - floatX *l_ln2w = params.ln2w + l * C; - floatX *l_ln2b = params.ln2b + l * C; - floatX *l_fcw = params.fcw + l * 4 * C * C; - floatX *l_fcprojw = params.fcprojw + l * C * 4 * C; - - floatX *dl_ln1w = grads.ln1w + l * C; - floatX *dl_ln1b = grads.ln1b + l * C; - floatX *dl_qkvw = grads.qkvw + l * 3 * C * C; - floatX *dl_qkvb = grads.qkvb + l * 3 * C; - floatX *dl_attprojw = grads.attprojw + l * C * C; - floatX *dl_attprojb = grads.attprojb + l * C; - floatX *dl_ln2w = grads.ln2w + l * C; - floatX *dl_ln2b = grads.ln2b + l * C; - floatX *dl_fcw = grads.fcw + l * 4 * C * C; - floatX *dl_fcb = grads.fcb + l * 4 * C; - floatX *dl_fcprojw = grads.fcprojw + l * C * 4 * C; - floatX *dl_fcprojb = grads.fcprojb + l * C; - - floatX *l_ln1 = (model->recompute < 2) ? acts.ln1 + l * B * T * C : acts.lnf; - float *l_ln1_mean = acts.ln1_mean + l * B * T; - float *l_ln1_rstd = acts.ln1_rstd + l * B * T; - floatX *l_qkvr = acts.qkvr + l * B * T * 3 * C; - floatX *l_atty = acts.atty + l * B * T * C; - floatX *l_residual2 = acts.residual2 + l * B * T * C; - floatX *l_ln2 = (model->recompute < 2) ? acts.ln2 + l * B * T * C : acts.lnf; - float *l_ln2_mean = acts.ln2_mean + l * B * T; - float *l_ln2_rstd = acts.ln2_rstd + l * B * T; - floatX *l_fch_pre_gelu = acts.fch + l * B * T * 4 * C; - floatX *l_fch_gelu = (model->recompute < 1) ? acts.fch_gelu + l * B * T * 4 * C : acts.fch_gelu; - - floatX *dl_bt4c = (floatX *)model->acts.scratch_bt4c; - - if (model->recompute >= 1) - { - - gelu_forward(l_fch_gelu, l_fch_pre_gelu, B * T * 4 * C, main_stream); - } - matmul_backward(dl_bt4c, dl_fcprojw, dl_fcprojb, dresidual, l_fch_gelu, l_fcprojw, scratchF, B, T, 4 * C, C, main_stream, l_fch_pre_gelu, model->gelu_fusion); - if (model->recompute >= 2) - { - - layernorm_forward(l_ln2, l_ln2_mean, l_ln2_rstd, l_residual2, l_ln2w, l_ln2b, B, T, C, main_stream); - } - matmul_backward(dl_btc, dl_fcw, dl_fcb, dl_bt4c, l_ln2, l_fcw, scratchF, B, T, C, 4 * C, main_stream); - - layernorm_backward(dresidual, dl_ln2w, dl_ln2b, scratchF, dl_btc, l_residual2, l_ln2w, l_ln2_mean, l_ln2_rstd, B, T, C, main_stream); - matmul_backward(dl_btc, dl_attprojw, dl_attprojb, dresidual, l_atty, l_attprojw, scratchF, B, T, C, C, main_stream); - -#ifdef ENABLE_CUDNN - float *l_att = (float *)acts.att + l * B * NH * T; - attention_backward_cudnn(dl_bt4c, dl_btc, l_qkvr, l_atty, (float *)l_att, B, T, NH, C, main_stream); -#else - floatX *l_att = acts.att + l * B * NH * T * T; - - floatX *buffer_a = l_atty; - floatX *buffer_b = l_fch_pre_gelu; - attention_backward(dl_bt4c, buffer_b, scratchX, buffer_a, dl_btc, l_qkvr, l_att, B, T, C, NH, main_stream); -#endif - if (model->recompute >= 2) - { - layernorm_forward(l_ln1, l_ln1_mean, l_ln1_rstd, residual, l_ln1w, l_ln1b, B, T, C, main_stream); - } - - matmul_backward(dl_btc, dl_qkvw, dl_qkvb, dl_bt4c, l_ln1, l_qkvw, scratchF, B, T, C, 3 * C, main_stream); - - layernorm_backward(dresidual, dl_ln1w, dl_ln1b, scratchF, dl_btc, residual, l_ln1w, l_ln1_mean, l_ln1_rstd, B, T, C, main_stream); - - if (last_step) - { - floatX *const pointers[] = { - dl_ln1w, dl_ln1b, - dl_qkvw, dl_qkvb, - dl_attprojw, dl_attprojb, - dl_ln2w, dl_ln2b, - dl_fcw, dl_fcb, - dl_fcprojw, dl_fcprojb}; - const size_t nelem[] = { - C, C, - 3 * C * C, 3 * C, - C * C, C, - C, C, - 4 * C * C, 4 * C, - C * 4 * C, C}; - multi_gpu_async_reduce_gradient(pointers, nelem, &multi_gpu_config, main_stream); - } - } - encoder_backward(grads.wte, grads.wpe, scratchX, model->workload_indices, model->bucket_info, - dresidual, model->inputs, inputs, B, T, C, random_u32(&model->rng_state), main_stream); - - if (last_step) - { - - global_sum_deterministic(model->accumulated_mean_loss, acts.losses, B * T, main_stream); - -#if MULTI_GPU - ncclCheck(ncclAllReduce(model->accumulated_mean_loss, model->accumulated_mean_loss, sizeof(float), ncclFloat, ncclAvg, multi_gpu_config.nccl_comm, main_stream)); -#endif - cudaCheck(cudaMemcpyAsync(&model->mean_loss, model->accumulated_mean_loss, sizeof(float), cudaMemcpyDeviceToHost, main_stream)); - - floatX *const pointers[] = {grads.wte, grads.wpe, grads.lnfw, grads.lnfb}; - const size_t nelem[] = {Vp * C, T * C, C, C}; - multi_gpu_async_reduce_gradient(pointers, nelem, &multi_gpu_config, main_stream); - } - - cudaCheck(cudaDeviceSynchronize()); - if (last_step) - { - model->mean_loss /= B * T * grad_accum_steps; - } - else - { - model->mean_loss = -1.f; - } -} - -ShardInfo gpt2_get_tensor_at_layer(const GPT2 *model, int layer_id, int param_tensor_id) -{ - - ptrdiff_t offset = 0; - for (int i = 0; i < param_tensor_id; i++) - { - offset += (ptrdiff_t)model->param_elements[i]; - } - size_t size = model->param_elements[param_tensor_id]; - - if (2 <= param_tensor_id && param_tensor_id <= 13) - { - size /= model->config.num_layers; - offset += (ptrdiff_t)(layer_id * size); - } - return {offset, size}; -} - -float gpt2_calculate_grad_norm(GPT2 *model, MultiGpuConfig *multi_gpu_config) -{ - NVTX_RANGE_FN(); - floatX *grads_memory = (floatX *)model->grads_memory; - - float *grad_norm_squared = (float *)model->acts.output; - float grad_norm_squared_cpu = 0.0f; - - int num_slices[2] = {1, model->config.num_layers}; - int max_num_block_sums = get_max_num_block_sums(num_slices, 2); - if (multi_gpu_config->zero_stage == 1) - { - - for (int i = 0; i < NUM_PARAMETER_TENSORS; i++) - { - ShardInfo tensor = gpt2_get_tensor_at_layer(model, 0, i); - ShardInfo shard = multi_gpu_get_shard_offset(tensor.size, multi_gpu_config, 1); - ptrdiff_t offset = tensor.offset + shard.offset; - bool is_first_pass = (i == 0); - if ((i < 2 || i > 13)) - { - global_norm_squared(grad_norm_squared, grads_memory + offset, shard.size, 0, 1, - max_num_block_sums, is_first_pass, main_stream); - } - else - { - global_norm_squared(grad_norm_squared, grads_memory + offset, shard.size, tensor.size, model->config.num_layers, - max_num_block_sums, is_first_pass, main_stream); - } - } - global_sum_deterministic(grad_norm_squared, grad_norm_squared, max_num_block_sums, main_stream); -#if MULTI_GPU - - ncclCheck(ncclAllReduce(grad_norm_squared, grad_norm_squared, sizeof(float), ncclFloat, ncclSum, multi_gpu_config->nccl_comm, main_stream)); -#endif - } - else - { - - global_norm_squared(grad_norm_squared, grads_memory, model->num_parameters, 0, 1, max_num_block_sums, true, main_stream); - global_sum_deterministic(grad_norm_squared, grad_norm_squared, max_num_block_sums, main_stream); - } - cudaCheck(cudaMemcpy(&grad_norm_squared_cpu, grad_norm_squared, sizeof(float), cudaMemcpyDeviceToHost)); - float grad_norm_cpu = sqrtf(grad_norm_squared_cpu); - return grad_norm_cpu; -} - -void gpt2_update(GPT2 *model, float learning_rate, float beta1, float beta2, float eps, float weight_decay, float grad_scale, int t, - MultiGpuConfig *multi_gpu_config, bool init_from_master_only = false) -{ - - NVTX_RANGE_FN(); - if (model->grads_memory == nullptr || model->m_memory == nullptr || model->v_memory == nullptr) - { - fprintf(stderr, "Need to allocate optimizer state before update"); - exit(EXIT_FAILURE); - } - - bool init_state = model->init_state; - if (init_state) - { - model->init_state = false; - NvtxRange rng("InitOpt"); - cudaCheck(cudaMemset(model->m_memory, 0, multi_gpu_config->shard_num_parameters * sizeof(float))); - cudaCheck(cudaMemset(model->v_memory, 0, multi_gpu_config->shard_num_parameters * sizeof(float))); - } - - model->rng_state_last_update = model->rng_state; - - for (int i = 0; i < NUM_PARAMETER_TENSORS; i++) - { - - unsigned int seed = random_u32(&model->rng_state); - - int num_layers = model->config.num_layers; - if ((i < 2 || i > 13)) - { - num_layers = 1; - } - - ShardInfo tensor = gpt2_get_tensor_at_layer(model, 0, i); - ShardInfo shard = multi_gpu_get_shard_offset(tensor.size, multi_gpu_config, 1); - ptrdiff_t local_offset_full = tensor.offset + shard.offset; - ptrdiff_t local_offset_partial = tensor.offset / multi_gpu_config->num_processes; - - float wd = (i == 0 || i == 1 || i == 4 || i == 6 || i == 10 || i == 12) ? weight_decay : 0.0f; - floatX *param_ptr = (floatX *)model->params_memory + local_offset_full; - floatX *grad_ptr = (floatX *)model->grads_memory + local_offset_full; - - ptrdiff_t opt_state_offset = multi_gpu_config->zero_stage < 1 ? local_offset_full : local_offset_partial; - float *m_ptr = model->m_memory + opt_state_offset; - float *v_ptr = model->v_memory + opt_state_offset; - float *master_ptr = nullptr; - if (model->master_weights != nullptr) - { - master_ptr = model->master_weights + opt_state_offset; - } - if (init_state && model->master_weights != nullptr) - { - size_t grid_size = CEIL_DIV(shard.size, 512); - copy_and_cast_kernel<<>>(master_ptr, param_ptr, shard.size, - shard.size, tensor.size); - cudaCheck(cudaGetLastError()); - } - - if (init_from_master_only) - { - - init_from_master(param_ptr, master_ptr, shard.size, tensor.size, shard.size, num_layers, seed, main_stream); - } - else - { - - adamw_update(param_ptr, master_ptr, grad_ptr, - m_ptr, v_ptr, - shard.size, tensor.size, tensor.size, shard.size, num_layers, - learning_rate, - beta1, beta2, t, eps, wd, grad_scale, seed, main_stream); - } - - if (multi_gpu_config->zero_stage == 1) - { -#if MULTI_GPU - ncclCheck(ncclGroupStart()); - for (int l = 0; l < num_layers; ++l) - { - - ncclCheck(ncclAllGather(param_ptr + l * tensor.size, - (floatX *)model->params_memory + tensor.offset + l * tensor.size, - shard.size, ncclFloatX, - multi_gpu_config->nccl_comm, multi_gpu_config->nccl_stream)); - } - ncclCheck(ncclGroupEnd()); -#endif - } - } - - cudaCheck(cudaDeviceSynchronize()); -} - -float gpt2_estimate_mfu(GPT2 *model, int num_tokens, float dt) -{ - - size_t N = model->num_parameters; - int L = model->config.num_layers; - int C = model->config.channels; - int T = model->seq_len; - size_t flops_per_token = 6 * N + (size_t)6 * L * C * T; - size_t flops_per_step = flops_per_token * num_tokens; - - float flops_achieved = (float)flops_per_step * (1.0f / dt); - float flops_promised = get_flops_promised(deviceProp.name, PRECISION_MODE) * 1e12f; - if (flops_promised < 0) - { - return -1.f; - } - float mfu = flops_achieved / flops_promised; - return mfu; -} - -void gpt2_free(GPT2 *model) -{ - cudaFreeCheck(&model->params_memory); - cudaFreeCheck(&model->grads_memory); - cudaFreeCheck(&model->m_memory); - cudaFreeCheck(&model->v_memory); - cudaFreeCheck(&model->master_weights); - cudaFreeCheck(&model->acts_memory); - cudaFreeCheck(&model->inputs); - cudaFreeCheck(&model->targets); - cudaFreeCheck(&model->accumulated_mean_loss); - cudaCheck(cudaFreeHost(model->cpu_losses)); - free(model->workload_indices); - free(model->bucket_info); -} - -void common_start(bool override_enable_tf32 = true, bool print_device_info = true) -{ - - cudaCheck(cudaGetDeviceProperties(&deviceProp, multi_gpu_config.local_device_idx)); - if (print_device_info) - { - printf("[System]\n"); - printf("Device %d: %s\n", multi_gpu_config.local_device_idx, deviceProp.name); - } - - cudaCheck(cudaStreamCreate(&main_stream)); - nvtxNameCudaStreamA(main_stream, "main stream"); - - cublasCheck(cublasLtCreate(&cublaslt_handle)); - cudaCheck(cudaMalloc(&cublaslt_workspace, cublaslt_workspace_size)); - - bool enable_tf32 = PRECISION_MODE == PRECISION_FP32 && deviceProp.major >= 8 && override_enable_tf32; - cublas_compute = enable_tf32 ? CUBLAS_COMPUTE_32F_FAST_TF32 : CUBLAS_COMPUTE_32F; - -#ifdef ENABLE_CUDNN - create_cudnn(); -#endif -} - -void common_free(GPT2 &model) -{ - cudaCheck(cudaStreamDestroy(main_stream)); - cudaCheck(cudaFree(cublaslt_workspace)); - cublasCheck(cublasLtDestroy(cublaslt_handle)); -#ifdef ENABLE_CUDNN - destroy_cudnn(); -#endif -} - -void save_state(const char *filename, int step, GPT2 *model, DataLoader *loader) -{ - printf("Writing state to %s\n", filename); - FILE *state_file = fopenCheck(filename, "wb"); - int state_header[256]; - memset(state_header, 0, sizeof(state_header)); - - state_header[0] = 20240527; - state_header[1] = 1; - state_header[2] = multi_gpu_config.num_processes; - state_header[3] = multi_gpu_config.process_rank; - state_header[4] = model->use_master_weights; - state_header[5] = loader->should_shuffle; - - state_header[10] = step; - - *((unsigned long long *)&state_header[20]) = model->rng_state; - *((unsigned long long *)&state_header[22]) = model->rng_state_last_update; - - *((size_t *)&state_header[30]) = loader->current_shard_idx; - *((size_t *)&state_header[32]) = loader->current_sample_idx; - fwriteCheck(state_header, sizeof(int), 256, state_file); - - size_t shard_num_parameters = multi_gpu_config.shard_num_parameters; - device_to_file(state_file, model->m_memory, shard_num_parameters * sizeof(float), IO_BUF_SIZE, main_stream); - device_to_file(state_file, model->v_memory, shard_num_parameters * sizeof(float), IO_BUF_SIZE, main_stream); - if (model->use_master_weights) - { - device_to_file(state_file, model->master_weights, shard_num_parameters * sizeof(float), IO_BUF_SIZE, main_stream); - } - - if (loader->should_shuffle) - { - fwriteCheck(&loader->glob_result.gl_pathc, sizeof(size_t), 1, state_file); - fwriteCheck(loader->shard_indices, sizeof(int), loader->glob_result.gl_pathc, state_file); - fwriteCheck(&loader->shard_num_samples, sizeof(size_t), 1, state_file); - fwriteCheck(loader->intra_shard_indices, sizeof(int), loader->shard_num_samples, state_file); - fwriteCheck(&loader->shuffle_rng, sizeof(mt19937_state), 1, state_file); - } - fcloseCheck(state_file); -} - -void load_state(int *step, GPT2 *model, DataLoader *loader, const char *filename) -{ - FILE *state_file = fopenCheck(filename, "rb"); - int state_header[256]; - freadCheck(state_header, sizeof(int), 256, state_file); - assert(state_header[0] == 20240527); - assert(state_header[1] == 1); - assert(state_header[2] == multi_gpu_config.num_processes); - assert(state_header[3] == multi_gpu_config.process_rank); - int use_master_weights = state_header[4]; - int should_shuffle = state_header[5]; - *step = state_header[10]; - model->rng_state = *((unsigned long long *)&state_header[20]); - model->rng_state_last_update = *((unsigned long long *)&state_header[22]); - size_t current_shard_idx = *((size_t *)&state_header[30]); - size_t current_sample_idx = *((size_t *)&state_header[32]); - - size_t shard_num_parameters = multi_gpu_config.shard_num_parameters; - if (use_master_weights == 1 && !model->use_master_weights) - { - printf0("Warning: Master weights are present in state, but not enabled for current run."); - } - else if (use_master_weights == 0 && model->use_master_weights) - { - printf0("Error: Master weights requested, but not present in state file."); - exit(EXIT_FAILURE); - } - - model->init_state = false; - assert(model->m_memory != nullptr); - assert(model->v_memory != nullptr); - file_to_device(model->m_memory, state_file, shard_num_parameters * sizeof(float), IO_BUF_SIZE, main_stream); - file_to_device(model->v_memory, state_file, shard_num_parameters * sizeof(float), IO_BUF_SIZE, main_stream); - if (model->use_master_weights) - { - assert(model->master_weights != nullptr); - file_to_device(model->master_weights, state_file, shard_num_parameters * sizeof(float), IO_BUF_SIZE, main_stream); - - model->rng_state = model->rng_state_last_update; - gpt2_update(model, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, &multi_gpu_config, true); - model->rng_state = *((unsigned long long *)&state_header[20]); - } - - loader->should_shuffle = should_shuffle; - if (should_shuffle == 1) - { - - size_t glob_result_gl_pathc; - freadCheck(&glob_result_gl_pathc, sizeof(size_t), 1, state_file); - assert(glob_result_gl_pathc == loader->glob_result.gl_pathc); - - loader->shard_indices = (int *)mallocCheck(loader->glob_result.gl_pathc * sizeof(int)); - freadCheck(loader->shard_indices, sizeof(int), loader->glob_result.gl_pathc, state_file); - - size_t shard_num_samples; - freadCheck(&shard_num_samples, sizeof(size_t), 1, state_file); - assert(shard_num_samples == loader->shard_num_samples); - - loader->intra_shard_indices = (int *)mallocCheck(loader->shard_num_samples * sizeof(int)); - freadCheck(loader->intra_shard_indices, sizeof(int), loader->shard_num_samples, state_file); - - freadCheck(&loader->shuffle_rng, sizeof(mt19937_state), 1, state_file); - } - dataloader_resume(loader, current_shard_idx, current_sample_idx); - - fcloseCheck(state_file); -} - -void write_checkpoint(const char *output_log_dir, int step, GPT2 *model, DataLoader *train_loader, MultiGpuConfig *multi_gpu_config) -{ - - printf0("Writing checkpoint at step %d\n", step); - int rank = multi_gpu_config->process_rank; - - if (rank == 0) - { - snprintf(filename_buffer, sizeof(filename_buffer), "%s/model_%08d.bin", output_log_dir, step); - gpt2_write_to_checkpoint(model, filename_buffer); - } - - snprintf(filename_buffer, sizeof(filename_buffer), "%s/state_%08d_%05d.bin", output_log_dir, step, rank); - save_state(filename_buffer, step, model, train_loader); - - multi_gpu_barrier(multi_gpu_config); - if (rank == 0) - { - snprintf(filename_buffer, sizeof(filename_buffer), "%s/DONE_%08d", output_log_dir, step); - FILE *done_file = fopenCheck(filename_buffer, "w"); - fcloseCheck(done_file); - } -} - -void delete_checkpoint(const char *output_log_dir, int step, MultiGpuConfig *multi_gpu_config) -{ - - printf0("Deleting checkpoint at step %d\n", step); - int rank = multi_gpu_config->process_rank; - if (rank == 0) - { - snprintf(filename_buffer, sizeof(filename_buffer), "%s/model_%08d.bin", output_log_dir, step); - remove(filename_buffer); - } - snprintf(filename_buffer, sizeof(filename_buffer), "%s/state_%08d_%05d.bin", output_log_dir, step, rank); - remove(filename_buffer); - if (rank == 0) - { - snprintf(filename_buffer, sizeof(filename_buffer), "%s/DONE_%08d", output_log_dir, step); - remove(filename_buffer); - } -} - -#ifndef TESTING - -void error_usage() -{ - fprintf(stderr, "Usage: ./train_gpt2cu [options]\n"); - fprintf(stderr, "Options:\n"); - - fprintf(stderr, " -i train data filename pattern (default = dev/data/tinyshakespeare/tiny_shakespeare_train.bin)\n"); - fprintf(stderr, " -j val data filename pattern (default = dev/data/tinyshakespeare/tiny_shakespeare_val.bin)\n"); - fprintf(stderr, " -e input .bin filename or descriptor, see code comments as docs. (default = gpt2_124M_bf16.bin)\n"); - fprintf(stderr, " -o output log dir (default = NULL, no logging)\n"); - fprintf(stderr, " -lg log gpu info every x steps (default = -1; disabled)\n"); - fprintf(stderr, " -n write optimization checkpoints every how many steps? (default 0, don't)\n"); - fprintf(stderr, " -nk max number of checkpoints to keep in the directory, removing old ones (0 = disable, default)\n"); - fprintf(stderr, " -nm every how many step checkpoints are considered major? major checkpoints never get deleted.\n"); - fprintf(stderr, " -y resume optimization found inside output log dir? (0=restart/overwrite, 1=resume/append)\n"); - - fprintf(stderr, " -b (per-GPU, micro) batch size B (default = 4)\n"); - fprintf(stderr, " -t sequence length T (default = 1024)\n"); - fprintf(stderr, " -d total desired batch size (default = B * T * num_processes, i.e. no grad accumulation\n"); - - fprintf(stderr, " -x max_steps of optimization to run (-1 (default) = disable, run 1 epoch)\n"); - - fprintf(stderr, " -k learning rate scheduler (default = cosine)\n"); - fprintf(stderr, " -l learning rate (default = 3e-4f)\n"); - fprintf(stderr, " -u learning rate warmup iterations (default = 0, no warmup)\n"); - fprintf(stderr, " -q learning rate decay: final fraction, at end of training (default = 1.0 (no decay))\n"); - fprintf(stderr, " -c weight decay (default = 0.0f)\n"); - fprintf(stderr, " -sl outlier stability: skip update if loss goes above this in zscore (0.0f=off)\n"); - fprintf(stderr, " -sg outlier stability: skip update if grad_norm goes above this in zscore (0.0f=off)\n"); - - fprintf(stderr, " -v val_loss_every, how often we evaluate val loss (default = 20)\n"); - fprintf(stderr, " -m val_max_steps, up to how many val batches to estimate val loss? (default = 20)\n"); - fprintf(stderr, " -s sample_every, how often we inference the model (default = 20)\n"); - fprintf(stderr, " -g genT, how many steps of inference we do (default = 64)\n"); - fprintf(stderr, " -h hellaswag eval run? (default = 0)\n"); - - fprintf(stderr, " -a overfit a single batch? 0/1. useful for debugging\n"); - - fprintf(stderr, " -f enable_tf32 override (default: 1, set to 0 to disable tf32)\n"); - fprintf(stderr, " -w keep f32 copy of weights for the optimizer? (default: 1)\n"); - fprintf(stderr, " -ge gelu fusion: 0=none, 1=forward, 2=forward+backward (default: 2 for >=SM90, 0 for older GPUs)\n"); - - fprintf(stderr, " -z zero_stage, Zero Optimization Stage, 0,1,2,3 (default = 0)\n"); - fprintf(stderr, " -r recompute: less memory but less speed. (default = 1), 0|1|2 = none,gelu,gelu+ln\n"); - - fprintf(stderr, " -pn num_processes (default = 1)\n"); - fprintf(stderr, " -pr process_rank (default = 0)\n"); - fprintf(stderr, " -pg gpus_per_node (default = 8)\n"); - fprintf(stderr, " -pm nccl_init_method: tcp,fs,mpi (default = mpi)\n"); - fprintf(stderr, " -ps server_ip - used only when nccl_init_method is tcp (default = -1)\n"); - fprintf(stderr, " -pp fs_path - used only when nccl_init_method is fs (default = /tmp)\n"); - exit(EXIT_FAILURE); -} - -int main(int argc, char *argv[]) -{ - - const char *train_data_pattern = "dev/data/tinyshakespeare/tiny_shakespeare_train.bin"; - const char *val_data_pattern = "dev/data/tinyshakespeare/tiny_shakespeare_val.bin"; - const char *load_filename = "gpt2_124M_bf16.bin"; - const char *lr_scheduler_type = "cosine"; - const char *output_log_dir = NULL; - int checkpoint_every = 0; - int checkpoints_keep = 0; - int major_checkpoint_every = 0; - int resume = 0; - int B = 4; - int T = 1024; - int total_batch_size = -1; - float learning_rate = 3e-4f; - int log_gpu_every = -1; - int warmup_iterations = 0; - float final_learning_rate_frac = 1.0f; - float weight_decay = 0.0f; - float skip_update_lossz = 0.0f; - float skip_update_gradz = 0.0f; - int val_loss_every = 20; - int val_max_steps = 20; - int sample_every = 20; - int genT = 64; - int overfit_single_batch = 0; - int max_steps = -1; - int override_enable_tf32 = 1; - int use_master_weights = 1; - int gelu_fusion = -1; - int recompute = 1; - int zero_stage = 0; - int hellaswag_eval = 0; - - int num_processes = 1; - int process_rank = 0; - int gpus_per_node = 8; - char nccl_init_method[256] = "mpi"; - char server_ip[256] = ""; - char fs_path[256] = ""; - for (int i = 1; i < argc; i += 2) - { - if (i + 1 >= argc) - { - error_usage(); - } - if (argv[i][0] != '-') - { - error_usage(); - } - if (!(strlen(argv[i]) == 2 || strlen(argv[i]) == 3)) - { - error_usage(); - } - - if (argv[i][1] == 'i') - { - train_data_pattern = argv[i + 1]; - } - else if (argv[i][1] == 'j') - { - val_data_pattern = argv[i + 1]; - } - else if (argv[i][1] == 'e') - { - load_filename = argv[i + 1]; - } - else if (argv[i][1] == 'o') - { - output_log_dir = argv[i + 1]; - } - else if (argv[i][1] == 'n' && argv[i][2] == '\0') - { - checkpoint_every = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'y') - { - resume = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'b') - { - B = atoi(argv[i + 1]); - } - else if (argv[i][1] == 't') - { - T = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'd') - { - total_batch_size = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'l' && argv[i][2] == '\0') - { - learning_rate = atof(argv[i + 1]); - } - else if (argv[i][1] == 'l' && argv[i][2] == 'g') - { - log_gpu_every = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'u') - { - warmup_iterations = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'q') - { - final_learning_rate_frac = atof(argv[i + 1]); - } - else if (argv[i][1] == 'c') - { - weight_decay = atof(argv[i + 1]); - } - else if (argv[i][1] == 'x') - { - max_steps = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'v') - { - val_loss_every = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'm') - { - val_max_steps = atoi(argv[i + 1]); - } - else if (argv[i][1] == 's' && argv[i][2] == '\0') - { - sample_every = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'g' && argv[i][2] == 'e') - { - gelu_fusion = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'g') - { - genT = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'a') - { - overfit_single_batch = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'f') - { - override_enable_tf32 = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'w') - { - use_master_weights = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'z') - { - zero_stage = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'r') - { - recompute = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'h') - { - hellaswag_eval = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'k') - { - lr_scheduler_type = argv[i + 1]; - } - else if (argv[i][1] == 'p' && argv[i][2] == 'i') - { - strcpy(nccl_init_method, argv[i + 1]); - } - else if (argv[i][1] == 'p' && argv[i][2] == 'f') - { - strcpy(fs_path, argv[i + 1]); - } - else if (argv[i][1] == 'p' && argv[i][2] == 's') - { - strcpy(server_ip, argv[i + 1]); - } - else if (argv[i][1] == 'p' && argv[i][2] == 'n') - { - num_processes = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'p' && argv[i][2] == 'r') - { - process_rank = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'p' && argv[i][2] == 'g') - { - gpus_per_node = atoi(argv[i + 1]); - } - else if (argv[i][1] == 's' && argv[i][2] == 'l') - { - skip_update_lossz = atof(argv[i + 1]); - } - else if (argv[i][1] == 's' && argv[i][2] == 'g') - { - skip_update_gradz = atof(argv[i + 1]); - } - else if (argv[i][1] == 'n' && argv[i][2] == 'k') - { - checkpoints_keep = atoi(argv[i + 1]); - } - else if (argv[i][1] == 'n' && argv[i][2] == 'm') - { - major_checkpoint_every = atoi(argv[i + 1]); - } - else - { - error_usage(); - } - } - - multi_gpu_config = multi_gpu_config_init(num_processes, process_rank, gpus_per_node, server_ip, fs_path, nccl_init_method); - common_start(override_enable_tf32, false); - - assert(warmup_iterations >= 0); - if (output_log_dir != NULL) - { - assert(strlen(output_log_dir) < 400); - } - int tokens_per_fwdbwd = B * T * multi_gpu_config.num_processes; - - if (total_batch_size == -1) - { - total_batch_size = tokens_per_fwdbwd; - } - - if (gelu_fusion == -1) - { - gelu_fusion = 0; - } - - assert(total_batch_size % tokens_per_fwdbwd == 0); - int grad_accum_steps = total_batch_size / tokens_per_fwdbwd; - - if (overfit_single_batch == 1) - { - train_data_pattern = val_data_pattern; - } - printf0("+-----------------------+----------------------------------------------------+\n"); - printf0("| Parameter | Value |\n"); - printf0("+-----------------------+----------------------------------------------------+\n"); - printf0("| train data pattern | %-50s |\n", train_data_pattern); - printf0("| val data pattern | %-50s |\n", val_data_pattern); - printf0("| output log dir | %-50s |\n", output_log_dir == NULL ? "NULL" : output_log_dir); - printf0("| checkpoint_every | %-50d |\n", checkpoint_every); - printf0("| resume | %-50d |\n", resume); - printf0("| micro batch size B | %-50d |\n", B); - printf0("| sequence length T | %-50d |\n", T); - printf0("| total batch size | %-50d |\n", total_batch_size); - printf0("| LR scheduler | %-50s |\n", lr_scheduler_type); - printf0("| learning rate (LR) | %-50e |\n", learning_rate); - printf0("| warmup iterations | %-50d |\n", warmup_iterations); - printf0("| final LR fraction | %-50e |\n", final_learning_rate_frac); - printf0("| weight decay | %-50e |\n", weight_decay); - printf0("| skip update lossz | %-50f |\n", skip_update_lossz); - printf0("| skip update gradz | %-50f |\n", skip_update_gradz); - printf0("| max_steps | %-50d |\n", max_steps); - printf0("| val_loss_every | %-50d |\n", val_loss_every); - printf0("| val_max_steps | %-50d |\n", val_max_steps); - printf0("| sample_every | %-50d |\n", sample_every); - printf0("| genT | %-50d |\n", genT); - printf0("| overfit_single_batch | %-50d |\n", overfit_single_batch); - printf0("| use_master_weights | %-50s |\n", use_master_weights ? "enabled" : "disabled"); - printf0("| gelu_fusion | %-50d |\n", gelu_fusion); - printf0("| recompute | %-50d |\n", recompute); - printf0("+-----------------------+----------------------------------------------------+\n"); - const char *precision_str = (PRECISION_MODE == PRECISION_FP32) - ? (cublas_compute == CUBLAS_COMPUTE_32F_FAST_TF32 ? "TF32" : "FP32") - : (PRECISION_MODE == PRECISION_FP16 ? "FP16" : "BF16"); - printf0("| device | %-50s |\n", deviceProp.name); - printf0("| peak TFlops | %-50.1f |\n", get_flops_promised(deviceProp.name, PRECISION_MODE)); - printf0("| precision | %-50s |\n", precision_str); - printf0("+-----------------------+----------------------------------------------------+\n"); - - int resuming = 0; - - int resume_max_step = find_max_step(output_log_dir); - if (resume == 1) - { - assert(output_log_dir != NULL); - if (resume_max_step != -1) - { - resuming = 1; - snprintf(filename_buffer, sizeof(filename_buffer), "%s/model_%08d.bin", output_log_dir, resume_max_step); - } - } - - GPT2 model; - gpt2_init_common(&model); - if (resuming == 1) - { - - bool weight_init = !use_master_weights; - gpt2_build_from_checkpoint(&model, filename_buffer, weight_init); - } - else if (ends_with_bin(load_filename)) - { - - gpt2_build_from_checkpoint(&model, load_filename); - } - else - { - - gpt_build_from_descriptor(&model, load_filename); - } - - model.use_master_weights = use_master_weights; - model.gelu_fusion = gelu_fusion; - model.recompute = recompute; - printf0("| weight init method | %-50s |\n", resuming == 1 ? "intermediate checkpoint" : load_filename); - printf0("| max_sequence_length T | %-50d |\n", model.config.max_seq_len); - printf0("| vocab_size V | %-50d |\n", model.config.vocab_size); - printf0("| padded_vocab_size Vp | %-50d |\n", model.config.padded_vocab_size); - printf0("| num_layers L | %-50d |\n", model.config.num_layers); - printf0("| num_heads NH | %-50d |\n", model.config.num_heads); - printf0("| channels C | %-50d |\n", model.config.channels); - printf0("| num_parameters | %-50zu |\n", model.num_parameters); - printf0("+-----------------------+----------------------------------------------------+\n"); - - int permute_train_loader = (overfit_single_batch == 1) ? 0 : 1; - DataLoader train_loader, val_loader; - dataloader_init(&train_loader, train_data_pattern, B, T, multi_gpu_config.process_rank, multi_gpu_config.num_processes, permute_train_loader); - dataloader_init(&val_loader, val_data_pattern, B, T, multi_gpu_config.process_rank, multi_gpu_config.num_processes, 0); - - int train_num_batches = max_steps; - if (train_num_batches == -1) - { - - size_t ntok = train_loader.num_tokens; - - train_num_batches = ntok / total_batch_size; - } - - int val_num_batches = val_max_steps; - if (val_num_batches == -1) - { - - size_t ntok = val_loader.num_tokens; - - val_num_batches = ntok / tokens_per_fwdbwd; - } - printf0("| train_num_batches | %-50d |\n", train_num_batches); - printf0("| val_num_batches | %-50d |\n", val_num_batches); - printf0("+-----------------------+----------------------------------------------------+\n"); - - EvalLoader eval_loader; - const char *hellaswag_path = "dev/data/hellaswag/hellaswag_val.bin"; - const bool hellaswag_available = access(hellaswag_path, F_OK) == 0; - const bool run_hellaswag = hellaswag_eval && hellaswag_available; - if (run_hellaswag) - { - evalloader_init(&eval_loader, hellaswag_path, B, T, multi_gpu_config.process_rank, multi_gpu_config.num_processes); - } - printf0("| run hellaswag | %-50s |\n", run_hellaswag ? "yes" : "no"); - printf0("+-----------------------+----------------------------------------------------+\n"); - - set_zero_configs(&multi_gpu_config, zero_stage, model.num_parameters); - printf0("| num_processes | %-50d |\n", multi_gpu_config.num_processes); - printf0("| zero_stage | %-50d |\n", multi_gpu_config.zero_stage); - printf0("+-----------------------+----------------------------------------------------+\n"); - - if (!hellaswag_available) - { - printf0("HellaSwag eval not found at %s, skipping its evaluation\n", hellaswag_path); - printf0("You can run `python dev/data/hellaswag.py` to export and use it with `-h 1`.\n"); - } - - printf0("num_parameters: %zu => bytes: %zu\n", model.num_parameters, model.num_parameters_bytes); - printf0("allocated %d MiB for model parameters\n", (int)round(model.num_parameters_bytes / (1024 * 1024))); - - printf0("batch_size B=%d * seq_len T=%d * num_processes=%d and total_batch_size=%d\n", - B, T, multi_gpu_config.num_processes, total_batch_size); - printf0("=> setting grad_accum_steps=%d\n", grad_accum_steps); - - if (multi_gpu_config.process_rank == 0) - { - create_dir_if_not_exists(output_log_dir); - } - Logger logger; - logger_init(&logger, output_log_dir, multi_gpu_config.process_rank, resume); - - Tokenizer tokenizer; - tokenizer_init(&tokenizer, "gpt2_tokenizer.bin"); - - LearningRateScheduler lr_scheduler; - lr_scheduler_init(&lr_scheduler, lr_scheduler_type, learning_rate, - warmup_iterations, train_num_batches, final_learning_rate_frac); - - int *gen_tokens = (int *)mallocCheck(B * T * sizeof(int)); - floatX *cpu_logits_raw = (floatX *)mallocCheck(model.config.vocab_size * sizeof(floatX)); - float *cpu_logits = (float *)mallocCheck(model.config.vocab_size * sizeof(float)); - - int step = 0; - gpt2_allocate_state(&model, B, T); - if (resuming == 1) - { - snprintf(filename_buffer, sizeof(filename_buffer), "%s/state_%08d_%05d.bin", output_log_dir, resume_max_step, multi_gpu_config.process_rank); - load_state(&step, &model, &train_loader, filename_buffer); - } - - OutlierDetector loss_outlier_detector, grad_norm_outlier_detector; - init_detector(&loss_outlier_detector); - init_detector(&grad_norm_outlier_detector); - - if (T < model.config.max_seq_len) - { - printf0("!!!!!!!!\n"); - printf0("WARNING:\n"); - printf0("- The training sequence length is: T=%d (set with -t)\n", T); - printf0("- The model's max sequence length is: max_seq_len=%d\n", model.config.max_seq_len); - printf0("You are attempting to train with a sequence length shorter than the model's max.\n"); - printf0("This will lead to unused parameters in the wpe position embedding weights.\n"); - printf0("If you know what you're doing you can ignore this warning.\n"); - printf0("If you're like ???, you are most likely misconfiguring your training run.\n"); - printf0("---> HINT: If you're training GPT-2 use -t 1024. If GPT-3, use -t 2048.\n"); - printf0("!!!!!!!!\n"); - } - - assert(T <= model.config.max_seq_len); - - cudaEvent_t start, end; - cudaCheck(cudaEventCreate(&start)); - cudaCheck(cudaEventCreate(&end)); - cudaCheck(cudaProfilerStart()); - double total_sum_iteration_time_s = 0.0; - float ema_tokens_per_second = 0.0f; - for (; step <= train_num_batches; step++) - { - NvtxRange step_range("Train step", step); - - int last_step = step == train_num_batches; - - if (step % val_loss_every == 0 || last_step) - { - NvtxRange validation_range("validation"); - float val_loss = 0.0f; - dataloader_reset(&val_loader); - for (int i = 0; i < val_num_batches; i++) - { - dataloader_next_batch(&val_loader); - val_loss += gpt2_validate(&model, val_loader.inputs, val_loader.targets, B, T); - } - val_loss /= val_num_batches; - val_loss = multi_gpu_cpu_float_sum(val_loss, &multi_gpu_config) / multi_gpu_config.num_processes; - printf0("val loss %f\n", val_loss); - logger_log_val(&logger, step, val_loss); - } - - if (run_hellaswag && - ((step > 0 && step % val_loss_every == 0) || last_step)) - { - NvtxRange evaluation_range("evaluation"); - float eval_acc_norm = 0.0f; - evalloader_reset(&eval_loader); - for (int i = 0; i < eval_loader.num_batches; i++) - { - if (i % 10 == 0) - { - printf("evaluating HellaSwag: %d/%d\r", i, eval_loader.num_batches); - } - evalloader_next_batch(&eval_loader); - gpt2_validate(&model, eval_loader.inputs, eval_loader.targets, B, T); - int correct = evalloader_stat_losses(&eval_loader, model.cpu_losses); - eval_acc_norm += (float)correct; - } - - eval_acc_norm = multi_gpu_cpu_float_sum(eval_acc_norm, &multi_gpu_config); - printf0("HellaSwag: %d/%d = %f\n", (int)eval_acc_norm, eval_loader.num_examples, eval_acc_norm / eval_loader.num_examples); - logger_log_eval(&logger, step, eval_acc_norm / eval_loader.num_examples); - } - - if (multi_gpu_config.process_rank == 0 && sample_every > 0 && - (step > 0 && (step % sample_every) == 0 || last_step)) - { - NvtxRange generation_range("generation"); - unsigned long long sample_rng_state = 1337; - - int eot_token = tokenizer.eot_token; - for (int i = 0; i < B * T; ++i) - { - gen_tokens[i] = eot_token; - } - - printf("generating:\n---\n"); - for (int t = 1; t < genT; t++) - { - NvtxRange generation_range("Generation step", t); - - gpt2_forward(&model, gen_tokens, 1, CEIL_DIV(t, min(T, 256)) * min(T, 256)); - - floatX *logits = model.acts.output + (t - 1) * model.config.padded_vocab_size; - - cudaCheck(cudaMemcpy(cpu_logits_raw, logits, model.config.vocab_size * sizeof(floatX), cudaMemcpyDeviceToHost)); - - for (int i = 0; i < model.config.vocab_size; i++) - { - cpu_logits[i] = (float)cpu_logits_raw[i]; - } - - float coin = random_f32(&sample_rng_state); - int next_token = sample_softmax(cpu_logits, model.config.vocab_size, coin); - gen_tokens[t] = next_token; - - if (tokenizer.init_ok) - { - const char *token_str = tokenizer_decode(&tokenizer, next_token); - safe_printf(token_str); - } - else - { - - printf("%d ", next_token); - } - fflush(stdout); - } - printf("\n---\n"); - } - - if ((checkpoint_every > 0 && output_log_dir != NULL && resuming == 0) && - ((step > 0 && step % checkpoint_every == 0) || last_step)) - { - - write_checkpoint(output_log_dir, step, &model, &train_loader, &multi_gpu_config); - - int step_delete = step - checkpoints_keep * checkpoint_every; - if (checkpoints_keep > 0 && step_delete > 0 && - (major_checkpoint_every == 0 || step_delete % major_checkpoint_every != 0)) - { - delete_checkpoint(output_log_dir, step_delete, &multi_gpu_config); - } - } - resuming = 0; - - if (last_step) - { - break; - } - - if (overfit_single_batch == 1) - { - - dataloader_reset(&train_loader); - } - - cudaCheck(cudaEventRecord(start)); - - for (int micro_step = 0; micro_step < grad_accum_steps; micro_step++) - { - - dataloader_next_batch(&train_loader); - - gpt2_forward(&model, train_loader.inputs, B, T); - - gpt2_backward_and_reduce(&model, train_loader.inputs, train_loader.targets, grad_accum_steps, micro_step); - } - float zloss = (float)(update_detector(&loss_outlier_detector, (double)model.mean_loss)); - - float step_learning_rate = get_learning_rate(&lr_scheduler, step); - - float grad_norm = gpt2_calculate_grad_norm(&model, &multi_gpu_config); - float zgrad = (float)(update_detector(&grad_norm_outlier_detector, (double)grad_norm)); - - if (isfinite(zloss) && skip_update_lossz != 0.0f && zloss > skip_update_lossz) - { - printf0("skipping update due to loss z-score of %f\n", zloss); - } - else if (isfinite(zgrad) && skip_update_gradz != 0.0f && zgrad > skip_update_gradz) - { - printf0("skipping update due to grad z-score of %f\n", zgrad); - } - else - { - - float grad_clip = 1.0f; - float grad_scale = (grad_norm > grad_clip) ? grad_clip / grad_norm : 1.0f; - gpt2_update(&model, step_learning_rate, 0.9f, 0.95f, 1e-8f, weight_decay, grad_scale, step + 1, &multi_gpu_config); - } - cudaCheck(cudaEventRecord(end)); - cudaCheck(cudaEventSynchronize(end)); - - float time_elapsed_ms; - cudaCheck(cudaEventElapsedTime(&time_elapsed_ms, start, end)); - size_t tokens_processed = (size_t)multi_gpu_config.num_processes * B * T * grad_accum_steps; - float tokens_per_second = tokens_processed / time_elapsed_ms * 1000.0f; - float bias_corrected_ema_tokens_per_second = tokens_per_second; - if (step > 0) - { - total_sum_iteration_time_s += time_elapsed_ms / 1000.0f; - - ema_tokens_per_second = 0.95f * ema_tokens_per_second + 0.05f * tokens_per_second; - bias_corrected_ema_tokens_per_second = ema_tokens_per_second / (1.0f - powf(0.95f, step)); - } - float mfu = gpt2_estimate_mfu(&model, B * T * grad_accum_steps, time_elapsed_ms / 1000.0f); - printf0("step %4d/%d | loss %7.6f (%+.2fz)| norm %6.4f (%+.2fz)| lr %.2e | %.2f ms | %.1f%% bf16 MFU | %.0f tok/s\n", - step + 1, train_num_batches, model.mean_loss, zloss, grad_norm, zgrad, step_learning_rate, - time_elapsed_ms, 100 * mfu, bias_corrected_ema_tokens_per_second); - if (log_gpu_every > 0 && (step + 1) % log_gpu_every == 0) - { - GPUUtilInfo gpu_info = get_gpu_utilization_info(); - printf0(" compute %2.1f%% | memory: %2.1f%% | fan: %2d%% | %4d MHz / %4d MHz | %3d W / %3d W | %d°C / %d°C | %s\n", - gpu_info.gpu_utilization, gpu_info.mem_utilization, gpu_info.fan, gpu_info.clock, gpu_info.max_clock, gpu_info.power / 1000, gpu_info.power_limit / 1000, - gpu_info.temperature, gpu_info.temp_slowdown, gpu_info.throttle_reason); - } - logger_log_train(&logger, step, model.mean_loss, step_learning_rate, grad_norm); - - if (step == 3) - { - cudaProfilerStop(); - } - } - - printf0("total average iteration time: %f ms\n", total_sum_iteration_time_s / (train_num_batches - 1) * 1000); - - cudaCheck(cudaEventDestroy(end)); - cudaCheck(cudaEventDestroy(start)); - if (run_hellaswag) - { - evalloader_free(&eval_loader); - } - dataloader_free(&train_loader); - dataloader_free(&val_loader); - tokenizer_free(&tokenizer); - free(cpu_logits_raw); - free(cpu_logits); - free(gen_tokens); - multi_gpu_config_free(&multi_gpu_config); - gpt2_free(&model); - common_free(model); - return 0; -} -#endif \ No newline at end of file diff --git a/Documentation/docs.pdf b/Documentation/docs.pdf deleted file mode 100644 index d46e8dad6c944a710819b88132fe00702e4661d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 792822 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
HkfE}t^7`R>DBaVD)tI~%}Qv7 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

gZc}+)Eq-}ZNcIY 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 Ph=Pl)$@hP!ImsX9b&#@8j(6i>14!TW30B# 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®%*Ap3;Q`7@RDvWu9znXN!oax(|Ml^!ekOr{) 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 o! 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 z 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 - image -
+image +image - [![Release](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/release.yml/badge.svg)](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/release.yml) [![Package](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/docker-publish.yml) - [![CI](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/ci.yml/badge.svg)](https://github.com/Eamon2009/Quadtrix.cpp/actions/workflows/ci.yml) -A local large language model with a modular, multi-path execution architecture. Train, run inference, and serve a chat interface — all from a single repository, across bare-metal C++, PyTorch, and a React frontend. + +Quadtrix.cpp is an experimental local LLM project that combines training, inference, and a chat interface in a single repository across three execution paths: a C++ versions, a PyTorch backend, and a React frontend.The C++ version is a decoder-only transformer - no external tensor libraries, no automatic differentiation. It includes character-level tokenization, backpropagation, AdamW optimization, checkpointing, and autoregressive generationd. The PyTorch version offers faster training and inference with BPE tokenization via tiktoken, while the React frontend provides a web UI on top of python backend.You can train small character-level models on CPU or Colab, or move to BPE-based models with the PyTorch backend. All version are designed to be hackable and runnable on consumer hardware without requiring massive GPU clusters. -> Full technical reference: [docs](https://eamon2009.github.io/LLMs/) - -> **Note** — File paths in this document are written for Windows PowerShell. Adjust separators (`\` vs `/`) and absolute paths to match your operating system before running any command. - ---- +***technical notes***: [docs](https://eamon2009.github.io/LLMs/) ## Leaderboard Runs are ranked by validation loss. Lower is better. -| # | Val Loss | Parameters | Time | Hardware | Description | -|--:|--:|--:|--:|---|---| -| 1 | **0.7176** | 10.82M | 61.3 min | Colab | Large-scale run, coherent paragraphs, strong convergence | -| 2 | 0.9250 | 1.99M | 6.1 min | T4 GPU | Optimised run, fast training, stable learning | -| 3 | 1.3145 | 0.82M | 39.4 min | CPU | Baseline, small data | -| 4 | 1.6371 | 0.82M | 76.2 min | CPU | Extended CPU training, 3000 iterations | +| # | Val Loss | Parameters | Time | Hardware | Description | +|--:|----------|------------|----------|----------|------------------------------------------| +| 1 | **0.7176** | 10.82M | 61.3 min | Colab | Large-scale run, coherent paragraphs, strong convergence | +| 2 | 0.9250 | 1.99M | 6.1 min | T4 GPU | Optimised run, fast training, stable learning | +| 3 | 1.3145 | 0.82M | 39.4 min | CPU | Baseline, small data | +| 4 | 1.6371 | 0.82M | 76.2 min | CPU | Extended CPU training, 3000 iterations | All runs: @Eamon2009, 2026. ---- - ## Benchmarks ### Runs at a Glance -| Metric | Character-Level | Small Scale | Large Scale | -|---|--:|--:|--:| -| Parameters | 0.83M | 2.00M | 19.17M | -| Layers | 4 | 4 | 4 | -| Embedding dim | 128 | 200 | 200 | -| Attention heads | 4 | 4 | 4 | -| Context length | 64 | 200 | 200 | -| Vocab | 105 char | 110 char | ~50K BPE | -| Corpus | TinyStories | TinyStories | Children's Stories | -| Iterations | 3,000 | 5,000 | 5,000 | -| Train loss | 1.5632 | 0.9045 | — | -| Val loss | 1.6371 | 0.9301 | — | -| Gen. gap | 0.0739 | 0.0256 | — | +| Metric | Character-Level | Small Scale | Large Scale | +|-------------------|------------------|-------------|-------------| +| Parameters | 0.83M | 2.00M | 19.17M | +| Layers | 4 | 4 | 4 | +| Embedding dim | 128 | 200 | 200 | +| Attention heads | 4 | 4 | 4 | +| Context length | 64 | 200 | 200 | +| Vocab | 105 char | 110 char | ~50K BPE | +| Corpus | TinyStories | TinyStories | Children's Stories | +| Iterations | 3,000 | 5,000 | 5,000 | +| Train loss | 1.5632 | 0.9045 | — | +| Val loss | 1.6371 | 0.9301 | — | +| Gen. gap | 0.0739 | 0.0256 | — | ### Comparison to Related Projects -| Project | Focus | Language | Autograd | -|---|---|---|---| -| nanoGPT | Minimal GPT training | Python | PyTorch | -| minGPT | Educational GPT | Python | PyTorch | -| llama2.c | Inference-oriented C | C | None | +| Project | Focus | Language | Autograd | +|---------------|--------------------------------------------|-------------------|----------------------| +| nanoGPT | Minimal GPT training | Python | PyTorch | +| minGPT | Educational GPT | Python | PyTorch | +| llama2.c | Inference-oriented C | C | None | | **Quadtrix.cpp** | Training + inference + web UI + multi-backend | C++ / Python / TypeScript | Manual C++ + PyTorch | ---- - -## Table of Contents - -- [System Overview](#system-overview) -- [Repository Structure](#repository-structure) -- [Requirements](#requirements) -- [Setup](#setup) -- [Running the Project](#running-the-project) -- [C++ Backend](#c-backend) -- [PyTorch Backend](#pytorch-backend) -- [FastAPI Backend](#fastapi-backend) -- [Frontend](#frontend) -- [NPM CLI](#npm-cli) -- [Configuration](#configuration) -- [API Reference](#api-reference) -- [Troubleshooting](#troubleshooting) -- [Technical Reference](#technical-reference) -- [References](#references) -- [License](#license) - ---- - -## System Overview - -``` -User Interface - React + Vite frontend - PWA assets and service worker - -API Layer - FastAPI app in backend/ - Session storage, request validation, CORS, health checks - -Model Backends - C++ executable main.cpp + include/ - PyTorch checkpoint engine/inference.py + engine/best_model.pt - -Training and Data - C++ character-level training from data/input.txt - PyTorch GPT-2 BPE training from engine/input.txt or QUADTRIX_TRAIN_DATA -``` - -### Backend Modes - -| Backend | Path | Purpose | -|---|---|---| -| C++ CPU | `main.cpp`, `include/`, `config/` | Manual transformer training, generation, terminal chat | -| PyTorch | `engine/main.py`, `engine/inference.py` | Faster training and inference with `torch` and `tiktoken` | -| iGPU | `iGPU/` | Experimental integrated-GPU inference and training | -| API | `backend/main.py` | FastAPI middleware used by the frontend | -| Web UI | `frontend/` | Local chat interface and PWA shell | ---- - -### Key Files - -| File | Role | -|---|---| -| `main.cpp` | C++ entry point for training, generation, and terminal chat | -| `config/config.h` | C++ hyperparameters, data path defaults, checkpoint path defaults | -| `include/tensor.h` | Custom tensor operations used throughout the C++ model | -| `include/gpt.h` | GPT language model implementation and generation path | -| `include/backward.h` | Analytical backpropagation and AdamW optimizer state | -| `data/input.txt` | Default C++ training corpus | -| `engine/main.py` | PyTorch training script | -| `engine/inference.py` | PyTorch checkpoint loading and generation | -| `backend/main.py` | FastAPI application entry point | -| `backend/inference.py` | Backend adapter for PyTorch and C++ model services | -| `frontend/src/` | React chat application source | - ---- - -## Requirements - -### Core - -| Tool | Version | Purpose | -|---|---|---| -| Python | 3.10+ | Backend, PyTorch training and inference | -| Node.js | 18+ | Frontend and CLI | -| npm | bundled with Node.js | Frontend dependencies | -| C++ compiler | C++17 | Building `main.cpp` | -| Git | any recent | Cloning and source control | - -### Python Dependencies - -Declared in `backend/requirements.txt`: - -``` -fastapi -uvicorn[standard] -pydantic -pydantic-settings -httpx -redis -torch -tiktoken -``` - -### C++ Dependencies - -The native C++ path has no third-party runtime dependency. It builds entirely from: - -``` -main.cpp -config/config.h -include/*.h -``` - ---- - -## Setup - -All commands run from the repository root in PowerShell. - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp -``` - -**1. Create a Python virtual environment** +# Getting started +**Create a Python virtual environment** ```powershell python -m venv .venv .\.venv\Scripts\python.exe -m pip install --upgrade pip ``` -**2. Install backend and PyTorch dependencies** +** Install backend and PyTorch dependencies** ```powershell cd backend ..\.venv\Scripts\python.exe -m pip install -r requirements.txt cd .. ``` - -**3. Install frontend dependencies** - +**Train** ```powershell -cd frontend -npm.cmd install -cd .. -``` - -Use `npm.cmd` on Windows PowerShell if `npm` is blocked by execution policy. - -**4. Build the frontend** - -```powershell -cd frontend -npm.cmd run build -cd .. +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\.venv\Scripts\python.exe engine\main.py ``` - -**5. Build the C++ executable** +**Build the C++ executable** Skip if `quadtrix.exe` already exists. To rebuild: @@ -227,541 +88,53 @@ g++ -std=c++17 -O3 -march=native -I. -Iinclude -o quadtrix.exe main.cpp --- -## Running the Project - -### Option A — PyTorch chat in the web UI - -Terminal 1 (backend): - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\backend -..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 -``` - -Terminal 2 (frontend): - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\frontend -npm.cmd run dev -``` - -Open `http://localhost:5173` and select the PyTorch backend in the UI. - -### Option B — C++ terminal chat - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp -.\quadtrix.exe data\input.txt --chat -``` - -Set tokens per response: - -```powershell -.\quadtrix.exe data\input.txt --chat --chat-tokens 300 -``` - -Requires `best_model.bin` unless `GPT_MODEL_PATH` points elsewhere. - -### Option C — C++ generation - -```powershell -.\quadtrix.exe data\input.txt --generate -``` - -Streams tokens until interrupted with `Ctrl+C`. - -### Option D — C++ training - -```powershell -.\quadtrix.exe data\input.txt -``` - -Writes the best checkpoint to `best_model.bin`. - -### Option E — PyTorch training - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp -.\.venv\Scripts\python.exe engine\main.py -``` - -Point to a custom corpus with `QUADTRIX_TRAIN_DATA`: - -```powershell -$env:QUADTRIX_TRAIN_DATA="C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\data\input.txt" -.\.venv\Scripts\python.exe engine\main.py -``` - -Checkpoint is saved to `best_model.pt`. - ---- - -## C++ Backend - -### Runtime Arguments - -``` -quadtrix.exe [data_path] [--generate] [--chat] [--chat-tokens N] -``` - -| Argument | Description | -|---|---| -| `data_path` | Plain-text corpus used to build the tokenizer and train/validation split | -| `--generate` | Load weights and stream generated text | -| `--chat` | Load weights and start interactive terminal chat | -| `--chat-tokens N` | Maximum generated tokens per chat response | - -### Environment Variables - -| Variable | Default | Description | -|---|---|---| -| `GPT_DATA_PATH` | `data/input.txt` | Overrides the default data file | -| `GPT_MODEL_PATH` | `best_model.bin` | Overrides the checkpoint path | - -```powershell -$env:GPT_MODEL_PATH="C:\models\quadtrix-best.bin" -.\quadtrix.exe data\input.txt --chat -``` - ---- - -## PyTorch Backend - -### Training - -```powershell -.\.venv\Scripts\python.exe engine\main.py -``` - -Default configuration in `engine/main.py`: - -| Parameter | Value | -|---|---| -| `batch_size` | 16 | -| `block_size` | 32 | -| `max_iters` | 10000 | -| `eval_interval` | 10 | -| `learning_rate` | 1e-3 | -| `n_embd` | 64 | -| `n_head` | 4 | -| `n_layer` | 4 | -| `dropout` | 0.1 | -| Tokenizer | GPT-2 BPE via `tiktoken` | - -### Inference - -Interactive chat: - -```powershell -.\.venv\Scripts\python.exe engine\inference.py --checkpoint "engine\best_model.pt" -``` - -Single prompt: - -```powershell -.\.venv\Scripts\python.exe engine\inference.py \ - --checkpoint "engine\best_model.pt" \ - --prompt "Once upon a time" \ - --max-new-tokens 100 \ - --temperature 1.0 -``` - -| Flag | Description | -|---|---| -| `--checkpoint` | Path to `.pt` checkpoint | -| `--prompt` | Generate from a fixed string instead of starting interactive chat | -| `--max-new-tokens` | Maximum tokens to generate | -| `--temperature` | Sampling temperature | -| `--top-k` | Optional top-k sampling cutoff | - ---- - -## FastAPI Backend - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\backend -..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 -``` - -### Endpoints - -| Method | Path | Description | -|---|---|---| -| `POST` | `/api/chat` | Generate a model response | -| `GET` | `/api/health` | Service health check | -| `GET` | `/api/stats` | Runtime statistics | -| `GET` | `/api/sessions` | List all sessions | -| `POST` | `/api/sessions` | Create a session | -| `DELETE` | `/api/sessions/{id}` | Delete a session | -| `GET` | `/api/sessions/{id}/messages` | Retrieve session message history | -| `POST` | `/api/feedback` | Submit feedback | - -### Environment - -Create `backend/.env` to override defaults: - -```ini -API_PORT=3001 -CORS_ORIGINS=http://localhost:5173 -REDIS_URL= -LOG_LEVEL=INFO -MAX_SESSIONS=1000 -SESSION_TTL_HOURS=24 -CPP_SERVER_URL=http://localhost:8080 -TORCH_CHECKPOINT_PATH=../engine/best_model.pt -REQUEST_TIMEOUT_SECONDS=60 -``` - -> The checked-in default uses `../engine/best_model .pt` with a space before `.pt`. If your checkpoint is named `best_model.pt`, set `TORCH_CHECKPOINT_PATH=../engine/best_model.pt` explicitly. - -> The C++ adapter expects a compatible HTTP service at `CPP_SERVER_URL` with `/health` and `/generate` endpoints. The current `main.cpp` operates in terminal mode only. Use the PyTorch backend for the web UI unless a separate C++ HTTP service is running. - ---- - -## Frontend - -### Development - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\frontend -npm.cmd run dev -``` - -Opens at `http://localhost:5173`. - -### Production Build - -```powershell -npm.cmd run build -``` - -### Production Preview - -```powershell -npm.cmd run preview -``` - -Served at `http://localhost:4173`. - -### PWA - -The frontend ships as an installable web app. Install from Chrome or Edge after running the production preview. The installed app requires the FastAPI backend at the configured API URL. - -``` -frontend/manifest.webmanifest -frontend/sw.js -frontend/public/manifest.webmanifest -frontend/public/sw.js -frontend/src/registerServiceWorker.ts -``` - ---- - -## Configuration - -### C++ Hyperparameters - -Edit `config/config.h` and recompile to apply any change. - -```cpp -static const int BATCH_SIZE = 4; -static const int BLOCK_SIZE = 64; -static const int MAX_ITERS = 3000; -static const int EVAL_INTERVAL = 200; -static const float LEARNING_RATE = 3e-4f; -static const int EVAL_ITERS = 10; -static const int N_EMBD = 128; -static const int N_HEAD = 4; -static const int N_LAYER = 4; -static const float DROPOUT = 0.2f; -``` - -| Parameter | Meaning | -|---|---| -| `BATCH_SIZE` | Sequences per gradient step | -| `BLOCK_SIZE` | Context length in tokens | -| `N_EMBD` | Embedding width | -| `N_HEAD` | Number of attention heads | -| `N_LAYER` | Number of transformer blocks | -| `DROPOUT` | Dropout probability during training | -| `LEARNING_RATE` | AdamW learning rate | -| `MAX_ITERS` | Total training iterations | -| `EVAL_INTERVAL` | Evaluation and checkpoint interval | - -### Scaling Guide - -| Goal | Change | -|---|---| -| Better local coherence | Increase `BLOCK_SIZE` | -| Higher model capacity | Increase `N_EMBD` and `N_LAYER` | -| Faster CPU runs | Reduce `N_LAYER` or `N_EMBD` | -| Optimised build | Compile with `-O3 -march=native` | -| More stable loss estimates | Increase `EVAL_ITERS` | - ---- - -## API Reference - -Base URL: `http://localhost:3001` - -### Health - -``` -GET /api/health -``` - -```powershell -Invoke-RestMethod http://localhost:3001/api/health -``` - -### Stats - -``` -GET /api/stats -``` - -```powershell -Invoke-RestMethod http://localhost:3001/api/stats -``` - -### Chat - -``` -POST /api/chat -``` - -PyTorch backend: - -```powershell -Invoke-RestMethod ` - -Uri http://localhost:3001/api/chat ` - -Method Post ` - -ContentType "application/json" ` - -Body '{ - "session_id": null, - "prompt": "Once upon a time", - "max_tokens": 100, - "temperature": 1.0, - "stream": false, - "model_backend": "torch" - }' -``` - -C++ backend (requires a compatible C++ HTTP service): - -```powershell -Invoke-RestMethod ` - -Uri http://localhost:3001/api/chat ` - -Method Post ` - -ContentType "application/json" ` - -Body '{ - "session_id": null, - "prompt": "Once upon a time", - "max_tokens": 100, - "temperature": 1.0, - "stream": false, - "model_backend": "cpp" - }' -``` - ---- - -## Troubleshooting - -**PowerShell blocks `npm`** - -```powershell -npm.cmd install -npm.cmd run dev -npm.cmd run build -``` - -**Backend cannot import dependencies** - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\backend -..\.venv\Scripts\python.exe -m pip install -r requirements.txt -``` - -**PyTorch checkpoint is missing** - -```powershell -Test-Path "C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\engine\best_model.pt" -``` - -If missing, train first: - -```powershell -.\.venv\Scripts\python.exe engine\main.py -``` - -**C++ chat cannot find weights** - -Train first to produce `best_model.bin`: - -```powershell -.\quadtrix.exe data\input.txt -``` - -Or point to an existing checkpoint: - -```powershell -$env:GPT_MODEL_PATH="C:\path\to\best_model.bin" -.\quadtrix.exe data\input.txt --chat -``` - -**Frontend cannot reach the backend** - -Start the backend and verify the health endpoint: - -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\backend -..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 -Invoke-RestMethod http://localhost:3001/api/health -``` - -**Port already in use** - -```powershell -Get-NetTCPConnection -LocalPort 3001 -Get-NetTCPConnection -LocalPort 5173 -Get-NetTCPConnection -LocalPort 4173 -Get-NetTCPConnection -LocalPort 8080 -``` - -**Rebuild C++ after changing hyperparameters** - -Any change to `config/config.h` requires recompilation: - -```powershell -g++ -std=c++17 -O2 -I. -Iinclude -o quadtrix.exe main.cpp -``` - ---- ## Technical Reference - -This section documents the model architecture, training procedure, and internal design decisions. It is not required reading to run the project. - -### Model Architecture - -Quadtrix is a decoder-only transformer in the GPT family. The forward pass is: - -``` -Input token IDs [B, T] - -> token embedding lookup table: vocab_size x n_embd - -> positional embedding learned table: block_size x n_embd - -> sum - -> transformer block x N - -> layer norm (pre-norm) - -> masked multi-head self-attention - -> residual add - -> layer norm (pre-norm) - -> feed-forward MLP (linear -> ReLU -> linear) - -> residual add - -> final layer norm - -> language model head linear: n_embd -> vocab_size (no bias) - -> logits [B, T, vocab_size] - -> cross-entropy loss -``` - -Each attention head operates over a `n_embd / n_head` dimensional subspace. The causal mask ensures each position can only attend to itself and positions that precede it. Masked logits are set to negative infinity before softmax, collapsing their probability mass to zero. - -### C++ Implementation - -The C++ path is the educational core of the project. Every computation is written explicitly — no automatic differentiation, no external tensor library. - -**What it implements:** - -- Character-level tokenizer built from the input corpus -- Train/validation split via `DataLoader` -- Token and positional embedding tables -- Multi-head causal self-attention -- Feed-forward MLP blocks -- Pre-layer normalisation and residual connections -- Cross-entropy loss -- Manual analytical backward pass -- AdamW optimiser with first and second moment estimates -- Checkpoint saving and loading +***Quadtrix is a decoder-only transformer. The architecture follows the standard GPT design with pre-layer normalization, causal self-attention, and residual connections.*** +The C++ version is : + +- Character-level tokenizer +- Manual tensor operations +- Analytical backpropagation +- AdamW optimizer with bias correction +- Checkpoint save/load - Autoregressive generation -- Terminal chat mode - -### Manual Backpropagation - -Gradients flow explicitly through every layer in reverse order: - -``` -dLoss/dLogits - -> lm_head linear projection backward - -> final layer norm - -> each transformer block in reverse - -> feed-forward residual branch - -> layer norm 2 - -> MLP fc2 -> ReLU -> fc1 - -> attention residual branch - -> layer norm 1 - -> output projection - -> each attention head - -> attention weights @ value - -> softmax - -> scaled dot product QK^T / sqrt(d_k) - -> causal mask - -> query / key / value projections - -> token embedding gradients - -> position embedding gradients -``` - -Causal mask entries are excluded from the backward pass — they received no probability mass in the forward pass and therefore accumulate no gradient. - -### Optimiser -The C++ path implements AdamW: - -``` -m_t = beta1 * m_{t-1} + (1 - beta1) * g_t first moment -v_t = beta2 * v_{t-1} + (1 - beta2) * g_t^2 second moment -m_hat = m_t / (1 - beta1^t) bias correction -v_hat = v_t / (1 - beta2^t) -theta_t = theta_{t-1} - lr * (m_hat / (sqrt(v_hat) + eps) + weight_decay * theta_{t-1}) +**The PyTorch path uses torch.nn and tiktoken for faster experimentation and GPU acceleration.** + +## File Structure +``` +Quadtrix.cpp/ +├── main.cpp +├── config/ +│ └── config.h +├── include/ +│ ├── tensor.h +│ ├── gpt.h +│ └── backward.h +│ └── ... +│ +├── data/ +│ └── input.txt +├── engine/ +│ ├── main.py +│ ├── inference.py +│ └── best_model.pt +├── backend/ +│ ├── main.py +│ ├── inference.py +│ └── requirements.txt +├── frontend/ +│ ├── src/ +│ └── ... +└── quadtrix.exe (after build) ``` -Weight decay is applied directly to the parameter rather than to the gradient, which is the key distinction between AdamW and Adam with L2 regularisation. - -### PyTorch Backend - -The PyTorch path mirrors the same transformer design using `torch.nn` modules and the GPT-2 BPE tokenizer from `tiktoken`. It targets faster experimentation and GPU acceleration. Training, inference, and checkpoint I/O are handled in `engine/main.py` and `engine/inference.py`. - -### Hardware Execution Paths - -| Device | Path | -|---|---| -| CPU | Native C++ and PyTorch CPU fallback | -| CUDA | PyTorch CUDA acceleration when a compatible GPU is present | -| iGPU | Experimental scripts in `iGPU/` for integrated-GPU execution | - -### Final C++ Run Metrics - -| Metric | Value | -|---|---| -| Validation loss | 1.6371 | -| Parameters | 826,985 | -| Vocabulary | 105 characters | -| Training tokens | ~28.3M | -| Validation tokens | ~3.1M | -| Training time | ~76.2 min | -| Architecture | 4 layers, 4 heads, 128 embedding dim | - ---- - ## References - - Vaswani et al., "Attention Is All You Need", NeurIPS 2017. - Radford et al., "Language Models are Unsupervised Multitask Learners", 2019. -- Karpathy, [nanoGPT](https://github.com/karpathy/nanoGPT). -- Karpathy, [minGPT](https://github.com/karpathy/minGPT). - ---- +- Karpathy, nanoGPT +- Karpathy, minGPT ## License - MIT diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index b19496f..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,73 +0,0 @@ -# Security Policy - -Quadtrix.cpp is a local-first transformer learning project. The repository includes native C++ code, Python inference and training code, a FastAPI backend, a React frontend, model checkpoints, and sample datasets. Security reports are welcome, especially when they affect local execution, backend API exposure, dependency safety, or handling of model/data files. - -## Supported Versions - -Security fixes are considered for: - -| Version | Supported | -| --- | --- | -| `master` / active development branch | Yes | -| Latest tagged release | Yes | -| Older releases | Best effort | - -If a fix affects both the C++ runtime and the Python or web paths, please call that out in the report so the patch can cover the whole stack. - -## Reporting a Vulnerability - -Please do not open a public issue for a vulnerability that could put users at risk. - -Preferred reporting path: - -1. Use GitHub's private vulnerability reporting or security advisory flow for this repository, if available. -2. Include enough detail to reproduce the issue locally. -3. Share the affected component: C++ runtime, Python engine, FastAPI backend, React frontend, packaging, model files, or documentation. - -Helpful details include: - -- Affected commit, branch, or release. -- Operating system and runtime versions. -- Exact command or request used to reproduce the issue. -- Expected behavior and actual behavior. -- Logs, stack traces, or crash output. -- Whether the issue requires a crafted model, dataset, prompt, HTTP request, or environment variable. - -You should receive an acknowledgement as soon as the report is reviewed. Fix timing depends on impact and complexity. - -## Security Scope - -In scope examples: - -- Memory safety bugs in the native C++ runtime. -- Crashes or denial-of-service issues caused by malformed input files, prompts, checkpoints, or HTTP requests. -- Backend API behavior that exposes local files, environment variables, model paths, prompts, sessions, or generated text unexpectedly. -- Unsafe dependency updates or dependency confusion risks in Python, npm, or GitHub Actions. -- Cross-site scripting, service worker, or PWA issues in the frontend. -- Secret leakage through logs, generated artifacts, bundled files, or example configuration. - -Out of scope examples: - -- Expected model hallucinations or low-quality generated text. -- Prompt injection against a local toy model without a concrete data exposure or code execution path. -- Reports that require already having arbitrary code execution on the user's machine. -- Vulnerabilities in third-party services or packages unless the repository uses them in an unsafe way. - -## Local Deployment Notes - -Quadtrix.cpp is intended to run locally during development. - -- Keep the FastAPI backend bound to `127.0.0.1` unless you intentionally expose it. -- Do not commit real `.env` files, tokens, API keys, private datasets, or private checkpoints. -- Treat downloaded model checkpoints and datasets as untrusted inputs. -- Rebuild native binaries from source when possible instead of trusting unknown executables. -- Review changes to service workers, PWA manifests, backend routing, and CORS settings carefully. - -## Dependency Updates - -The project uses C++, Python, npm, and GitHub Actions. When updating dependencies: - -- Prefer minimal version bumps tied to a clear reason. -- Run the relevant local checks from `contributing.md`. -- Watch for lockfile changes and generated build output. -- Note any security-related update in the pull request summary. diff --git a/benchmark_results.csv b/benchmark_results.csv deleted file mode 100644 index 7496a05..0000000 --- a/benchmark_results.csv +++ /dev/null @@ -1,6 +0,0 @@ -prompt,prompt_tokens,gen_tokens,avg_ms,min_ms,max_ms,std_ms,tok_per_sec -"",1,50,2027,1848.4,2314.78,168.952,24.667 -"The",3,50,2561.63,2241.3,2986.35,306.631,19.5188 -"Once upon a time",16,50,3038.74,2885.22,3225.42,126.5,16.4542 -"The quick brown fox jumps",25,50,3975,3561.3,4783.34,454.592,12.5786 -"a",1,50,1862.99,1808.71,1929.64,46.4738,26.8386 diff --git a/contributing.md b/contributing.md deleted file mode 100644 index 3705488..0000000 --- a/contributing.md +++ /dev/null @@ -1,162 +0,0 @@ -# Contributing to Quadtrix.cpp - -Thanks for helping improve Quadtrix.cpp. This project is a transformer learning lab with several execution paths: native C++ training and inference, PyTorch experiments, a FastAPI backend, and a React + TypeScript chat UI. Contributions are easiest to review when they keep those paths clear and testable. - -## Good First Contributions - -Useful contributions include: - -- Fixing correctness bugs in the C++ transformer implementation. -- Improving training, inference, checkpoint loading, or export scripts. -- Making the FastAPI backend more reliable and easier to run locally. -- Improving the React chat UI without hiding the model/backend behavior. -- Adding focused documentation for setup, model files, datasets, or run commands. -- Tightening CI, dependency versions, packaging, or release steps. - -For larger model architecture changes, open an issue first so the design can be discussed before a big patch lands. - -## Repository Layout - -```text -Quadtrix.cpp/ - main.cpp Native C++ entry point - include/ C++ headers - src/ C++ source files - engine/ PyTorch training, inference, export, and model files - backend/ FastAPI backend and session handling - frontend/ React + TypeScript chat UI - iGPU/ Integrated GPU experiments - config/ Runtime configuration - data/ Local datasets and helpers - .github/workflows/ CI and release workflows -``` - -## Development Setup - -From the repository root: - -```powershell -python -m venv .venv -.\.venv\Scripts\python.exe -m pip install --upgrade pip -cd backend -..\.venv\Scripts\python.exe -m pip install -r requirements.txt -``` - -Install frontend dependencies: - -```powershell -cd frontend -npm.cmd install -``` - -Build the native C++ runtime from the repository root: - -```bash -g++ -std=c++17 -O2 -I. -Iinclude -o quadtrix main.cpp -``` - -## Running Locally - -Run the C++ model: - -```powershell -.\Quadtrix.exe data\input.txt --chat -``` - -Run the C++ HTTP server: - -```powershell -.\Quadtrix.exe data\input.txt --server --port 8080 -``` - -Run the FastAPI backend: - -```powershell -cd backend -..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 -``` - -Run the frontend: - -```powershell -cd frontend -npm.cmd run dev -``` - -Open the app at: - -```text -http://localhost:5173 -``` - -## Checks Before Opening a Pull Request - -Run the checks that match your change. - -C++: - -```bash -g++ -std=c++17 -O2 -I. -Iinclude -o quadtrix main.cpp -``` - -Python: - -```powershell -.\.venv\Scripts\python.exe -m compileall backend engine iGPU -cd backend -..\.venv\Scripts\python.exe -c "from main import app; print(app.title)" -``` - -Frontend: - -```powershell -cd frontend -npm.cmd run build -``` - -If you cannot run a relevant check, mention that in the pull request and explain why. - -## Pull Request Guidelines - -- Keep changes focused on one problem or feature. -- Use the existing style of the file you are editing. -- Avoid committing generated artifacts unless the project already expects them. -- Do not commit `.env` files, secrets, private datasets, or personal checkpoints. -- Update `README.md`, `run.md`, or related docs when commands or behavior change. -- Include screenshots or short notes for UI changes. -- Mention any change that affects model files, ports, CORS, service workers, or packaging. - -The pull request template asks for: - -- Summary and user-facing impact. -- C++ build status. -- Backend smoke-test status. -- Frontend build status. -- Documentation or screenshot updates when needed. - -## Coding Notes - -For C++ changes: - -- Prefer clear, debuggable code over clever abstractions. -- Keep the educational value of the implementation visible. -- Be careful with tensor shapes, bounds, and ownership. -- Add comments only where the math or control flow is not obvious. - -For Python changes: - -- Keep backend behavior explicit and local-development friendly. -- Avoid broad exception swallowing around model loading or inference. -- Treat model paths, datasets, and request payloads as untrusted inputs. - -For frontend changes: - -- Keep the chat UI practical and responsive. -- Preserve the ability to switch between the C++ backend and the `.pt` path. -- Make loading, error, and disconnected states clear. - -## Documentation Style - -Use concrete commands and paths. Quadtrix.cpp has multiple runtime paths, so say exactly which path a command belongs to: C++, PyTorch, FastAPI backend, frontend, iGPU, or packaging. - -When documenting training results, include the hardware, dataset, iteration count, elapsed time, and validation metric so results can be compared fairly. diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index a9fbdfe..8a7b880 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,4 +1,15 @@ +#!/bin/bash set -e +VARIANT="${QUADTRIX_VARIANT:-auto}" + +if [ "$VARIANT" = "auto" ]; then + if command -v nvidia-smi &>/dev/null && nvidia-smi &>/dev/null 2>&1; then + VARIANT="cuda" + else + VARIANT="cpu" + fi +fi + echo "" echo " ██████╗ ██╗ ██╗ █████╗ ██████╗ ████████╗██████╗ ██╗██╗ ██╗" echo " ██╔═══██╗██║ ██║██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗██║╚██╗██╔╝" @@ -9,14 +20,48 @@ echo " ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝╚═ echo "" echo " Starting Quadtrix.cpp..." echo "" -echo " FastAPI backend at http://localhost:3001" +echo " FastAPI backend at http://localhost:3001" echo " React frontend at http://localhost:8080" echo " Models volume at /app/models" echo "" + +if [ "$VARIANT" = "cuda" ]; then + echo " Mode: CUDA / GPU" + echo "" + if command -v nvidia-smi &>/dev/null; then + if nvidia-smi &>/dev/null 2>&1; then + GPU_NAME=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1 || echo "Unknown") + GPU_MEM=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader 2>/dev/null | head -1 || echo "?") + echo " GPU detected: $GPU_NAME ($GPU_MEM)" + else + echo " WARNING: nvidia-smi present but GPU is not accessible." + echo "" + echo " Running on WSL2? Make sure you have:" + echo " 1. NVIDIA Game/Studio/Data-Centre driver ≥ 515 on Windows" + echo " 2. WSL2 (not WSL1): wsl --set-version 2" + echo " 3. The CUDA toolkit installed inside WSL is optional;" + echo " the driver bridge handles it automatically." + echo " Docs: https://developer.nvidia.com/cuda/wsl" + fi + else + echo " WARNING: No NVIDIA driver found. CUDA image started without GPU." + echo "" + echo " On WSL2, install the NVIDIA driver on Windows (not inside WSL)." + echo " GPU passthrough is handled automatically by WSL2." + echo " Docs: https://developer.nvidia.com/cuda/wsl" + echo "" + echo " To run without a GPU, use the CPU image instead:" + echo " docker pull ghcr.io/eamon2009/quadtrix-cpu:sha-3b65553" + fi + echo "" +else + echo " Mode: CPU" + echo "" +fi WEIGHTS_FOUND=0 if [ -f "/app/models/best_model.pt" ]; then - echo " PyTorch checkpoint found: /app/models/best_model.pt" + echo " PyTorch checkpoint found: /app/models/best_model.pt" WEIGHTS_FOUND=1 fi @@ -29,8 +74,13 @@ if [ "$WEIGHTS_FOUND" = "0" ]; then echo "" echo " WARNING: No model weights found in /app/models" echo " The backend will start but inference will fail until weights are mounted." - echo " Mount your weights directory:" - echo " docker run -v /path/to/your/models:/app/models ..." + echo "" + echo " Mount your weights at run-time:" + if [ "$VARIANT" = "cuda" ]; then + echo " docker run --gpus all -v /path/to/models:/app/models ghcr.io/eamon2009/quadtrix-cuda:sha-3b65553" + else + echo " docker run -v /path/to/models:/app/models ghcr.io/eamon2009/quadtrix-cpu:sha-3b65553" + fi echo "" fi exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf \ No newline at end of file diff --git a/docs/run.md b/docs/run.md new file mode 100644 index 0000000..a2c0e65 --- /dev/null +++ b/docs/run.md @@ -0,0 +1,492 @@ +# Quadtrix.cpp + +Quadtrix.cpp is a local GPT-style language model project with multiple runtime paths: + +- Native C++ inference and training through `Quadtrix.exe` / `main.cpp` +- PyTorch checkpoint inference through `engine/inference.py` and `engine/best_model .pt` +- FastAPI middleware in `backend/` +- React + TypeScript chat UI in `frontend/` + +The web interface can chat with both model backends: + +- `C++`: calls the C++ HTTP server on port `8080` +- `.pt`: loads the PyTorch checkpoint directly from `engine/best_model .pt` + +## Project Layout + +```text +Quadtrix.cpp/ + Quadtrix.exe + main.cpp + config/ + include/ + data/ + engine/ + inference.py + main.py + fine-tune/main.py + best_model .pt + fineweb_30mb.txt + backend/ + main.py + inference.py + requirements.txt + frontend/ + package.json + src/ +``` + +## Requirements + +- Python 3.10+ +- Node.js 18+ +- npm +- C++17 compiler if you want to rebuild the C++ executable + +## 1. Python Setup + +From the repo root: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +python -m venv .venv +.\.venv\Scripts\python.exe -m pip install --upgrade pip +``` + +Install backend and PyTorch inference dependencies: + +```powershell +cd backend +..\.venv\Scripts\python.exe -m pip install -r requirements.txt +``` + +## 2. Frontend Setup + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\frontend +npm.cmd install +npm.cmd run build +``` + +Run the frontend: + +```powershell +npm.cmd run dev +``` + +Frontend URL: + +```text +http://localhost:5173 +``` + +## Install as a Web App + +The frontend is configured as an installable PWA. It includes: + +- `frontend/manifest.webmanifest` +- `frontend/sw.js` +- `frontend/public/manifest.webmanifest` +- `frontend/public/sw.js` +- service worker registration in `frontend/src/registerServiceWorker.ts` + +For the clean installable version, build and preview the frontend: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\frontend +npm.cmd run build +npm.cmd run preview +``` + +Open the preview URL, usually: + +```text +http://localhost:4173 +``` + +Then install from the browser: + +- Chrome / Edge: click the install icon in the address bar +- Or open browser menu -> Apps -> Install this site as an app + +The installed app still talks to the backend at: + +```text +http://localhost:3001 +``` + +So keep the FastAPI backend running when chatting. + +## 3. Run the PyTorch `.pt` Model in the Web UI + +The `.pt` model does not need a separate model server. The FastAPI backend loads it directly from: + +```text +engine/best_model .pt +``` + +Start the backend: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\backend +..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 +``` + +Start the frontend in another terminal: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\frontend +npm.cmd run dev +``` + +Open: + +```text +http://localhost:5173 +``` + +Select `.pt` in the top bar. + +## 4. Run the C++ Model in the Web UI + +Start the C++ inference server: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\Quadtrix.exe data\input.txt --server --port 8080 +``` + +Start the backend: + +```powershell +cd backend +..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 +``` + +Start the frontend: + +```powershell +cd ..\frontend +npm.cmd run dev +``` + +Open: + +```text +http://localhost:5173 +``` + +Select `C++` in the top bar. + +## 5. Run Both Backends Together + +Use three terminals. + +Terminal 1: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\Quadtrix.exe data\input.txt --server --port 8080 +``` + +Terminal 2: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\backend +..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 +``` + +Terminal 3: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\frontend +npm.cmd run dev +``` + +Open: + +```text +http://localhost:5173 +``` + +Switch between `C++` and `.pt` from the model selector. + +## 6. Backend API + +Base URL: + +```text +http://localhost:3001 +``` + +Routes: + +```text +GET /api/health +GET /api/stats +POST /api/chat +GET /api/sessions +POST /api/sessions +DELETE /api/sessions/{id} +GET /api/sessions/{id}/messages +POST /api/feedback +``` + +Example `.pt` chat request: + +```powershell +Invoke-RestMethod ` + -Uri http://localhost:3001/api/chat ` + -Method Post ` + -ContentType "application/json" ` + -Body '{ + "session_id": null, + "prompt": "Once upon a time", + "max_tokens": 100, + "temperature": 1.0, + "stream": false, + "model_backend": "torch" + }' +``` + +Example C++ chat request: + +```powershell +Invoke-RestMethod ` + -Uri http://localhost:3001/api/chat ` + -Method Post ` + -ContentType "application/json" ` + -Body '{ + "session_id": null, + "prompt": "Once upon a time", + "max_tokens": 100, + "temperature": 1.0, + "stream": false, + "model_backend": "cpp" + }' +``` + +## 7. Environment Variables + +Backend defaults are in `backend/.env.example`: + +```text +API_PORT=3001 +CORS_ORIGINS=http://localhost:5173 +REDIS_URL= +LOG_LEVEL=INFO +MAX_SESSIONS=1000 +SESSION_TTL_HOURS=24 +CPP_SERVER_URL=http://localhost:8080 +TORCH_CHECKPOINT_PATH=../engine/best_model .pt +REQUEST_TIMEOUT_SECONDS=60 +``` + +Create `backend/.env` if you want overrides. + +Frontend defaults are in `frontend/.env.example`: + +```text +VITE_API_BASE_URL=http://localhost:3001 +``` + +## 8. PyTorch CLI Inference + +Interactive chat: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\.venv\Scripts\python.exe engine\inference.py --checkpoint "engine\best_model .pt" +``` + +Generate once: + +```powershell +.\.venv\Scripts\python.exe engine\inference.py --checkpoint "engine\best_model .pt" --prompt "Hello" --max-new-tokens 100 --temperature 1.0 +``` + +## 9. PyTorch Training + +Main training: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\.venv\Scripts\python.exe engine\main.py +``` + +Fine-tuning: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\.venv\Scripts\python.exe engine\fine-tune\main.py +``` + +## 10. C++ Build and Run + +Build manually: + +```powershell +g++ -std=c++17 -O2 -I. -Iinclude -o Quadtrix.exe main.cpp +``` + +Train from scratch: + +```powershell +.\Quadtrix.exe data\input.txt +``` + +Terminal chat: + +```powershell +.\Quadtrix.exe data\input.txt --chat +``` + +Raw generation: + +```powershell +.\Quadtrix.exe data\input.txt --generate +``` + +HTTP server: + +```powershell +.\Quadtrix.exe data\input.txt --server --port 8080 +``` + +## 11. Health Checks + +Backend: + +```powershell +Invoke-RestMethod http://localhost:3001/api/health +``` + +C++ server: + +```powershell +Invoke-RestMethod http://localhost:8080/health +``` + +Frontend: + +```text +http://localhost:5173 +``` + +When only `.pt` is available, backend health should show: + +```json +{ + "status": "degraded", + "api": "ok", + "cpp_server": "unreachable", + "torch_model": "ok" +} +``` + +When both are available, backend health should show: + +```json +{ + "status": "ok", + "api": "ok", + "cpp_server": "ok", + "torch_model": "ok" +} +``` + +## 12. Troubleshooting + +### PowerShell blocks `npm` + +Use `npm.cmd`: + +```powershell +npm.cmd run dev +npm.cmd run build +``` + +### `.pt` model is unavailable + +Check that this file exists: + +```text +engine/best_model .pt +``` + +Then check Python dependencies: + +```powershell +cd backend +..\.venv\Scripts\python.exe -c "import torch, tiktoken; print(torch.__version__)" +``` + +### Backend cannot import FastAPI + +Install dependencies into the repo venv: + +```powershell +cd backend +..\.venv\Scripts\python.exe -m pip install -r requirements.txt +``` + +### C++ option is offline + +Start the C++ server: + +```powershell +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\Quadtrix.exe data\input.txt --server --port 8080 +``` + +### Frontend cannot reach backend + +Check: + +```text +http://localhost:3001/api/health +``` + +Make sure frontend config points to: + +```text +VITE_API_BASE_URL=http://localhost:3001 +``` + +### Port already in use + +```powershell +Get-NetTCPConnection -LocalPort 3001 +Get-NetTCPConnection -LocalPort 5173 +Get-NetTCPConnection -LocalPort 8080 +``` + +## Recommended Daily Run + +```powershell +# Terminal 1 +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp +.\Quadtrix.exe data\input.txt --server --port 8080 +``` + +```powershell +# Terminal 2 +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\backend +..\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 3001 +``` + +```powershell +# Terminal 3 +cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp\frontend +npm.cmd run dev +``` + +Open: + +```text +http://localhost:5173 +``` + +## License + +MIT diff --git a/engine/main.py b/engine/main.py index 983e893..78b5eb3 100644 --- a/engine/main.py +++ b/engine/main.py @@ -6,10 +6,7 @@ import os from pathlib import Path import tiktoken - -# # LOGGING UTILITIES - W = 78 DOUBLE = "=" * W SINGLE = "-" * W @@ -68,7 +65,7 @@ def success(msg): log(f" ok {msg}") batch_size = 16 block_size = 32 -max_iters = 6000 +max_iters = 20000 eval_interval = 100 learning_rate = 1e-3 device = 'cuda' if torch.cuda.is_available() else 'cpu' @@ -83,7 +80,7 @@ def success(msg): log(f" ok {msg}") # tokenizer -def get_tokenizer(encoding_name="gpt2"): +def get_tokenizer(encoding_name="o200k"): tokenizer = tiktoken.get_encoding(encoding_name) vocab_size = tokenizer.n_vocab return tokenizer, vocab_size @@ -97,7 +94,7 @@ def decode(tokens, tokenizer): return tokenizer.decode(tokens) with open(cleaned_path, 'r', encoding='utf-8') as f: text = f.read() -tokenizer, vocab_size = get_tokenizer("gpt2") +tokenizer, vocab_size = get_tokenizer("o200k") encoded_data = encode(text, tokenizer) data = torch.tensor(encoded_data, dtype=torch.long) @@ -249,8 +246,6 @@ def generate(self, idx, max_new_tokens): n_params = sum(p.numel() for p in model.parameters()) optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate) -# ── num_activations: real count via forward hooks on a dummy batch ─────────── - def count_activations(m, bs, seq_len, dev): total = 0 @@ -272,7 +267,7 @@ def _hook(module, inp, out): _num_activations = count_activations(model, batch_size, block_size, device) -# ── dataset batch counts ───────────────────────────────────────────────────── +# _train_batches = len(train_data) // (batch_size * block_size) _val_batches = len(val_data) // (batch_size * block_size) @@ -290,8 +285,6 @@ def _hook(module, inp, out): train_start = time.time() for iter in range(max_iters): - - # ── val + checkpoint at eval_interval ──────────────────────────────────── if iter % eval_interval == 0 or iter == max_iters - 1: losses = estimate_loss() is_best = losses['val'] < best_val_loss @@ -300,8 +293,6 @@ def _hook(module, inp, out): torch.save(model.state_dict(), 'best_model.pt') log(f" val loss {losses['val']:.6f}") sys.stdout.flush() - - # ── forward + backward ─────────────────────────────────────────────────── step_start = time.time() xb, yb = get_batch('train') @@ -330,7 +321,7 @@ def _hook(module, inp, out): with open(LOG_PATH, "a", encoding="utf-8") as f: f.write(line + "\n") - # ── sample 100 tokens every 50 steps ───────────────────────────────────── + # sample 100 tokens every 50 steps if (iter + 1) % 50 == 0: model.eval() context = torch.zeros((1, 1), dtype=torch.long, device=device) diff --git a/llm.cpp/config/config.h b/llm.cpp/config/config.h new file mode 100644 index 0000000..323ca87 --- /dev/null +++ b/llm.cpp/config/config.h @@ -0,0 +1,19 @@ +#pragma once +#include + +static const std::string DEFAULT_CLEANED_PATH = "data/input.txt"; +static const std::string DATA_PATH_ENV_VAR = "GPT_DATA_PATH"; +static const unsigned int SEED = 1337; +static const double TRAIN_SPLIT = 0.9; // 90% train, 10% val +static const int BATCH_SIZE = 16; +static const int BLOCK_SIZE = 64; // Context length +static const int MAX_ITERS = 5000; +static const int EVAL_INTERVAL = 250; +static const float LEARNING_RATE = 5e-4f; +static const int EVAL_ITERS = 100; +static const int N_EMBD = 128; +static const int N_HEAD = 4; +static const int N_LAYER = 4; +static const float DROPOUT = 0.05f; +static const std::string BEST_MODEL_PATH = "best_model.bin"; +static const std::string MODEL_PATH_ENV_VAR = "GPT_MODEL_PATH"; diff --git a/llm.cpp/include/attention.h b/llm.cpp/include/attention.h new file mode 100644 index 0000000..df14414 --- /dev/null +++ b/llm.cpp/include/attention.h @@ -0,0 +1,121 @@ +#pragma once +#include "config/config.h" +#include "linear.h" +#include "tensor.h" + +#include +#include +struct Head +{ + int head_size; + Linear key, query, value; + + Head() = default; + + Head(int n_embd, int hs, std::mt19937 &rng) + : head_size(hs), key(n_embd, hs, false, rng), query(n_embd, hs, false, rng), + value(n_embd, hs, false, rng) + { + } + + Tensor forward(const Tensor &x, bool training, std::mt19937 &rng) const + { + int B = x.shape[0], T = x.shape[1]; + + Tensor k = key.forward(x); // [B, T, hs] + Tensor q = query.forward(x); // [B, T, hs] + Tensor v = value.forward(x); // [B, T, hs] + + // scaled dot-product wei = q @ k^T * scale + float scale = 1.0f / std::sqrt((float)head_size); + Tensor kt = transpose23(k); // [B, hs, T] + Tensor wei = bmm(q, kt); // [B, T, T] + for (int b = 0; b < B; ++b) + for (int i = 0; i < T; ++i) + for (int j = i + 1; j < T; ++j) + wei.at(b, i, j) = -1e30f; + + // scale then softmax + wei = scale3d_inplace(wei, scale); + wei = softmax3d(wei); + + // dropout on attention weights + wei = dropout(wei, DROPOUT, training, rng); + return bmm(wei, v); + } + + int num_params() const + { + return key.num_params() + query.num_params() + value.num_params(); + } + + void save(std::ofstream &f) const + { + key.save(f); + query.save(f); + value.save(f); + } + void load(std::ifstream &f) + { + key.load(f); + query.load(f); + value.load(f); + } + + private: + static Tensor scale3d_inplace(Tensor t, float s) + { + for (auto &v : t.data) + v *= s; + return t; + } +}; + +// Multi-head causal attention +struct MultiHeadAttention +{ + int num_heads, head_size, n_embd; + std::vector heads; + Linear proj; + + MultiHeadAttention() = default; + + MultiHeadAttention(int n_embd_, int num_h, int hs, std::mt19937 &rng) + : num_heads(num_h), head_size(hs), n_embd(n_embd_), proj(num_h * hs, n_embd_, true, rng) + { + for (int i = 0; i < num_h; ++i) + heads.emplace_back(n_embd_, hs, rng); + } + Tensor forward(const Tensor &x, bool training, std::mt19937 &rng) const + { + std::vector head_outs; + head_outs.reserve(num_heads); + for (auto &h : heads) + head_outs.push_back(h.forward(x, training, rng)); + + Tensor concat = cat_last(head_outs); // [B, T, num_heads*hs] + Tensor out = proj.forward(concat); // [B, T, n_embd] + return dropout(out, DROPOUT, training, rng); + } + + int num_params() const + { + int n = proj.num_params(); + for (auto &h : heads) + n += h.num_params(); + return n; + } + + void save(std::ofstream &f) const + { + for (auto &h : heads) + h.save(f); + proj.save(f); + } + void load(std::ifstream &f) + { + for (auto &h : heads) + h.load(f); + proj.load(f); + } +}; \ No newline at end of file diff --git a/llm.cpp/include/backward.h b/llm.cpp/include/backward.h new file mode 100644 index 0000000..2528314 --- /dev/null +++ b/llm.cpp/include/backward.h @@ -0,0 +1,1053 @@ +#pragma once +// ============================================================ +// include/backward.h – Full analytical backpropagation +// Each backward_* function: +// - receives dOut (gradient of loss w.r.t. this layer's output) +// - receives saved activations from the forward pass +// - fills gradients into Grad structs (mirroring weight layout) +// - returns dX (gradient of loss w.r.t. this layer's input) +// ============================================================ + +#include "config/config.h" +#include "tensor.h" + +#include +#include +#include + +// ============================================================= +// Gradient stores (one per learnable weight tensour) +// ============================================================ + +struct GradLinear +{ + Tensor dW; // same shape as weight [in, out] + Tensor db; // same shape as bias [out] (may be empty) + bool has_bias; + + GradLinear() : has_bias(false) {} + GradLinear(int in_f, int out_f, bool bias) + : dW({in_f, out_f}, 0.0f), db(bias ? Tensor({out_f}, 0.0f) : Tensor()), has_bias(bias) + { + } + + void zero() + { + dW.fill(0.0f); + if (has_bias) + db.fill(0.0f); + } +}; + +struct GradEmbedding +{ + Tensor dW; // [num_embeddings, embedding_dim] + GradEmbedding() = default; + GradEmbedding(int n, int d) : dW({n, d}, 0.0f) {} + void zero() + { + dW.fill(0.0f); + } +}; + +struct GradLayerNorm +{ + Tensor dgamma; // [C] + Tensor dbeta; // [C] + GradLayerNorm() = default; + GradLayerNorm(int C) : dgamma({C}, 0.0f), dbeta({C}, 0.0f) {} + void zero() + { + dgamma.fill(0.0f); + dbeta.fill(0.0f); + } +}; + +struct GradHead +{ + GradLinear dkey, dquery, dvalue; + GradHead() = default; + GradHead(int n_embd, int hs) + : dkey(n_embd, hs, false), dquery(n_embd, hs, false), dvalue(n_embd, hs, false) + { + } + void zero() + { + dkey.zero(); + dquery.zero(); + dvalue.zero(); + } +}; + +struct GradMHA +{ + std::vector heads; + GradLinear proj; + GradMHA() = default; + GradMHA(int n_embd, int n_head, int hs) : proj(n_head * hs, n_embd, true) + { + for (int i = 0; i < n_head; ++i) + heads.emplace_back(n_embd, hs); + } + void zero() + { + for (auto &h : heads) + h.zero(); + proj.zero(); + } +}; + +struct GradFFN +{ + GradLinear dfc1, dfc2; + GradFFN() = default; + GradFFN(int n_embd) : dfc1(n_embd, 4 * n_embd, true), dfc2(4 * n_embd, n_embd, true) {} + void zero() + { + dfc1.zero(); + dfc2.zero(); + } +}; + +struct GradBlock +{ + GradMHA sa; + GradFFN ffwd; + GradLayerNorm ln1, ln2; + GradBlock() = default; + GradBlock(int n_embd, int n_head, int hs) + : sa(n_embd, n_head, hs), ffwd(n_embd), ln1(n_embd), ln2(n_embd) + { + } + void zero() + { + sa.zero(); + ffwd.zero(); + ln1.zero(); + ln2.zero(); + } +}; + +struct Grads +{ + GradEmbedding tok_emb, pos_emb; + std::vector blocks; + GradLayerNorm ln_f; + GradLinear lm_head; + + Grads() = default; + Grads(int vocab_size, int n_embd, int n_head, int n_layer, int block_size) + : tok_emb(vocab_size, n_embd), pos_emb(block_size, n_embd), ln_f(n_embd), + lm_head(n_embd, vocab_size, true) + { + int hs = n_embd / n_head; + for (int i = 0; i < n_layer; ++i) + blocks.emplace_back(n_embd, n_head, hs); + } + + void zero() + { + tok_emb.zero(); + pos_emb.zero(); + for (auto &b : blocks) + b.zero(); + ln_f.zero(); + lm_head.zero(); + } +}; + +// ============================================================ +// Saved activations from the forward pass +// (we need these to compute gradients) +// ============================================================ + +struct SavedHead +{ + Tensor x; // input [B, T, n_embd] + Tensor k, q, v; // key/query/value projections [B,T,hs] + Tensor wei_pre; // pre-softmax scores [B, T, T] + Tensor wei; // post-softmax weights [B, T, T] + Tensor dropout_mask; // 1=kept, 0=zeroed [B, T, T] (or empty) + bool used_dropout; +}; + +struct SavedMHA +{ + std::vector heads; + Tensor concat; // [B, T, n_head*hs] (after cat, before proj) + Tensor proj_out; // [B, T, n_embd] (after proj, before dropout) + Tensor dropout_mask; // proj dropout mask + bool used_dropout; +}; + +struct SavedFFN +{ + Tensor x; // input to fc1 [B, T, n_embd] + Tensor h_pre; // fc1 output before relu [B, T, 4*n_embd] + Tensor h; // after relu [B, T, 4*n_embd] + Tensor out_pre; // fc2 output before dropout [B, T, n_embd] + Tensor dropout_mask; + bool used_dropout; +}; + +struct SavedLN +{ + Tensor x; // input [B, T, C] + Tensor xhat; // normalized, before gamma/beta [B,T,C] + Tensor inv_std; // 1/sqrt(var+eps) per row stored as [B, T, 1] → flat + std::vector mu_vec, invstd_vec; // [B*T] each +}; + +struct SavedBlock +{ + SavedLN ln1, ln2; + SavedMHA mha; + SavedFFN ffn; + Tensor x_in; // input to block [B, T, C] + Tensor x_after_mha; // after residual add [B, T, C] +}; + +struct SavedForward +{ + // Embeddings + std::vector idx; // flat token indices B*T + int B, T; + Tensor tok_out; // [B, T, C] + Tensor pos_out; // [1, T, C] + Tensor emb_sum; // tok+pos [B, T, C] + + // Blocks + std::vector blocks; + + // Final LN + lm_head + SavedLN ln_f; + Tensor lm_in; // input to lm_head [B, T, C] + Tensor logits3d; // [B, T, V] + Tensor logits2d; // [B*T, V] + std::vector targets; +}; + +// ============================================================ +// Primitive backward ops +// ============================================================ + +// ---- cross-entropy backward --------------------------------- +// dlogits [B*T, V]: softmax(logits) - one_hot(targets) / BT +inline Tensor backward_cross_entropy(const Tensor &logits2d, const std::vector &targets) +{ + int BT = logits2d.shape[0], V = logits2d.shape[1]; + Tensor dlogits({BT, V}, 0.0f); + for (int i = 0; i < BT; ++i) + { + // softmax + float maxv = -1e30f; + for (int v = 0; v < V; ++v) + maxv = std::max(maxv, logits2d.at(i, v)); + float sumv = 0.0f; + for (int v = 0; v < V; ++v) + { + dlogits.at(i, v) = std::exp(logits2d.at(i, v) - maxv); + sumv += dlogits.at(i, v); + } + for (int v = 0; v < V; ++v) + dlogits.at(i, v) /= sumv; + // subtract one-hot + dlogits.at(i, targets[i]) -= 1.0f; + // scale by 1/BT + for (int v = 0; v < V; ++v) + dlogits.at(i, v) /= (float)BT; + } + return dlogits; +} + +// ---- linear backward [B,T,out] → [B,T,in] ----------------- +// dOut [B,T,E], x [B,T,D], W [D,E] (bias grad trivially = sum over B,T) +// Returns dX [B,T,D]; accumulates into gW [D,E] and gb [E] +inline Tensor backward_linear(const Tensor &dOut, // [B, T, E] + const Tensor &x, // [B, T, D] + const Tensor &W, // [D, E] + GradLinear &g) +{ + int B = dOut.shape[0], T = dOut.shape[1], E = dOut.shape[2]; + int D = W.shape[0]; + assert(E == W.shape[1]); + + // dX = dOut @ W^T [B, T, D] + Tensor dX({B, T, D}, 0.0f); + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int d = 0; d < D; ++d) + { + float s = 0.0f; + for (int e = 0; e < E; ++e) + s += dOut.at(b, t, e) * W.at(d, e); + dX.at(b, t, d) += s; + } + + // dW += x^T @ dOut accumulated [D, E] + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int d = 0; d < D; ++d) + for (int e = 0; e < E; ++e) + g.dW.at(d, e) += x.at(b, t, d) * dOut.at(b, t, e); + + // db += sum over B, T + if (g.has_bias) + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int e = 0; e < E; ++e) + g.db.at(e) += dOut.at(b, t, e); + + return dX; +} + +// ---- layer-norm backward [B,T,C] → [B,T,C] ---------------- +// Gradient of LayerNorm as derived in the original Ba et al. paper. +inline Tensor backward_layernorm(const Tensor &dOut, // [B, T, C] + const SavedLN &saved, + const Tensor &gamma, // [C] + GradLayerNorm &g) +{ + int B = dOut.shape[0], T = dOut.shape[1], C = dOut.shape[2]; + Tensor dX({B, T, C}, 0.0f); + + for (int b = 0; b < B; ++b) + { + for (int t = 0; t < T; ++t) + { + float inv_std = saved.invstd_vec[b * T + t]; + + // dgamma += dOut * xhat (accumulated) + // dbeta += dOut (accumulated) + for (int c = 0; c < C; ++c) + { + float xhat_c = saved.xhat.at(b, t, c); + g.dgamma.at(c) += dOut.at(b, t, c) * xhat_c; + g.dbeta.at(c) += dOut.at(b, t, c); + } + + // dX = (1/C) * inv_std * ( + // C * gamma * dOut + // - sum(gamma * dOut) + // - xhat * sum(gamma * dOut * xhat) ) + float sum1 = 0.0f, sum2 = 0.0f; + for (int c = 0; c < C; ++c) + { + float gd = gamma.at(c) * dOut.at(b, t, c); + sum1 += gd; + sum2 += gd * saved.xhat.at(b, t, c); + } + for (int c = 0; c < C; ++c) + { + float xhat_c = saved.xhat.at(b, t, c); + dX.at(b, t, c) = + inv_std / C * + (C * gamma.at(c) * dOut.at(b, t, c) - sum1 - xhat_c * sum2); + } + } + } + return dX; +} + +// ---- ReLU backward ------------------------------------------ +inline Tensor backward_relu(const Tensor &dOut, const Tensor &pre_relu) +{ + Tensor dX(dOut.shape); + for (int i = 0; i < dOut.numel(); ++i) + dX.data[i] = (pre_relu.data[i] > 0.0f) ? dOut.data[i] : 0.0f; + return dX; +} + +// ---- dropout backward (use same mask from forward) ---------- +inline Tensor backward_dropout(const Tensor &dOut, + const Tensor &mask, // 1=kept, 0=zeroed + float p) +{ + if (p == 0.0f) + return dOut; + Tensor dX(dOut.shape); + float inv_keep = 1.0f / (1.0f - p); + for (int i = 0; i < dOut.numel(); ++i) + dX.data[i] = dOut.data[i] * mask.data[i] * inv_keep; + return dX; +} + +// ---- batched matmul backward [B,T,D] x [B,D,T2] → [B,T,T2] -- +// da = dOut @ b^T, db = a^T @ dOut (both accumulated) +inline std::pair backward_bmm(const Tensor &dOut, // [B, T, T2] + const Tensor &a, // [B, T, D] + const Tensor &b) +{ // [B, D, T2] + int B = dOut.shape[0], T = dOut.shape[1], T2 = dOut.shape[2]; + int D = a.shape[2]; + Tensor da({B, T, D}, 0.0f); + Tensor db({B, D, T2}, 0.0f); + + for (int bb = 0; bb < B; ++bb) + { + // da = dOut @ b^T: da[b,t,d] += sum_{t2} dOut[b,t,t2]*b[b,d,t2] + for (int t = 0; t < T; ++t) + for (int d = 0; d < D; ++d) + { + float s = 0.0f; + for (int t2 = 0; t2 < T2; ++t2) + s += dOut.at(bb, t, t2) * b.at(bb, d, t2); + da.at(bb, t, d) += s; + } + // db = a^T @ dOut: db[b,d,t2] += sum_{t} a[b,t,d]*dOut[b,t,t2] + for (int d = 0; d < D; ++d) + for (int t2 = 0; t2 < T2; ++t2) + { + float s = 0.0f; + for (int t = 0; t < T; ++t) + s += a.at(bb, t, d) * dOut.at(bb, t, t2); + db.at(bb, d, t2) += s; + } + } + return {da, db}; +} + +// ---- softmax backward [B,T,T] (attention weights) ---------- +// d_pre = softmax_bwd(dwei, wei) +// For each row: d_pre_i = s_i * (d_i - sum_j(s_j * d_j)) +inline Tensor backward_softmax3d(const Tensor &dwei, // [B, T, T] + const Tensor &wei) +{ // [B, T, T] + int B = wei.shape[0], T1 = wei.shape[1], T2 = wei.shape[2]; + Tensor dpre({B, T1, T2}, 0.0f); + for (int b = 0; b < B; ++b) + for (int t = 0; t < T1; ++t) + { + float dot = 0.0f; + for (int t2 = 0; t2 < T2; ++t2) + dot += wei.at(b, t, t2) * dwei.at(b, t, t2); + for (int t2 = 0; t2 < T2; ++t2) + dpre.at(b, t, t2) = wei.at(b, t, t2) * (dwei.at(b, t, t2) - dot); + } + return dpre; +} + +// ---- cat_last backward [B,T,D_total] → slice per head ------ +inline std::vector backward_cat_last(const Tensor &dConcat, + const std::vector &head_sizes) +{ + int B = dConcat.shape[0], T = dConcat.shape[1]; + std::vector out; + int offset = 0; + for (int hs : head_sizes) + { + Tensor dh({B, T, hs}, 0.0f); + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int d = 0; d < hs; ++d) + dh.at(b, t, d) = dConcat.at(b, t, offset + d); + out.push_back(dh); + offset += hs; + } + return out; +} + +// ============================================================ +// Forward pass WITH activation saving +// ============================================================ + +// ---- saved layernorm forward -------------------------------- +inline Tensor forward_ln_save(const Tensor &x, + const Tensor &gamma, + const Tensor &beta, + SavedLN &saved, + float eps = 1e-5f) +{ + int B = x.shape[0], T = x.shape[1], C = x.shape[2]; + saved.x = x; + saved.xhat = Tensor({B, T, C}); + saved.mu_vec.resize(B * T); + saved.invstd_vec.resize(B * T); + Tensor out({B, T, C}); + for (int b = 0; b < B; ++b) + { + for (int t = 0; t < T; ++t) + { + float mu = 0.0f; + for (int c = 0; c < C; ++c) + mu += x.at(b, t, c); + mu /= C; + float var = 0.0f; + for (int c = 0; c < C; ++c) + { + float d = x.at(b, t, c) - mu; + var += d * d; + } + var /= C; + float inv = 1.0f / std::sqrt(var + eps); + saved.mu_vec[b * T + t] = mu; + saved.invstd_vec[b * T + t] = inv; + for (int c = 0; c < C; ++c) + { + float xh = (x.at(b, t, c) - mu) * inv; + saved.xhat.at(b, t, c) = xh; + out.at(b, t, c) = xh * gamma.at(c) + beta.at(c); + } + } + } + return out; +} + +// ---- saved single attention head forward -------------------- +inline Tensor forward_head_save(const Tensor &x, // [B,T,n_embd] + const Tensor &Wk, + const Tensor &Wq, + const Tensor &Wv, + bool training, + float drop_p, + std::mt19937 &rng, + SavedHead &sh) +{ + int B = x.shape[0], T = x.shape[1], hs = Wk.shape[1]; + sh.x = x; + sh.k = matmul(x, Wk); // [B,T,hs] + sh.q = matmul(x, Wq); + sh.v = matmul(x, Wv); + + float scale = 1.0f / std::sqrt((float)hs); + + // wei_pre = q @ k^T * scale [B, T, T] + Tensor kt = transpose23(sh.k); + sh.wei_pre = bmm(sh.q, kt); + for (auto &v : sh.wei_pre.data) + v *= scale; + + // causal mask + for (int b = 0; b < B; ++b) + for (int i = 0; i < T; ++i) + for (int j = i + 1; j < T; ++j) + sh.wei_pre.at(b, i, j) = -1e30f; + + // softmax + sh.wei = softmax3d(sh.wei_pre); + + // dropout on attention weights + sh.used_dropout = training && drop_p > 0.0f; + Tensor wei_drop = sh.wei; + if (sh.used_dropout) + { + sh.dropout_mask = Tensor(sh.wei.shape, 1.0f); + float inv_keep = 1.0f / (1.0f - drop_p); + std::bernoulli_distribution bd(1.0f - drop_p); + for (int i = 0; i < sh.dropout_mask.numel(); ++i) + { + bool kept = bd(rng); + sh.dropout_mask.data[i] = kept ? 1.0f : 0.0f; + wei_drop.data[i] = kept ? sh.wei.data[i] * inv_keep : 0.0f; + } + } + + return bmm(wei_drop, sh.v); // [B,T,hs] +} + +// ---- saved MHA forward -------------------------------------- +inline Tensor forward_mha_save(const Tensor &x, + const std::vector &Wks, + const std::vector &Wqs, + const std::vector &Wvs, + const Tensor &Wp, // proj weight [n_head*hs, n_embd] + const Tensor &bp, // proj bias [n_embd] + int n_head, + bool training, + float drop_p, + std::mt19937 &rng, + SavedMHA &sm) +{ + sm.heads.resize(n_head); + std::vector head_outs(n_head); + for (int h = 0; h < n_head; ++h) + head_outs[h] = + forward_head_save(x, Wks[h], Wqs[h], Wvs[h], training, drop_p, rng, sm.heads[h]); + + sm.concat = cat_last(head_outs); // [B,T, n_head*hs] + sm.proj_out = matmul(sm.concat, Wp); + sm.proj_out = add_bias(sm.proj_out, bp); + + // projection dropout + sm.used_dropout = training && drop_p > 0.0f; + Tensor out = sm.proj_out; + if (sm.used_dropout) + { + sm.dropout_mask = Tensor(out.shape, 1.0f); + float inv_keep = 1.0f / (1.0f - drop_p); + std::bernoulli_distribution bd(1.0f - drop_p); + for (int i = 0; i < sm.dropout_mask.numel(); ++i) + { + bool kept = bd(rng); + sm.dropout_mask.data[i] = kept ? 1.0f : 0.0f; + out.data[i] = kept ? out.data[i] * inv_keep : 0.0f; + } + } + return out; +} + +// ---- saved FFN forward -------------------------------------- +inline Tensor forward_ffn_save(const Tensor &x, + const Tensor &W1, + const Tensor &b1, + const Tensor &W2, + const Tensor &b2, + bool training, + float drop_p, + std::mt19937 &rng, + SavedFFN &sf) +{ + sf.x = x; + sf.h_pre = matmul(x, W1); + sf.h_pre = add_bias(sf.h_pre, b1); + sf.h = relu(sf.h_pre); + sf.out_pre = matmul(sf.h, W2); + sf.out_pre = add_bias(sf.out_pre, b2); + + sf.used_dropout = training && drop_p > 0.0f; + Tensor out = sf.out_pre; + if (sf.used_dropout) + { + sf.dropout_mask = Tensor(out.shape, 1.0f); + float inv_keep = 1.0f / (1.0f - drop_p); + std::bernoulli_distribution bd(1.0f - drop_p); + for (int i = 0; i < sf.dropout_mask.numel(); ++i) + { + bool kept = bd(rng); + sf.dropout_mask.data[i] = kept ? 1.0f : 0.0f; + out.data[i] = kept ? out.data[i] * inv_keep : 0.0f; + } + } + return out; +} + +// ============================================================ +// Full model forward with all activations saved +// ============================================================ +#include "quadtrix.h" // for GPTLanguageModel layout + +inline SavedForward forward_save(GPTLanguageModel &model, + const std::vector &idx, + int B, + int T, + const std::vector &targets, + bool training) +{ + SavedForward s; + s.idx = idx; + s.B = B; + s.T = T; + s.targets = targets; + int C = model.n_embd; + int V = model.vocab_size; + + // ── Embeddings ─────────────────────────────────────────── + s.tok_out = model.token_emb.forward(idx, B, T); + s.pos_out = model.pos_emb.forward_pos(T); + s.emb_sum = Tensor({B, T, C}); + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int d = 0; d < C; ++d) + s.emb_sum.at(b, t, d) = s.tok_out.at(b, t, d) + s.pos_out.at(0, t, d); + + // ── Transformer blocks ─────────────────────────────────── + s.blocks.resize(model.n_layer); + Tensor x = s.emb_sum; + for (int l = 0; l < model.n_layer; ++l) + { + auto &blk = model.blocks[l]; + auto &sb = s.blocks[l]; + sb.x_in = x; + + // LN1 + MHA + residual + Tensor x_ln1 = forward_ln_save(x, blk.ln1.gamma, blk.ln1.beta, sb.ln1); + + // Build weight vector views for each head + int n_head = model.n_head; + + std::vector Wks(n_head), Wqs(n_head), Wvs(n_head); + for (int h = 0; h < n_head; ++h) + { + Wks[h] = blk.sa.heads[h].key.weight; + Wqs[h] = blk.sa.heads[h].query.weight; + Wvs[h] = blk.sa.heads[h].value.weight; + } + + Tensor attn = forward_mha_save(x_ln1, + Wks, + Wqs, + Wvs, + blk.sa.proj.weight, + blk.sa.proj.bias, + n_head, + training, + DROPOUT, + model.rng, + sb.mha); + sb.x_after_mha = add(x, attn); // residual + + // LN2 + FFN + residual + Tensor x_ln2 = forward_ln_save(sb.x_after_mha, blk.ln2.gamma, blk.ln2.beta, sb.ln2); + Tensor ffn = forward_ffn_save(x_ln2, + blk.ffwd.fc1.weight, + blk.ffwd.fc1.bias, + blk.ffwd.fc2.weight, + blk.ffwd.fc2.bias, + training, + DROPOUT, + model.rng, + sb.ffn); + x = add(sb.x_after_mha, ffn); + } + + // ── Final LN + lm_head ─────────────────────────────────── + s.lm_in = forward_ln_save(x, model.ln_f.gamma, model.ln_f.beta, s.ln_f); + s.logits3d = matmul(s.lm_in, model.lm_head.weight); + s.logits3d = add_bias(s.logits3d, model.lm_head.bias); + + // reshape [B,T,V] → [B*T, V] + s.logits2d = Tensor({B * T, V}); + for (int i = 0; i < B * T; ++i) + for (int v = 0; v < V; ++v) + s.logits2d.at(i, v) = s.logits3d.data[i * V + v]; + + return s; +} + +// ============================================================ +// Full backward pass +// ============================================================ + +inline Grads backward(GPTLanguageModel &model, const SavedForward &s) +{ + int B = s.B, T = s.T; + int C = model.n_embd, V = model.vocab_size; + int n_head = model.n_head, hs = C / n_head; + + Grads g(V, C, n_head, model.n_layer, model.block_size); + + // ── dLoss / dLogits [B*T, V] ──────────────────────────── + Tensor dlogits2d = backward_cross_entropy(s.logits2d, s.targets); + + // reshape to [B, T, V] + Tensor dlogits3d({B, T, V}); + for (int i = 0; i < B * T; ++i) + for (int v = 0; v < V; ++v) + dlogits3d.data[i * V + v] = dlogits2d.at(i, v); + + // ── lm_head backward [B,T,V] → [B,T,C] ────────────────── + Tensor dx = backward_linear(dlogits3d, s.lm_in, model.lm_head.weight, g.lm_head); + + // ── final layernorm backward ────────────────────────────── + dx = backward_layernorm(dx, s.ln_f, model.ln_f.gamma, g.ln_f); + + // ── transformer blocks (reverse order) ─────────────────── + for (int l = model.n_layer - 1; l >= 0; --l) + { + auto &blk = model.blocks[l]; + auto &sb = s.blocks[l]; + auto &gb = g.blocks[l]; + + // ---- FFN residual: dx is d(x_after_mha + ffn_out) ── + // dffn = dx (residual, pass-through) + // dx += dx (will be added after LN2 backward below) + Tensor dffn_out = dx; // gradient to the ffn output branch + // residual adds straight through: + // d(x_after_mha) gets dx directly (accumulated below) + + // ---- LN2 + FFN backward ───────────────────────────── + // dffn_out → (dropout bwd) → fc2 bwd → relu bwd → fc1 bwd → dx_ln2 + Tensor dffn = dffn_out; + if (sb.ffn.used_dropout) + dffn = backward_dropout(dffn, sb.ffn.dropout_mask, DROPOUT); + + // fc2 backward + Tensor dh_relu = backward_linear(dffn, sb.ffn.h, blk.ffwd.fc2.weight, gb.ffwd.dfc2); + // relu backward + Tensor dh_pre = backward_relu(dh_relu, sb.ffn.h_pre); + // fc1 backward + Tensor dx_ln2 = backward_linear(dh_pre, sb.ffn.x, blk.ffwd.fc1.weight, gb.ffwd.dfc1); + + // LN2 backward → d(x_after_mha) from FFN branch + Tensor dx_after_mha_ffn = backward_layernorm(dx_ln2, sb.ln2, blk.ln2.gamma, gb.ln2); + // total d(x_after_mha) = residual-pass + LN2 branch + Tensor dx_after_mha = add(dx, dx_after_mha_ffn); + + // ---- MHA residual: x_after_mha = x_in + attn_out ─── + Tensor dattn_out = dx_after_mha; // gradient to attn branch + // d(x_in) from this residual = dx_after_mha (passed through) + + // ---- MHA backward ──────────────────────────────────── + Tensor dmha = dattn_out; + if (sb.mha.used_dropout) + dmha = backward_dropout(dmha, sb.mha.dropout_mask, DROPOUT); + + // proj backward [B,T,n_embd] → [B,T,n_head*hs] + Tensor dconcat = backward_linear(dmha, sb.mha.concat, blk.sa.proj.weight, gb.sa.proj); + + // split concat grad back to each head + std::vector head_sizes(n_head, hs); + auto dhead_outs = backward_cat_last(dconcat, head_sizes); + + // input grad accumulator + Tensor dx_ln1({B, T, C}, 0.0f); + + for (int h = 0; h < n_head; ++h) + { + auto &sh = sb.mha.heads[h]; + auto &gh = gb.sa.heads[h]; + + // dhead_outs[h]: [B, T, hs] = d(wei_drop @ v) + Tensor &dout_h = dhead_outs[h]; + + // attention dropout on wei + Tensor dwei_drop = dout_h; // placeholder — we need d(wei_drop @ v) + // Actually: out_h = wei_drop @ v + // d(wei_drop) = dout_h @ v^T [B,T,T] + // d(v) = wei_drop^T @ dout_h [B,T,hs] + Tensor wei_used = + sh.used_dropout ? Tensor( + [&]() + { + Tensor tmp = sh.wei; + float inv_keep = 1.0f / (1.0f - DROPOUT); + for (int i = 0; i < tmp.numel(); ++i) + tmp.data[i] = sh.dropout_mask.data[i] * + sh.wei.data[i] * inv_keep; + return tmp; + }()) + : sh.wei; + + // d(out_h) = dhead_outs[h] + // out_h = wei_used @ v → backward of bmm + // da = dOut @ b^T → d_wei_used = dout_h @ v^T [B,T,T] + // db = a^T @ dOut → dv = wei_used^T @ dout_h [B,T,hs] + Tensor vT = transpose23(sh.v); // [B, hs, T] + // d_wei_drop [B,T,T] = dout_h @ vT (but vT is [B,hs,T], need [B,T,hs]@... ) + // Use bmm with v transposed + // dout_h [B,T,hs], v [B,T,hs] → vT [B,hs,T] + // d_wei_drop = bmm(dout_h, vT) = [B,T,hs]@[B,hs,T] = [B,T,T] + Tensor d_wei_drop = bmm(dout_h, vT); // [B,T,T] + + // dv = wei_used^T @ dout_h = [B,T,T]^T @ [B,T,hs] = [B,T,hs] + Tensor wei_usedT = transpose23(wei_used); // [B, T, T] transposed → [B, T, T] + // bmm needs [B,T,T] x [B,T,hs]: wei_usedT [B,T,T] x dout_h [B,T,hs] + // but bmm signature is [B,T,D]x[B,D,T2] + // wei_usedT as [B,T,T] x dout_h [B,T,hs]: first transpose wei_used to get [B,T,T] + // correct: dv = bmm(wei_used^T, dout_h) where wei_used^T = [B,T,T] transposed + // back + Tensor dv = bmm(transpose23(sh.wei), dout_h); // [B,T,hs] + + // attention dropout backward on d_wei_drop → d_wei + Tensor d_wei = d_wei_drop; + if (sh.used_dropout) + { + float inv_keep = 1.0f / (1.0f - DROPOUT); + for (int i = 0; i < d_wei.numel(); ++i) + d_wei.data[i] *= sh.dropout_mask.data[i] * inv_keep; + } + + // causal mask backward: zero out upper-triangle grads (they were -inf, grad=0) + for (int b = 0; b < B; ++b) + for (int i = 0; i < T; ++i) + for (int j = i + 1; j < T; ++j) + d_wei.at(b, i, j) = 0.0f; + + // softmax backward + Tensor d_wei_pre = backward_softmax3d(d_wei, sh.wei); + + // scale backward (multiply by same 1/sqrt(hs)) + float scale = 1.0f / std::sqrt((float)hs); + for (auto &v : d_wei_pre.data) + v *= scale; + + // d_wei_pre = dq @ kT + q @ dkT (product rule of q@k^T) + // d_wei_pre [B,T,T], q [B,T,hs], k [B,T,hs] + // dq = d_wei_pre @ k [B,T,T]@[B,T,hs]... need k [B,hs,T]^T = k + // actual: d_wei_pre[b,i,j] = sum over... it's q[b,i,:] · k[b,j,:] + // dq[b,i,d] = sum_j d_wei_pre[b,i,j] * k[b,j,d] + // = bmm(d_wei_pre, k) where k is [B,T,hs] → need [B,T,hs] directly + // = bmm with b=[B,hs,T]? No: bmm([B,T,T], [B,T,hs]) needs second arg [B,T,T] + // Use: dq = d_wei_pre @ k with k as [B, hs, T]... no. + // dq[b,i,d] = sum_j d_pre[b,i,j] * k[b,j,d] → this IS bmm(d_pre, k) if + // k were [B,T,hs]... but bmm expects [B,D,T2]. So treat as matmul style: + // bmm(d_pre [B,T,T], k [B,T,hs]) — but bmm signature needs [B,D,T2]: + // interpret as B batches, each [T,T] @ [T,hs] = [T,hs]: b's D=T, T2=hs → valid! + Tensor dq = bmm(d_wei_pre, sh.k); // [B,T,hs] + + // dk[b,j,d] = sum_i d_pre[b,i,j] * q[b,i,d] + // = (d_pre^T @ q)[b,j,d] = bmm(transpose23(d_pre), q) [B,T,T]@[B,T,hs] + Tensor dk = bmm(transpose23(d_wei_pre), sh.q); // [B,T,hs] + + // Now project back through key/query/value linear layers (no bias) + // dX_from_k = dk @ Wk^T etc. Use backward_linear with dummy GradLinear + // but we need separate grads: + // dWk += xln1^T @ dk (accumulated) + // similar for Wq, Wv + // and dx_ln1 += dk @ Wk^T + dq @ Wq^T + dv @ Wv^T + + // Key + Tensor dx_k = backward_linear(dk, sh.x, blk.sa.heads[h].key.weight, gh.dkey); + Tensor dx_q = backward_linear(dq, sh.x, blk.sa.heads[h].query.weight, gh.dquery); + Tensor dx_v = backward_linear(dv, sh.x, blk.sa.heads[h].value.weight, gh.dvalue); + + // accumulate into dx_ln1 + for (int i = 0; i < dx_ln1.numel(); ++i) + { + dx_ln1.data[i] += dx_k.data[i] + dx_q.data[i] + dx_v.data[i]; + } + } + + // LN1 backward → d(x_in) + Tensor dx_in_mha = backward_layernorm(dx_ln1, sb.ln1, blk.ln1.gamma, gb.ln1); + + // total dx for this block: residual pass-through + LN1/MHA branch + LN2/FFN branch + // d(x_in) = d(x_after_mha) [residual from MHA] + d(x_in) [from MHA path] + // d(x_in) = dx_after_mha (pass-through of FFN residual) + dx_in_mha + dx = add(dx_after_mha, dx_in_mha); + } + + // ── Embedding backward ─────────────────────────────────── + // dx is now d(emb_sum) = d(tok_emb + pos_emb) + // pos_emb grad: sum over batch + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int d = 0; d < C; ++d) + g.pos_emb.dW.at(t, d) += dx.at(b, t, d); + + // tok_emb grad: scatter into vocab rows + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + { + int tok = s.idx[b * T + t]; + for (int d = 0; d < C; ++d) + g.tok_emb.dW.at(tok, d) += dx.at(b, t, d); + } + + return g; +} + +// ============================================================ +// Apply Grads → model weights (AdamW update) +// ============================================================ + +struct AdamWState +{ + int step{0}; + float lr, beta1, beta2, eps; + + struct ParamState + { + std::vector *param; + std::vector m, v; + }; + std::vector states; + + AdamWState(float lr_ = 3e-4f, float b1 = 0.9f, float b2 = 0.999f, float e = 1e-8f) + : lr(lr_), beta1(b1), beta2(b2), eps(e) + { + } + + void register_param(std::vector &p) + { + states.push_back( + {&p, std::vector(p.size(), 0.0f), std::vector(p.size(), 0.0f)}); + } + + // Update one param tensor from its gradient tensor + void update_one(int idx, const Tensor &grad) + { + auto &ps = states[idx]; + for (int i = 0; i < (int)ps.param->size(); ++i) + { + float g = grad.data[i]; + ps.m[i] = beta1 * ps.m[i] + (1.0f - beta1) * g; + ps.v[i] = beta2 * ps.v[i] + (1.0f - beta2) * g * g; + float mh = ps.m[i] / (1.0f - std::pow(beta1, step)); + float vh = ps.v[i] / (1.0f - std::pow(beta2, step)); + (*ps.param)[i] -= lr * mh / (std::sqrt(vh) + eps); + } + } +}; + +inline void apply_grads(GPTLanguageModel &model, const Grads &g, AdamWState &opt) +{ + opt.step++; + int pi = 0; + + auto upd = [&](std::vector ¶m, const Tensor &grad) + { + auto &ps = opt.states[pi++]; + assert(ps.param == ¶m); + for (int i = 0; i < (int)param.size(); ++i) + { + float gv = grad.data[i]; + ps.m[i] = opt.beta1 * ps.m[i] + (1.0f - opt.beta1) * gv; + ps.v[i] = opt.beta2 * ps.v[i] + (1.0f - opt.beta2) * gv * gv; + float mh = ps.m[i] / (1.0f - std::pow(opt.beta1, opt.step)); + float vh = ps.v[i] / (1.0f - std::pow(opt.beta2, opt.step)); + param[i] -= opt.lr * mh / (std::sqrt(vh) + opt.eps); + } + }; + + upd(model.token_emb.weight.data, g.tok_emb.dW); + upd(model.pos_emb.weight.data, g.pos_emb.dW); + + for (int l = 0; l < model.n_layer; ++l) + { + auto &blk = model.blocks[l]; + auto &gb = g.blocks[l]; + for (int h = 0; h < model.n_head; ++h) + { + upd(blk.sa.heads[h].key.weight.data, gb.sa.heads[h].dkey.dW); + upd(blk.sa.heads[h].query.weight.data, gb.sa.heads[h].dquery.dW); + upd(blk.sa.heads[h].value.weight.data, gb.sa.heads[h].dvalue.dW); + } + upd(blk.sa.proj.weight.data, gb.sa.proj.dW); + upd(blk.sa.proj.bias.data, gb.sa.proj.db); + upd(blk.ffwd.fc1.weight.data, gb.ffwd.dfc1.dW); + upd(blk.ffwd.fc1.bias.data, gb.ffwd.dfc1.db); + upd(blk.ffwd.fc2.weight.data, gb.ffwd.dfc2.dW); + upd(blk.ffwd.fc2.bias.data, gb.ffwd.dfc2.db); + upd(blk.ln1.gamma.data, gb.ln1.dgamma); + upd(blk.ln1.beta.data, gb.ln1.dbeta); + upd(blk.ln2.gamma.data, gb.ln2.dgamma); + upd(blk.ln2.beta.data, gb.ln2.dbeta); + } + upd(model.ln_f.gamma.data, g.ln_f.dgamma); + upd(model.ln_f.beta.data, g.ln_f.dbeta); + upd(model.lm_head.weight.data, g.lm_head.dW); + upd(model.lm_head.bias.data, g.lm_head.db); +} + +// Build AdamWState from model params (call once before training) +inline AdamWState build_optimizer(GPTLanguageModel &model, float lr) +{ + AdamWState opt(lr); + opt.register_param(model.token_emb.weight.data); + opt.register_param(model.pos_emb.weight.data); + for (auto &blk : model.blocks) + { + for (auto &h : blk.sa.heads) + { + opt.register_param(h.key.weight.data); + opt.register_param(h.query.weight.data); + opt.register_param(h.value.weight.data); + } + opt.register_param(blk.sa.proj.weight.data); + opt.register_param(blk.sa.proj.bias.data); + opt.register_param(blk.ffwd.fc1.weight.data); + opt.register_param(blk.ffwd.fc1.bias.data); + opt.register_param(blk.ffwd.fc2.weight.data); + opt.register_param(blk.ffwd.fc2.bias.data); + opt.register_param(blk.ln1.gamma.data); + opt.register_param(blk.ln1.beta.data); + opt.register_param(blk.ln2.gamma.data); + opt.register_param(blk.ln2.beta.data); + } + opt.register_param(model.ln_f.gamma.data); + opt.register_param(model.ln_f.beta.data); + opt.register_param(model.lm_head.weight.data); + opt.register_param(model.lm_head.bias.data); + return opt; +} \ No newline at end of file diff --git a/llm.cpp/include/block.h b/llm.cpp/include/block.h new file mode 100644 index 0000000..874d6fa --- /dev/null +++ b/llm.cpp/include/block.h @@ -0,0 +1,61 @@ +#pragma once +// ============================================================ +// include/block.h – Single Transformer block +// Mirrors: class Block in Python +// Architecture: pre-LN - MHA - residual -pre-LN - FFN -residual +// ============================================================ + +#include "attention.h" +#include "feedforward.h" +#include "layernorm.h" +#include + +struct Block +{ + MultiHeadAttention sa; // self-attention + FeedForward ffwd; // feed-forward + LayerNorm ln1; // before attention + LayerNorm ln2; // before ffn + + Block() = default; + + Block(int n_embd, int n_head, std::mt19937 &rng) + : sa(n_embd, n_head, n_embd / n_head, rng), + ffwd(n_embd, rng), + ln1(n_embd), + ln2(n_embd) {} + + // x: [B, T, n_embd] → [B, T, n_embd] + Tensor forward(const Tensor &x, bool training, std::mt19937 &rng) const + { + // x = x + sa(ln1(x)) + Tensor xn1 = ln1.forward(x); + Tensor attn = sa.forward(xn1, training, rng); + Tensor x2 = add(x, attn); + + // x = x + ffwd(ln2(x)) + Tensor xn2 = ln2.forward(x2); + Tensor ffn = ffwd.forward(xn2, training, rng); + return add(x2, ffn); + } + + int num_params() const + { + return sa.num_params() + ffwd.num_params() + ln1.num_params() + ln2.num_params(); + } + + void save(std::ofstream &f) const + { + sa.save(f); + ffwd.save(f); + ln1.save(f); + ln2.save(f); + } + void load(std::ifstream &f) + { + sa.load(f); + ffwd.load(f); + ln1.load(f); + ln2.load(f); + } +}; \ No newline at end of file diff --git a/llm.cpp/include/char_level.h b/llm.cpp/include/char_level.h new file mode 100644 index 0000000..4e89dbf --- /dev/null +++ b/llm.cpp/include/char_level.h @@ -0,0 +1,131 @@ +#pragma once +// ============================================================ +// include/dataloader.h – Character-level tokeniser & batching +// Mirrors the data-loading section of the Python script +// ============================================================ + +#include "tensor.h" +#include "config/config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct DataLoader +{ + std::string text; + std::vector chars; // sorted vocabulary + std::map stoi; // char → index + std::map itos; // index → char + int vocab_size{0}; + + std::vector train_data; + std::vector val_data; + + // ---- load and prepare ---------------------------------------- + void load(const std::string &path, double train_split = TRAIN_SPLIT) + { + std::ifstream f(path); + if (!f.is_open()) + throw std::runtime_error("[DataLoader] Cannot open file: " + path); + + std::ostringstream ss; + ss << f.rdbuf(); + text = ss.str(); + if (text.empty()) + throw std::runtime_error("[DataLoader] File is empty: " + path); + + // build vocabulary + std::set charset(text.begin(), text.end()); + chars = std::vector(charset.begin(), charset.end()); + std::sort(chars.begin(), chars.end()); + vocab_size = (int)chars.size(); + + stoi.clear(); + itos.clear(); + for (int i = 0; i < vocab_size; ++i) + { + stoi[chars[i]] = i; + itos[i] = chars[i]; + } + + // encode + std::vector data; + data.reserve(text.size()); + for (char c : text) + data.push_back(stoi.at(c)); + + int n = (int)(train_split * data.size()); + train_data = std::vector(data.begin(), data.begin() + n); + val_data = std::vector(data.begin() + n, data.end()); + + if (train_data.size() <= (size_t)BLOCK_SIZE || + val_data.size() <= (size_t)BLOCK_SIZE) + throw std::runtime_error("[DataLoader] Dataset is too small for the configured BLOCK_SIZE=" + + std::to_string(BLOCK_SIZE) + ". Need more than " + + std::to_string(BLOCK_SIZE + 1) + " tokens in both train and validation splits."); + + std::cout << "[DATA] Total characters : " << text.size() << "\n"; + std::cout << "[DATA] Vocabulary size : " << vocab_size << "\n"; + std::cout << "[DATA] Train tokens : " << train_data.size() << "\n"; + std::cout << "[DATA] Val tokens : " << val_data.size() << "\n"; + } + + // ---- encode / decode ----------------------------------------- + std::vector encode(const std::string &s) const + { + std::vector out; + out.reserve(s.size()); + for (char c : s) + { + auto it = stoi.find(c); + if (it != stoi.end()) + out.push_back(it->second); + } + return out; + } + + std::string decode(const std::vector &ids) const + { + std::string out; + out.reserve(ids.size()); + for (int id : ids) + { + auto it = itos.find(id); + if (it != itos.end()) + out += it->second; + } + return out; + } + + // ---- batch sampler ------------------------------------------- + // Returns (x, y) as flat integer vectors of size B*T + std::pair, std::vector> + get_batch(const std::string &split, int batch_size, int block_size, + std::mt19937 &rng) const + { + const std::vector &d = (split == "train") ? train_data : val_data; + + std::uniform_int_distribution dist(0, (int)d.size() - block_size - 1); + + std::vector x(batch_size * block_size); + std::vector y(batch_size * block_size); + + for (int b = 0; b < batch_size; ++b) + { + int start = dist(rng); + for (int t = 0; t < block_size; ++t) + { + x[b * block_size + t] = d[start + t]; + y[b * block_size + t] = d[start + t + 1]; + } + } + return {x, y}; + } +}; diff --git a/llm.cpp/include/dataloader.h b/llm.cpp/include/dataloader.h new file mode 100644 index 0000000..ee2d7eb --- /dev/null +++ b/llm.cpp/include/dataloader.h @@ -0,0 +1,237 @@ +#pragma once + +#include "config/config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// DataLoader handles BPE tokenization, corpus loading, and batch generation. +struct DataLoader +{ + std::vector vocab; // id to token string + std::map token_to_id; // token string to id + std::vector> merges; // merge rules in training order + std::map, int> merge_rank; // pair to training step index + int base_vocab_size{0}; // number of single-char tokens + int vocab_size{0}; + + std::vector train_data; + std::vector val_data; + + // Load text file and train BPE tokenizer on it. + // Splits into train and validation sets. + void load(const std::string &path, + int target_vocab = BPE_VOCAB_SIZE, + double train_split = TRAIN_SPLIT) + { + std::ifstream f(path); + if (!f.is_open()) + throw std::runtime_error("[DataLoader] Cannot open file: " + path); + + std::ostringstream ss; + ss << f.rdbuf(); + std::string text = ss.str(); + if (text.empty()) + throw std::runtime_error("[DataLoader] File is empty: " + path); + + std::cout << "[BPE] Text length: " << text.size() << " characters\n"; + std::cout << "[BPE] Target vocab size: " << target_vocab << "\n"; + std::cout.flush(); + + std::vector data = train_bpe(text, target_vocab); + + int n = (int)(train_split * (double)data.size()); + train_data = std::vector(data.begin(), data.begin() + n); + val_data = std::vector(data.begin() + n, data.end()); + + if ((int)train_data.size() <= BLOCK_SIZE || + (int)val_data.size() <= BLOCK_SIZE) + throw std::runtime_error( + "[DataLoader] Dataset too small for BLOCK_SIZE=" + + std::to_string(BLOCK_SIZE)); + + std::cout << "[DATA] Total tokens : " << data.size() << "\n"; + std::cout << "[DATA] Train tokens : " << train_data.size() << "\n"; + std::cout << "[DATA] Val tokens : " << val_data.size() << "\n"; + } + + // Encode a string to BPE token ids. + // Characters not found in base vocab are skipped silently. + std::vector encode(const std::string &text) const + { + return apply_merges(base_encode(text)); + } + + // Decode BPE token ids back to the original string. + std::string decode(const std::vector &ids) const + { + std::string out; + for (int id : ids) + if (id >= 0 && id < (int)vocab.size()) + out += vocab[id]; + return out; + } + + // Get a random batch of (input, target) token pairs. + // Input is [batch_size * block_size] tokens. + // Target is the next token for each input position. + std::pair, std::vector> + get_batch(const std::string &split, int batch_size, int block_size, + std::mt19937 &rng) const + { + const std::vector &d = (split == "train") ? train_data : val_data; + std::uniform_int_distribution dist(0, (int)d.size() - block_size - 1); + + std::vector x(batch_size * block_size); + std::vector y(batch_size * block_size); + + for (int b = 0; b < batch_size; ++b) { + int start = dist(rng); + for (int t = 0; t < block_size; ++t) { + x[b * block_size + t] = d[start + t]; + y[b * block_size + t] = d[start + t + 1]; + } + } + return {x, y}; + } + +private: + + // Convert a string to char-level token ids. + std::vector base_encode(const std::string &text) const + { + std::vector ids; + ids.reserve(text.size()); + for (char c : text) { + auto it = token_to_id.find(std::string(1, c)); + if (it != token_to_id.end()) + ids.push_back(it->second); + } + return ids; + } + + // Apply all BPE merge rules in training order to a token sequence. + std::vector apply_merges(std::vector ids) const + { + for (int rank = 0; rank < (int)merges.size(); ++rank) { + int left = merges[rank].first; + int right = merges[rank].second; + int new_id = base_vocab_size + rank; + + std::vector out; + out.reserve(ids.size()); + int i = 0; + while (i < (int)ids.size()) { + if (i + 1 < (int)ids.size() && + ids[i] == left && ids[i+1] == right) + { + out.push_back(new_id); + i += 2; + } else { + out.push_back(ids[i]); + ++i; + } + } + ids = std::move(out); + } + return ids; + } + + // Train BPE on the input text. + // Returns the final BPE-encoded token sequence for the full corpus. + std::vector train_bpe(const std::string &text, int target_vocab) + { + // Build base vocabulary from all unique characters. + std::set chars(text.begin(), text.end()); + for (char c : chars) { + std::string s(1, c); + token_to_id[s] = (int)vocab.size(); + vocab.push_back(s); + } + base_vocab_size = (int)vocab.size(); + + if (target_vocab <= base_vocab_size) { + vocab_size = base_vocab_size; + return base_encode(text); + } + + // Encode full text as base character-level tokens. + std::vector ids = base_encode(text); + + int num_merges = target_vocab - base_vocab_size; + merges.reserve(num_merges); + std::cout << "[BPE] Running " << num_merges << " merges...\n"; + std::cout.flush(); + + for (int step = 0; step < num_merges; ++step) + { + // Count frequency of all adjacent token pairs. + std::unordered_map counts; + counts.reserve(ids.size()); + for (int i = 0; i + 1 < (int)ids.size(); ++i) { + long long key = ((long long)ids[i] << 32) | (unsigned int)ids[i+1]; + ++counts[key]; + } + + if (counts.empty()) break; + + // Find the most frequent pair. + long long best_key = 0; + int best_cnt = -1; + for (auto &kv : counts) { + if (kv.second > best_cnt) { + best_cnt = kv.second; + best_key = kv.first; + } + } + + int left = (int)(best_key >> 32); + int right = (int)(best_key & 0xFFFFFFFFLL); + + // Create a new token for this merge. + int new_id = (int)vocab.size(); + std::string new_tok = vocab[left] + vocab[right]; + vocab.push_back(new_tok); + token_to_id[new_tok] = new_id; + merges.push_back({left, right}); + merge_rank[{left, right}] = step; + + // Apply the merge everywhere in the sequence. + std::vector out; + out.reserve(ids.size()); + int i = 0; + while (i < (int)ids.size()) { + if (i + 1 < (int)ids.size() && + ids[i] == left && ids[i+1] == right) + { + out.push_back(new_id); + i += 2; + } else { + out.push_back(ids[i]); + ++i; + } + } + ids = std::move(out); + + // Print progress every 500 merges. + if ((step + 1) % 500 == 0 || step + 1 == num_merges) { + std::cout << "[BPE] step " << (step + 1) << "/" << num_merges + << " vocab=" << (int)vocab.size() + << " seq=" << ids.size() << "\n"; + std::cout.flush(); + } + } + + vocab_size = (int)vocab.size(); + std::cout << "[BPE] Done. Final vocab size: " << vocab_size << "\n"; + return ids; + } +}; diff --git a/llm.cpp/include/embedding.h b/llm.cpp/include/embedding.h new file mode 100644 index 0000000..6004b21 --- /dev/null +++ b/llm.cpp/include/embedding.h @@ -0,0 +1,62 @@ +#pragma once +// ============================================================ +// include/embedding.h – Lookup-table embedding +// Mirrors: nn.Embedding(num_embeddings, embedding_dim) +// ============================================================ + +#include "tensor.h" +#include +#include + +struct Embedding +{ + int num_embeddings; + int embedding_dim; + Tensor weight; // [num_embeddings, embedding_dim] + + Embedding() = default; + + Embedding(int num_emb, int emb_dim, std::mt19937 &rng) + : num_embeddings(num_emb), embedding_dim(emb_dim) + { + weight = Tensor::randn({num_emb, emb_dim}, 0.0f, 0.02f, rng); + } + + // idx: flat vector of token indices, length B*T + // returns Tensor [B, T, emb_dim] + Tensor forward(const std::vector &idx, int B, int T) const + { + Tensor out({B, T, embedding_dim}); + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + { + int token = idx[b * T + t]; + for (int d = 0; d < embedding_dim; ++d) + out.at(b, t, d) = weight.at(token, d); + } + return out; + } + + // position embedding: idx = 0,1,...,T-1 to [1, T, emb_dim] + Tensor forward_pos(int T) const + { + Tensor out({1, T, embedding_dim}); + for (int t = 0; t < T; ++t) + for (int d = 0; d < embedding_dim; ++d) + out.at(0, t, d) = weight.at(t, d); + return out; + } + + int num_params() const { return weight.numel(); } + + void save(std::ofstream &f) const + { + f.write(reinterpret_cast(weight.data.data()), + weight.numel() * sizeof(float)); + } + void load(std::ifstream &f) + { + f.read(reinterpret_cast(weight.data.data()), + weight.numel() * sizeof(float)); + } +}; \ No newline at end of file diff --git a/llm.cpp/include/feedforward.h b/llm.cpp/include/feedforward.h new file mode 100644 index 0000000..3ae35ba --- /dev/null +++ b/llm.cpp/include/feedforward.h @@ -0,0 +1,47 @@ +#pragma once +// ============================================================ +// include/feedforward.h – Position-wise feed-forward network +// Mirrors: class FeedFoward in Python +// ============================================================ + +#include "tensor.h" +#include "linear.h" +#include "config/config.h" +#include + +struct FeedForward +{ + Linear fc1; // n_embd → 4*n_embd + Linear fc2; // 4*n_embd → n_embd + + FeedForward() = default; + + FeedForward(int n_embd, std::mt19937 &rng) + : fc1(n_embd, 4 * n_embd, true, rng), + fc2(4 * n_embd, n_embd, true, rng) {} + + // x: [B, T, n_embd] → [B, T, n_embd] + Tensor forward(const Tensor &x, bool training, std::mt19937 &rng) const + { + Tensor h = fc1.forward(x); // [B, T, 4*n_embd] + h = relu(h); // ReLU + h = fc2.forward(h); // [B, T, n_embd] + return dropout(h, DROPOUT, training, rng); + } + + int num_params() const + { + return fc1.num_params() + fc2.num_params(); + } + + void save(std::ofstream &f) const + { + fc1.save(f); + fc2.save(f); + } + void load(std::ifstream &f) + { + fc1.load(f); + fc2.load(f); + } +}; \ No newline at end of file diff --git a/llm.cpp/include/gpt.h b/llm.cpp/include/gpt.h new file mode 100644 index 0000000..33b0991 --- /dev/null +++ b/llm.cpp/include/gpt.h @@ -0,0 +1,261 @@ +#pragma once +// ============================================================ +// include/gpt.h – GPT Language Model +// Mirrors: class GPTLanguageModel in Python +// ============================================================ + +#include "tensor.h" +#include "embedding.h" +#include "block.h" +#include "layernorm.h" +#include "linear.h" +#include "config/config.h" +#include +#include +#include +#include +#include + +// ------------------------------------------------------------------ +// Cross-entropy loss for language modelling +// logits : [B*T, vocab_size] (flat) +// targets: flat integer indices, length B*T +// ------------------------------------------------------------------ +inline float cross_entropy(const Tensor &logits, const std::vector &targets) +{ + int BT = logits.shape[0]; + int V = logits.shape[1]; + float loss = 0.0f; + for (int i = 0; i < BT; ++i) + { + // log-softmax + NLL + float maxv = -1e30f; + for (int v = 0; v < V; ++v) + maxv = std::max(maxv, logits.at(i, v)); + float sumexp = 0.0f; + for (int v = 0; v < V; ++v) + sumexp += std::exp(logits.at(i, v) - maxv); + float log_prob = logits.at(i, targets[i]) - maxv - std::log(sumexp); + loss -= log_prob; + } + return loss / (float)BT; +} + +// ------------------------------------------------------------------ +// AdamW optimiser (simple, stateful) +// ------------------------------------------------------------------ +struct AdamW +{ + float lr, beta1, beta2, eps, weight_decay; + int step_count; + std::vector params; + std::vector sizes; + std::vector> m, v; // first/second moment + + AdamW(float lr_ = 3e-4f, + float beta1_ = 0.9f, float beta2_ = 0.999f, + float eps_ = 1e-8f, float wd = 0.0f) + : lr(lr_), beta1(beta1_), beta2(beta2_), + eps(eps_), weight_decay(wd), step_count(0) {} + + void add_param(std::vector &p) + { + params.push_back(p.data()); + sizes.push_back((int)p.size()); + m.emplace_back(p.size(), 0.0f); + v.emplace_back(p.size(), 0.0f); + } + + // grads must be passed in the same order as params were added + void step(std::vector> &grads) + { + ++step_count; + float bc1 = 1.0f - std::pow(beta1, step_count); + float bc2 = 1.0f - std::pow(beta2, step_count); + for (int pi = 0; pi < (int)params.size(); ++pi) + { + for (int i = 0; i < sizes[pi]; ++i) + { + float g = grads[pi][i]; + m[pi][i] = beta1 * m[pi][i] + (1.0f - beta1) * g; + v[pi][i] = beta2 * v[pi][i] + (1.0f - beta2) * g * g; + float mhat = m[pi][i] / bc1; + float vhat = v[pi][i] / bc2; + params[pi][i] -= lr * mhat / (std::sqrt(vhat) + eps); + if (weight_decay > 0.0f) + params[pi][i] -= lr * weight_decay * params[pi][i]; + } + } + } +}; + +// ------------------------------------------------------------------ +// GPTLanguageModel +// ------------------------------------------------------------------ +struct GPTLanguageModel +{ + std::mt19937 rng; + int vocab_size, n_embd, n_head, n_layer, block_size; + + Embedding token_emb; // [vocab_size, n_embd] + Embedding pos_emb; // [block_size, n_embd] + std::vector blocks; + LayerNorm ln_f; + Linear lm_head; // [n_embd, vocab_size] + + GPTLanguageModel(int vocab, int embd, int heads, int layers, + int blk_sz, unsigned int seed) + : vocab_size(vocab), n_embd(embd), n_head(heads), + n_layer(layers), block_size(blk_sz), + rng(seed), + token_emb(vocab, embd, rng), + pos_emb(blk_sz, embd, rng), + ln_f(embd), + lm_head(embd, vocab, true, rng) + { + for (int i = 0; i < layers; ++i) + blocks.emplace_back(embd, heads, rng); + } + + int num_params() const + { + int n = token_emb.num_params() + pos_emb.num_params() + ln_f.num_params() + lm_head.num_params(); + for (auto &b : blocks) + n += b.num_params(); + return n; + } + + // ---------------------------------------------------------------- + // forward + // idx : flat [B*T] token indices + // B, T : batch and sequence length + // targets: flat [B*T] next-token indices (empty = inference) + // returns: (logits [B*T, vocab], loss) loss=0 when no targets + // ---------------------------------------------------------------- + std::pair forward(const std::vector &idx, + int B, int T, + const std::vector &targets, + bool training) + { + // token + position embeddings + Tensor tok = token_emb.forward(idx, B, T); // [B, T, n_embd] + Tensor pos = pos_emb.forward_pos(T); // [1, T, n_embd] + + // broadcast pos over batch + Tensor x({B, T, n_embd}); + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int d = 0; d < n_embd; ++d) + x.at(b, t, d) = tok.at(b, t, d) + pos.at(0, t, d); + + // transformer blocks + for (auto &blk : blocks) + x = blk.forward(x, training, rng); + + // final layer norm + x = ln_f.forward(x); + + // lm_head → logits [B, T, vocab] + Tensor logits3d = lm_head.forward(x); // [B, T, vocab] + + // reshape to [B*T, vocab] + Tensor logits({B * T, vocab_size}); + for (int i = 0; i < B * T; ++i) + for (int v = 0; v < vocab_size; ++v) + logits.at(i, v) = logits3d.data[i * vocab_size + v]; + + float loss = 0.0f; + if (!targets.empty()) + loss = cross_entropy(logits, targets); + + return {logits, loss}; + } + + // ---------------------------------------------------------------- + // generate (greedy autoregressive sampling with temperature=1) + // ---------------------------------------------------------------- + std::vector generate(std::vector context, int max_new_tokens) + { + std::uniform_real_distribution udist(0.0f, 1.0f); + + for (int step = 0; step < max_new_tokens; ++step) + { + // crop context to block_size + int T = std::min((int)context.size(), block_size); + std::vector ctx(context.end() - T, context.end()); + + std::pair forward_result = forward(ctx, 1, T, std::vector(), false); + Tensor logits = forward_result.first; + + // pick last time-step logits [vocab] + int offset = (T - 1) * vocab_size; + std::vector last_logits(vocab_size); + for (int v = 0; v < vocab_size; ++v) + last_logits[v] = logits.data[offset + v]; + + // softmax + float maxv = *std::max_element(last_logits.begin(), last_logits.end()); + float sumv = 0.0f; + for (auto &lv : last_logits) + { + lv = std::exp(lv - maxv); + sumv += lv; + } + for (auto &lv : last_logits) + lv /= sumv; + + // multinomial sample + float r = udist(rng); + float cumsum = 0.0f; + int next_tok = vocab_size - 1; + for (int v = 0; v < vocab_size; ++v) + { + cumsum += last_logits[v]; + if (r < cumsum) + { + next_tok = v; + break; + } + } + context.push_back(next_tok); + } + return context; + } + + // ---------------------------------------------------------------- + // save / load weights + // ---------------------------------------------------------------- + void save(const std::string &path) const + { + std::ofstream f(path, std::ios::binary); + if (!f) + { + std::cerr << "[ERROR] Cannot open " << path << " for writing\n"; + return; + } + token_emb.save(f); + pos_emb.save(f); + for (auto &b : blocks) + b.save(f); + ln_f.save(f); + lm_head.save(f); + std::cout << "[SAVE] Weights written to " << path << "\n"; + } + + void load(const std::string &path) + { + std::ifstream f(path, std::ios::binary); + if (!f) + { + std::cerr << "[ERROR] Cannot open " << path << " for reading\n"; + return; + } + token_emb.load(f); + pos_emb.load(f); + for (auto &b : blocks) + b.load(f); + ln_f.load(f); + lm_head.load(f); + std::cout << "[LOAD] Weights loaded from " << path << "\n"; + } +}; diff --git a/llm.cpp/include/layernorm.h b/llm.cpp/include/layernorm.h new file mode 100644 index 0000000..1bafb33 --- /dev/null +++ b/llm.cpp/include/layernorm.h @@ -0,0 +1,45 @@ +#pragma once +// ============================================================ +// include/layernorm.h – Layer normalisation +// Mirrors: nn.LayerNorm(n_embd) +// ============================================================ + +#include "tensor.h" +#include + +struct LayerNorm +{ + int n_embd; + Tensor gamma; // scale [n_embd] (weight) + Tensor beta; // shift [n_embd] (bias) + + LayerNorm() = default; + + explicit LayerNorm(int embd) + : n_embd(embd), + gamma(Tensor::ones({embd})), + beta(Tensor::zeros({embd})) {} + + // x: [B, T, n_embd] → [B, T, n_embd] + Tensor forward(const Tensor &x) const + { + return layer_norm(x, gamma, beta); + } + + int num_params() const { return gamma.numel() + beta.numel(); } + + void save(std::ofstream &f) const + { + f.write(reinterpret_cast(gamma.data.data()), + gamma.numel() * sizeof(float)); + f.write(reinterpret_cast(beta.data.data()), + beta.numel() * sizeof(float)); + } + void load(std::ifstream &f) + { + f.read(reinterpret_cast(gamma.data.data()), + gamma.numel() * sizeof(float)); + f.read(reinterpret_cast(beta.data.data()), + beta.numel() * sizeof(float)); + } +}; \ No newline at end of file diff --git a/llm.cpp/include/linear.h b/llm.cpp/include/linear.h new file mode 100644 index 0000000..af12b6a --- /dev/null +++ b/llm.cpp/include/linear.h @@ -0,0 +1,60 @@ +#pragma once +// ============================================================ +// include/linear.h – Linear (fully-connected) layer +// Mirrors: nn.Linear(in, out, bias=True/False) +// ============================================================ + +#include "tensor.h" +#include + +struct Linear +{ + int in_features, out_features; + bool has_bias; + Tensor weight; // [in_features, out_features] + Tensor bias; // [out_features] (empty when has_bias=false) + + Linear() = default; + + Linear(int in_f, int out_f, bool use_bias, std::mt19937 &rng) + : in_features(in_f), out_features(out_f), has_bias(use_bias) + { + weight = Tensor::randn({in_f, out_f}, 0.0f, 0.02f, rng); + if (has_bias) + bias = Tensor({out_f}, 0.0f); + } + + // forward: x [B, T, in_features] → [B, T, out_features] + Tensor forward(const Tensor &x) const + { + Tensor out = matmul(x, weight); + if (has_bias) + out = add_bias(out, bias); + return out; + } + + // count parameters + int num_params() const + { + return weight.numel() + (has_bias ? bias.numel() : 0); + } + + // ---- serialisation ---------------------------------------- + void save(std::ofstream &f) const + { + f.write(reinterpret_cast(weight.data.data()), + weight.numel() * sizeof(float)); + if (has_bias) + f.write(reinterpret_cast(bias.data.data()), + bias.numel() * sizeof(float)); + } + + void load(std::ifstream &f) + { + f.read(reinterpret_cast(weight.data.data()), + weight.numel() * sizeof(float)); + if (has_bias) + f.read(reinterpret_cast(bias.data.data()), + bias.numel() * sizeof(float)); + } +}; \ No newline at end of file diff --git a/llm.cpp/include/quadtrix.h b/llm.cpp/include/quadtrix.h new file mode 100644 index 0000000..0d5cd67 --- /dev/null +++ b/llm.cpp/include/quadtrix.h @@ -0,0 +1,250 @@ +#pragma once + +#include "tensor.h" +#include "embedding.h" +#include "block.h" +#include "layernorm.h" +#include "linear.h" +#include "config/config.h" +#include "sampler.h" +#include +#include +#include +#include +#include + +// Cross-entropy loss for language modelling. +// logits has shape BT by vocab_size (flat row-major). +// targets is a flat list of next-token indices of length BT. +inline float cross_entropy(const Tensor &logits, const std::vector &targets) +{ + int BT = logits.shape[0]; + int V = logits.shape[1]; + float loss = 0.0f; + for (int i = 0; i < BT; ++i) + { + float maxv = -1e30f; + for (int v = 0; v < V; ++v) + maxv = std::max(maxv, logits.at(i, v)); + float sumexp = 0.0f; + for (int v = 0; v < V; ++v) + sumexp += std::exp(logits.at(i, v) - maxv); + float log_prob = logits.at(i, targets[i]) - maxv - std::log(sumexp); + loss -= log_prob; + } + return loss / (float)BT; +} + +// AdamW optimiser: first and second moment estimates with weight decay. +struct AdamW +{ + float lr, beta1, beta2, eps, weight_decay; + int step_count; + std::vector params; + std::vector sizes; + std::vector> m, v; + + AdamW(float lr_ = 3e-4f, + float beta1_ = 0.9f, float beta2_ = 0.999f, + float eps_ = 1e-8f, float wd = 0.0f) + : lr(lr_), beta1(beta1_), beta2(beta2_), + eps(eps_), weight_decay(wd), step_count(0) {} + + void add_param(std::vector &p) + { + params.push_back(p.data()); + sizes.push_back((int)p.size()); + m.emplace_back(p.size(), 0.0f); + v.emplace_back(p.size(), 0.0f); + } + + // grads must be passed in the same order params were added + void step(std::vector> &grads) + { + ++step_count; + float bc1 = 1.0f - std::pow(beta1, step_count); + float bc2 = 1.0f - std::pow(beta2, step_count); + for (int pi = 0; pi < (int)params.size(); ++pi) + { + for (int i = 0; i < sizes[pi]; ++i) + { + float g = grads[pi][i]; + m[pi][i] = beta1 * m[pi][i] + (1.0f - beta1) * g; + v[pi][i] = beta2 * v[pi][i] + (1.0f - beta2) * g * g; + float mhat = m[pi][i] / bc1; + float vhat = v[pi][i] / bc2; + params[pi][i] -= lr * mhat / (std::sqrt(vhat) + eps); + if (weight_decay > 0.0f) + params[pi][i] -= lr * weight_decay * params[pi][i]; + } + } + } +}; + +// Full GPT language model: token and position embeddings, +// N transformer blocks, final layer norm, and an output projection. +struct GPTLanguageModel +{ + std::mt19937 rng; + int vocab_size, n_embd, n_head, n_layer, block_size; + + Embedding token_emb; + Embedding pos_emb; + std::vector blocks; + LayerNorm ln_f; + Linear lm_head; + + GPTLanguageModel(int vocab, int embd, int heads, int layers, + int blk_sz, unsigned int seed) + : vocab_size(vocab), n_embd(embd), n_head(heads), + n_layer(layers), block_size(blk_sz), + rng(seed), + token_emb(vocab, embd, rng), + pos_emb(blk_sz, embd, rng), + ln_f(embd), + lm_head(embd, vocab, true, rng) + { + for (int i = 0; i < layers; ++i) + blocks.emplace_back(embd, heads, rng); + } + + int num_params() const + { + int n = token_emb.num_params() + pos_emb.num_params() + + ln_f.num_params() + lm_head.num_params(); + for (auto &b : blocks) + n += b.num_params(); + return n; + } + + // Run the full forward pass. + // idx : flat list of B times T token indices + // B, T : batch size and sequence length + // targets : flat list of B times T next-token indices (empty means inference only) + // training: enables dropout when true + // returns : logits of shape BT by vocab, and scalar loss (0 when no targets) + std::pair forward(const std::vector &idx, + int B, int T, + const std::vector &targets, + bool training) + { + Tensor tok = token_emb.forward(idx, B, T); + Tensor pos = pos_emb.forward_pos(T); + + Tensor x({B, T, n_embd}); + for (int b = 0; b < B; ++b) + for (int t = 0; t < T; ++t) + for (int d = 0; d < n_embd; ++d) + x.at(b, t, d) = tok.at(b, t, d) + pos.at(0, t, d); + + for (auto &blk : blocks) + x = blk.forward(x, training, rng); + + x = ln_f.forward(x); + + Tensor logits3d = lm_head.forward(x); + + Tensor logits({B * T, vocab_size}); + for (int i = 0; i < B * T; ++i) + for (int v = 0; v < vocab_size; ++v) + logits.at(i, v) = logits3d.data[i * vocab_size + v]; + + float loss = 0.0f; + if (!targets.empty()) + loss = cross_entropy(logits, targets); + + return {logits, loss}; + } + + // Autoregressively sample max_new_tokens tokens from context. + // Repetition penalty from params is applied to raw logits before softmax + // so that tokens seen recently in the window are less likely to repeat. + // params defaults to config.h values when not provided. + std::vector generate(std::vector context, + int max_new_tokens, + const SamplerParams ¶ms = SamplerParams()) + { + std::uniform_real_distribution udist(0.0f, 1.0f); + + for (int step = 0; step < max_new_tokens; ++step) + { + // crop context to model block size + int T = std::min((int)context.size(), block_size); + std::vector ctx(context.end() - T, context.end()); + + Tensor logits = forward(ctx, 1, T, std::vector(), false).first; + + // pull out the last time step logits only + int offset = (T - 1) * vocab_size; + std::vector last(vocab_size); + for (int v = 0; v < vocab_size; ++v) + last[v] = logits.data[offset + v]; + + // lower the score of tokens seen recently + apply_rep_penalty(last, context, params); + + // softmax to get a probability distribution + float maxv = *std::max_element(last.begin(), last.end()); + float sumv = 0.0f; + for (auto &lv : last) + { + lv = std::exp(lv - maxv); + sumv += lv; + } + for (auto &lv : last) + lv /= sumv; + + // multinomial sample from the distribution + float r = udist(rng); + float cumsum = 0.0f; + int next_tok = vocab_size - 1; + for (int v = 0; v < vocab_size; ++v) + { + cumsum += last[v]; + if (r < cumsum) + { + next_tok = v; + break; + } + } + context.push_back(next_tok); + } + return context; + } + + // Write all weights to a binary file in layer order. + void save(const std::string &path) const + { + std::ofstream f(path, std::ios::binary); + if (!f) + { + std::cerr << "[ERROR] Cannot open " << path << " for writing\n"; + return; + } + token_emb.save(f); + pos_emb.save(f); + for (auto &b : blocks) + b.save(f); + ln_f.save(f); + lm_head.save(f); + std::cout << "[SAVE] Weights written to " << path << "\n"; + } + + // Read all weights from a binary file in the same layer order as save. + void load(const std::string &path) + { + std::ifstream f(path, std::ios::binary); + if (!f) + { + std::cerr << "[ERROR] Cannot open " << path << " for reading\n"; + return; + } + token_emb.load(f); + pos_emb.load(f); + for (auto &b : blocks) + b.load(f); + ln_f.load(f); + lm_head.load(f); + std::cout << "[LOAD] Weights loaded from " << path << "\n"; + } +}; diff --git a/llm.cpp/include/sampler.h b/llm.cpp/include/sampler.h new file mode 100644 index 0000000..8bee497 --- /dev/null +++ b/llm.cpp/include/sampler.h @@ -0,0 +1,50 @@ +#pragma once + +#include "config/config.h" +#include +#include + +// Holds all parameters that control token sampling at inference time. +// Fields can be set from CLI flags or left at config.h defaults. +struct SamplerParams +{ + float rep_penalty; // values above 1.0 reduce repeated tokens + int rep_window; // how many recent tokens to scan for repeats + std::string system_prompt; // text prepended before every user turn in chat + + SamplerParams() + : rep_penalty(DEFAULT_REP_PENALTY), + rep_window(DEFAULT_REP_WINDOW), + system_prompt("") {} +}; + +// Adjust raw logits to make recently seen tokens less likely to appear again. +// Tokens found in the recent context window have their logit reduced: +// positive logits are divided by rep_penalty +// negative logits are multiplied by rep_penalty +// This matches the formula used in llama.cpp repetition penalty. +// Call this on the last time step logits before softmax. +inline void apply_rep_penalty(std::vector &logits, + const std::vector &context, + const SamplerParams ¶ms) +{ + if (params.rep_penalty <= 1.0f || context.empty()) + return; + + int window_start = (int)context.size() - params.rep_window; + if (window_start < 0) + window_start = 0; + + for (int i = window_start; i < (int)context.size(); ++i) + { + int tok = context[i]; + if (tok < 0 || tok >= (int)logits.size()) + continue; + + float &l = logits[tok]; + if (l > 0.0f) + l /= params.rep_penalty; + else + l *= params.rep_penalty; + } +} diff --git a/llm.cpp/include/tensor.h b/llm.cpp/include/tensor.h new file mode 100644 index 0000000..c3526b6 --- /dev/null +++ b/llm.cpp/include/tensor.h @@ -0,0 +1,567 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +#ifdef __AVX__ +#include +#endif + +#ifdef __SSE__ +#include +#endif + +struct Tensor +{ + std::vector shape; + std::vector data; + + Tensor() = default; + + Tensor(std::vector sh, float fill = 0.0f) : shape(std::move(sh)) + { + int total = 1; + for (int d : shape) + total *= d; + data.reserve(total); + data.assign(total, fill); + } + + Tensor(const Tensor &) = default; + Tensor(Tensor &&) noexcept = default; + Tensor &operator=(const Tensor &) = default; + Tensor &operator=(Tensor &&) noexcept = default; + + int numel() const + { + int n = 1; + for (int d : shape) + n *= d; + return n; + } + + int ndim() const { return (int)shape.size(); } + + float &at(int i) { return data[i]; } + float at(int i) const { return data[i]; } + + float &at(int r, int c) { return data[r * shape[1] + c]; } + float at(int r, int c) const { return data[r * shape[1] + c]; } + + float &at(int b, int r, int c) { return data[b * shape[1] * shape[2] + r * shape[2] + c]; } + float at(int b, int r, int c) const { return data[b * shape[1] * shape[2] + r * shape[2] + c]; } + + static Tensor zeros(std::vector sh) { return Tensor(sh, 0.0f); } + static Tensor ones(std::vector sh) { return Tensor(sh, 1.0f); } + + static Tensor randn(std::vector sh, float mean, float std, std::mt19937 &rng) + { + std::normal_distribution dist(mean, std); + Tensor t(sh); + for (auto &v : t.data) + v = dist(rng); + return t; + } + + void fill(float v) { std::fill(data.begin(), data.end(), v); } + + void print_shape(const std::string &name = "") const + { + if (!name.empty()) + std::cout << name << ": "; + std::cout << "["; + for (int i = 0; i < (int)shape.size(); ++i) + { + std::cout << shape[i]; + if (i + 1 < (int)shape.size()) + std::cout << ", "; + } + std::cout << "]" << std::endl; + } +}; + +inline Tensor add(const Tensor &a, const Tensor &b) +{ + assert(a.data.size() == b.data.size()); + Tensor c(a.shape); + size_t n = a.data.size(); + +#ifdef __AVX__ + size_t i = 0; + size_t vec_end = n & ~7ULL; + for (; i < vec_end; i += 8) + { + __m256 va = _mm256_loadu_ps(&a.data[i]); + __m256 vb = _mm256_loadu_ps(&b.data[i]); + __m256 vc = _mm256_add_ps(va, vb); + _mm256_storeu_ps(&c.data[i], vc); + } + for (; i < n; ++i) + c.data[i] = a.data[i] + b.data[i]; +#elif defined(__SSE__) + size_t i = 0; + size_t vec_end = n & ~3ULL; + for (; i < vec_end; i += 4) + { + __m128 va = _mm_loadu_ps(&a.data[i]); + __m128 vb = _mm_loadu_ps(&b.data[i]); + __m128 vc = _mm_add_ps(va, vb); + _mm_storeu_ps(&c.data[i], vc); + } + for (; i < n; ++i) + c.data[i] = a.data[i] + b.data[i]; +#else + for (size_t i = 0; i < n; ++i) + c.data[i] = a.data[i] + b.data[i]; +#endif + return c; +} + +inline void add_inplace(Tensor &a, const Tensor &b) +{ + assert(a.data.size() == b.data.size()); + size_t n = a.data.size(); + +#ifdef __AVX__ + size_t i = 0; + size_t vec_end = n & ~7ULL; + for (; i < vec_end; i += 8) + { + __m256 va = _mm256_loadu_ps(&a.data[i]); + __m256 vb = _mm256_loadu_ps(&b.data[i]); + __m256 vc = _mm256_add_ps(va, vb); + _mm256_storeu_ps(&a.data[i], vc); + } + for (; i < n; ++i) + a.data[i] += b.data[i]; +#elif defined(__SSE__) + size_t i = 0; + size_t vec_end = n & ~3ULL; + for (; i < vec_end; i += 4) + { + __m128 va = _mm_loadu_ps(&a.data[i]); + __m128 vb = _mm_loadu_ps(&b.data[i]); + __m128 vc = _mm_add_ps(va, vb); + _mm_storeu_ps(&a.data[i], vc); + } + for (; i < n; ++i) + a.data[i] += b.data[i]; +#else + for (size_t i = 0; i < n; ++i) + a.data[i] += b.data[i]; +#endif +} + +inline Tensor scale(const Tensor &a, float s) +{ + Tensor c(a.shape); + size_t n = a.data.size(); + +#ifdef __AVX__ + size_t i = 0; + size_t vec_end = n & ~7ULL; + __m256 vs = _mm256_set1_ps(s); + for (; i < vec_end; i += 8) + { + __m256 va = _mm256_loadu_ps(&a.data[i]); + __m256 vc = _mm256_mul_ps(va, vs); + _mm256_storeu_ps(&c.data[i], vc); + } + for (; i < n; ++i) + c.data[i] = a.data[i] * s; +#elif defined(__SSE__) + size_t i = 0; + size_t vec_end = n & ~3ULL; + __m128 vs = _mm_set1_ps(s); + for (; i < vec_end; i += 4) + { + __m128 va = _mm_loadu_ps(&a.data[i]); + __m128 vc = _mm_mul_ps(va, vs); + _mm_storeu_ps(&c.data[i], vc); + } + for (; i < n; ++i) + c.data[i] = a.data[i] * s; +#else + for (size_t i = 0; i < n; ++i) + c.data[i] = a.data[i] * s; +#endif + return c; +} + +inline void scale_inplace(Tensor &a, float s) +{ + size_t n = a.data.size(); + +#ifdef __AVX__ + size_t i = 0; + size_t vec_end = n & ~7ULL; + __m256 vs = _mm256_set1_ps(s); + for (; i < vec_end; i += 8) + { + __m256 va = _mm256_loadu_ps(&a.data[i]); + __m256 vc = _mm256_mul_ps(va, vs); + _mm256_storeu_ps(&a.data[i], vc); + } + for (; i < n; ++i) + a.data[i] *= s; +#elif defined(__SSE__) + size_t i = 0; + size_t vec_end = n & ~3ULL; + __m128 vs = _mm_set1_ps(s); + for (; i < vec_end; i += 4) + { + __m128 va = _mm_loadu_ps(&a.data[i]); + __m128 vc = _mm_mul_ps(va, vs); + _mm_storeu_ps(&a.data[i], vc); + } + for (; i < n; ++i) + a.data[i] *= s; +#else + for (auto &v : a.data) + v *= s; +#endif +} + +inline Tensor relu(const Tensor &a) +{ + Tensor c(a.shape); + size_t n = a.data.size(); + +#ifdef __AVX__ + size_t i = 0; + size_t vec_end = n & ~7ULL; + __m256 zero = _mm256_setzero_ps(); + for (; i < vec_end; i += 8) + { + __m256 va = _mm256_loadu_ps(&a.data[i]); + __m256 vc = _mm256_max_ps(va, zero); + _mm256_storeu_ps(&c.data[i], vc); + } + for (; i < n; ++i) + c.data[i] = std::max(0.0f, a.data[i]); +#elif defined(__SSE__) + size_t i = 0; + size_t vec_end = n & ~3ULL; + __m128 zero = _mm_setzero_ps(); + for (; i < vec_end; i += 4) + { + __m128 va = _mm_loadu_ps(&a.data[i]); + __m128 vc = _mm_max_ps(va, zero); + _mm_storeu_ps(&c.data[i], vc); + } + for (; i < n; ++i) + c.data[i] = std::max(0.0f, a.data[i]); +#else + for (size_t i = 0; i < n; ++i) + c.data[i] = std::max(0.0f, a.data[i]); +#endif + return c; +} + +inline void relu_inplace(Tensor &a) +{ + size_t n = a.data.size(); + +#ifdef __AVX__ + size_t i = 0; + size_t vec_end = n & ~7ULL; + __m256 zero = _mm256_setzero_ps(); + for (; i < vec_end; i += 8) + { + __m256 va = _mm256_loadu_ps(&a.data[i]); + __m256 vc = _mm256_max_ps(va, zero); + _mm256_storeu_ps(&a.data[i], vc); + } + for (; i < n; ++i) + a.data[i] = std::max(0.0f, a.data[i]); +#elif defined(__SSE__) + size_t i = 0; + size_t vec_end = n & ~3ULL; + __m128 zero = _mm_setzero_ps(); + for (; i < vec_end; i += 4) + { + __m128 va = _mm_loadu_ps(&a.data[i]); + __m128 vc = _mm_max_ps(va, zero); + _mm_storeu_ps(&a.data[i], vc); + } + for (; i < n; ++i) + a.data[i] = std::max(0.0f, a.data[i]); +#else + for (auto &v : a.data) + v = std::max(0.0f, v); +#endif +} + +inline Tensor softmax3d(const Tensor &a) +{ + int B = a.shape[0], T = a.shape[1], C = a.shape[2]; + Tensor out(a.shape); + +#ifdef _OPENMP +#pragma omp parallel for collapse(2) if (B * T > 64) +#endif + for (int b = 0; b < B; ++b) + { + for (int t = 0; t < T; ++t) + { + float maxv = -1e30f; + for (int c = 0; c < C; ++c) + maxv = std::max(maxv, a.at(b, t, c)); + + float sumv = 0.0f; + for (int c = 0; c < C; ++c) + { + float e = std::exp(a.at(b, t, c) - maxv); + out.at(b, t, c) = e; + sumv += e; + } + + float inv_sum = 1.0f / sumv; + for (int c = 0; c < C; ++c) + out.at(b, t, c) *= inv_sum; + } + } + return out; +} + +inline Tensor softmax2d(const Tensor &a) +{ + int T = a.shape[0], C = a.shape[1]; + Tensor out(a.shape); + +#ifdef _OPENMP +#pragma omp parallel for if (T > 128) +#endif + for (int t = 0; t < T; ++t) + { + float maxv = -1e30f; + for (int c = 0; c < C; ++c) + maxv = std::max(maxv, a.at(t, c)); + + float sumv = 0.0f; + for (int c = 0; c < C; ++c) + { + float e = std::exp(a.at(t, c) - maxv); + out.at(t, c) = e; + sumv += e; + } + + float inv_sum = 1.0f / sumv; + for (int c = 0; c < C; ++c) + out.at(t, c) *= inv_sum; + } + return out; +} + +inline Tensor layer_norm(const Tensor &x, const Tensor &gamma, const Tensor &beta, float eps = 1e-5f) +{ + int B = x.shape[0], T = x.shape[1], C = x.shape[2]; + Tensor out(x.shape); + +#ifdef _OPENMP +#pragma omp parallel for collapse(2) if (B * T > 64) +#endif + for (int b = 0; b < B; ++b) + { + for (int t = 0; t < T; ++t) + { + float mu = 0.0f; + for (int c = 0; c < C; ++c) + mu += x.at(b, t, c); + mu /= C; + + float var = 0.0f; + for (int c = 0; c < C; ++c) + { + float d = x.at(b, t, c) - mu; + var += d * d; + } + var /= C; + + float inv = 1.0f / std::sqrt(var + eps); + for (int c = 0; c < C; ++c) + out.at(b, t, c) = (x.at(b, t, c) - mu) * inv * gamma.at(c) + beta.at(c); + } + } + return out; +} + +inline Tensor matmul(const Tensor &a, const Tensor &w) +{ + assert(a.ndim() == 3 && w.ndim() == 2); + int B = a.shape[0], T = a.shape[1], D = a.shape[2]; + int E = w.shape[1]; + assert(w.shape[0] == D); + + Tensor out({B, T, E}, 0.0f); + + const int TILE_T = 32; + const int TILE_E = 32; + const int TILE_D = 32; + +#ifdef _OPENMP +#pragma omp parallel for collapse(2) if (B * T * E * D > 100000) +#endif + for (int b = 0; b < B; ++b) + { + for (int t0 = 0; t0 < T; t0 += TILE_T) + { + int t_end = std::min(t0 + TILE_T, T); + for (int e0 = 0; e0 < E; e0 += TILE_E) + { + int e_end = std::min(e0 + TILE_E, E); + for (int d0 = 0; d0 < D; d0 += TILE_D) + { + int d_end = std::min(d0 + TILE_D, D); + for (int t = t0; t < t_end; ++t) + { + for (int e = e0; e < e_end; ++e) + { + float s = out.at(b, t, e); + for (int d = d0; d < d_end; ++d) + s += a.at(b, t, d) * w.at(d, e); + out.at(b, t, e) = s; + } + } + } + } + } + } + return out; +} + +inline Tensor add_bias(const Tensor &x, const Tensor &bias) +{ + assert(x.shape.back() == bias.shape[0]); + Tensor out = x; + int E = bias.shape[0]; + int stride = E; + int n = x.numel() / E; + +#ifdef _OPENMP +#pragma omp parallel for if (n * E > 10000) +#endif + for (int i = 0; i < n; ++i) + { + for (int e = 0; e < E; ++e) + out.data[i * stride + e] += bias.data[e]; + } + return out; +} + +inline Tensor bmm(const Tensor &a, const Tensor &b) +{ + assert(a.ndim() == 3 && b.ndim() == 3); + int B = a.shape[0], T = a.shape[1], D = a.shape[2]; + int T2 = b.shape[2]; + assert(b.shape[0] == B && b.shape[1] == D); + + Tensor out({B, T, T2}, 0.0f); + + const int TILE = 32; + +#ifdef _OPENMP +#pragma omp parallel for if (B * T * T2 * D > 100000) +#endif + for (int bb = 0; bb < B; ++bb) + { + for (int t0 = 0; t0 < T; t0 += TILE) + { + int t_end = std::min(t0 + TILE, T); + for (int t2_0 = 0; t2_0 < T2; t2_0 += TILE) + { + int t2_end = std::min(t2_0 + TILE, T2); + for (int d0 = 0; d0 < D; d0 += TILE) + { + int d_end = std::min(d0 + TILE, D); + for (int t = t0; t < t_end; ++t) + { + for (int t2 = t2_0; t2 < t2_end; ++t2) + { + float s = out.at(bb, t, t2); + for (int d = d0; d < d_end; ++d) + s += a.at(bb, t, d) * b.at(bb, d, t2); + out.at(bb, t, t2) = s; + } + } + } + } + } + } + return out; +} + +inline Tensor transpose23(const Tensor &a) +{ + int B = a.shape[0], T = a.shape[1], D = a.shape[2]; + Tensor out({B, D, T}); + +#ifdef _OPENMP +#pragma omp parallel for collapse(2) if (B * T * D > 10000) +#endif + for (int b = 0; b < B; ++b) + { + for (int d = 0; d < D; ++d) + { + for (int t = 0; t < T; ++t) + out.at(b, d, t) = a.at(b, t, d); + } + } + return out; +} + +inline Tensor cat_last(const std::vector &ts) +{ + int B = ts[0].shape[0], T = ts[0].shape[1]; + int total = 0; + for (auto &t : ts) + total += t.shape[2]; + + Tensor out({B, T, total}, 0.0f); + + int offset = 0; + for (auto &t : ts) + { + int D = t.shape[2]; +#ifdef _OPENMP +#pragma omp parallel for collapse(2) if (B * T * D > 10000) +#endif + for (int b = 0; b < B; ++b) + { + for (int tt = 0; tt < T; ++tt) + { + for (int d = 0; d < D; ++d) + out.at(b, tt, offset + d) = t.at(b, tt, d); + } + } + offset += D; + } + return out; +} + +inline Tensor dropout(const Tensor &x, float p, bool training, std::mt19937 &rng) +{ + if (!training || p == 0.0f) + return x; + + std::bernoulli_distribution dist(1.0f - p); + Tensor out = x; + float scale_v = 1.0f / (1.0f - p); + + for (auto &v : out.data) + v = dist(rng) ? v * scale_v : 0.0f; + + return out; +} \ No newline at end of file diff --git a/llm.cpp/include/torch_bridge.h b/llm.cpp/include/torch_bridge.h new file mode 100644 index 0000000..7e5e784 --- /dev/null +++ b/llm.cpp/include/torch_bridge.h @@ -0,0 +1,34 @@ +#pragma once + +#include "tensor.h" +#include +#include +#include +#include + +inline torch::Tensor to_torch_tensor(const Tensor &src) +{ + if (src.shape.empty() || src.shape.size() > 3) + throw std::invalid_argument("Tensor rank must be 1, 2, or 3"); + + std::vector sizes(src.shape.begin(), src.shape.end()); + auto tensor = torch::from_blob( + const_cast(src.data.data()), + torch::IntArrayRef(sizes), + torch::TensorOptions().dtype(torch::kFloat32)) + .clone(); + return tensor; +} + +inline Tensor from_torch_tensor(const torch::Tensor &src) +{ + auto cpu = src.contiguous().to(torch::kCPU).to(torch::kFloat32); + std::vector shape; + shape.reserve(cpu.dim()); + for (int64_t i = 0; i < cpu.dim(); ++i) + shape.push_back(static_cast(cpu.size(i))); + + Tensor out(shape); + std::memcpy(out.data.data(), cpu.data_ptr(), out.numel() * sizeof(float)); + return out; +} diff --git a/llm.cpp/train.cpp b/llm.cpp/train.cpp new file mode 100644 index 0000000..155628c --- /dev/null +++ b/llm.cpp/train.cpp @@ -0,0 +1,473 @@ +#include "config/config.h" +#include "include/backward.h" +#include "include/dataloader.h" +#include "include/quadtrix.h" +#include "include/sampler.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static volatile bool g_interrupted = false; +static void sig_handler(int) +{ + g_interrupted = true; +} + +// Return the current wall-clock time as a formatted string. +static std::string now_str() +{ + std::time_t t = std::time(nullptr); + char buf[32]; + std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", std::localtime(&t)); + return buf; +} + +// Return elapsed seconds since an arbitrary epoch using a monotonic clock. +static double wall_secs() +{ + using namespace std::chrono; + return duration(steady_clock::now().time_since_epoch()).count(); +} + +// Return true if the file at path exists and can be opened. +static bool file_exists(const std::string &path) +{ + std::ifstream f(path.c_str(), std::ios::binary); + return f.good(); +} + +// Return the directory portion of a file path, or "." for bare filenames. +static std::string dir_name(const std::string &path) +{ + std::string::size_type pos = path.find_last_of("/\\"); + if (pos == std::string::npos) + return "."; + if (pos == 0) + return path.substr(0, 1); + return path.substr(0, pos); +} + +// Return true if path starts with a drive letter or a slash. +static bool is_absolute_path(const std::string &path) +{ + if (path.empty()) + return false; + if (path.size() > 1 && path[1] == ':') + return true; + return path[0] == '/' || path[0] == '\\'; +} + +// Join base directory and child path with a separator. +static std::string join_path(const std::string &base, const std::string &child) +{ + if (base.empty() || base == ".") + return child; + char last = base[base.size() - 1]; + if (last == '/' || last == '\\') + return base + child; + return base + "/" + child; +} + +// Try the requested path first, then look next to the executable. +// Return whichever path exists, or the requested path if neither does. +static std::string choose_existing_path(const std::string &requested_path, const std::string &argv0) +{ + if (requested_path.empty()) + return requested_path; + if (file_exists(requested_path)) + return requested_path; + if (is_absolute_path(requested_path)) + return requested_path; + + std::vector candidates; + candidates.push_back(join_path(dir_name(argv0), requested_path)); + candidates.push_back(join_path(".", requested_path)); + + for (size_t i = 0; i < candidates.size(); ++i) + { + if (file_exists(candidates[i])) + return candidates[i]; + } + return requested_path; +} + +// Choose a writable output path, preferring one next to the executable +// only when the current directory copy does not already exist. +static std::string choose_output_path(const std::string &requested_path, const std::string &argv0) +{ + if (requested_path.empty() || is_absolute_path(requested_path)) + return requested_path; + + std::string exe_relative = join_path(dir_name(argv0), requested_path); + if (file_exists(requested_path) || !file_exists(exe_relative)) + return requested_path; + return exe_relative; +} + +// Print a one-line usage summary listing all supported flags. +static void print_usage(const char *argv0) +{ + std::cout << "Usage: " << argv0 << " [options] [data_file]\n" + << "\n" + << " --generate run inference only (needs saved weights)\n" + << " --chat start interactive chat mode\n" + << " --chat-tokens N max tokens per chat reply (default " + << DEFAULT_CHAT_TOKENS << ")\n" + << " --system TEXT system prompt prepended to every chat turn\n" + << " --rep-penalty F repetition penalty, 1.0 means off (default " + << DEFAULT_REP_PENALTY << ")\n" + << " --rep-window N recent token window for penalty (default " + << DEFAULT_REP_WINDOW << ")\n" + << " --help show this message\n"; +} + +// Sample n_tokens from the model using the given sampler params and print them. +static void +sample_tokens(GPTLanguageModel &model, DataLoader &dl, int n_tokens, const SamplerParams ¶ms) +{ + std::vector ctx = {0}; + for (int i = 0; i < n_tokens; ++i) + { + ctx = model.generate(ctx, 1, params); + std::cout << dl.decode({ctx.back()}) << std::flush; + if ((int)ctx.size() > BLOCK_SIZE) + ctx = std::vector(ctx.end() - BLOCK_SIZE, ctx.end()); + } + std::cout << "\n"; +} + +// Estimate average cross-entropy loss over EVAL_ITERS random batches. +// No gradients are computed and training mode is disabled. +static float +estimate_loss(GPTLanguageModel &model, DataLoader &dl, const std::string &split, std::mt19937 &rng) +{ + float total = 0.0f; + for (int k = 0; k < EVAL_ITERS; ++k) + { + std::pair, std::vector> batch = + dl.get_batch(split, BATCH_SIZE, BLOCK_SIZE, rng); + std::pair result = + model.forward(batch.first, BATCH_SIZE, BLOCK_SIZE, batch.second, false); + total += result.second; + } + return total / EVAL_ITERS; +} + +// Build the initial context for a chat turn. +// Places system tokens first (if any), then appends user tokens. +// Crops the combined context to BLOCK_SIZE from the right. +static std::vector build_turn_context(const std::vector &sys_tokens, + const std::vector &user_tokens) +{ + std::vector ctx; + ctx.reserve(sys_tokens.size() + user_tokens.size()); + ctx.insert(ctx.end(), sys_tokens.begin(), sys_tokens.end()); + ctx.insert(ctx.end(), user_tokens.begin(), user_tokens.end()); + + if ((int)ctx.size() > BLOCK_SIZE) + ctx = std::vector(ctx.end() - BLOCK_SIZE, ctx.end()); + + return ctx; +} + +// Run an interactive chat loop. +// The system prompt is encoded once and prepended to the context on every turn. +// Repetition penalty is applied during generation using params. +static void +run_chat(GPTLanguageModel &model, DataLoader &dl, int max_new_tokens, const SamplerParams ¶ms) +{ + // Encode the system prompt once at startup. + // Unknown characters are silently skipped because the model uses + // character-level tokenisation limited to the training vocabulary. + std::vector sys_tokens; + if (!params.system_prompt.empty()) + { + sys_tokens = dl.encode(params.system_prompt); + if (sys_tokens.empty()) + { + std::cerr << "[WARN] System prompt produced zero tokens. " + "All characters may be outside the training vocabulary.\n"; + } + else + { + std::cout << "[CHAT] System prompt active (" << sys_tokens.size() << " tokens, " + << BLOCK_SIZE - (int)sys_tokens.size() + << " tokens left for user input)\n"; + } + } + + std::cout << "\n" << std::string(60, '=') << "\n"; + std::cout << " Quadtrix CHAT MODE\n"; + std::cout << " Type your prompt and press Enter.\n"; + std::cout << " Type quit or exit to leave.\n"; + std::cout << std::string(60, '=') << "\n\n"; + + while (!g_interrupted) + { + std::cout << "\033[1;32mYou>\033[0m "; + std::cout.flush(); + + std::string prompt; + if (!std::getline(std::cin, prompt)) + break; + + // Strip leading and trailing whitespace. + size_t s = prompt.find_first_not_of(" \t\r\n"); + size_t e = prompt.find_last_not_of(" \t\r\n"); + if (s == std::string::npos) + continue; + prompt = prompt.substr(s, e - s + 1); + + if (prompt == "quit" || prompt == "exit") + { + std::cout << "[Chat] Bye!\n"; + break; + } + + // Encode the user text. Fall back to token 0 when nothing encodes. + std::vector user_tokens = dl.encode(prompt); + if (user_tokens.empty()) + user_tokens = {0}; + + // Build the starting context: system prompt then user input. + std::vector ctx = build_turn_context(sys_tokens, user_tokens); + + std::cout << "\033[1;36mQuadtrix>\033[0m "; + std::cout.flush(); + + // Generate tokens one by one and print each immediately. + for (int tok = 0; tok < max_new_tokens && !g_interrupted; ++tok) + { + ctx = model.generate(ctx, 1, params); + std::cout << dl.decode({ctx.back()}) << std::flush; + + if ((int)ctx.size() > BLOCK_SIZE) + ctx = std::vector(ctx.end() - BLOCK_SIZE, ctx.end()); + } + std::cout << "\n\n"; + } +} + +// Entry point: parse flags, load data, build model, then train or run inference. +int main(int argc, char *argv[]) +{ + std::signal(SIGINT, sig_handler); + + std::cout << " Quadtrix v1.0 (C++)\n"; + + // Resolve data and model paths from defaults, then override with env vars. + std::string data_path = DEFAULT_CLEANED_PATH; + std::string model_path = BEST_MODEL_PATH; + + const char *env_data = std::getenv(DATA_PATH_ENV_VAR.c_str()); + const char *env_model = std::getenv(MODEL_PATH_ENV_VAR.c_str()); + if (env_data != nullptr && env_data[0] != '\0') + data_path = env_data; + if (env_model != nullptr && env_model[0] != '\0') + model_path = env_model; + + // Mode flags and sampler settings with their defaults. + bool gen_mode = false; + bool chat_mode = false; + int chat_tokens = DEFAULT_CHAT_TOKENS; + float rep_penalty = DEFAULT_REP_PENALTY; + int rep_window = DEFAULT_REP_WINDOW; + std::string system_prompt; + + for (int i = 1; i < argc; ++i) + { + std::string a = argv[i]; + + if (a == "--help") + { + print_usage(argv[0]); + return 0; + } + else if (a == "--generate") + { + gen_mode = true; + } + else if (a == "--chat") + { + chat_mode = true; + } + else if (a == "--chat-tokens" && i + 1 < argc) + { + chat_tokens = std::atoi(argv[++i]); + } + else if (a == "--system" && i + 1 < argc) + { + // Accept quoted or unquoted system prompt strings. + system_prompt = argv[++i]; + } + else if (a == "--rep-penalty" && i + 1 < argc) + { + rep_penalty = (float)std::atof(argv[++i]); + } + else if (a == "--rep-window" && i + 1 < argc) + { + rep_window = std::atoi(argv[++i]); + } + else + { + data_path = a; + } + } + + data_path = choose_existing_path(data_path, argv[0]); + model_path = choose_output_path(model_path, argv[0]); + + // Build the sampler params struct from parsed values. + SamplerParams sampler; + sampler.rep_penalty = rep_penalty; + sampler.rep_window = rep_window; + sampler.system_prompt = system_prompt; + + // Load and tokenise the training corpus. + DataLoader dl; + try + { + dl.load(data_path); + } + catch (const std::exception &e) + { + std::cerr << e.what() << "\n"; + std::cerr << "[HINT] Put your text at " << DEFAULT_CLEANED_PATH + << ", pass a file path as the first argument, or set " << DATA_PATH_ENV_VAR + << ".\n"; + return 1; + } + + GPTLanguageModel model(dl.vocab_size, N_EMBD, N_HEAD, N_LAYER, BLOCK_SIZE, SEED); + + long n_params = model.num_params(); + std::cout << "max_seq_len: " << BLOCK_SIZE << "\n"; + std::cout << "vocab_size: " << dl.vocab_size << "\n"; + std::cout << "num_layers: " << N_LAYER << "\n"; + std::cout << "num_heads: " << N_HEAD << "\n"; + std::cout << "channels: " << N_EMBD << "\n"; + std::cout << "num_parameters: " << n_params << "\n"; + std::cout << "rep_penalty: " << rep_penalty << "\n"; + std::cout << "rep_window: " << rep_window << "\n"; + + // Chat mode: load weights, print system prompt info, then enter the loop. + if (chat_mode) + { + if (!file_exists(model_path)) + { + std::cerr << "[ERROR] Cannot start chat because model weights were not found at " + << model_path << "\n"; + std::cerr << "[HINT] Train first, or set " << MODEL_PATH_ENV_VAR + << " to an existing weights file.\n"; + return 1; + } + + model.load(model_path); + std::cout << "weights: " << model_path << "\n"; + std::cout << "max_tokens: " << chat_tokens << "\n"; + + if (!sampler.system_prompt.empty()) + std::cout << "system: " << sampler.system_prompt << "\n"; + + run_chat(model, dl, chat_tokens, sampler); + return 0; + } + + // Generate mode: load weights and stream tokens until interrupted. + if (gen_mode) + { + if (!file_exists(model_path)) + { + std::cerr << "[ERROR] Cannot generate because model weights were not found at " + << model_path << "\n"; + std::cerr << "[HINT] Train first, or set " << MODEL_PATH_ENV_VAR + << " to an existing weights file.\n"; + return 1; + } + + model.load(model_path); + std::cout << "\ngenerating:\n"; + std::vector ctx = {0}; + while (!g_interrupted) + { + ctx = model.generate(ctx, 1, sampler); + std::cout << dl.decode({ctx.back()}) << std::flush; + if ((int)ctx.size() > BLOCK_SIZE) + ctx = std::vector(ctx.end() - BLOCK_SIZE, ctx.end()); + } + std::cout << "\n"; + return 0; + } + + // Training mode: build optimizer, then iterate. + AdamWState opt = build_optimizer(model, LEARNING_RATE); + std::mt19937 rng(SEED); + + float best_val_loss = 1e30f; + float last_val_loss = 0.0f; + + // Compute the initial validation loss before the first update. + { + std::mt19937 init_rng(SEED); + last_val_loss = estimate_loss(model, dl, "val", init_rng); + } + + for (int iter = 1; iter <= MAX_ITERS && !g_interrupted; ++iter) + { + double step_start = wall_secs(); + + std::pair, std::vector> batch = + dl.get_batch("train", BATCH_SIZE, BLOCK_SIZE, rng); + + SavedForward saved = + forward_save(model, batch.first, BATCH_SIZE, BLOCK_SIZE, batch.second, true); + + float batch_loss = + model.forward(batch.first, BATCH_SIZE, BLOCK_SIZE, batch.second, false).second; + + Grads grads = backward(model, saved); + apply_grads(model, grads, opt); + + double step_ms = (wall_secs() - step_start) * 1000.0; + int tok_per_sec = + (step_ms > 0.0) ? (int)((long)BATCH_SIZE * BLOCK_SIZE / (step_ms / 1000.0)) : 0; + + bool better = false; + if (iter % EVAL_INTERVAL == 0 || iter == MAX_ITERS) + { + last_val_loss = estimate_loss(model, dl, "val", rng); + if (last_val_loss < best_val_loss) + { + best_val_loss = last_val_loss; + model.save(model_path); + better = true; + } + } + + std::cout << "step" << std::setw(5) << iter << "/" << MAX_ITERS << " | loss " + << std::fixed << std::setprecision(6) << batch_loss << " | val " << std::fixed + << std::setprecision(6) << last_val_loss << " | lr " << std::scientific + << std::setprecision(2) << (float)LEARNING_RATE << " | " << std::fixed + << std::setprecision(2) << step_ms << " ms" + << " | " << tok_per_sec << " tok/s" << (better ? " best" : "") << "\n"; + std::cout.flush(); + + if (iter % EVAL_INTERVAL == 0 || iter == MAX_ITERS) + { + std::cout << "generating:\n"; + // Use sampler params so training samples also reflect the chosen settings. + sample_tokens(model, dl, iter == MAX_ITERS ? 10000 : 150, sampler); + } + } + + return 0; +} \ No newline at end of file diff --git a/train_test/test.c b/train_test/test.c new file mode 100644 index 0000000..564428a --- /dev/null +++ b/train_test/test.c @@ -0,0 +1,416 @@ +#include +#include +#include +#include +#include +#include + +// Config +typedef struct +{ + int vocab_size; + int block_size; + int n_embd; + int n_head; + int n_layer; +} Config; + +// Tensor helpers +typedef struct +{ + float *data; + int dims[4]; + int ndim; +} Tensor; + +static Tensor read_tensor(FILE *f) +{ + Tensor t = {0}; + fread(&t.ndim, sizeof(int), 1, f); + int total = 1; + for (int i = 0; i < t.ndim; i++) + { + fread(&t.dims[i], sizeof(int), 1, f); + total *= t.dims[i]; + } + t.data = (float *)malloc(total * sizeof(float)); + fread(t.data, sizeof(float), total, f); + return t; +} + +static float *alloc(int n) +{ + float *p = (float *)calloc(n, sizeof(float)); + if (!p) + { + fprintf(stderr, "OOM\n"); + exit(1); + } + return p; +} + +// Math +static void softmax(float *x, int n) +{ + float max = x[0]; + for (int i = 1; i < n; i++) + if (x[i] > max) + max = x[i]; + float sum = 0.0f; + for (int i = 0; i < n; i++) + { + x[i] = expf(x[i] - max); + sum += x[i]; + } + for (int i = 0; i < n; i++) + x[i] /= sum; +} + +static void layer_norm(float *out, float *x, float *w, float *b, int n) +{ + float mean = 0.0f, var = 0.0f; + for (int i = 0; i < n; i++) + mean += x[i]; + mean /= n; + for (int i = 0; i < n; i++) + var += (x[i] - mean) * (x[i] - mean); + var = var / n + 1e-5f; + float inv = 1.0f / sqrtf(var); + for (int i = 0; i < n; i++) + out[i] = (x[i] - mean) * inv * w[i] + b[i]; +} + +// matmul: out[M x N] = A[M x K] @ B[K x N] (B is stored row-major as [N x K]) +static void matmul(float *out, float *A, float *B, int M, int K, int N) +{ + memset(out, 0, M * N * sizeof(float)); + for (int m = 0; m < M; m++) + for (int k = 0; k < K; k++) + { + float a = A[m * K + k]; + for (int n = 0; n < N; n++) + out[m * N + n] += a * B[n * K + k]; + } +} + +static void add_bias(float *x, float *b, int rows, int cols) +{ + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + x[i * cols + j] += b[j]; +} + +static void relu(float *x, int n) +{ + for (int i = 0; i < n; i++) + if (x[i] < 0) + x[i] = 0; +} + +static int sample(float *probs, int n) +{ + float r = (float)rand() / ((float)RAND_MAX + 1.0f); + float cdf = 0.0f; + for (int i = 0; i < n; i++) + { + cdf += probs[i]; + if (r < cdf) + return i; + } + return n - 1; +} + +// Model weights +typedef struct +{ + Tensor tok_emb; + Tensor pos_emb; + // per layer + Tensor *head_k; // [n_layer * n_head] + Tensor *head_q; + Tensor *head_v; + Tensor *sa_proj_w; + Tensor *sa_proj_b; + Tensor *ff_w1; + Tensor *ff_b1; + Tensor *ff_w2; + Tensor *ff_b2; + Tensor *ln1_w; + Tensor *ln1_b; + Tensor *ln2_w; + Tensor *ln2_b; + Tensor ln_f_w; + Tensor ln_f_b; + Tensor lm_w; + Tensor lm_b; +} Weights; + +// Signal handler +static volatile int running = 1; +void handle_sigint(int s) +{ + (void)s; + printf("\n\n[Stopped by user]\n"); + running = 0; +} + +// Forward pass +static void forward(float *logits, int *tokens, int T, Config *cfg, Weights *W) +{ + int C = cfg->n_embd; + int nh = cfg->n_head; + int hs = C / nh; + + // Build x [T x C] from embeddings + float *x = alloc(T * C); + for (int t = 0; t < T; t++) + for (int c = 0; c < C; c++) + x[t * C + c] = W->tok_emb.data[tokens[t] * C + c] + W->pos_emb.data[t * C + c]; + + float *xn = alloc(T * C); + float *tmp = alloc(T * C * 4); // scratch for ffwd + + for (int l = 0; l < cfg->n_layer; l++) + { + int base = l * nh; + + // ── LayerNorm 1 ── + float *ln1_out = alloc(T * C); + for (int t = 0; t < T; t++) + layer_norm(ln1_out + t * C, x + t * C, W->ln1_w[l].data, W->ln1_b[l].data, C); + + // ── Multi-head attention ── + float *attn_out = alloc(T * C); + float *head_out = alloc(T * C); + memset(head_out, 0, T * C * sizeof(float)); + + for (int h = 0; h < nh; h++) + { + float *K = alloc(T * hs); + float *Q = alloc(T * hs); + float *V = alloc(T * hs); + + matmul(K, ln1_out, W->head_k[base + h].data, T, C, hs); + matmul(Q, ln1_out, W->head_q[base + h].data, T, C, hs); + matmul(V, ln1_out, W->head_v[base + h].data, T, C, hs); + + // Attention scores [T x T] + float *att = alloc(T * T); + float scale = 1.0f / sqrtf((float)hs); + for (int i = 0; i < T; i++) + { + for (int j = 0; j < T; j++) + { + if (j > i) + { + att[i * T + j] = -1e9f; + continue; + } + float dot = 0.0f; + for (int k = 0; k < hs; k++) + dot += Q[i * hs + k] * K[j * hs + k]; + att[i * T + j] = dot * scale; + } + softmax(att + i * T, T); + } + + // Weighted sum of V → into head_out at offset h*hs + float *hv = alloc(T * hs); + for (int i = 0; i < T; i++) + for (int k = 0; k < hs; k++) + { + float s = 0.0f; + for (int j = 0; j <= i; j++) + s += att[i * T + j] * V[j * hs + k]; + hv[i * hs + k] = s; + } + + for (int t = 0; t < T; t++) + for (int k = 0; k < hs; k++) + head_out[t * C + h * hs + k] = hv[t * hs + k]; + + free(K); + free(Q); + free(V); + free(att); + free(hv); + } + + // Project attention output + matmul(attn_out, head_out, W->sa_proj_w[l].data, T, C, C); + add_bias(attn_out, W->sa_proj_b[l].data, T, C); + + // Residual + for (int i = 0; i < T * C; i++) + x[i] += attn_out[i]; + free(head_out); + free(attn_out); + free(ln1_out); + + // LayerNorm 2 + float *ln2_out = alloc(T * C); + for (int t = 0; t < T; t++) + layer_norm(ln2_out + t * C, x + t * C, W->ln2_w[l].data, W->ln2_b[l].data, C); + + // Feed forward + int ff = 4 * C; + float *ff1 = alloc(T * ff); + float *ff2 = alloc(T * C); + matmul(ff1, ln2_out, W->ff_w1[l].data, T, C, ff); + add_bias(ff1, W->ff_b1[l].data, T, ff); + relu(ff1, T * ff); + matmul(ff2, ff1, W->ff_w2[l].data, T, ff, C); + add_bias(ff2, W->ff_b2[l].data, T, C); + + // Residual + for (int i = 0; i < T * C; i++) + x[i] += ff2[i]; + free(ln2_out); + free(ff1); + free(ff2); + } + + // Final layer norm + float *xf = alloc(C); + layer_norm(xf, x + (T - 1) * C, W->ln_f_w.data, W->ln_f_b.data, C); + + // LM head - logits + memset(logits, 0, cfg->vocab_size * sizeof(float)); + for (int v = 0; v < cfg->vocab_size; v++) + { + for (int c = 0; c < C; c++) + logits[v] += xf[c] * W->lm_w.data[v * C + c]; + logits[v] += W->lm_b.data[v]; + } + + free(x); + free(xn); + free(tmp); + free(xf); +} + +// Main +int main(void) +{ + signal(SIGINT, handle_sigint); + srand((unsigned)time(NULL)); + + FILE *fv = fopen("../vocab.bin", "rb"); + if (!fv) + { + fprintf(stderr, "[Error] Cannot open vocab.bin\n"); + return 1; + } + int vocab_size; + fread(&vocab_size, sizeof(int), 1, fv); + char *vocab = (char *)malloc(vocab_size); + for (int i = 0; i < vocab_size; i++) + { + unsigned char c; + fread(&c, 1, 1, fv); + vocab[i] = (char)c; + } + fclose(fv); + + // Load weights + FILE *fw = fopen("../weights.bin", "rb"); + if (!fw) + { + fprintf(stderr, "[Error] Cannot open weights.bin\n"); + return 1; + } + + Config cfg; + fread(&cfg.vocab_size, sizeof(int), 1, fw); + fread(&cfg.block_size, sizeof(int), 1, fw); + fread(&cfg.n_embd, sizeof(int), 1, fw); + fread(&cfg.n_head, sizeof(int), 1, fw); + fread(&cfg.n_layer, sizeof(int), 1, fw); + + Weights W = {0}; + W.tok_emb = read_tensor(fw); + W.pos_emb = read_tensor(fw); + + int nl = cfg.n_layer, nh = cfg.n_head; + W.head_k = (Tensor *)malloc(nl * nh * sizeof(Tensor)); + W.head_q = (Tensor *)malloc(nl * nh * sizeof(Tensor)); + W.head_v = (Tensor *)malloc(nl * nh * sizeof(Tensor)); + W.sa_proj_w = (Tensor *)malloc(nl * sizeof(Tensor)); + W.sa_proj_b = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ff_w1 = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ff_b1 = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ff_w2 = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ff_b2 = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ln1_w = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ln1_b = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ln2_w = (Tensor *)malloc(nl * sizeof(Tensor)); + W.ln2_b = (Tensor *)malloc(nl * sizeof(Tensor)); + + for (int l = 0; l < nl; l++) + { + for (int h = 0; h < nh; h++) + { + W.head_k[l * nh + h] = read_tensor(fw); + W.head_q[l * nh + h] = read_tensor(fw); + W.head_v[l * nh + h] = read_tensor(fw); + } + W.sa_proj_w[l] = read_tensor(fw); + W.sa_proj_b[l] = read_tensor(fw); + W.ff_w1[l] = read_tensor(fw); + W.ff_b1[l] = read_tensor(fw); + W.ff_w2[l] = read_tensor(fw); + W.ff_b2[l] = read_tensor(fw); + W.ln1_w[l] = read_tensor(fw); + W.ln1_b[l] = read_tensor(fw); + W.ln2_w[l] = read_tensor(fw); + W.ln2_b[l] = read_tensor(fw); + } + + W.ln_f_w = read_tensor(fw); + W.ln_f_b = read_tensor(fw); + W.lm_w = read_tensor(fw); + W.lm_b = read_tensor(fw); + fclose(fw); + + printf("--- Model loaded ---\n"); + printf("[INFO] vocab=%d block=%d embd=%d heads=%d layers=%d\n", + cfg.vocab_size, + cfg.block_size, + cfg.n_embd, + cfg.n_head, + cfg.n_layer); + printf("Generating text (Ctrl+C to stop)...\n\n"); + printf("--------------------------------------------------\n"); + + // Generation loop + int *ctx = (int *)calloc(cfg.block_size, sizeof(int)); + float *logits = alloc(cfg.vocab_size); + int ctx_len = 1; // start with token 0 + ctx[0] = 0; + + while (running) + { + int T = ctx_len < cfg.block_size ? ctx_len : cfg.block_size; + int *window = ctx + (ctx_len - T); + + forward(logits, window, T, &cfg, &W); + softmax(logits, cfg.vocab_size); + + int next = sample(logits, cfg.vocab_size); + printf("%c", vocab[next]); + fflush(stdout); + + if (ctx_len < cfg.block_size) + ctx[ctx_len++] = next; + else + { + memmove(ctx, ctx + 1, (cfg.block_size - 1) * sizeof(int)); + ctx[cfg.block_size - 1] = next; + } + } + + free(ctx); + free(logits); + free(vocab); + return 0; +} \ No newline at end of file From 597d63bada093111209ce44d0ea049e83e5057e1 Mon Sep 17 00:00:00 2001 From: Eamon Sippy Date: Wed, 1 Jul 2026 18:47:08 +0530 Subject: [PATCH 8/8] Add language model architecture for inference script (#108) --- .gitattributes | 5 + .github/workflows/{ci.yml => ci-approval.yml} | 28 +-- .github/workflows/docker-publish.yml | 22 +- .github/workflows/pr-check.yml | 8 +- .github/workflows/release.yml | 6 +- README.md | 208 +++++++++--------- backend/requirements.txt | 4 +- docs/quadtrix_training_report.png | Bin 0 -> 218171 bytes engine/main.py | 20 +- train_test/model.py | 131 +++++++++++ train_test/test.cpp | 96 ++++++++ 11 files changed, 381 insertions(+), 147 deletions(-) rename .github/workflows/{ci.yml => ci-approval.yml} (92%) create mode 100644 docs/quadtrix_training_report.png create mode 100644 train_test/model.py create mode 100644 train_test/test.cpp diff --git a/.gitattributes b/.gitattributes index 251a617..5f080b8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,6 @@ frontend/** linguist-vendored +frontend/** linguist-vendored +[submodule "pytorch"] + path = pytorch + url = https://github.com/pytorch/pytorch + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci-approval.yml similarity index 92% rename from .github/workflows/ci.yml rename to .github/workflows/ci-approval.yml index 992ef59..5068e0d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci-approval.yml @@ -1,4 +1,4 @@ -name: CI +name: ci-approval on: workflow_dispatch: @@ -84,7 +84,7 @@ jobs: run: ./quadtrix --help || true - name: Upload binary - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: quadtrix-linux-amd64 path: quadtrix @@ -111,7 +111,7 @@ jobs: run: tar -czf quadtrix-macos-arm64.tar.gz quadtrix - name: Upload binary - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: quadtrix-macos-arm64 path: quadtrix-macos-arm64.tar.gz @@ -127,15 +127,15 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-qemu-action@v4 + - uses: docker/setup-buildx-action@v4 - name: Set lowercase image prefix run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV - name: Login to GHCR if: ${{ inputs.push_image == 'true' }} - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -143,7 +143,7 @@ jobs: - name: Extract metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.IMAGE_PREFIX }}-cpp tags: | @@ -174,15 +174,15 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-qemu-action@v4 + - uses: docker/setup-buildx-action@v4 - name: Set lowercase image prefix run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV - name: Login to GHCR if: ${{ inputs.push_image == 'true' }} - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -190,7 +190,7 @@ jobs: - name: Extract metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.IMAGE_PREFIX }}-cpu tags: | @@ -221,14 +221,14 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-buildx-action@v4 - name: Set lowercase image prefix run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV - name: Login to GHCR if: ${{ inputs.push_image == 'true' }} - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -236,7 +236,7 @@ jobs: - name: Extract metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.IMAGE_PREFIX }}-cuda tags: | diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 0986534..205c599 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -41,15 +41,15 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-qemu-action@v4 + - uses: docker/setup-buildx-action@v4 - name: Set lowercase image prefix run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> "$GITHUB_ENV" - name: Login to GHCR if: ${{ inputs.push_image == 'true' }} - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -57,7 +57,7 @@ jobs: - name: Extract metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.IMAGE_PREFIX }}-cpp tags: | @@ -88,15 +88,15 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-qemu-action@v4 + - uses: docker/setup-buildx-action@v4 - name: Set lowercase image prefix run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> "$GITHUB_ENV" - name: Login to GHCR if: ${{ inputs.push_image == 'true' }} - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -104,7 +104,7 @@ jobs: - name: Extract metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.IMAGE_PREFIX }}-cpu tags: | @@ -135,14 +135,14 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-buildx-action@v4 - name: Set lowercase image prefix run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> "$GITHUB_ENV" - name: Login to GHCR if: ${{ inputs.push_image == 'true' }} - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -150,7 +150,7 @@ jobs: - name: Extract metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.IMAGE_PREFIX }}-cuda tags: | diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index b50de6b..07b05f2 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -150,7 +150,7 @@ jobs: run: ./quadtrix --help || true - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: ${{ matrix.artifact }} path: quadtrix @@ -199,19 +199,19 @@ jobs: exit $failed - name: Lint — Dockerfile.cpp - uses: hadolint/hadolint-action@v3.1.0 + uses: hadolint/hadolint-action@v3.3.0 with: dockerfile: .devops/Dockerfile.cpp failure-threshold: error - name: Lint — Dockerfile (CPU) - uses: hadolint/hadolint-action@v3.1.0 + uses: hadolint/hadolint-action@v3.3.0 with: dockerfile: .devops/Dockerfile failure-threshold: error - name: Lint — Dockerfile.backend (CUDA) - uses: hadolint/hadolint-action@v3.1.0 + uses: hadolint/hadolint-action@v3.3.0 with: dockerfile: .devops/Dockerfile.backend failure-threshold: error diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e92b486..05fd17b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -93,7 +93,7 @@ jobs: tar -czf "${package}.tar.gz" -C "${ARTIFACT_ROOT}" "${package}" - name: Upload artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: quadtrix-bin-ubuntu-${{ matrix.build }}-cpu path: quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-ubuntu-${{ matrix.build }}-cpu.tar.gz @@ -142,7 +142,7 @@ jobs: Compress-Archive -Path "${env:ARTIFACT_ROOT}\${package}\*" -DestinationPath "${package}.zip" -Force - name: Upload artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: quadtrix-bin-windows-${{ matrix.arch }}-cpu path: quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-windows-${{ matrix.arch }}-cpu.zip @@ -192,7 +192,7 @@ jobs: tar -czf "${package}.tar.gz" -C "${ARTIFACT_ROOT}" "${package}" - name: Upload artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: quadtrix-bin-macos-${{ matrix.build }}-cpu path: quadtrix-${{ needs.release-metadata.outputs.tag_name }}-bin-macos-${{ matrix.build }}-cpu.tar.gz diff --git a/README.md b/README.md index 7eb276d..bc88dfd 100644 --- a/README.md +++ b/README.md @@ -1,140 +1,140 @@ # Quadtrix.cpp -

-image -image +Language models in dependency-free C++, with no need for 245MB of PyTorch or 107MB of cPython to make a transformer actually work. The native path is a from-scratch decoder-only GPT: tensors, embeddings, multi-head causal self-attention, layer norm, cross-entropy, and a analytical backward pass with AdamW, all in [main.cpp](main.cpp) and [include/](include/). No autograd, no framework — every gradient is derived and written out. +***technical notes***: [docs](https://eamon2009.github.io/LLMs/) +Alongside it sits a parallel PyTorch implementation in [engine/main.py](engine/main.py) and [engine/inference.py](engine/inference.py), so you can train and generate the same architecture with `torch` + `tiktoken` when you want speed instead of transparency. A FastAPI middleware layer in [backend/](backend/) and a React/TypeScript web UI in [frontend/](frontend/) let you chat with either backend in the browser. There's also an experimental integrated-GPU path in [iGPU/](engine/iGPU/). +The point of this repo is the C++ core. The PyTorch, FastAPI, and frontend layers exist to make the model usable, but if you're here to learn how a GPT is actually built and trained without a framework doing the work for you, [include/backward.h](include/backward.h) is where to start reading. -

-Quadtrix.cpp is an experimental local LLM project that combines training, inference, and a chat interface in a single repository across three execution paths: a C++ versions, a PyTorch backend, and a React frontend.The C++ version is a decoder-only transformer - no external tensor libraries, no automatic differentiation. It includes character-level tokenization, backpropagation, AdamW optimization, checkpointing, and autoregressive generationd. The PyTorch version offers faster training and inference with BPE tokenization via tiktoken, while the React frontend provides a web UI on top of python backend.You can train small character-level models on CPU or Colab, or move to BPE-based models with the PyTorch backend. All version are designed to be hackable and runnable on consumer hardware without requiring massive GPU clusters. +## quick start (C++, train + chat) -***technical notes***: [docs](https://eamon2009.github.io/LLMs/) +The fastest way to see the whole pipeline — tokenize, train, checkpoint, generate — using the bundled character-level corpus: -## Leaderboard +```bash +g++ -std=c++17 -O2 -I. -Iinclude -o quadtrix.exe main.cpp +./quadtrix.exe data/input.txt +``` -Runs are ranked by validation loss. Lower is better. +This trains from scratch on `data/input.txt` and writes the best checkpoint to `best_model.bin`. Once you have a checkpoint, generate or chat with it: -| # | Val Loss | Parameters | Time | Hardware | Description | -|--:|----------|------------|----------|----------|------------------------------------------| -| 1 | **0.7176** | 10.82M | 61.3 min | Colab | Large-scale run, coherent paragraphs, strong convergence | -| 2 | 0.9250 | 1.99M | 6.1 min | T4 GPU | Optimised run, fast training, stable learning | -| 3 | 1.3145 | 0.82M | 39.4 min | CPU | Baseline, small data | -| 4 | 1.6371 | 0.82M | 76.2 min | CPU | Extended CPU training, 3000 iterations | +```bash +./quadtrix.exe data/input.txt --generate +./quadtrix.exe data/input.txt --chat --chat-tokens 300 +``` -All runs: @Eamon2009, 2026. +debugging tip: drop `-O2` for `-g` when compiling if you want to step through `include/backward.h` or `include/gpt.h` in a debugger — the manual backward pass is much easier to follow one breakpoint at a time. -## Benchmarks +### runtime arguments -### Runs at a Glance +```bash +quadtrix.exe [data_path] [--generate] [--chat] [--chat-tokens N] +``` -| Metric | Character-Level | Small Scale | Large Scale | -|-------------------|------------------|-------------|-------------| -| Parameters | 0.83M | 2.00M | 19.17M | -| Layers | 4 | 4 | 4 | -| Embedding dim | 128 | 200 | 200 | -| Attention heads | 4 | 4 | 4 | -| Context length | 64 | 200 | 200 | -| Vocab | 105 char | 110 char | ~50K BPE | -| Corpus | TinyStories | TinyStories | Children's Stories | -| Iterations | 3,000 | 5,000 | 5,000 | -| Train loss | 1.5632 | 0.9045 | — | -| Val loss | 1.6371 | 0.9301 | — | -| Gen. gap | 0.0739 | 0.0256 | — | +| Argument | Description | +|---|---| +| `data_path` | Plain-text corpus used to build the tokenizer and train/validation split | +| `--generate` | Load weights and continuously generate text | +| `--chat` | Load weights and start interactive terminal chat | +| `--chat-tokens N` | Max generated tokens per chat response | + +| Env var | Default | Description | +|---|---|---| +| `GPT_DATA_PATH` | `data/input.txt` | Override the default training corpus | +| `GPT_MODEL_PATH` | `best_model.bin` | Override the checkpoint path | + +## what's actually implemented in C++ + +No third-party runtime dependency — it builds from `main.cpp`, `config/config.h`, and `include/*.h` alone. + +- Character-level tokenizer built directly from the input corpus +- Train/validation split via `DataLoader` +- Token + positional embeddings +- Multi-head causal self-attention with explicit QKV projections +- Pre-layer-norm residual transformer blocks +- Feed-forward MLP with ReLU +- Cross-entropy loss +- **Fully analytical backward pass** — every gradient (attention, layer norm, MLP, embeddings) is derived and coded in `include/backward.h`, not autograd +- AdamW optimizer (first/second moment estimates, weight decay) +- Checkpoint save/load +- Autoregressive generation and terminal chat mode + +Hyperparameters live in `config/config.h` and require a rebuild to take effect: + +```cpp +static const int BATCH_SIZE = 4; +static const int BLOCK_SIZE = 64; +static const int N_EMBD = 128; +static const int N_HEAD = 4; +static const int N_LAYER = 4; +static const float DROPOUT = 0.2f; +static const float LEARNING_RATE = 3e-4f; +static const int MAX_ITERS = 3000; +``` -### Comparison to Related Projects +For an optimized native build: -| Project | Focus | Language | Autograd | -|---------------|--------------------------------------------|-------------------|----------------------| -| nanoGPT | Minimal GPT training | Python | PyTorch | -| minGPT | Educational GPT | Python | PyTorch | -| llama2.c | Inference-oriented C | C | None | -| **Quadtrix.cpp** | Training + inference + web UI + multi-backend | C++ / Python / TypeScript | Manual C++ + PyTorch | +```bash +g++ -std=c++17 -O3 -march=native -I. -Iinclude -o quadtrix.exe main.cpp +``` +## the PyTorch reference path -# Getting started -**Create a Python virtual environment** +[engine/main.py](engine/main.py) trains the same architectural idea with `torch`, `torch.nn`, and GPT-2 BPE tokenization via `tiktoken`, useful when you want to scale past what C++ loops can comfortably train on CPU. -```powershell -python -m venv .venv -.\.venv\Scripts\python.exe -m pip install --upgrade pip +```bash +python engine/main.py ``` -** Install backend and PyTorch dependencies** +It looks for `engine/input.txt` by default; point it elsewhere with `QUADTRIX_TRAIN_DATA` if needed. Run inference against a saved checkpoint: -```powershell -cd backend -..\.venv\Scripts\python.exe -m pip install -r requirements.txt -cd .. -``` -**Train** -```powershell -cd C:\Users\Admin\Documents\GitHub\Quadtrix.cpp -.\.venv\Scripts\python.exe engine\main.py +```bash +python engine/inference.py --checkpoint engine/best_model.pt --prompt "Once upon a time" --max-new-tokens 100 ``` -**Build the C++ executable** -Skip if `quadtrix.exe` already exists. To rebuild: +## web chat (FastAPI + React) -```powershell -g++ -std=c++17 -O2 -I. -Iinclude -o quadtrix.exe main.cpp -``` +To chat with either backend from a browser instead of the terminal, bring up the API and the frontend in two terminals: -For maximum CPU throughput: +```bash +# terminal 1 — backend +cd backend && uvicorn main:app --host 127.0.0.1 --port 3001 -```powershell -g++ -std=c++17 -O3 -march=native -I. -Iinclude -o quadtrix.exe main.cpp +# terminal 2 — frontend +cd frontend && npm run dev ``` ---- +Then open `http://localhost:5173` and select a backend. The PyTorch path works out of the box once a `.pt` checkpoint exists; the C++ backend option expects a compatible HTTP service at `CPP_SERVER_URL` exposing `/health` and `/generate`, which `main.cpp` does not currently serve on its own — use the PyTorch backend for the web UI unless you've built that bridge. +## results so far -## Technical Reference -***Quadtrix is a decoder-only transformer. The architecture follows the standard GPT design with pre-layer normalization, causal self-attention, and residual connections.*** -The C++ version is : +image -- Character-level tokenizer -- Manual tensor operations -- Analytical backpropagation -- AdamW optimizer with bias correction -- Checkpoint save/load -- Autoregressive generation +| Run | Params | Val loss | Time | Notes | +|---|---|---|---|---| +| C++ CPU baseline | 0.82M | 1.31 | 39.4 min | small data, fragmented output | +| C++ CPU extended | 0.83M | 1.64 | 76.2 min | 3,000 iters, char-level, 28.3M train tokens | +| T4 | 10.82M | 0.72 | 61.3 min | coherent paragraphs, strong convergence | +| T4 optimized | 1.99M | 0.93 | 6.1 min | fast, stable, basic coherence | -**The PyTorch path uses torch.nn and tiktoken for faster experimentation and GPU acceleration.** +See [run.md](run.md) and the leaderboard in the full docs for more configurations. -## File Structure -``` -Quadtrix.cpp/ -├── main.cpp -├── config/ -│ └── config.h -├── include/ -│ ├── tensor.h -│ ├── gpt.h -│ └── backward.h -│ └── ... -│ -├── data/ -│ └── input.txt -├── engine/ -│ ├── main.py -│ ├── inference.py -│ └── best_model.pt -├── backend/ -│ ├── main.py -│ ├── inference.py -│ └── requirements.txt -├── frontend/ -│ ├── src/ -│ └── ... -└── quadtrix.exe (after build) -``` +## how this differs from similar projects + +| Project | Focus | Language | Autograd | +|---|---|---|---| +| nanoGPT / minGPT | Minimal, educational GPT training | Python | PyTorch | +| llama2.c | Inference-only | C | None | +| **Quadtrix.cpp** | Training *and* inference, manual backward pass, web UI | C++ / Python / TypeScript | Manual (C++) + PyTorch | + +I'd like the C++ core (`main.cpp`, `include/`, `config/`) to stay dependency-free and to stay the part of this repo that explin transformer internals directly. The PyTorch engine, FastAPI middleware, and React frontend are welcome to grow more features, integrations, and UI polish. If you build a port to another language or framework, I'm happy to link to it from a notable-forks section; just open an issue or PR. + +## references + +- Vaswani et al., "Attention Is All You Need", 2017 +- Radford et al., GPT-2 technical work, 2019 +- nanoGPT and minGPT as educational reference points -## References -- Vaswani et al., "Attention Is All You Need", NeurIPS 2017. -- Radford et al., "Language Models are Unsupervised Multitask Learners", 2019. -- Karpathy, nanoGPT -- Karpathy, minGPT +## license -## License MIT diff --git a/backend/requirements.txt b/backend/requirements.txt index cec57cc..960d38f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,8 +1,8 @@ fastapi==0.115.6 uvicorn[standard]==0.34.0 -pydantic==2.10.4 +pydantic==2.13.4 pydantic-settings==2.7.1 httpx==0.28.1 -redis==5.2.1 +redis==8.0.1 torch tiktoken diff --git a/docs/quadtrix_training_report.png b/docs/quadtrix_training_report.png new file mode 100644 index 0000000000000000000000000000000000000000..1add67d82d0bbe35f225b66f21e4a17743f35bb3 GIT binary patch literal 218171 zcmeFZXH-*L`!9+W8=|rik*0#6(v;q@P^1Kq-VvpRD!mg>5fKFe>4b>%j`R{h1?dnV zKxiRSLyr(b=s7dnz2EzP&!_w4-f{03hcWgh1YB8bt~sCQ*X9b>(om*5bM*`j4Go>j zV+Cy*nlk}3G{*!^odoYla>$#2Z&DtLh8{XDHXh!VZq_sqOOF?hE*_51XV<)}-Q1xr z&cXus?g~ioU9c;PN3DCqQ`zYuV7vlaYq;@Jz1a{9$%BX=4arc2cSj@Tjwv}ume z(5NUp(Dg}O!O|u&=wZICmwzye&mx;2=QGSb^UT2U^GmapFVAQ%Dz3aUvtW5=_7$U9 z`sL*rFWn3N4>BJUoDx=d(%cg|G|E)O>Qmfe4=8CoAK~iUv68~EwZgW&kaZs!cJLwp z^DDSgdq(!y|9l6$KK0?X=KuCqSM=}G|NYie$xCwo+rjvhfAIYG9|g}n-ah`{ZGa+e0bC`P<2Hb_cJ8YnapUPR|arTVYcZcK%7 zwEBDf8S7yCf5+z z7O=NkUFo)?bMdeHe1BcO+*#+jY_&E~yRnJZ?7FDTY8ewD?l^LvCO^*w*C?k_8Ox(- zWAx{OT2B3YtDd|VP~l0+Y}JbAH{n)h_s#4^$Rn=M+<)JlEUKm_y@k|`CY&k(r&lWDG781*Sl)?am|^}|h0&PPi_1w5-`m9fp|rPbG( zC_$q&uFu;ERX*#_m?hmZJ(dPLbbFUazGj&E&c&5kcg3qFbj^0e2F~jxgitE5CDQa} z=cm+Bc?04ulQNQfE9DKuky6V?qrP}Jgi#N+i#-;YP3%LR;uaS-sPiVQ2?t?{&9X{M z`)rX3=6-oUJUILo(p3|fI-z{nF3p0e%Z!X2E#VAVFv{UTrV2wxclRg#BIAzlv>bf6 zpgpJ1pX8Y+`A mh06?x)|z|_wuS5J-ON7zw$LK70mgKxde+hrYoXG7OaPaegy*f zR}c-Ebp>HcUGGxkRGR-qI6||1C$!t&!(hiV>G>M(sE1xEmc(e_%Bg$B)pm zK7B^0@>m@BJhLpfm|svFGuhyuLdw*DOWD-2y0u@ofi3Dn&wIm%4hn+E0%moI)&=(l z1BaR@hbD_iL6fR(-Je6g{Rh>JO@Vt`Hc87p$JwKJ^2eho{`l^s8DXab_QT~^0hd41 zSAm`JpZa!VfryeP@0c*0Kd3L(r)Bf_s8W1ptMPHaLJ^qDwCWmn1O&v)SRI7=+c;o+ zpe&TA90m8!Ak?*KcZpYW|95j>cDYr@C1M)A{C*!7=V)Ij@$E%U^-HlCpFiIhbD88D zuW}MrF^>MyQI_0Y3l5MnmwTDd@LH72##`}P5qWuw;@bJE2r?VEDQ=5d2}+J~_MDKr zleUP!*?K}Fk-5=+=niokoF(LF%FJ3lA>MVS^+f9M8#WOlR{!he*?^dbp1ADrHFP#aIQ&CZUts!L zHS6K&vGZ7i1-TxIr!5=0^K)|FZYzsRd(hsh!6M$iEN6}PaC?THa2HFke^#vVs6GLc zUmddGhN)RNY>_w8Zw1I$m{bz9r6Bg@G+na zIFM^Xw&^kN?315nVoxf+^5T?v`i*9BqP9HmXpUKn14#`s8~}SrcVk%|68goai$zFZ zP_H}8{a0^FN=jxQouuUmcv@$>m4h3HU&~S{nDQuD$=0K({E>%dtI>}b%+!RWxx?g1 z+cQyWDPm6fB7wTIEsyJ~hZQ6tW9ZisMOr(Zyd}p?tvr{9<7CMbXx)+_=Qhtkw5KA* zqUinhPbLeWw!q)tX(8gX{e~9%i@TCOzn?OTIVP&)4tln%QVt0e^=Ds;h+l@}u^nl7 zd3o7avm(ihIf&%r_|8i_&*#9sBC34Tr`Ajqu4#WmEi@mww^m=G;^Q(_kvAG;x3T;q z^lXnq9lb0*)!k|m>3dz?zyFJ(4IC|iHK}sEjgqGzjpWXo(N{{9>MMHk{IUpG|0##= zFCMCVSgPT$ySbR1|8*}r#G#}?Y(=$IZ!}WmqA`Qct0EUE#GzS@LDtxTkjy#;BbCW9gu?xpwL>kzGr64--2q7t&EoQzK6|5 zEAQ^FB0e*(ZBToGb(HMZ-8ii{?qd7t!un?j?zZ90z4VFIYMgV7(?LPj(hJJ$^P>Iy z@E6IO%9rQ{Q5}lweZ!dCp5U}1jlFI#a zEpL4Lxmu0NZFbJpFBjLVYiCHUR-iLM!Jsy06&ZE7)X<8pNW2swnQNJYjP)Atu^j=o zd?xmr-=r^I&j$x8xpNGcXVX%lAOMwxAAc`ocj=NLpb*u2kJ=ghwtyW}qJoCuzjuB& z)9-PSmLNxsqtPmvG6$Pz$PG%5IBtba8BYTB;%pk4 z3!MK~R|U0^xFgNU$@$ACei;MH3fia-9DD`^yLFMZNgGcW>4dB#Sz8^t3NBCnx5H zyB@08tHz3eMrDhzTph0#?}$h~m80ToY^}%e9!|1|^@3Yz&aL|(I|BN%Plv8KsT8Qx zL4S@I<}D#>3clonO53T(WHu|j0@lg7I{Nowkhd~ZuNl-gmX6WO{DP#dOg7YyntLXu zw3-#L)Gtag+%lrHFlcTvZ*}k>UZ*C2KHr_PlIHl+Q!G;}P%P9gSqN^AV|Y#|XTw+|A~`1r={dM&`xc z!s@N;OUB)S-w8U5ldhEZhEbce&p>Bx$ULvUhAc@}a_*DPopYGuQmc)lO~zIgc3BU2 zqVJ7x>fZdJpf#kLXY8pRi*c@Q` z+~K-lf1@ZxKWp$Hir+&%o$;Qi?|^*&lX|E{Q&0n{)N6I@#Kart29iEv{f^oNx!I48 z?wljyEEa=?7w?$EIH-^gfvJoslgE}UxOt-mMw=h}wETNY1h**sr3g(f|wb z>Z&UAR5*=`t+)b^sfV`qENxkSQ59mhp?TcPVB~#ees2WqC+ewdo+|PSgh2`=F>`Kb z2an)IR)Gt+3K9RS=nl)R9bIxx$fXaSe#WkY@;f3IC{t5G^eNN-w6@<_29~COpE!-~ z5BVLNxz4yFZ6=lWaVXqaPaUl6DFjMxIn&Zuda?0*{n;T;zuER^ zITio(sw1CH>)jkV32Nd!vm8)KyWFNinfzjdNR+S7+d4rFS`iL{JTo79{fuR#6!m8+ z-5>gw-d%Vg>$mxPXRoB`@Qg$n%)9-NK*ZyU{3Ng%Fw&3#XGDAtHtJdaW6E%%zKNnEhFN@`79b`e))98^T+!1zc$AnRykwuWGF{%okz$8)&(5y z;L8AJ+|ixz=<4hgQkj^t13jP}bBvz_a#!Hit>4VU0N)aj3w~=F56$X4px;zGr6!6% zojd*Y--{&ukM)A}cA2PoGT)uV8MwQ-&U`p(i_puJT8NL1esaB5Csqy{Zh!VNU#@mS zSF*w^VkNKfaCiALdI9w59d+*?dA)mI+t``hvP5A>|&{7yS#P4I&;Iy`sCQ#Ws1)KJ#V+(O57V-$P<0R6k5p-3AWrH6n#!fB! z;16HB|7Bga{tvMazB+0d#+GS|O1oYkcYbhax74yZ;Bc$tbKdEMa$D5a;Q?qsyIjXk zOv}?j-udruuir~8n7#Mn*S9k&i^;l+ zTTPS$)VsCbN(VBFbIo_#k?tg6$c=1HSy{7_bXRAEBlSSTlttKw#ad)DiGkh@J-IrQ7m&wM%Gc3bxKu*zAl$oMf1OG;;bK zZ+9uR{SEAl0C*8_ILyTfIa#+kpax-TF&_OL&XbnwA;pvC^F`AwPydtjX5XVZK)%Jz z;&JXM*(3F-^jXi_A{q0o>`6a`dnKBAp11%iUs6#&yW~Uc5$7#BwbM*5|5!sK5>;yE zHTqL#LT`6seXykrpgJutT%b2I=!8h{aW+2A&c&%-W6+Hu1B;{vq6;m1wpt*fzKv9enu%{<{-fKUmk%o&GkSAWPs1Q|QJ zQX%B)(+uh{+4Y_H2efRn!j$B~Ro%kB2Q!yQ}U zNzme1H_FviRlD(2eww{o;>Ad?NYcThn(pMSsa4qL$NtrXPxJR9bfKFQHwLjeSJOauR# zLF3fUq?ps#_I}_`MuTl+)926M(0MvJs`&IL8A@_6@*=v;R*FT;@wbS>FyE|*l=s>S z(Yq~@jn_;Al#4u%NjcCNf(e0JqqdKF-K~FwLq4}rR~)=`m$WPks5sI00EiEpjg20Q z+L~Y$y=-g}>nDA0V4VykV-t~NaF92V3L39$jk^OSu_$JmgnO0CmoOXqI~>$=GN!-o*K|BwNvy z9CZKM%VYidA;yv=`4y^p`k`vNOr|eF_{{1C_o`bv8(7DxoJ`W|e~&xYLu^oKZ0McB z9)L7unD0GPXm^?grSyX;SwIW|BQB{T!=ApRO*6U@vQ2 zaW${?@}Fz|nowgq_~)YevcttW0)B@q2JHZfC)NQ=Hl1JVHL0hZkFy&F<#lI1#YH_v z8*oU-K$I76Vfg3dYkx&j1qA1?N?uEdM7~LNagsP&G4=!~w|MUL3L&7IAr|X)sLBkO zS&3G;V6-|C?>$!+p9_hJyORQ)cx zLZ&;ucd{uWBI3`2M{2Q<)KHNvUkg!+xIR&?vgcs?{AH}^fZn^$PN*g`C|aB9`g7( znXku7Z1BML6Gp0CEF{Sj?sIVl=Fxfu`g$X42aAX6%Oy?mU4l)fW7RG$L1(2r7M^CW zgP+^M#An!SNG_Fu9R{GW`|SQJmf2YZjHk~+U%HL_Cg667#naCfeet#&(jXLy7ka3{p~?UI9tk#XKWseMGBIils4X<9*4Q8tvmU%UIgq8s#4PdR^ZP6J9(s*C ziO1jla{#SJx7nlGbkN~{e*Dk>ulZ?bNI3oH$3HI=X#PE=|NP?rOLF`FIjR4Q0GPx7 zzjI6ebMpUZPW?Z5`+`p~OL^pGW@c{7^hzxk-qBRXWf0&pzHS3Qxs#eq%DQ@b;;Nj+ zRY5t+tf`TJR*5UL0xwDZoRsI%Uqgz1Kr>E8C5bxd>&nxX{-;Le>eXBbwld;j5w+Ky z3am2YgM3=;sU4B=S}|1l%WqvBZzPxv%DTeX%M)j3ry~T#PMeL6j>g2sassI)PI|58 z5zwx?kCwCmWOCye?RgP;vo{^~OM`iCXoz?R(w8_b%d6k#^!&%`(*rr09MF-{bSrD? zj!5aXTM1@fNu${@KY=L4-<2Sk0O0+D0W^9>R@%{}a&UWnrbo;R;JCMKGvVYFntO_X z`hV_Zl6OSjWpLp&DEq=>n#)#5u- zCEdFTm$gz_OjB_p;Qm<4SO(kXmWFb6vO@9 z8T9b^kzIhU=xP$>c4irf6hMjW)+S39LutbFAIShTe3}j^a{CEGbON7|_M)~C=+`?< z{^T`RBc2>c%6zQhK9Ie`okk`*7egH(0VFb&bWlj#+LQ<^o0P|?I!DrU(i%PK*;N{v z`&=&ClAy>{Wigfn(vTHk zk#6Akow1s7(3pN*OUra5fN?6ZZ*y_{f`X`u2PD5+ze=3OtLCMA`4)C!!#IKr+5Hx- zO9Dmn)Jc0fszIF_(sa117AduK%cXg~ac?cQ^#e-^reditLa^}`po45(RM2qhhN!6C zdFhqAzQC1)Xxmz!M)*w~FTFX1X3nWHC|2D@-Frl}SjvcC9s#8Obhwh5^G z7jBQ;TmuCEX^boiU|^m8$s#~FxR2<%j2zR_h?Nu_)hY04Bn_LyBqc2dLLz?J-Bgz) zM=z+Vsm36<3Eb$!E`bpW=u$;bmO)iD0;og8CZy-RWq#(x{@ zr6E-v6@8)H?pU9h4-eYV=2wsQFW;m((VL5C&b$9!<{LBeAOD6N0<5%ZCtzuq@vcWP@PpNp=X(r z*ZM1^a(fGU5s^8#RlwTr64_Vk7l9S`t+1pHyWrMueyn03o!ds~)#SJA)u#uky>Mw- zHkbB~*KH2DA<2Jvr0Qr${(SGgTvXla>0fRJsS?i;XOtQr1tPFjcj7&6ue#zzH(4sx z5sVi#;=%5@lON$YR3WfqtZl6B?{_R*xM}UrQYYuVbzlmm2;ASi1|e8E^nVG3J_VLq z^>thhEs5$DKm#NRKyfH}&m!KdE}Up!?)%e&lzTdHw{dHAJcWwJoe{5wll#v0YBWF8 z43J=y+~4uG{Uzr^*8*L!uf8oRd$&a8RlXFDt^HN1;4`SoW)bq}mNSj39FyJy)7*3xeYV4RQKi7%t}-W%*Fb5-ee+?A`LBNKJSXjjr$vnJ z6$kmNLt2}jtD(;c4P>$9@$?PR%J*rN?y;VnV3?Ohz#NH2Q38t-2?$MBf z-wS>Vx^rW7o&_q7eO`@?hk$7w51;^SJXh8wAiP{-et+0HkLfTQl5+W{3kdE^&jGPS zgyQhyGkdH-C_BrtYc2a(3ea2Teav#wQ6!(~k>^o#$+t4wxcw%!0HsfCQIp+5x1fR4 z+Q%9}>xPmgw+A0NHcP@-B!JqY62&g7eiTs!^^kjM_S`i^*fuh$6$n|Gz;(}V$ZL}? zY23|6`51R-mBj7u6H)UuZd7XF6kUxAGC421sg-os@}+`yQ_z9cuWupq>8tP;3uQx9 zmHNqpGiGLoek+9-w`>i#eZ2KGFxz{PwRp`aCTue)9aD5;9SdA`>#^ff2*C79B#T`p zk+s0qVshJE%t^_wNMDffJ6G6NUKdnk`1K*X&#xnZg1=UH*&9|Rzd2H$-w5?Rb~qz?`FswN<^ z-8d)|n#N=iaPQZi-1e_yntpzDIyyS;!30ff`rhw>TbR;B4-z@SXrObXkY$N@6xr9QBj)Dh;&RzC z@NsrnZ6(<~2cM*YYWemj9avYDWz7kMt>Pf6X}D+G%PL&N z<~`9b?Fi(}NzWxvO+}jloUlC{-YNzwuRLvWF9Qm6Uz^coTWc#TAF33{K%3(vX+N0z zHlR8t<`N3%D9A3z3=pgRea17#hH*$=_itnYbL7Z)n&()zR1nbHdvH?lr(J}1yv4tn zi(%4;rhpwcO%Vwq^NLLHbKv%*fi#RC2M8s};b~q%Oxn=fD`4eKqLx5DDF*do5j!;iMD;innN)Ah&d;ArwZQu*MWHo8vIIp<5tS^;ERZg0+?KLQE2 zb5ftRjyqLjWvCG=@9jN86G4`Hm_VSw;ht*a)>&}clX#PM}y#fUn(18{;{;Rms-BUM=P_hQ$^Z~;k&i?GzU3b(02<4 z_HM-eX6_B~^<>c3lJz9; zbb`B<2h;@V5`CBow%(XO?L+l(X@~8#{^Tt|4xCGo_ICa@``xD~_Uq$q(+az2@lhRl z7ofgOVnof-s$AijS`>Gh z( zAh<)mcRhXb@hl8(2aLMO=gjp?P<)3S`nuK_`uI}Oa- zmrokLvOEOOru%JaAPOd2!WQuR`-9jU763t=A-FpS3^>?} zdX5^|##PFjiqk2*oOH}Z56zICg1KF}>ppf5B;h=IZ0?sFsd8Fgw;MOa6jVCM0#GH2 z4gy{GPGG(JF|(I>BV>14mOwo0@n=2f3znT&9V*1SNZTA@ql>9(DfhFgYQX zYJi??z}R^4V+|F>UeGg+w5YcpEM~0OySpmz0P6ig9P1H#`)gWC3NK1-&oPvIxZcJw z4_kfrK#e3_(Y;Si+fgqilx&CbGd4F@>!Rn7o4|{%R;_%A5D+peRr~=WRt-0oW-NP> zMK^%ynBuI;T4!46aK<(bBp|LSv%0?i6d&IS#8ExVs~QGp4zV}ws!svL4`1Avp$1Yi zABCNt#8jjNQ>T&)45U{$FHu3#{V0Ocj#Wsr;% zqu>B&F9U<*6Xv}-rpN9(dy%*gf*xX6?>gwX!Sg|o$J_b!ivCVvH8q-s+@6kz3p%9A z)Cs@Gdf;mb6(+R`fBWG>I(5$Za)G;#L2nFr!*5vnEhl2|1B-aF!0pP_60_S<9wt|S z*er>;>pIeCIsWcR3p5t0gKdqRMunVp@pw3ofldwf)lU4S>q3O9-*aW2DNn06MU9r7MKY|^< zS7I_0my%$6h;plZ0(b5@s7?Xqw!TkOs{@E9x{X0|I!;cBqeRGs)4xVG_AQeyj>jk>7Yc)tMHJl z`LNEs0yD?UwoDsZ158C4|(M=lmHa8$7+I=r&){B)bUR!7tPxT6-_ z=L^a|-_Na8mSZTKYLXI^G&?JR!fVtuqdmMW@=#VML+;@&~2OJ$@ za-U&yg6H#0;8c-ROf7#FlP>8?4~QYyjNKNWc=3u{3Ebm>)OH-Ogpc+E4~SdV+!>*$8A|ST{-cQ(5*leQ=a9 zrFyT`qm9ZXnhSKw$r5;q(OB^*ujT~yE@=d#YRxKp!;yKA(b;6j&`!fRwF~Lkqz3tv z8=Qez$Ri1y*`7*Pr?v&k_e&;D6lVZRg($T3NBW^ri&AB7bDd|FW72HWm9W2&7 z3+k4fnk4hTxiH(;H;+1Ra(CSiw;RjGY&A?e8p7uYuw!5R6WMXg5Yv!iqTW*Do`Qxn z#AooM0^@5JQ zbRF*SAw+~2rUUux+q*Z3=A}e$suV~mshK{rI8=~Oy9^Ob47LC4P|4`@YdQRw)3+rv zWpP|UdF|OJEcE>n>ledYpNi0TH_+vS1T0ititdh?#@d;*Lmu1I`l^X2;Cy26v+9r; zYHZ6+C`SK-4hTnwdxuD%;AcLE2xvg9&llav6&L6Mrk3tjUzm<0_eISuZg-Q;oPoA2 zb6VD3T<`MXv!Tfs0w1BzvUU1(3i6j82_`}x+LoR{bku3syUhWr*F&`9KF-_lxM=f7 zp?Tp}4pV{XZHYdy&w3#aLQx>FF4mFO`yuW7r5=XxJ!uKlF*^54;v&PnbyAi;UI*h( zh%6fP57W|ItF?1WMK>p=u+uL0810_Y-3b8jcOE9I;T0Kpz!4f6`XDOw7#85jwG%&f z_#j&6wu}I@)9gdJxf>MH0|T)!8t9BEOVP$X7E$7rA2NxVQNZvYeh>Bw+*r>PR|o|7 zkSfe2&(woaL|3G2`bD;`=oO752IG2eH%^_csD3jtz zS#!+0^ap;V?fH@>1s(MWHPz1HjxdhPAM$OnQaDd-@@c><*DvQ5W&ZSV{Hyn{_=nUE z2{Zpj-4<~d{jmf;m>X!NQx(5)4lWpeG1M?IhA?_OSDWN*-AJftHi1@-=(%!fx_UYY*H?ywXZ zOifyF2}rG;D+~U9uO= z)4^*p(33}=(-Y`m$;Yqe{;>U06uVYDz;>01qF~B%x^K!O?(!-LhyCDFGaf9A7=pKf z%xqHe4PhanS%9uZWv!3bNu)iV7&3(8L*6WkEy(eFu6SvGYrXC?FtruJ*opSizvvCz z^lLiasK%ZJzTj}Ag7D2Z+I(cs-7mB%o zjYE@jC9tie_Lb2aK%f>gt!I?qf6;JO$Dpdrwc=SOxBgO3(AZ?3tLP#T>)q4k??_+| z>R1|zsrD?eLiiU?{>+~Ht+<4t-^Ef{d#qv3y?!Si2(P_;=!9+B#oGe$S>rBc8|lO^ zGfsp>PVY&XJVG*49Ns)gsw9~!PrTbKsP?s@OFp{lL4traW%*uHRgaWsO#Je2$Gg?l z>=z3?seXYQA8@dQv!)I7OI7&TD|tgQ21POWYTT@({cL-gr`w+7(NS}wL0kAlP)1>b zmwZW=T#HbY2r$br{R73b&7(LyL!N`)Bcr97r?`N0JTB%0!ox^g+PA0gfQ?3lc5hEO zz7B7v5LG&Tc@wR1885*i5jp!qC>ZK@K^&#m8$`@ zIsGksTg$KQxrFy+$(Nq~c)442%6fGj#F8|IiU*9pX5YJG^h?9gA58wKk_qm9@AI+B z(1)qqLr~G5?6Q8kxvCrs)1UP9Ja`_D`Q50is?PdU&p%zEv-vPw|LmZ|8kqGDa4Zp9 zZ|Z;Ka3i66ngz29iu4V?rZl!a47SxPJcYDGxgeQ9^y9g+s?DFAYJE9Bkkygp#e8`k zairecC3g062VRQ9&s7_N;a)Rb_R=5q1!V1`OsY9kg^5?u(&b`muxQ_6NTGk}h1@dW z;v{{#58MZ=o`9X72rzSbR`4F3<&*1-=2RIs8H;QLC==qZronPnDXfzzRdpqZCYEa#NK5FyG}39Hy ze80XSC*)OXN)UXuW7T!bh{p_P)GOb_XGG43;&Lx(=>GiWF8(X`(aNY)c9SpH$Hr4o zQp~^J;9hKY68N9y`arG`E}P_I@Z%Sjdgqr>~qj8(~p9psu<@&^`qB% zV3e0T8~5t2fh=&AESV~E1>o{UYk3Ibd;N#+g>shm0iEMTW@Ah%oV1wnCzYHYwSY}o zlH!9q776cKyxp_YF`Zv5sS2v}LK#}Y3Z^0L2?%Zc<|Yl>#L``|XKBc>N=yC2>aE5X zD_^Y{xk>4Mq)R)CIUBAvJp*eOJ1<=mz4xRIqcE_l(oe@Cav_J&9}~u*y7>C^SZ?uV z{SF@tqA`fVnOiBkJoUe$RT&6Rn291E?o{bldh|rxabSyB0rzGOXEd%k1m$&jnX{Ev zD!b!C87}IfOqnwciT(OJT=EpgD~}sLBtyx|yLsa5jl@VRm!=(;O7!```~sl1$GF)x ztSjwEWF)*kWv*^l3y0m@se7x>Q#3&n@7Z znv4#|=rXwD^oHU7eB&%s`5;c%Lw4}EHqVp}5MRybAI{|K6$Iq_xBA21|Ew!qRV4um zdeZ4wSpN2vH5oDJK#OS$eY_nAzHy{TICyFnwKLnX15i_S>`ht-|0Q11}jV{^ovWWQrNpH-Kd-_XSd9qcBt ze5UT2;^v4U-Icr7rg2VS zKavn-xss>Bl6Rou84l1^+cbx$^K0e|fVA5T^WwRSg7^Kq(8rZ1KX{E*beal?J_Oll z>#k07bju@Ip8m}6$t=V8#O-!Y>k`S+Uv9XCO|~S*+!*^#UQ95(v204r>+lV6p7)4v zn%v(`^5QSKDlWEqWwlli1@o06mNj%{?^@Vo@2K0F+Z^oVI3lELwF=y&aJ7y~Tznco zVNNDEPXnVeJN@{)TuHkexcalAVuPtk$A!&@+X3cjwJJI|Ld#$u7pgH(F;Yr(3;iy$ zPGizdZB#06-G3Llv)INlSID6G7vXANvncoXs_Jg_o$OMr#xyyz7!@!VgO_Kw+*xhl z@7*54JOe>AZk_@R7MaQNqb-rNG{JY_z5tvmw(N5h@9zg_?rp91>`}R$rnz|@?EG+Z$=g-Nh+S=N*i=0Y{WKR&Y{DFrcPxlAK$5zf3eEgBN zq3z9O4C*~q5Ar`eAX^|X28D)GzQ00fWo%Pjl@z9_Tt@$L95-)z;*91E8_PTABeF&&~4~uQcI+?cYh0$l;sA&vn@buRp*ZQvO% z_G?#U!#)#CK!UX$y6kiQ;2gzM3njQv%Ho0qCIv7^(ms2cG9RG$@8bZ0#;ZF$E7rOaUi%2=a5wza=1U1);9ye6F09&Uci&I+McXA zNP%cd26GcgYo>vG3AUUn{5E-mD5bml)!xeTzZqK&#>PX=(`eyQ4#BJAW`d6eS{aai zq|-U_ix1J`fNCIdY6(<>Vo}z4xQ!|%p(Ec7dZU*W>mnC?fGtR31<{2xumiAHM!&?I zEt-&xNMA-o7A#v6CL0=H%QN7bi|$%nH7VyCKnGgXEZm5)EonfuQN-;#yLk``9j9<% z=#v2}_o8^D$7gQex`k*xE4ZMV`GEo7+>Mi;a1F~*EVr>HCMDa)q^*HC9nsbJs4HHMSoXW52}xicD9_nxQU-I7it42IyBRe3 zC?7Evf+;wsaT&{gPa)Bv8Q;~)4a>T<1-C?z4q=Z4Eh6(F?&cNQ9JJ4#P+uF+;n=4$ zssV$Pa}M<^3-m`>;Z{Q9aesow_nV6;{Ywn759~O6-6`};S7^(TkAM+wXo4?cry^i}YD02L* zhh=Ky^cRJ{<~OMlfjK&?=|dNOW%{-KT<$LG4R0w{}oAa7%ohb z{5*Iv(*4;(&4=4O3B!ZHNI?>_x@@RB=!gZhjZ!O#&m;4GvqMxpQ90~)mrq{+Zpi3& z2Tuk$$g6zUnbNEO!@7tZ7|oTNha;FBU{@+;~0vCS1dio4I*_VRz zs7v0=Ue4OHk+qfER8mSAR$)`dCB())A9L9y8`;9=!nqpk)=ZxcR8>`lh#vXIoXwQX zxsKgbYRQO_8>=q_h02y_1dPskmk$l*Bd4v_r+?Z6;2Xx$hR#j`*+&ev?C}G#tqa0T zb>i97Y$}iWX~ZE@XDW*pX(G(O#@w+0`Xgr-7}^agh+V8_?V@chx&JEIxbQJGh;rbK z0zQpP@#zKEFm~@{5*%<&*#+0c%LjeWF8Zl|X}h>9Cwsa7xkH1bY83iL(hAtZ$4WG3 z)09^$30b&Tb9s6j?Am)ZDPtJ-S~DwLSE>g%&`C2l8ah;CnMfyZ$-X&*zhV)~@6xzq zBV3~KC10)r&aiM*%bK3@T)d%QWt<1VyC{$k5}P+PdoBhx3Za1E)kA08zw3N8EF)5? z)0E%_6Q|6XUH*a%%U!COk)jT^M0Qj!U5B!#|QO(m3Z=*SO_xH9HZ*x4sUh~?OiR=&f zpo^O81tsyYw^jXh9_zX)O+oBY_5700l}5eyXXsJX=M2c1;L&|4EBjSWFitu#O;^edOHhw6Qfw-3J3YIueDr35BA97;)o^x%2ipn*~dEYvOA{{s{Z`_7!t8kIm!o+ z8vi3bvhZZC04YX|%9xzAnZ7Fvj}kJ>f1_9Xn>MJ=B6&(DJ3rL&?bZ1WAGz&sGt9DM zGb$>#3w|wLk)ND_PK?Ze?e=A=h~!(oy^`!v?sO2B?E$iBz*m(8k&alWvEz_!5s@RL z;A5RJYOlE1Xgvm0*rT|;8~4lFi2KCkRedot{C3bDk`HWd-I$f6`1U)5?Rt~ftiubV z0{thusRb*^KAx-6jcZUqk?6Xvl_TR7I z1<7T;XxQP!QCp5^l~@HgHwEW9mDzn_S6jbF(jI}ycjaF6&j>~1iVLIO7SRqRjNo}9 zj;TC|ziLVP(UlI0C+RLp64j%hM=>VJTVy&IL@P!pNO@mQk~0HNf9GUI$!eqjs7GvYM9B*bROIj^>MYZ{3TJ+>4e|z%y~-Su9(z?iZVI{qQknzhwmUVu zwbfYeGJCyIH+E_L*$MY93&g!gRueU4hA!jWWzFYrJa2uQ>TN#MD0rzCNWizL_LnKx zy5j~ExE6n};KUpM{q&lSgx`6mL&Fyi$cmA2b$k~qo^TR=0Whdy3kl#`<`^f-YW%Q$ z@??lXreFcY&puLDi&cF^MMZAVieq%KnWDLG*0cmVCt{__WYiX< z1KW|l{d?v#!EgV4zRf>pRVh40oKKlS{7y>X5pqs#-y=j!_!YD-mqdVjva@Vb^_JB) z6F8bTbaLJScs{xv%aahLqkTij>hWmBWRS^hX6)at%ht+<>*0Zc)k0rc%aen`%lw_$ z1!!6tuGfD>QA5V+|1}8rMBTI7LuljmT2}@;(n3qZQ}Jmg@o)3uBsgHEvm0HC`h^!j zoY^t;dE`YSWDW8mo|fa&%>V(zYXi0Jqosjc7ooUD7^Oyc%v*WEIj;QW7|4)M>2$8=>xz4IWL$KTB}`y6#;Dn%erW zsqz$4u_%p=rAX;`9{>FBuN39>3in;u@O_WEVr1hqG;?OyX=$E{Qst?Czgh+Xx3>aM z4Hy8s&GNvus1+bUQX|jd3i#J4;x6%E>z+n0*nvik>)ZsvS@2w&SukJE?Xm~Tjy&gp zygow1bs6G_T(}WE)vTBeVW^!sA5F&+z;L~3M~NEfJq%hdDr+K5-Qs7IT)Guap5!eE z-dQTJW)$^IJ}j=+m<^#-0P5;&UXB9bMN7oOrjXFk8%_J#!$o_aA6SQH=jT4=;%xTb zm+}NvhL~AVW(%Za6kMU7&Fhw$mgk{Y)QrbW@yx;tn)?qwtC3GZhw|fqucJ!az)RiU zbHAtpJdY*Mpd<~*2SR|#p6%24`+ezqrC>Qe#x(}^Y>a|-m<96ALeE>zfyeJ;n1UGn zhL&fHm8nf{>TOyn#_=j1cl#TQfOB0G@zrVT7drsp)M82$-sDhRo88JQvZ_Gy7G91i zjw22i$2EA5-JbP1aC5ibnEol0>tJA1eEO5Xp5y3^C<+;oI{GzZ|MQS+j+jru+J4w?;oX^ zMr){-%;SGVar_z`vXgsY4n4}Rr!gZg?bJOpG5dQE3#NI>JI8aW;D)cDlq z8rB2^-EV=geAx z-3^jTN_UsEba(yM#(SUZ^Ss|bUI#k3;|}GVefD0Tx#pU4F5OEve=sU4O6T&}v^UkQ zv>qL-@$61c))nQlhQJLQtCuHnRWaP>uCk1bR_(t14i9a^UL;5QH0R;WT#v{TjQh2- z+l|lTSq=Ugd8sWD^!DUe^QN0$jjAsYjl_G|EPOe8Npl^<=P>1174@TPw;N#Ncy8y? zjMq~#SN>S(C(C`g{Mh)jhX4*I;$wqjTkK1zD~uJfu;z_W(xWVoYyn_7?jy-nEAeYt zpo>HFg_ks|NSU&5Rx)v!vf%6YHy&auzxr|#LR`VzPM^MZf~&V(JXiPD8wUm6Z@VWp zNq=sgx$PuCxKQ;W-=I$&j~1+iV!qm83+{BY@KE}J&%2r8EyBiM^{7MwlJL;9Da(CX z8iIo{y94bOqlP?1(gI1@kfS=_)!3sj}5 z#d;1S{uyPyp6@RE#u%3qKqol7AZkzk@hO~k9#o>3%x0q9N5T4KrrD9INt z#9GgGu4*k$h50(pCP^0>MF@$1)P!@I@~IkioJNhmQ;P^=fIq3@Cv_{U&4A~({=R13 zwK4jX_YG0+ooG+s)dK}L#)GrWFFOB-dmjG$&o_^_vGT8G;+`qb`g!A`<>(FKRMPWP z5RmkMz!1WvaHBLOET9mD9wkUbHJ|i6vDvkGm&)=ki94xZI}XFAv9D%vI(2x|Jkz%^ z#cSf2q({0+$8GW>ptMkH_=bhIVr@7^1^?%-0OFTtg!kQexuU-9Pi7<8#a*15cm1>ovF1GSZ0>9}-)ije*J`kTHV}E9dLUoUS{V$yYWbqvX-e*3!ijR-9?JbGP9b)%tG{BtNEcHV zJbJ!0z_#9-H?Xub`rQ)F#+-+s6XRT$U*~ire#@w+r^5_E@~@K)LOjfI_fbm`hL%7yP^HSmQ{mv#^fDl-Q-j?rP`Xl{=7zMBzpzX zvxG3)ql0);t(k}C+!GufI_?*vxRixA2Rj~om)>d!3Grn!iSbvlj>bf;&lhU+X%jmZ z&WQ6I{2&*5@GIU9lG_5nM-w-ZUR(tv((n$Zc=RlF8%n=Nc-BuMG=04Cz$j^{6qVG% zO&(WELL0fcK&kcpB&Phpl6s*-Pfpp1yeuYCk>X`DYJF1 zpvyNkr>GB7b7HrP<|r0C7)8nSRvJTwZK%;(DoGGjVu> zIv@(JXa5<OF$tasc)2ATm#TzjaS!0Y8i;8T39g&khybgdjhN0B%+HT z|H%Fb@tnI+d=3PQzMq<$AC*|6l_jo-h=?CFbq(;_p(vu$K_6laAnIe#?jZ*t2T;Ch z1ok|6YE=Qus6S|(8o;vEsLe?j1k|oRO~@>>JZBonhk|PXl7O|Xm&*%s9_qmBrimy* zUvP>=|WyPv90vt^CzA&Pw4W96H9s zgLHyhy9rAzKYrY6Xh(7fST1>a*VIL?#dWkz&bDsNmKZ|929#(#=1oos;o6QB;vxfc zqB9>HGB+qB=ijBFif#)FizX|@WoAO z&Rcvvtt4@>S}jQM^M*hH&JcQVgg+?Sj>kluREMXn=VUdy)ix$-=40uimAM11Hjn!x z`cYrDcdLm7$JZc}M2D&x@rc;r0b`Mf9yLGzibpa8EJt}gnl47#13?M+dt%V_Y%CT_ zFh@GbOACu=%>~jAI|$T&@fP;8TM7sV>Z7wMEG|}+tFLIOEM}xX#~>t^f#G^u#@DGB zkJy=CZN8ylv|mwCbQTPytosfE1xC{ID?*`Ey6MjtDVstuqjz0}>J1C(n0t!))er5H zwtkTBYS5ekgWw#MMBv*RuQ(GmwLY|Z7Y)X4T}l`2SfWW{mm2#EJ=P|uB{q;hyfm1o zC4zAnzqH~>L_Px^Ef=mOy17W}N1*{V;^ql7B5m)O)a`R#R zadbuZ`1yz}1!6(=Iqcf2c;=+hbN)5MrIA${q|tk_4rxWw+;XL=6?jNYBiPP+23L+9 zYsLHP-)c(NUhPfzNlXCtU>R?Tri40aC__}JnuKWYg(xt)gzG9Ky<#ZQGo2o* z_NXM`^_h7e+xI;*Eqs3DzSI@`;w!j&SMcGh_=@*8)WAkF^%k*1)<^eYo_(pJO^r3FD+Y~4IiGv*12#2YdxUh(@i zAC!{qSX`SnZyjIMk+xVU7jjOy_7c^gNs6r}QOXStr?8`UCGvhYnH-UC#;(p8zB6eE z^0vE$>9n8;skx*b70|eM{+7nlinZuQXL5LoTlapqtfJWV>CRF+tFN=kDHHIqtx%WW zYy{WAgwxSp6q1~}ie%ztn+elYl2lbOR8^v@s^AO0*&>USw{hEgToUTvC#YV--@~E0 zH8{lmjUgBR-MH21=uF4g8>hOe4^QQ%lIG{)OYQY{=HjOa7N3+`WVkof&^bdUOY6}8 zS-&TJ%E{`fXIl&=Q|a52;w{gY+1lBL9(B&ay?M{3tb2a{w7>t1!}v-BWeToTy5c_Y ze#HYh2E)@36(s0Cg+vy&#SdZt0I0!kF;nhv3U} ztDpY-^7wA;6leR->oNwM!E^+}u_XdEvm#al@S?$?ENcLfT}o?C;^N|+ydt!AvxlN7 z*JihR4wUrt%xAYK8uEih-7rm=&z_V(GU5AcktS!MjjR%_pt2`pz4`Jtrh-3ze=~{V ziTFTodsRY0s8%1nu33zB6WgyQBjGe$xU2``qnE^;EfkwV6sZ}{53u%dm-pUk@*HNy zMY#3%#K%V{I3Rf(eezC-NyA7mpraI8!FN^H!A|(#XlrqZYj)th{I>a~HiY6Ww1~Vn zWD0@XcC*3Y)_-0G0K82M#&>+!d7+&+`lC7GUfSSUR1h~@#AdCJtSLWs_)Q7z2b z0wA2HmAibo0_Rkj)#^mu%b~Vfh%cg)2B*+{V+*MQ?MRy^YK}WvenQs`B4e_6JsuYf z*X7bv;i#+kIEJiI|Ie$AvFD_*r@G5y-2`55uuf4{3x{5Gb60h9b#QZsFZd>csm%jV zmM`Z!mr7GzGyD}B@dkT&n7{- z%huC>xK)0Hft)U18fya&Ihj`*by%I^oz0QVG0>If~Jo z56~lBeYFkNasbE-1dG?&2`Iu}_}qR|_eu>ZOO#mcq`KF-KYQF^1!H%;{cx24Vezp86xU(nI5tVY)Rb# zOihQ*AQ-=`tO4~=piqK=jL#N%q&{CtMY3z2#HGLb2>#U2VqBPJzd(1WTC#x*Ztx({ zTnP!U@diR3V`7qJbrT64hVf<{V6oCl^H9zO2(lHClJc=CZ03LX@J*_6K{J==wA{4f ztx6Eg4v+2*t(QU#+qm3u2|@HPgT-sxAc=wbVEt{{?x z4be9C=MES?UZ+{Lkrc?~g`@4f2K`lTij-g{0-Vmztzj{ZXLSEPc!wmMAAiMU#bcOxupW=o0~ z+u4V<3(Ma*YDc_JKWa98Rnyfo*l~$1ojlwmg<180zE$wEi3Rr-+btcHxH-+#noIeE z5jVaD*|FBjjaChZ7=6C6<2^@8?!eyBGyP`sDyI=$kt+Wf6vf2w5t>_DOP4>M7&p6^ z$hx^Wj`i`x0>|0h=!nFq@8}rr&AifxM00LciSUiehg?~fi{x+9P#^m{#XY+V>-xnz zb*qcSFkEd6MHzOGd6lvri9}L!S6ns1%V-yl63>HyqOWSb1h0F749f7LKW;+{p~TCV zD$_VvS0b-T$SHAM@9?{2oBe(0Gww^MZ>I2%G$8!}nA$%mKo+Jy%q}$smtwnIBY$+@ zYjb+m(?h%(l@ad^tyEAQg@*$|+|vMEYHfL>Y_rHDMb+=)R+Y_`Q|8k( zXp%gT_&5o zIxf}lq^o^KI^)s|BwQ;SG4JRXeIJwR;})PvV4+S(^KZTiU(e?F>ck@z}YpcCebMzb4a5cMJ6^~*>|0GkG>#a zv14%W&QQYF7JAB1ohpHrjUn5)H1q>ysvIFB!JD`|!(HPc0z*%HFEP1)s(4hV(=M=7 z-*jU41tOcWMQ}BCKb4PxUe5zga zoqb&G)%P=|NOlvXPEcD7Sv>s~{GMf~e(Y+)2JU$)2agRjS8GU1?;0-pN=FYZSy{_r86Y~{zj z)SHgO=EY~o9u{PmXrhZEYvUMDk69f#*GJR)wM^3!lWp=*`#G*U-U*9Yp}I<3k^Z*Xr)?^#~GF4nyXFMRj&1-H8IRe46<*?BRCYdYjRH!-n; zYFO5)Y&zO4xQx5iEGys|x!z{vBXj|d*ne3(7Ao7-`%2{t;Pgx921JI33p3TNnG4LJ zXD{Bk14u0hafi)XW4RBDmmHSQO%4)F*S9$l)1wX?@D>ENf3lzY4_K^J^U-td(zMMT z#p0r<%)c??pp@%um(F;T$$b*uR^^JPgBxbTKhh%bT1)WV_C%l9D2M!5^zv)BMcQN- z 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 torch.Tensor: + B, T, C = x.shape + k = self.key(x) + q = self.query(x) + wei = q @ k.transpose(-2, -1) * k.shape[-1] ** -0.5 + wei = wei.masked_fill(self.tril[:T, :T] == 0, float('-inf')) + wei = F.softmax(wei, dim=-1) + wei = self.dropout(wei) + return wei @ self.value(x) + + +class MultiHeadAttention(nn.Module): + def __init__(self, num_heads: int, head_size: int): + super().__init__() + self.heads = nn.ModuleList([Head(head_size) for _ in range(num_heads)]) + self.proj = nn.Linear(head_size * num_heads, n_embd) + self.dropout = nn.Dropout(dropout) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + out = torch.cat([h(x) for h in self.heads], dim=-1) + return self.dropout(self.proj(out)) + + +class FeedFoward(nn.Module): + def __init__(self, n_embd: int): + super().__init__() + self.net = nn.Sequential( + nn.Linear(n_embd, 4 * n_embd), + nn.ReLU(), + nn.Linear(4 * n_embd, n_embd), + nn.Dropout(dropout), + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return self.net(x) + + +class Block(nn.Module): + def __init__(self, n_embd: int, n_head: int): + super().__init__() + head_size = n_embd // n_head + self.sa = MultiHeadAttention(n_head, head_size) + self.ffwd = FeedFoward(n_embd) + self.ln1 = nn.LayerNorm(n_embd) + self.ln2 = nn.LayerNorm(n_embd) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = x + self.sa(self.ln1(x)) + x = x + self.ffwd(self.ln2(x)) + return x + + +class GPTLanguageModel(nn.Module): + def __init__(self): + super().__init__() + self.token_embedding_table = nn.Embedding(vocab_size, n_embd) + self.position_embedding_table = nn.Embedding(block_size, n_embd) + self.blocks = nn.Sequential( + *[Block(n_embd, n_head=n_head) for _ in range(n_layer)]) + self.ln_f = nn.LayerNorm(n_embd) + self.lm_head = nn.Linear(n_embd, vocab_size) + self.apply(self._init_weights) + + def _init_weights(self, module: nn.Module) -> None: + if isinstance(module, nn.Linear): + torch.nn.init.normal_(module.weight, mean=0.0, std=0.02) + if module.bias is not None: + torch.nn.init.zeros_(module.bias) + elif isinstance(module, nn.Embedding): + torch.nn.init.normal_(module.weight, mean=0.0, std=0.02) + + def forward(self, idx: torch.Tensor, targets: Optional[torch.Tensor] = None) -> Tuple[torch.Tensor, Optional[torch.Tensor]]: + B, T = idx.shape + tok_emb = self.token_embedding_table(idx) + pos_emb = self.position_embedding_table( + torch.arange(T, device=idx.device)) + x = tok_emb + pos_emb + x = self.blocks(x) + x = self.ln_f(x) + logits = self.lm_head(x) + + if targets is None: + loss = None + else: + B, T, C = logits.shape + logits = logits.view(B * T, C) + targets = targets.view(B * T) + loss = F.cross_entropy(logits, targets) + + return logits, loss diff --git a/train_test/test.cpp b/train_test/test.cpp new file mode 100644 index 0000000..41e25e7 --- /dev/null +++ b/train_test/test.cpp @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +bool running = true; +void handle_sigint(int) +{ + std::cout << "\n\n[Stopped by user]\n"; + running = false; +} + +std::map build_vocab(const std::string &path) +{ + std::ifstream file(path); + if (!file.is_open()) + { + std::cerr << "[Error] Cannot open: " << path << "\n"; + exit(1); + } + std::string text((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + + std::set char_set(text.begin(), text.end()); + std::vector chars(char_set.begin(), char_set.end()); + std::sort(chars.begin(), chars.end()); + + std::map it; + for (int i = 0; i < (int)chars.size(); i++) + it[i] = chars[i]; + + return it; +} + +int main() +{ + signal(SIGINT, handle_sigint); + + std::string model_path = "../best_model_script.pt"; + std::string cleaned_path = "../cleaned.txt"; + + std::cout << "--- Loading Pre-trained Model ---\n"; + torch::jit::script::Module model; + try + { + model = torch::jit::load(model_path, torch::kCPU); + } + catch (const c10::Error &e) + { + std::cerr << "[Error] Could not load model: " << e.what() << "\n"; + return 1; + } + model.eval(); + + auto it = build_vocab(cleaned_path); + std::cout << "[INFO] Vocab size : " << it.size() << "\n"; + std::cout << "[INFO] Device : CPU\n"; + std::cout << "Model loaded. Generating text (Ctrl+C to stop)...\n\n"; + std::cout << std::string(50, '-') << "\n"; + + const int block_size = 128; + auto context = torch::zeros({1, 1}, torch::kLong); + + torch::NoGradGuard no_grad; + + while (running) + { + auto idx_cond = context; + if (context.size(1) > block_size) + idx_cond = context.slice(1, context.size(1) - block_size); + + std::vector inputs = {idx_cond}; + auto output = model.forward(inputs).toTuple(); + auto logits = output->elements()[0].toTensor(); + + logits = logits.select(1, logits.size(1) - 1); + auto probs = torch::softmax(logits, -1); + auto idx_next = torch::multinomial(probs, 1); + + context = torch::cat({context, idx_next}, 1); + if (context.size(1) > block_size) + context = context.slice(1, context.size(1) - block_size); + + int token = idx_next[0][0].item(); + if (it.count(token)) + std::cout << it[token] << std::flush; + else + std::cout << '?' << std::flush; + } + + return 0; +} \ No newline at end of file

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

-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