From d2e943e9c56e209c6bfc018415c307ea12de0bc6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 28 Jan 2025 10:21:33 +0000 Subject: [PATCH] Update GitHub Pages --- README.md | 1 + howtos/howto_torch2zml/index.html | 2 +- sources.tar | Bin 655360 -> 645120 bytes tutorials/getting_started/index.html | 25 +++++++++++-------------- tutorials/write_first_model/index.html | 17 +++++++---------- 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index ce4a97c..4316b7e 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,4 @@ Fri Nov 15 13:46:13 UTC 2024 Mon Dec 2 21:30:54 UTC 2024 Fri Dec 6 14:34:48 UTC 2024 Mon Dec 9 18:51:57 UTC 2024 +Tue Jan 28 10:21:33 UTC 2025 diff --git a/howtos/howto_torch2zml/index.html b/howtos/howto_torch2zml/index.html index 1a2cb06..a6f4370 100644 --- a/howtos/howto_torch2zml/index.html +++ b/howtos/howto_torch2zml/index.html @@ -284,7 +284,7 @@

Loading an individual layer

In the a var ctx = try zml.Context.init(); defer ctx.deinit(); - const platform = ctx.autoPlatform(); + const platform = ctx.autoPlatform(.{}); const mlp_weights = try zml.aio.loadModelBuffers(Mlp, mlp_shape, model_weights, allocator, platform); zml.testing.testLayer(platform, activations, "model.layers.0.mlp", mlp_shape, mlp_weights, 1e-3); diff --git a/sources.tar b/sources.tar index 4f48cf6d11e773e617580ae8775ea8f0ea958053..b54ed339c60fbd77d566edd7473c5419de0114f2 100755 GIT binary patch delta 41883 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 delta 51170 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

&X+xB!Q+JSG&ybu8{KVi{(4?R;1i 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 T-c|E;E;_#NTV4J=^>6ckWr

Getting Started with ZML

In this tutorial, we will install ZML and run a few models locally.

Prerequisites

First, let's checkout the ZML codebase. In a terminal, run:

git clone https://github.com/zml/zml.git
 cd zml/
 

We use bazel to build ZML and its dependencies. We recommend to download it through bazelisk, a version manager for bazel.

Install Bazel:

macOs:

    brew install bazelisk
-

Linux:

    curl -L -o /usr/local/bin/bazel 'https://github.com/bazelbuild/bazelisk/releases/download/v1.20.0/bazelisk-linux-amd64'
+

Linux:

    curl -L -o /usr/local/bin/bazel 'https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-linux-amd64'
     chmod +x /usr/local/bin/bazel
 

Run a pre-packaged model

ZML comes with a variety of model examples. See also our reference implementations in the examples folder.

MNIST

The classic handwritten digits recognition task. The model is tasked to recognize a handwritten digit, which has been converted to a 28x28 pixel monochrome image. Bazel will download a pre-trained model, and the test dataset. The program will load the model, compile it, and classify a randomly picked example from the test dataset.

On the command line:

cd examples
 bazel run -c opt //mnist
-

Llama

Llama is a family of "Large Language Models", trained to generate text, based on the beginning of a sentence/book/article. This "beginning" is generally referred to as the "prompt".

TinyLlama, Stories 15M

To start, you can use a small model trained specifically on children's history books. This model has been trained by Andrej Karpathy; you can read more about it on his Github.

cd examples
-bazel run -c opt //llama:TinyLlama-Stories-15M
-bazel run -c opt //llama:TinyLlama-Stories-15M -- --prompt="Once upon a time, there was a cute little dragon"
-

OpenLLama 3B

cd examples
-bazel run -c opt //llama:OpenLLaMA-3B
-bazel run -c opt //llama:OpenLLaMA-3B -- --prompt="Once upon a time,"
-

Meta Llama 3 8B

This model has restrictions, see here: it requires approval from Meta on Huggingface, which can take a few hours to get granted.

While waiting for approval, you can already generate your Huggingface access token.

Once you've been granted access, you're ready to download a gated model like Meta-Llama-3-8b!

# requires token in $HOME/.cache/huggingface/token, as created by the
+

Llama

Llama is a family of "Large Language Models", trained to generate text, based on the beginning of a sentence/book/article. This "beginning" is generally referred to as the "prompt".

Meta Llama 3.1 8B

This model has restrictions, see here. It requires approval from Meta on Huggingface, which can take a few hours to get granted.

While waiting for approval, you can already generate your Huggingface access token.

Once you've been granted access, you're ready to download a gated model like Meta-Llama-3.1-8B-Instruct!

# requires token in $HOME/.cache/huggingface/token, as created by the
 # `huggingface-cli login` command, or the `HUGGINGFACE_TOKEN` environment variable.
 cd examples
-bazel run -c opt //llama:Meta-Llama-3-8b
-bazel run -c opt //llama:Meta-Llama-3-8b -- --promt="Once upon a time,"
-

Run Tests

bazel test //zml:test
+bazel run -c opt //llama:Llama-3.1-8B-Instruct
+bazel run -c opt //llama:Llama-3.1-8B-Instruct -- --prompt="What is the capital of France?"
+

You can also try Llama-3.1-70B-Instruct if you have enough memory.

Meta Llama 3.2 1B

Like the 8B model above, this model also requires approval. See here for access requirements.

cd examples
+bazel run -c opt //llama:Llama-3.2-1B-Instruct
+bazel run -c opt //llama:Llama-3.2-1B-Instruct -- --prompt="What is the capital of France?"
+

For a larger 3.2 model, you can also try Llama-3.2-3B-Instruct.

Run Tests

bazel test //zml:test
 

Running Models on GPU / TPU

You can compile models for accelerator runtimes by appending one or more of the following arguments to the command line when compiling or running a model:

  • NVIDIA CUDA: --@zml//runtimes:cuda=true
  • AMD RoCM: --@zml//runtimes:rocm=true
  • Google TPU: --@zml//runtimes:tpu=true
  • AWS Trainium/Inferentia 2: --@zml//runtimes:neuron=true
  • AVOID CPU: --@zml//runtimes:cpu=false

The latter, avoiding compilation for CPU, cuts down compilation time.

So, to run the OpenLLama model from above on your host sporting an NVIDIA GPU, run the following:

cd examples
-bazel run -c opt //llama:OpenLLaMA-3B             \
-          --@zml//runtimes:cuda=true              \
-          -- --prompt="Once upon a time,"
+bazel run -c opt //llama:Llama-3.2-1B-Instruct            \
+          --@zml//runtimes:cuda=true                      \
+          -- --prompt="What is the capital of France?"
 

Where to go next:

In Deploying Models on a Server, we show how you can cross-compile and package for a specific architecture, then deploy and run your model. Alternatively, you can also dockerize your model.

You might also want to check out the examples, read through the documentation, start writing your first model, or read about more high-level ZML concepts.

diff --git a/tutorials/write_first_model/index.html b/tutorials/write_first_model/index.html index 6bd3eab..fe1c28e 100644 --- a/tutorials/write_first_model/index.html +++ b/tutorials/write_first_model/index.html @@ -183,7 +183,7 @@

You see, in ZML AI models are just structs with a forward function!

There are more things to observe:

  • forward functions typically take Tensors as inputs, and return Tensors.
    • more advanced use-cases are passing in / returning structs or tuples, like struct { Tensor, Tensor } as an example for a tuple of two tensors. You can see such use-cases, for example in the Llama Model
  • in the model, tensors may be optional. As is the case with bias.

Adding a main() function

ZML code is async. Hence, We need to provide an async main function. It works like this:

pub fn main() !void {
     var gpa = std.heap.GeneralPurposeAllocator(.{}){};
     defer _ = gpa.deinit();
-    try asynk.AsyncThread.main(gpa.allocator(), asyncMain, .{});
+    try asynk.AsyncThread.main(gpa.allocator(), asyncMain);
 }
 
 
@@ -205,7 +205,7 @@ 

var context = try zml.Context.init(); defer context.deinit(); - const platform = context.autoPlatform(); + const platform = context.autoPlatform(.{}); ... }
@@ -221,7 +221,7 @@

try buffers.put(arena, "bias", zml.HostBuffer.fromArray(&bias)); // the actual BufferStore -var bs: zml.aio.BufferStore = .{ +const bs: zml.aio.BufferStore = .{ .arena = arena_state, .buffers = buffers, }; @@ -234,7 +234,7 @@

// The shape of the input tensor, we have to pass in manually. var compilation = try asyncc( zml.compileModel, - .{ allocator, model_shapes, .forward, .{input_shape}, platform }, + .{ allocator, Layer.forward, model_shapes, .{input_shape}, platform }, ); // Produce a bufferized weights struct from the fake BufferStore. @@ -330,7 +330,7 @@

Running it

With everything in place now, running the pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); - try asynk.AsyncThread.main(gpa.allocator(), asyncMain, .{}); + try asynk.AsyncThread.main(gpa.allocator(), asyncMain); } pub fn asyncMain() !void { @@ -348,7 +348,7 @@

Running it

With everything in place now, running the var context = try zml.Context.init(); defer context.deinit(); - const platform = context.autoPlatform(); + const platform = context.autoPlatform(.{}); // Our weights and bias to use var weights = [3]f16{ 2.0, 2.0, 2.0 }; @@ -373,10 +373,7 @@

Running it

With everything in place now, running the // Start compiling. This uses the inferred shapes from the BufferStore. // The shape of the input tensor, we have to pass in manually. - var compilation = try asyncc( - zml.compileModel, - .{ allocator, model_shapes, .forward, .{input_shape}, platform }, - ); + var compilation = try asyncc(zml.compileModel, .{ allocator, Layer.forward, model_shapes, .{input_shape}, platform }); // Produce a bufferized weights struct from the fake BufferStore. // This is like the inferred shapes, but with actual values.