From 6e938cfe9d5c9c4f3aadf8f82bda647323b75112 Mon Sep 17 00:00:00 2001 From: Nicolas Patry Date: Wed, 12 Jul 2023 18:35:34 +0200 Subject: [PATCH 1/2] Adding cheatsheet + expand on other ML frameworks. --- README.md | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2f518fd8..2bf954ed 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,21 @@ let c = a.matmul(&b)?; ## How to use ? +Cheatsheet: + +| Creation | torch.zeros((2, 2)) | Tensor::zeros((2, 2))? | +|------------|-----------------------------------------|------------------------------------------------------------------| +| Creation | torch.Tensor([2, 2]) | Tensor::new(&[2.0f32, 2.0], &Device::Cpu)? | +| Creation | torch.Tensor([2, 2, 2, 2]).view((2, 2)) | Tensor::from_slice(&[2.0, 2.0, 2.0, 2.0], (2, 2), &Device::Cpu)? | +| Indexing | tensor[:, :4] | tensor.i((.., ..4))? | +| Operations | a.matmul(b) | a.matmul(&b)? | +| Arithmetic | a + b | &a + &b | +| Device | tensor.to(device="cuda") | tensor.to_device(&Device::Cuda(0))? | +| Dtype | tensor.to(dtype=torch.float16) | tensor.to_dtype(&DType::F16)? | +| Saving | torch.save({"A": A}, "model.bin") | tensor.save_safetensors("A", "model.safetensors")? | +| Loading | weights = torch.load("model.bin") | TODO (in the examples for now | + + Check out our [examples](./candle-examples/examples/): - [Whisper](./candle-examples/examples/whisper/) @@ -38,16 +53,33 @@ Check out our [examples](./candle-examples/examples/): ## FAQ -- Why Candle? +### Why Candle? Candle stems from the need to reduce binary size in order to *enable serverless* -possible by making the whole engine smaller than PyTorch very large library volume +possible by making the whole engine smaller than PyTorch very large library volume. +This enables creating runtimes on a cluster much faster. And simply *removing Python* from production workloads. Python can really add overhead in more complex workflows and the [GIL](https://www.backblaze.com/blog/the-python-gil-past-present-and-future/) is a notorious source of headaches. Rust is cool, and a lot of the HF ecosystem already has Rust crates [safetensors](https://github.com/huggingface/safetensors) and [tokenizers](https://github.com/huggingface/tokenizers). + +### Other ML frameworks + +- [dfdx](https://github.com/coreylowman/dfdx) is a formidable crate, with shapes being included + in types preventing a lot of headaches by getting compiler to complain about shape mismatch right off the bat + However we found that some features still require nightly and writing code can be a bit dauting for non rust experts. + + We're leveraging and contributing to other core crates for the runtime so hopefully both crates can benefit from each + other + +- [burn](https://github.com/burn-rs/burn) is a general crate that can leverage multiple backends so you can choose the best + engine for your workload + +- [tch-rs](https://github.com/LaurentMazare/tch-rs.git) Bindings to the torch library in Rust. Extremely versatile, but they + do bring in the entire torch library into the runtime. `tch-rs` was written by the same author as `candle`. + ### Missing symbols when compiling with the mkl feature. If you get some missing symbols when compiling binaries/tests using the mkl From 91817b9e5730dda40df67e50eb3313b79504201b Mon Sep 17 00:00:00 2001 From: laurent Date: Wed, 12 Jul 2023 18:43:52 +0100 Subject: [PATCH 2/2] Tweak the table formatting. --- README.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 2bf954ed..b432f4d2 100644 --- a/README.md +++ b/README.md @@ -29,17 +29,17 @@ let c = a.matmul(&b)?; Cheatsheet: -| Creation | torch.zeros((2, 2)) | Tensor::zeros((2, 2))? | -|------------|-----------------------------------------|------------------------------------------------------------------| -| Creation | torch.Tensor([2, 2]) | Tensor::new(&[2.0f32, 2.0], &Device::Cpu)? | -| Creation | torch.Tensor([2, 2, 2, 2]).view((2, 2)) | Tensor::from_slice(&[2.0, 2.0, 2.0, 2.0], (2, 2), &Device::Cpu)? | -| Indexing | tensor[:, :4] | tensor.i((.., ..4))? | -| Operations | a.matmul(b) | a.matmul(&b)? | -| Arithmetic | a + b | &a + &b | -| Device | tensor.to(device="cuda") | tensor.to_device(&Device::Cuda(0))? | -| Dtype | tensor.to(dtype=torch.float16) | tensor.to_dtype(&DType::F16)? | -| Saving | torch.save({"A": A}, "model.bin") | tensor.save_safetensors("A", "model.safetensors")? | -| Loading | weights = torch.load("model.bin") | TODO (in the examples for now | +| | Using PyTorch | Using Candle | +|------------|------------------------------------------|------------------------------------------------------------------| +| Creation | `torch.Tensor([[1, 2], [3, 4]])` | `Tensor::new(&[[1f32, 2.]], [3., 4.]], &Device::Cpu)?` | +| Indexing | `tensor[:, :4]` | `tensor.i((.., ..4))?` | +| Operations | `tensor.view((2, 2))` | `tensor.reshape((2, 2))?` | +| Operations | `a.matmul(b)` | `a.matmul(&b)?` | +| Arithmetic | `a + b` | `&a + &b` | +| Device | `tensor.to(device="cuda")` | `tensor.to_device(&Device::Cuda(0))?` | +| Dtype | `tensor.to(dtype=torch.float16)` | `tensor.to_dtype(&DType::F16)?` | +| Saving | `torch.save({"A": A}, "model.bin")` | `tensor.save_safetensors("A", "model.safetensors")?` | +| Loading | `weights = torch.load("model.bin")` | TODO (see the examples for now) | Check out our [examples](./candle-examples/examples/): @@ -78,7 +78,8 @@ Rust is cool, and a lot of the HF ecosystem already has Rust crates [safetensors engine for your workload - [tch-rs](https://github.com/LaurentMazare/tch-rs.git) Bindings to the torch library in Rust. Extremely versatile, but they - do bring in the entire torch library into the runtime. `tch-rs` was written by the same author as `candle`. + do bring in the entire torch library into the runtime. The main contributor of `tch-rs` is also involved in the development + of `candle`. ### Missing symbols when compiling with the mkl feature.