From f0cddd5d5da0c0e5c198c7e1fed5a462321be49d Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Tue, 28 Jan 2025 12:05:44 +0800 Subject: [PATCH 01/14] modern lstm --- Cargo.lock | 934 ++++++++++++++++++++++---- examples/modern-lstm/Cargo.toml | 29 + examples/modern-lstm/README.md | 22 + examples/modern-lstm/src/cli.rs | 42 ++ examples/modern-lstm/src/dataset.rs | 111 +++ examples/modern-lstm/src/inference.rs | 46 ++ examples/modern-lstm/src/lib.rs | 5 + examples/modern-lstm/src/main.rs | 170 +++++ examples/modern-lstm/src/model.rs | 336 +++++++++ examples/modern-lstm/src/training.rs | 125 ++++ 10 files changed, 1673 insertions(+), 147 deletions(-) create mode 100644 examples/modern-lstm/Cargo.toml create mode 100644 examples/modern-lstm/README.md create mode 100644 examples/modern-lstm/src/cli.rs create mode 100644 examples/modern-lstm/src/dataset.rs create mode 100644 examples/modern-lstm/src/inference.rs create mode 100644 examples/modern-lstm/src/lib.rs create mode 100644 examples/modern-lstm/src/main.rs create mode 100644 examples/modern-lstm/src/model.rs create mode 100644 examples/modern-lstm/src/training.rs diff --git a/Cargo.lock b/Cargo.lock index 5f5b948a86..c19478d646 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -402,12 +402,12 @@ name = "backend-comparison" version = "0.17.0" dependencies = [ "arboard", - "burn", - "burn-common", + "burn 0.17.0", + "burn-common 0.17.0", "chrono", "clap", "colored", - "cubecl", + "cubecl 0.5.0", "derive-new 0.7.0", "dirs", "half", @@ -425,7 +425,7 @@ dependencies = [ "strum_macros", "sysinfo 0.32.1", "tracing-subscriber", - "wgpu", + "wgpu 24.0.1", "wsl", ] @@ -615,43 +615,91 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "burn" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55af4c56b540bcf00cf1c7e13b1c60644734906495048afbd4a79aabd0a6efbe" +dependencies = [ + "burn-core 0.16.0", + "burn-train 0.16.0", +] + [[package]] name = "burn" version = "0.17.0" dependencies = [ - "burn-core", - "burn-train", + "burn-core 0.17.0", + "burn-train 0.17.0", +] + +[[package]] +name = "burn-autodiff" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa53181463ef16220438e240f10e1e8cb2fcf1824dbc33b8f259a454ff5f46f" +dependencies = [ + "burn-common 0.16.0", + "burn-tensor 0.16.0", + "derive-new 0.7.0", + "log", + "spin", ] [[package]] name = "burn-autodiff" version = "0.17.0" dependencies = [ - "burn-common", - "burn-tensor", + "burn-common 0.17.0", + "burn-tensor 0.17.0", "burn-tensor-testgen", "derive-new 0.7.0", "log", "spin", ] +[[package]] +name = "burn-candle" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b49a6da72c10ac552b3c023d74dade9714c10aac0fc5f33cfc4ca389463b99e" +dependencies = [ + "burn-tensor 0.16.0", + "candle-core", + "derive-new 0.7.0", + "half", +] + [[package]] name = "burn-candle" version = "0.17.0" dependencies = [ - "burn-autodiff", - "burn-tch", - "burn-tensor", + "burn-autodiff 0.17.0", + "burn-tch 0.17.0", + "burn-tensor 0.17.0", "candle-core", "derive-new 0.7.0", "half", ] +[[package]] +name = "burn-common" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a1471949b06002c984df9d753a084a79149841dd7935911d9e432b8478f9fd5" +dependencies = [ + "cubecl-common 0.4.0", + "getrandom", + "rayon", + "serde", + "web-time", +] + [[package]] name = "burn-common" version = "0.17.0" dependencies = [ - "cubecl-common", + "cubecl-common 0.5.0", "dashmap", "getrandom", "indicatif", @@ -662,25 +710,61 @@ dependencies = [ "web-time", ] +[[package]] +name = "burn-core" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8ebbf7d5c8bdc269260bd8e7ce08e488e6625da19b3d80ca34a729d78a77ab" +dependencies = [ + "ahash", + "bincode", + "burn-autodiff 0.16.0", + "burn-candle 0.16.0", + "burn-common 0.16.0", + "burn-cuda 0.16.0", + "burn-dataset 0.16.0", + "burn-derive 0.16.0", + "burn-hip 0.16.0", + "burn-ndarray 0.16.0", + "burn-router 0.16.0", + "burn-tch 0.16.0", + "burn-tensor 0.16.0", + "burn-wgpu 0.16.0", + "data-encoding", + "derive-new 0.7.0", + "flate2", + "half", + "hashbrown 0.15.2", + "log", + "num-traits", + "portable-atomic-util", + "rand", + "rmp-serde", + "serde", + "serde_json", + "spin", + "uuid", +] + [[package]] name = "burn-core" version = "0.17.0" dependencies = [ "ahash", "bincode", - "burn-autodiff", - "burn-candle", - "burn-common", - "burn-cuda", - "burn-dataset", - "burn-derive", - "burn-hip", - "burn-ndarray", + "burn-autodiff 0.17.0", + "burn-candle 0.17.0", + "burn-common 0.17.0", + "burn-cuda 0.17.0", + "burn-dataset 0.17.0", + "burn-derive 0.17.0", + "burn-hip 0.17.0", + "burn-ndarray 0.17.0", "burn-remote", - "burn-router", - "burn-tch", - "burn-tensor", - "burn-wgpu", + "burn-router 0.17.0", + "burn-tch 0.17.0", + "burn-tensor 0.17.0", + "burn-wgpu 0.17.0", "data-encoding", "derive-new 0.7.0", "flate2", @@ -700,26 +784,68 @@ dependencies = [ "uuid", ] +[[package]] +name = "burn-cuda" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90534d6c7f909a8cad49470921dc3eb2b118f7a3c8bde313defba3f4cae3ac3" +dependencies = [ + "burn-fusion 0.16.0", + "burn-jit 0.16.0", + "burn-tensor 0.16.0", + "bytemuck", + "cubecl 0.4.0", + "derive-new 0.7.0", + "half", + "log", +] + [[package]] name = "burn-cuda" version = "0.17.0" dependencies = [ - "burn-fusion", - "burn-jit", - "burn-tensor", + "burn-fusion 0.17.0", + "burn-jit 0.17.0", + "burn-tensor 0.17.0", "bytemuck", - "cubecl", + "cubecl 0.5.0", "derive-new 0.7.0", "half", "log", "paste", ] +[[package]] +name = "burn-dataset" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b851cb5165da57871bed2c48a29673dde0ddbd198a39b2a37411b6adf6df6ad" +dependencies = [ + "csv", + "derive-new 0.7.0", + "dirs", + "gix-tempfile", + "image", + "r2d2", + "r2d2_sqlite", + "rand", + "rmp-serde", + "rusqlite", + "sanitize-filename 0.6.0", + "serde", + "serde_json", + "serde_rusqlite", + "strum", + "strum_macros", + "tempfile", + "thiserror 2.0.11", +] + [[package]] name = "burn-dataset" version = "0.17.0" dependencies = [ - "burn-common", + "burn-common 0.17.0", "csv", "derive-new 0.7.0", "dirs", @@ -747,6 +873,18 @@ dependencies = [ "thiserror 2.0.11", ] +[[package]] +name = "burn-derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f784ffe0df57848ba232e5f40a1c1f5df3571df59bec99ba32bc7610fd9e811" +dependencies = [ + "derive-new 0.7.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "burn-derive" version = "0.17.0" @@ -757,12 +895,28 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "burn-fusion" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3753a33b8084516c0b9e3040d11ccfd3a52d88495318501138c29376a54ba81f" +dependencies = [ + "burn-common 0.16.0", + "burn-tensor 0.16.0", + "derive-new 0.7.0", + "half", + "hashbrown 0.15.2", + "log", + "serde", + "spin", +] + [[package]] name = "burn-fusion" version = "0.17.0" dependencies = [ - "burn-common", - "burn-tensor", + "burn-common 0.17.0", + "burn-tensor 0.17.0", "derive-new 0.7.0", "half", "hashbrown 0.15.2", @@ -771,15 +925,31 @@ dependencies = [ "spin", ] +[[package]] +name = "burn-hip" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd9fbfee77b3d2b67bf434b883ec6ed73f4f9bf1fd8d59f9dde217c7a4b5285d" +dependencies = [ + "burn-fusion 0.16.0", + "burn-jit 0.16.0", + "burn-tensor 0.16.0", + "bytemuck", + "cubecl 0.4.0", + "derive-new 0.7.0", + "half", + "log", +] + [[package]] name = "burn-hip" version = "0.17.0" dependencies = [ - "burn-fusion", - "burn-jit", - "burn-tensor", + "burn-fusion 0.17.0", + "burn-jit 0.17.0", + "burn-tensor 0.17.0", "bytemuck", - "cubecl", + "cubecl 0.5.0", "derive-new 0.7.0", "half", "log", @@ -790,8 +960,8 @@ dependencies = [ name = "burn-import" version = "0.17.0" dependencies = [ - "burn", - "burn-ndarray", + "burn 0.17.0", + "burn-ndarray 0.17.0", "candle-core", "derive-new 0.7.0", "half", @@ -812,18 +982,41 @@ dependencies = [ "zip 2.2.2", ] +[[package]] +name = "burn-jit" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6b06689c4e8d6cfdcaf0b0e168e58a931c3935414e48f4e3e3e85e8d7a77a0" +dependencies = [ + "burn-common 0.16.0", + "burn-fusion 0.16.0", + "burn-tensor 0.16.0", + "bytemuck", + "cubecl 0.4.0", + "derive-new 0.7.0", + "futures-lite", + "half", + "hashbrown 0.15.2", + "log", + "num-traits", + "rand", + "serde", + "spin", + "text_placeholder", +] + [[package]] name = "burn-jit" version = "0.17.0" dependencies = [ - "burn-autodiff", - "burn-common", - "burn-fusion", - "burn-ndarray", - "burn-tensor", + "burn-autodiff 0.17.0", + "burn-common 0.17.0", + "burn-fusion 0.17.0", + "burn-ndarray 0.17.0", + "burn-tensor 0.17.0", "burn-tensor-testgen", "bytemuck", - "cubecl", + "cubecl 0.5.0", "derive-new 0.7.0", "futures-lite", "half", @@ -838,15 +1031,37 @@ dependencies = [ "text_placeholder", ] +[[package]] +name = "burn-ndarray" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419fa3eda8cf9fddce0d156946b3d46642c10a41569b23e7855f775f862d310a" +dependencies = [ + "atomic_float", + "blas-src", + "burn-autodiff 0.16.0", + "burn-common 0.16.0", + "burn-tensor 0.16.0", + "derive-new 0.7.0", + "libm", + "matrixmultiply", + "ndarray 0.16.1", + "num-traits", + "openblas-src", + "portable-atomic-util", + "rand", + "spin", +] + [[package]] name = "burn-ndarray" version = "0.17.0" dependencies = [ "atomic_float", "blas-src", - "burn-autodiff", - "burn-common", - "burn-tensor", + "burn-autodiff 0.17.0", + "burn-common 0.17.0", + "burn-tensor 0.17.0", "derive-new 0.7.0", "libm", "matrixmultiply", @@ -862,8 +1077,8 @@ dependencies = [ name = "burn-no-std-tests" version = "0.17.0" dependencies = [ - "burn", - "burn-ndarray", + "burn 0.17.0", + "burn-ndarray 0.17.0", "serde", ] @@ -873,9 +1088,9 @@ version = "0.17.0" dependencies = [ "async-channel", "axum", - "burn-common", - "burn-router", - "burn-tensor", + "burn-common 0.17.0", + "burn-router 0.17.0", + "burn-tensor 0.17.0", "derive-new 0.7.0", "futures-util", "log", @@ -888,26 +1103,53 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "burn-router" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39bdb6d5c749221741a362da9b3ea3157304f831ab4b4a6902725a1efaea159" +dependencies = [ + "burn-common 0.16.0", + "burn-tensor 0.16.0", + "hashbrown 0.15.2", + "log", + "spin", +] + [[package]] name = "burn-router" version = "0.17.0" dependencies = [ - "burn-autodiff", - "burn-common", - "burn-ndarray", - "burn-tensor", - "burn-wgpu", + "burn-autodiff 0.17.0", + "burn-common 0.17.0", + "burn-ndarray 0.17.0", + "burn-tensor 0.17.0", + "burn-wgpu 0.17.0", "hashbrown 0.15.2", "log", "spin", ] +[[package]] +name = "burn-tch" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c22939f7a95b87e45ad4dadad812a96fb187dade1ceba8dc0cebc2fc451624" +dependencies = [ + "burn-tensor 0.16.0", + "half", + "libc", + "log", + "rand", + "tch", +] + [[package]] name = "burn-tch" version = "0.17.0" dependencies = [ - "burn-autodiff", - "burn-tensor", + "burn-autodiff 0.17.0", + "burn-tensor 0.17.0", "half", "libc", "log", @@ -915,16 +1157,37 @@ dependencies = [ "tch", ] +[[package]] +name = "burn-tensor" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24db20273a636d5340e5a29af142722e0a657491e6b3cfcceb1e62eb862b3b37" +dependencies = [ + "burn-common 0.16.0", + "bytemuck", + "colored", + "cubecl 0.4.0", + "derive-new 0.7.0", + "half", + "hashbrown 0.15.2", + "num-traits", + "portable-atomic-util", + "rand", + "rand_distr", + "serde", + "serde_bytes", +] + [[package]] name = "burn-tensor" version = "0.17.0" dependencies = [ "bincode", - "burn-common", + "burn-common 0.17.0", "burn-tensor-testgen", "bytemuck", "colored", - "cubecl", + "cubecl 0.5.0", "derive-new 0.7.0", "half", "hashbrown 0.15.2", @@ -944,13 +1207,35 @@ dependencies = [ "quote", ] +[[package]] +name = "burn-train" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714298cbc0c41f48d53cb1e6aeb6203b49b6110620517f69fbcc37a9b41cb6c8" +dependencies = [ + "async-channel", + "burn-core 0.16.0", + "burn-ndarray 0.16.0", + "derive-new 0.7.0", + "log", + "nvml-wrapper", + "ratatui", + "rstest", + "serde", + "sysinfo 0.32.1", + "systemstat", + "tracing-appender", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "burn-train" version = "0.17.0" dependencies = [ "async-channel", - "burn-core", - "burn-ndarray", + "burn-core 0.17.0", + "burn-ndarray 0.17.0", "derive-new 0.7.0", "log", "nvml-wrapper", @@ -964,14 +1249,26 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "burn-wgpu" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef5b6c56da563a708b2da16f0559a061e7b93f3acae63903734ee978c9b9f93" +dependencies = [ + "burn-fusion 0.16.0", + "burn-jit 0.16.0", + "burn-tensor 0.16.0", + "cubecl 0.4.0", +] + [[package]] name = "burn-wgpu" version = "0.17.0" dependencies = [ - "burn-fusion", - "burn-jit", - "burn-tensor", - "cubecl", + "burn-fusion 0.17.0", + "burn-jit 0.17.0", + "burn-tensor 0.17.0", + "cubecl 0.5.0", "half", "paste", ] @@ -1143,6 +1440,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "cfg_aliases" version = "0.2.1" @@ -1572,21 +1875,55 @@ dependencies = [ "memchr", ] +[[package]] +name = "cubecl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecf090429a4172d94c819e2977f440d7f5846c09f31d36937de309f986c878e" +dependencies = [ + "cubecl-core 0.4.0", + "cubecl-cuda 0.4.0", + "cubecl-hip 0.4.0", + "cubecl-linalg 0.4.0", + "cubecl-reduce 0.4.0", + "cubecl-runtime 0.4.0", + "cubecl-wgpu 0.4.0", + "half", +] + [[package]] name = "cubecl" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ - "cubecl-core", - "cubecl-cuda", - "cubecl-hip", - "cubecl-linalg", - "cubecl-reduce", - "cubecl-runtime", - "cubecl-wgpu", + "cubecl-core 0.5.0", + "cubecl-cuda 0.5.0", + "cubecl-hip 0.5.0", + "cubecl-linalg 0.5.0", + "cubecl-reduce 0.5.0", + "cubecl-runtime 0.5.0", + "cubecl-wgpu 0.5.0", "half", ] +[[package]] +name = "cubecl-common" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10239ee4800968f367fbc4828250d38acf5d14fa53e8d0370d5f474387591322" +dependencies = [ + "derive-new 0.6.0", + "embassy-futures", + "futures-lite", + "getrandom", + "log", + "portable-atomic", + "rand", + "serde", + "spin", + "web-time", +] + [[package]] name = "cubecl-common" version = "0.5.0" @@ -1608,6 +1945,26 @@ dependencies = [ "web-time", ] +[[package]] +name = "cubecl-core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d249976814abe45ee5d04bdfd5e2359558b409affdc03914625bea778dab5ade" +dependencies = [ + "bytemuck", + "cubecl-common 0.4.0", + "cubecl-macros 0.4.0", + "cubecl-runtime 0.4.0", + "derive-new 0.6.0", + "derive_more 1.0.0", + "half", + "log", + "num-traits", + "paste", + "serde", + "serde_json", +] + [[package]] name = "cubecl-core" version = "0.5.0" @@ -1615,10 +1972,10 @@ source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae4 dependencies = [ "bitflags 2.8.0", "bytemuck", - "cubecl-common", + "cubecl-common 0.5.0", "cubecl-ir", - "cubecl-macros", - "cubecl-runtime", + "cubecl-macros 0.5.0", + "cubecl-runtime 0.5.0", "derive-new 0.6.0", "derive_more 1.0.0", "half", @@ -1629,15 +1986,47 @@ dependencies = [ "serde_json", ] +[[package]] +name = "cubecl-cpp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8463629d0bdf4d09d47150bce35132236c1a597f65eba213b45073406048a596" +dependencies = [ + "bytemuck", + "cubecl-common 0.4.0", + "cubecl-core 0.4.0", + "cubecl-runtime 0.4.0", + "derive-new 0.6.0", + "half", + "log", +] + [[package]] name = "cubecl-cpp" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ "bytemuck", - "cubecl-common", - "cubecl-core", - "cubecl-runtime", + "cubecl-common 0.5.0", + "cubecl-core 0.5.0", + "cubecl-runtime 0.5.0", + "derive-new 0.6.0", + "half", + "log", +] + +[[package]] +name = "cubecl-cuda" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12c0b49113ba986e984538cf54c3d7390c0af934a80f083b6c99cad737d22c59" +dependencies = [ + "bytemuck", + "cubecl-common 0.4.0", + "cubecl-core 0.4.0", + "cubecl-cpp 0.4.0", + "cubecl-runtime 0.4.0", + "cudarc", "derive-new 0.6.0", "half", "log", @@ -1649,27 +2038,45 @@ version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ "bytemuck", - "cubecl-common", - "cubecl-core", - "cubecl-cpp", - "cubecl-runtime", + "cubecl-common 0.5.0", + "cubecl-core 0.5.0", + "cubecl-cpp 0.5.0", + "cubecl-runtime 0.5.0", "cudarc", "derive-new 0.6.0", "half", "log", ] +[[package]] +name = "cubecl-hip" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976e150315f9d7d6bb84c51cb13c19221ea5d185bb6d61347a3c392dd29720de" +dependencies = [ + "bytemuck", + "cubecl-common 0.4.0", + "cubecl-core 0.4.0", + "cubecl-cpp 0.4.0", + "cubecl-hip-sys", + "cubecl-runtime 0.4.0", + "derive-new 0.6.0", + "half", + "log", + "paste", +] + [[package]] name = "cubecl-hip" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ "bytemuck", - "cubecl-common", - "cubecl-core", - "cubecl-cpp", + "cubecl-common 0.5.0", + "cubecl-core 0.5.0", + "cubecl-cpp 0.5.0", "cubecl-hip-sys", - "cubecl-runtime", + "cubecl-runtime 0.5.0", "derive-new 0.6.0", "half", "log", @@ -1690,7 +2097,7 @@ name = "cubecl-ir" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ - "cubecl-common", + "cubecl-common 0.5.0", "cubecl-macros-internal", "derive_more 1.0.0", "float-ord", @@ -1700,24 +2107,53 @@ dependencies = [ "type_hash", ] +[[package]] +name = "cubecl-linalg" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "640c379e225fecb1336f963affd3b8f1ff66b9320a972dfe92d8158dca8b6382" +dependencies = [ + "bytemuck", + "cubecl-core 0.4.0", + "cubecl-runtime 0.4.0", + "half", + "serde", +] + [[package]] name = "cubecl-linalg" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ "bytemuck", - "cubecl-core", - "cubecl-runtime", + "cubecl-core 0.5.0", + "cubecl-runtime 0.5.0", "half", "serde", ] +[[package]] +name = "cubecl-macros" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05d95f3be436814f909a3ac97209159f63076d3d2b254914bc02db2ac7faefb" +dependencies = [ + "cubecl-common 0.4.0", + "darling", + "derive-new 0.6.0", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "cubecl-macros" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ - "cubecl-common", + "cubecl-common 0.5.0", "darling", "derive-new 0.6.0", "ident_case", @@ -1743,7 +2179,7 @@ name = "cubecl-opt" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ - "cubecl-common", + "cubecl-common 0.5.0", "cubecl-ir", "float-ord", "log", @@ -1754,16 +2190,49 @@ dependencies = [ "type-map", ] +[[package]] +name = "cubecl-reduce" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0912890b52cc6f9636e0070320ff93dec27af15d57453789081b9a8bdb49786d" +dependencies = [ + "cubecl-core 0.4.0", + "cubecl-runtime 0.4.0", + "num-traits", +] + [[package]] name = "cubecl-reduce" version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ - "cubecl-core", - "cubecl-runtime", + "cubecl-core 0.5.0", + "cubecl-runtime 0.5.0", "num-traits", ] +[[package]] +name = "cubecl-runtime" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e84f4ae5a096e4d0c410db01d18b673d6efcd6eea1724d1a001ab60484df87" +dependencies = [ + "async-channel", + "async-lock", + "cfg_aliases 0.2.1", + "cubecl-common 0.4.0", + "derive-new 0.6.0", + "dirs", + "hashbrown 0.14.5", + "log", + "md5", + "sanitize-filename 0.5.0", + "serde", + "serde_json", + "spin", + "wasm-bindgen-futures", +] + [[package]] name = "cubecl-runtime" version = "0.5.0" @@ -1771,8 +2240,8 @@ source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae4 dependencies = [ "async-channel", "async-lock", - "cfg_aliases", - "cubecl-common", + "cfg_aliases 0.2.1", + "cubecl-common 0.5.0", "derive-new 0.6.0", "dirs", "hashbrown 0.14.5", @@ -1792,15 +2261,35 @@ version = "0.5.0" source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" dependencies = [ "bitflags 2.8.0", - "cubecl-common", - "cubecl-core", + "cubecl-common 0.5.0", + "cubecl-core 0.5.0", "cubecl-opt", - "cubecl-runtime", + "cubecl-runtime 0.5.0", "half", "hashbrown 0.14.5", "rspirv", ] +[[package]] +name = "cubecl-wgpu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf8105d01ef4cd103d4e31bee9ae583fabc807253234923fb08218b28db7d15" +dependencies = [ + "async-channel", + "bytemuck", + "cfg-if", + "cfg_aliases 0.2.1", + "cubecl-common 0.4.0", + "cubecl-core 0.4.0", + "cubecl-runtime 0.4.0", + "derive-new 0.6.0", + "hashbrown 0.14.5", + "log", + "web-time", + "wgpu 23.0.1", +] + [[package]] name = "cubecl-wgpu" version = "0.5.0" @@ -1810,16 +2299,16 @@ dependencies = [ "async-channel", "bytemuck", "cfg-if", - "cfg_aliases", - "cubecl-common", - "cubecl-core", - "cubecl-runtime", + "cfg_aliases 0.2.1", + "cubecl-common 0.5.0", + "cubecl-core 0.5.0", + "cubecl-runtime 0.5.0", "cubecl-spirv", "derive-new 0.6.0", "hashbrown 0.14.5", "log", "web-time", - "wgpu", + "wgpu 24.0.1", ] [[package]] @@ -1836,7 +2325,7 @@ dependencies = [ name = "custom-csv-dataset" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "csv", "reqwest", "serde", @@ -1846,10 +2335,10 @@ dependencies = [ name = "custom-cubecl-kernel" version = "0.17.0" dependencies = [ - "burn", - "burn-jit", + "burn 0.17.0", + "burn-jit 0.17.0", "bytemuck", - "cubecl", + "cubecl 0.5.0", "derive-new 0.7.0", "log", "serde", @@ -1859,7 +2348,7 @@ dependencies = [ name = "custom-image-dataset" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "flate2", "tar", ] @@ -1868,7 +2357,7 @@ dependencies = [ name = "custom-renderer" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "bytemuck", "derive-new 0.7.0", "guide", @@ -1880,7 +2369,7 @@ dependencies = [ name = "custom-training-loop" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "bytemuck", "derive-new 0.7.0", "guide", @@ -1892,9 +2381,9 @@ dependencies = [ name = "custom-wgpu-kernel" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "bytemuck", - "cubecl", + "cubecl 0.5.0", "derive-new 0.7.0", "log", "serde", @@ -2858,6 +3347,18 @@ dependencies = [ "walkdir", ] +[[package]] +name = "glow" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "glow" version = "0.16.0" @@ -2934,7 +3435,7 @@ dependencies = [ name = "guide" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "log", "serde", ] @@ -3434,8 +3935,8 @@ dependencies = [ name = "image-classification-web" version = "0.17.0" dependencies = [ - "burn", - "burn-candle", + "burn 0.17.0", + "burn-candle 0.17.0", "burn-import", "console_error_panic_hook", "js-sys", @@ -3760,6 +4261,18 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "lstm" +version = "0.1.0" +dependencies = [ + "burn 0.16.0", + "clap", + "polars", + "rand", + "rand_distr", + "serde", +] + [[package]] name = "lz4" version = "1.28.1" @@ -3985,7 +4498,7 @@ dependencies = [ name = "mnist" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "log", "serde", ] @@ -3994,7 +4507,7 @@ dependencies = [ name = "mnist-inference-web" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "console_error_panic_hook", "js-sys", "serde", @@ -4006,7 +4519,7 @@ dependencies = [ name = "model" version = "0.6.0" dependencies = [ - "burn", + "burn 0.17.0", "burn-import", ] @@ -4053,6 +4566,27 @@ dependencies = [ "target-features", ] +[[package]] +name = "naga" +version = "23.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.8.0", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "rustc-hash 1.1.0", + "spirv 0.3.0+sdk-1.3.268.0", + "termcolor", + "thiserror 1.0.69", + "unicode-xid", +] + [[package]] name = "naga" version = "24.0.0" @@ -4062,7 +4596,7 @@ dependencies = [ "arrayvec", "bit-set", "bitflags 2.8.0", - "cfg_aliases", + "cfg_aliases 0.2.1", "codespan-reporting", "hexf-parse", "indexmap", @@ -4079,7 +4613,7 @@ dependencies = [ name = "named-tensor" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "serde", ] @@ -4555,7 +5089,7 @@ dependencies = [ name = "onnx-inference" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "burn-import", "serde", ] @@ -4581,9 +5115,9 @@ dependencies = [ name = "onnx-tests" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "burn-import", - "burn-ndarray", + "burn-ndarray 0.17.0", "float-cmp", "serde", ] @@ -5651,7 +6185,7 @@ dependencies = [ name = "pytorch-import" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "burn-import", "model", ] @@ -5660,10 +6194,10 @@ dependencies = [ name = "pytorch-tests" version = "0.17.0" dependencies = [ - "burn", - "burn-autodiff", + "burn 0.17.0", + "burn-autodiff 0.17.0", "burn-import", - "burn-ndarray", + "burn-ndarray 0.17.0", "float-cmp", "serde", ] @@ -5737,7 +6271,7 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ - "cfg_aliases", + "cfg_aliases 0.2.1", "libc", "once_cell", "socket2", @@ -6625,7 +7159,7 @@ dependencies = [ name = "server" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "cfg-if", ] @@ -6738,7 +7272,7 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" name = "simple-regression" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "log", "rgb", "serde", @@ -7149,7 +7683,7 @@ dependencies = [ name = "text-classification" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "derive-new 0.7.0", "serde", "tokenizers", @@ -7159,7 +7693,7 @@ dependencies = [ name = "text-generation" version = "0.17.0" dependencies = [ - "burn", + "burn 0.17.0", "derive-new 0.7.0", "log", "serde", @@ -8095,10 +8629,35 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" name = "wgan" version = "0.1.0" dependencies = [ - "burn", + "burn 0.17.0", "image", ] +[[package]] +name = "wgpu" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +dependencies = [ + "arrayvec", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "naga 23.1.0", + "parking_lot 0.12.3", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core 23.0.1", + "wgpu-hal 23.0.1", + "wgpu-types 23.0.0", +] + [[package]] name = "wgpu" version = "24.0.1" @@ -8107,11 +8666,11 @@ checksum = "47f55718f85c2fa756edffa0e7f0e0a60aba463d1362b57e23123c58f035e4b6" dependencies = [ "arrayvec", "bitflags 2.8.0", - "cfg_aliases", + "cfg_aliases 0.2.1", "document-features", "js-sys", "log", - "naga", + "naga 24.0.0", "parking_lot 0.12.3", "profiling", "raw-window-handle", @@ -8120,9 +8679,34 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", + "wgpu-core 24.0.0", + "wgpu-hal 24.0.0", + "wgpu-types 24.0.0", +] + +[[package]] +name = "wgpu-core" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.8.0", + "cfg_aliases 0.1.1", + "document-features", + "indexmap", + "log", + "naga 23.1.0", + "once_cell", + "parking_lot 0.12.3", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "wgpu-hal 23.0.1", + "wgpu-types 23.0.0", ] [[package]] @@ -8134,11 +8718,11 @@ dependencies = [ "arrayvec", "bit-vec", "bitflags 2.8.0", - "cfg_aliases", + "cfg_aliases 0.2.1", "document-features", "indexmap", "log", - "naga", + "naga 24.0.0", "once_cell", "parking_lot 0.12.3", "profiling", @@ -8146,8 +8730,53 @@ dependencies = [ "rustc-hash 1.1.0", "smallvec", "thiserror 2.0.11", - "wgpu-hal", - "wgpu-types", + "wgpu-hal 24.0.0", + "wgpu-types 24.0.0", +] + +[[package]] +name = "wgpu-hal" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.8.0", + "block", + "bytemuck", + "cfg_aliases 0.1.1", + "core-graphics-types", + "glow 0.14.2", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal 0.29.0", + "naga 23.1.0", + "ndk-sys", + "objc", + "once_cell", + "parking_lot 0.12.3", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", + "wgpu-types 23.0.0", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] @@ -8163,9 +8792,9 @@ dependencies = [ "bitflags 2.8.0", "block", "bytemuck", - "cfg_aliases", + "cfg_aliases 0.2.1", "core-graphics-types", - "glow", + "glow 0.16.0", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", @@ -8176,7 +8805,7 @@ dependencies = [ "libloading", "log", "metal 0.31.0", - "naga", + "naga 24.0.0", "ndk-sys", "objc", "once_cell", @@ -8191,11 +8820,22 @@ dependencies = [ "thiserror 2.0.11", "wasm-bindgen", "web-sys", - "wgpu-types", + "wgpu-types 24.0.0", "windows 0.58.0", "windows-core 0.58.0", ] +[[package]] +name = "wgpu-types" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +dependencies = [ + "bitflags 2.8.0", + "js-sys", + "web-sys", +] + [[package]] name = "wgpu-types" version = "24.0.0" diff --git a/examples/modern-lstm/Cargo.toml b/examples/modern-lstm/Cargo.toml new file mode 100644 index 0000000000..a37f651d09 --- /dev/null +++ b/examples/modern-lstm/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "lstm" +version = "0.1.0" +edition = "2021" + +[features] +ndarray = ["burn/ndarray"] +ndarray-blas-accelerate = ["burn/ndarray", "burn/accelerate"] +ndarray-blas-netlib = ["burn/ndarray", "burn/blas-netlib"] +ndarray-blas-openblas = ["burn/ndarray", "burn/openblas"] +tch-cpu = ["burn/tch"] +tch-gpu = ["burn/tch"] +wgpu = ["burn/wgpu"] + +[dependencies] +burn = { version="0.16.0", features=["train"] } + +# Random number generator +rand = { version="0.8.5" } +rand_distr = { version="0.4.3" } + +# Serialization +serde = { version="1.0.210", features=["std", "derive"] } + +# Organise the results in dataframe +polars = { version="0.44.1" } + +# Command line parser +clap = { version="4.5.21", features=["derive"] } \ No newline at end of file diff --git a/examples/modern-lstm/README.md b/examples/modern-lstm/README.md new file mode 100644 index 0000000000..5a41f078b1 --- /dev/null +++ b/examples/modern-lstm/README.md @@ -0,0 +1,22 @@ +# Advanced LSTM Implementation with Burn +A sophisticated implementation of Long Short-Term Memory (LSTM) networks in Burn, featuring state-of-the-art architectural enhancements and optimizations. This implementation includes bidirectional processing capabilities and advanced regularization techniques, making it suitable for both research and production environments. More details can be found at the [PyTorch implementation](https://github.com/shiv08/Advanced-LSTM-Implementation-with-PyTorch). + +`LstmNetwork` is the top-level module with bidirectional support and output projection. It can support multiple LSTM variants by setting appropriate `bidirectional` and `num_layers`: +* LSTM: `num_layers = 1` and `bidirectional = false` +* Stacked LSTM: `num_layers > 1` and `bidirectional = false` +* Birectional LSTM: `num_layers = 1` and `bidirectional = true` +* Birectional Stacked LSTM: `num_layers > 1` and `birectional = true` + +This implementation is complementary to Burn's official LSTM, users can choose either one depends on the project's specific needs. + +## Example Usage + +### Training +```sh +cargo run --release --features ndarray -- train --artifact-dir /home/wangjw/data/work/projects/lstm/output --num-epochs 30 --batch-size 32 --num-workers 2 --lr 0.001 +``` + +### Inference +```sh +cargo run --release --features ndarray -- infer --artifact-dir /home/wangjw/data/work/projects/lstm/output +``` diff --git a/examples/modern-lstm/src/cli.rs b/examples/modern-lstm/src/cli.rs new file mode 100644 index 0000000000..8d3f4a9582 --- /dev/null +++ b/examples/modern-lstm/src/cli.rs @@ -0,0 +1,42 @@ +use clap::{Parser, Subcommand}; + +/// A CLI for long short-term memory network +#[derive(Parser, Debug)] +#[command(version, author, about, long_about=None)] +pub struct Cli { + #[command(subcommand)] + pub command: Commands, +} + +#[derive(Subcommand, Debug)] +pub enum Commands { + /// Train a model + Train { + /// Path to save trained model + #[arg(long)] + artifact_dir: String, + + /// Number of epochs of training + #[arg(long, default_value="200")] + num_epochs: usize, + + /// Size of the batches + #[arg(long, default_value="64")] + batch_size: usize, + + /// Number of cpu threads to use during batch generation + #[arg(long, default_value="8")] + num_workers: usize, + + /// Learning rate + #[arg(long, default_value="0.00005")] + lr: f64, + }, + + /// Inference + Infer { + /// Path to the trained model + #[arg(long)] + artifact_dir: String, + } +} \ No newline at end of file diff --git a/examples/modern-lstm/src/dataset.rs b/examples/modern-lstm/src/dataset.rs new file mode 100644 index 0000000000..7845159b1d --- /dev/null +++ b/examples/modern-lstm/src/dataset.rs @@ -0,0 +1,111 @@ +use burn::{ + data::{ + dataloader::batcher::Batcher, + dataset::{Dataset, InMemDataset}, + }, + prelude::*, +}; +use rand::Rng; +use rand_distr::{Normal, Distribution}; +use serde::{Deserialize, Serialize}; + +// Dataset parameters +pub const NUM_SEQUENCES: usize = 1000; +pub const SEQ_LENGTH: usize = 10; +pub const NOISE_LEVEL: f32 = 0.1; +pub const RANDOM_SEED: u64 = 5; + +// Generate a sequence where each number is the sum of previous two numbers plus noise +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct SequenceDatasetItem { + pub sequence: Vec, + pub target: f32, +} + +impl SequenceDatasetItem { + pub fn new(seq_length: usize, noise_level: f32) -> Self { + // Start with two random numbers between 0 and 1 + let mut seq = vec![rand::thread_rng().gen(), rand::thread_rng().gen()]; + + // Generate sequence + for _i in 0..seq_length { + // Next number is sum of previous two plus noise + let normal = Normal::new(0.0, noise_level).unwrap(); + let next_val = seq[seq.len()-2] + seq[seq.len()-1] + normal.sample(&mut rand::thread_rng()); + seq.push(next_val); + } + + Self { + // Convert to sequence and target + sequence: seq[0..seq.len()-1].to_vec(), // All but last + target: seq[seq.len()-1], // Last value + } + } +} + +// Custom Dataset for Sequence Data +pub struct SequenceDataset { + dataset: InMemDataset, +} + +impl SequenceDataset { + pub fn new(num_sequences: usize, seq_length: usize, noise_level: f32) -> Self { + let mut items = vec![]; + for _i in 0..num_sequences { + items.push(SequenceDatasetItem::new(seq_length, noise_level)); + } + let dataset = InMemDataset::new(items); + + Self { dataset } + } +} + +impl Dataset for SequenceDataset { + fn get(&self, index: usize) -> Option { + self.dataset.get(index) + } + + fn len(&self) -> usize { + self.dataset.len() + } +} + +#[derive(Clone, Debug)] +pub struct SequenceBatcher { + device: B::Device, +} + +#[derive(Clone, Debug)] +pub struct SequenceBatch { + pub sequences: Tensor, // [batch_size, seq_length, input_size] + pub targets: Tensor, // [batch_size, 1] +} + +impl SequenceBatcher { + pub fn new(device: B::Device) -> Self { + Self { + device, + } + } +} + +impl Batcher> for SequenceBatcher { + fn batch(&self, items: Vec) -> SequenceBatch { + let mut sequences: Vec> = Vec::new(); + + for item in items.iter() { + let seq_tensor = Tensor::::from_floats(item.sequence.as_slice(), &self.device); + // Add feature dimension, the input_size is 1 implicitly. We can change the input_size here with some operations + sequences.push(seq_tensor.unsqueeze_dims(&[-1])); + } + let sequences = Tensor::stack(sequences, 0); + + let targets = items + .iter() + .map(|item| Tensor::::from_floats([item.target], &self.device)) + .collect(); + let targets = Tensor::stack(targets, 0); + + SequenceBatch { sequences, targets } + } +} \ No newline at end of file diff --git a/examples/modern-lstm/src/inference.rs b/examples/modern-lstm/src/inference.rs new file mode 100644 index 0000000000..3cd23c75a0 --- /dev/null +++ b/examples/modern-lstm/src/inference.rs @@ -0,0 +1,46 @@ +use crate::{ + dataset::{ + SequenceBatcher, + SequenceDataset, + SequenceDatasetItem, + NUM_SEQUENCES, SEQ_LENGTH, NOISE_LEVEL, + }, + training::TrainingConfig, + model::LstmNetwork, +}; +use polars::prelude::*; +use burn::{ + data::{dataset::Dataset, dataloader::batcher::Batcher}, + prelude::*, + record::{CompactRecorder, Recorder}, +}; + +pub fn infer(artifact_dir: &str, device: B::Device) { + // Loading model + let config = TrainingConfig::load(format!("{artifact_dir}/config.json")) + .expect("Config should exist for the model; run train first"); + let record = CompactRecorder::new() + .load(format!("{artifact_dir}/model").into(), &device) + .expect("Trained model should exist; run train first"); + + let model: LstmNetwork = config.model.init(&device).load_record(record); + + let dataset = SequenceDataset::new(NUM_SEQUENCES / 5, SEQ_LENGTH, NOISE_LEVEL); + let items: Vec = dataset.iter().collect(); + + let batcher = SequenceBatcher::new(device); + // Put all items in one batch + let batch = batcher.batch(items); + let predicted = model.forward(batch.sequences, None); + let targets = batch.targets; + + let predicted = predicted.squeeze::<1>(1).into_data(); + let expected = targets.squeeze::<1>(1).into_data(); + + // Display the predicted vs expected values + let results = df![ + "predicted" => &predicted.to_vec::().unwrap(), + "expected" => &expected.to_vec::().unwrap(), + ].unwrap(); + println!("{}", &results.head(Some(10))); +} \ No newline at end of file diff --git a/examples/modern-lstm/src/lib.rs b/examples/modern-lstm/src/lib.rs new file mode 100644 index 0000000000..d355a91bc2 --- /dev/null +++ b/examples/modern-lstm/src/lib.rs @@ -0,0 +1,5 @@ +pub mod dataset; +pub mod model; +pub mod training; +pub mod inference; +pub mod cli; diff --git a/examples/modern-lstm/src/main.rs b/examples/modern-lstm/src/main.rs new file mode 100644 index 0000000000..a803578c32 --- /dev/null +++ b/examples/modern-lstm/src/main.rs @@ -0,0 +1,170 @@ +#[cfg(any( + feature = "ndarray", + feature = "ndarray-blas-netlib", + feature = "ndarray-blas-openblas", + feature = "ndarray-blas-accelerate", +))] +mod ndarray { + use burn::{ + backend::{ndarray::{NdArray, NdArrayDevice}, Autodiff}, + grad_clipping::GradientClippingConfig, + optim::AdamConfig, + }; + use lstm::{ + cli::{Cli, Commands}, + inference::infer, + model::LstmNetworkConfig, + training::{TrainingConfig, train}, + }; + + pub fn run(cli: Cli) { + let device = NdArrayDevice::Cpu; + + match cli.command { + Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + let config = TrainingConfig::new( + LstmNetworkConfig::new(), + // Gradient clipping via optimizer config + AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), + num_epochs, + batch_size, + num_workers, + lr); + train::>(&artifact_dir, config, device); + }, + Commands::Infer {artifact_dir} => { + infer::(&artifact_dir, device); + }, + } + } +} + +#[cfg(feature = "tch-cpu")] +mod tch_cpu { + use burn::{ + backend::{libtorch::{LibTorch, LibTorchDevice}, Autodiff}, + grad_clipping::GradientClippingConfig, + optim::AdamConfig + }; + use lstm::{ + cli::{Cli, Commands}, + inference::infer, + model::LstmNetworkConfig, + training::{TrainingConfig, train}, + }; + + pub fn run(cli: Cli) { + let device = LibTorchDevice::Cpu; + + match cli.command { + Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + let config = TrainingConfig::new( + LstmNetworkConfig::new(), + // Gradient clipping via optimizer config + AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), + num_epochs, + batch_size, + num_workers, + lr); + train::>(&artifact_dir, config, device); + }, + Commands::Infer {artifact_dir} => { + infer::(&artifact_dir, device); + }, + } + } +} + +#[cfg(feature = "tch-gpu")] +mod tch_gpu { + use burn::{ + backend::{libtorch::{LibTorch, LibTorchDevice}, Autodiff}, + grad_clipping::GradientClippingConfig, + optim::AdamConfig + }; + use lstm::{ + cli::{Cli, Commands}, + inference::infer, + model::LstmNetworkConfig, + training::{TrainingConfig, train}, + }; + + pub fn run(cli: Cli) { + #[cfg(not(target_os = "macos"))] + let device = LibTorchDevice::Cuda(0); + #[cfg(target_os = "macos")] + let device = LibTorchDevice::Mps; + + match cli.command { + Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + let config = TrainingConfig::new( + LstmNetworkConfig::new(), + // Gradient clipping via optimizer config + AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), + num_epochs, + batch_size, + num_workers, + lr); + train::>(&artifact_dir, config, device); + }, + Commands::Infer {artifact_dir} => { + infer::(&artifact_dir, device); + }, + } + } +} + +#[cfg(feature = "wgpu")] +mod wgpu { + use burn::{ + backend::{wgpu::{Wgpu, WgpuDevice}, Autodiff}, + grad_clipping::GradientClippingConfig, + optim::AdamConfig + }; + use lstm::{ + cli::{Cli, Commands}, + inference::infer, + model::LstmNetworkConfig, + training::{TrainingConfig, train}, + }; + + pub fn run(cli: Cli) { + let device = WgpuDevice::default(); + + match cli.command { + Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + let config = TrainingConfig::new( + LstmNetworkConfig::new(), + // Gradient clipping via optimizer config + AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), + num_epochs, + batch_size, + num_workers, + lr); + train::>(&artifact_dir, config, device); + }, + Commands::Infer {artifact_dir} => { + infer::(&artifact_dir, device); + }, + } + } +} + +use clap::Parser; +use lstm::cli::Cli; +fn main() { + let cli = Cli::parse(); + #[cfg(any( + feature = "ndarray", + feature = "ndarray-blas-netlib", + feature = "ndarray-blas-openblas", + feature = "ndarray-blas-accelerate", + ))] + ndarray::run(cli); + #[cfg(feature = "tch-cpu")] + tch_cpu::run(cli); + #[cfg(feature = "tch-gpu")] + tch_gpu::run(cli); + #[cfg(feature = "wgpu")] + wgpu::run(cli); +} diff --git a/examples/modern-lstm/src/model.rs b/examples/modern-lstm/src/model.rs new file mode 100644 index 0000000000..f580554b18 --- /dev/null +++ b/examples/modern-lstm/src/model.rs @@ -0,0 +1,336 @@ +use burn::{ + nn::{LayerNorm, LayerNormConfig, Dropout, DropoutConfig, Initializer, Linear, LinearConfig, LstmState, Sigmoid, Tanh}, + prelude::*, +}; + +// LSTM Cell implementation with layer normalization. +// +// Mathematical formulation of LSTM: +// f_t = σ(W_f · [h_{t-1}, x_t] + b_f) # Forget gate +// i_t = σ(W_i · [h_{t-1}, x_t] + b_i] # Input gate +// g_t = tanh(W_g · [h_{t-1}, x_t] + b_g] # Candidate cell state +// o_t = σ(W_o · [h_{t-1}, x_t] + b_o) # Output gate +// +// c_t = f_t ⊙ c_{t-1} + i_t ⊙ g_t # New cell state +// h_t = o_t ⊙ tanh(c_t) # New hidden state +// +// where: +// - σ is the sigmoid function +// - ⊙ is the element-wise multiplication +// - [h_{t-1}, x_t] represents concatenation + +#[derive(Module, Debug)] +pub struct LstmCell { + pub hidden_size: usize, + // Combined weight matrices for efficiency + // weight_ih layer uses combined weights for [i_t, f_t, g_t, o_t] for input x_t + // weight_hh layer uses combined weights for [i_t, f_t, g_t, o_t] for hidden state h_{t-1} + pub weight_ih: Linear, + pub weight_hh: Linear, + // Layer Normalization for better training stability. Don't use BatchNorm because the input distribution is always changing for LSTM. + pub norm_x: LayerNorm, // Normalize gate pre-activations + pub norm_h: LayerNorm, // Normalize hidden state + pub norm_c: LayerNorm, // Normalize cell state + pub dropout: Dropout, +} + +// Configuration to create a Lstm module using the init function. +#[derive(Config, Debug)] +pub struct LstmCellConfig { + // The size of the input features + pub input_size: usize, + // The size of the hidden state + pub hidden_size: usize, + // The number of hidden layers + pub dropout: f64, +} + +impl LstmCellConfig { + // Initialize parameters using best practices: + // 1. Orthogonal initialization for better gradient flow (here we use Xavier because of the lack of Orthogonal in burn) + // 2. Initialize forget gate bias to 1.0 to prevent forgetting at start of training + pub fn init(&self, device: &B::Device) -> LstmCell { + let initializer = Initializer::XavierNormal{gain:1.0}; + let init_bias = Tensor::::ones([self.hidden_size], &device); + + let mut weight_ih = LinearConfig::new(self.input_size, 4 * self.hidden_size) + .with_initializer(initializer.clone()) + .init(device); + // Set forget gate bias to 1.0 (helps with learning long sequences) + let bias = weight_ih.bias.clone().unwrap().val().slice_assign([self.hidden_size..2*self.hidden_size], init_bias.clone()); + weight_ih.bias = weight_ih.bias.map(|p| p.map(|_t| bias)); + + let mut weight_hh = LinearConfig::new(self.hidden_size, 4 * self.hidden_size) + .with_initializer(initializer) + .init(device); + let bias = weight_hh.bias.clone().unwrap().val().slice_assign([self.hidden_size..2*self.hidden_size], init_bias); + weight_hh.bias = weight_hh.bias.map(|p| p.map(|_t| bias)); + + LstmCell { + hidden_size: self.hidden_size, + weight_ih, + weight_hh, + norm_x: LayerNormConfig::new(4 * self.hidden_size).init(device), + norm_h: LayerNormConfig::new(self.hidden_size).init(device), + norm_c: LayerNormConfig::new(self.hidden_size).init(device), + dropout: DropoutConfig::new(self.dropout).init(), + } + } +} + +impl LstmCell { + // Forward pass of LSTM cell. + // Args: + // x: Input tensor of shape (batch_size, input_size) + // state: Tuple of (h_{t-1}, c_{t-1}) each of shape (batch_size, hidden_size) + // Returns: + // Tuple of (h_t, c_t) representing new hidden and cell states + pub fn forward( + &self, + x: Tensor, + state: LstmState, + ) -> LstmState { + let (h_prev, c_prev) = (state.hidden, state.cell); + + // Combined matrix multiplication for all gates + // Shape: (batch_size, 4 * hidden_size) + let gates_x = self.weight_ih.forward(x); // Transform input + let gates_h = self.weight_hh.forward(h_prev); // Transform previous hidden state + + // Apply layer normalization + let gates_x = self.norm_x.forward(gates_x); + // Combined gate pre-activations + let gates = gates_x + gates_h; + + // Split into individual gates + // Each gate shape: (batch_size, hidden_size) + let gates = gates.chunk(4, 1); + let i_gate = gates[0].clone(); + let f_gate = gates[1].clone(); + let g_gate = gates[2].clone(); + let o_gate = gates[3].clone(); + + // Apply gate non-linearities + let i_t = Sigmoid::new().forward(i_gate); + let f_t = Sigmoid::new().forward(f_gate); + let g_t = Tanh::new().forward(g_gate); + let o_t = Sigmoid::new().forward(o_gate); + + // Update cell state: c_t = f_t ⊙ c_{t-1} + i_t ⊙ g_t + let c_t = f_t * c_prev + i_t * g_t; + let c_t = self.norm_c.forward(c_t); + + // Update cell state: h_t = o_t ⊙ tanh(c_t) + let h_t = o_t * Tanh::new().forward(c_t.clone()); + let h_t = self.norm_h.forward(h_t); + + let h_t = self.dropout.forward(h_t); + + LstmState::new(h_t, c_t) + } + + // Initialize cell state and hidden state if provided or with zeros + pub fn init_state( + &self, + batch_size: usize, + device: &B::Device, + ) -> LstmState { + let cell = Tensor::zeros([batch_size, self.hidden_size], device); + let hidden = Tensor::zeros([batch_size, self.hidden_size], device); + + LstmState::new(cell, hidden) + } +} + +// Stacked LSTM implementation supporting multiple layers +// Each layer processes the output of the previous layer +#[derive(Module, Debug)] +pub struct StackedLstm { + pub layers: Vec>, +} + +#[derive(Config, Debug)] +pub struct StackedLstmConfig { + pub input_size: usize, + pub hidden_size: usize, + pub num_layers: usize, + pub dropout: f64, +} + +impl StackedLstmConfig { + pub fn init(&self, device: &B::Device) -> StackedLstm { + let mut layers: Vec> = vec![]; + // Create list of LSTM cells, one for each layer + for i in 0..self.num_layers { + if i == 0 { + if i < self.num_layers - 1 { + layers.push(LstmCellConfig::new(self.input_size, self.hidden_size, self.dropout).init(device)); + } else { // No dropout on last layer + layers.push(LstmCellConfig::new(self.input_size, self.hidden_size, 0.0).init(device)); + } + } else { + if i < self.num_layers -1 { + layers.push(LstmCellConfig::new(self.hidden_size, self.hidden_size, self.dropout).init(device)); + } else { // No dropout on last layer + layers.push(LstmCellConfig::new(self.hidden_size, self.hidden_size, 0.0).init(device)); + } + } + } + StackedLstm { layers } + } +} + +impl StackedLstm { + // Process input sequence through stacked LSTM layers. + // + // Args: + // x: Input tensor of shape (batch_size, seq_length, input_size) + // states: Optional initial states for each layer + // + // Returns: + // Tuple of (output, states) where output has shape (batch_size, seq_length, hidden_size) + // and states is a vector of length num_layers, both cell and hidden state in each element have shape (batch_size, hidden_size) + pub fn forward( + &self, + x: Tensor, + states: Option>>, + ) -> (Tensor::, Vec>) { + let [batch_size, seq_length, _] = x.dims(); + let device = x.device(); + + let mut states = match states { + None => { + let mut temp: Vec> = vec![]; + for layer in self.layers.iter() { + temp.push(layer.init_state(batch_size, &device)); + } + temp + }, + _ => states.unwrap(), + }; + + let mut layer_outputs = vec![]; + for t in 0..seq_length { + let mut input_t = x.clone().slice([None, Some((t as i64, t as i64 + 1)), None]).squeeze::<2>(1); + for (i, lstm_cell) in self.layers.iter().enumerate() { + let mut state: LstmState = LstmState::new(states[i].cell.clone(), states[i].hidden.clone()); + state = lstm_cell.forward(input_t, state); + input_t = state.hidden.clone(); + states[i] = state; + } + layer_outputs.push(input_t); + } + + // Stack output along sequence dimension + let output = Tensor::stack(layer_outputs, 1); + + (output, states) + } +} + +// Complete LSTM network with bidirectional support. +// +// In bidirectional mode: +// - Forward LSTM processes sequence from left to right +// - Backward LSTM processes sequence from right to left +// - Outputs are concatenated for final prediction +#[derive(Module, Debug)] +pub struct LstmNetwork { + // Forward direction LSTM + pub stacked_lstm: StackedLstm, + // Optional backward direction LSTM for bidirectional processing + pub reverse_lstm: Option>, + pub dropout: Dropout, + pub fc: Linear, +} + +#[derive(Config, Debug)] +pub struct LstmNetworkConfig { + #[config(default = 1)] + pub input_size: usize, // Single feature (number sequence) + #[config(default = 32)] + pub hidden_size: usize, // Size of LSTM hidden state + #[config(default = 2)] + pub num_layers: usize, // Number of LSTM layers + #[config(default = 1)] + pub output_size: usize, // Predict one number + #[config(default = 0.1)] + pub dropout: f64, + #[config(default = true)] + pub bidirectional: bool, // Use bidirectional LSTM +} + +impl LstmNetworkConfig { + pub fn init(&self, device: &B::Device) -> LstmNetwork { + // Forward direction LSTM + let stacked_lstm = StackedLstmConfig::new(self.input_size, self.hidden_size, self.num_layers, self.dropout) + .init(device); + + // Optional backward direction LSTM for bidirectional processing + let (reverse_lstm, hidden_size) = if self.bidirectional { + let lstm = StackedLstmConfig::new(self.input_size, self.hidden_size, self.num_layers, self.dropout) + .init(device); + (Some(lstm), 2*self.hidden_size) + } else { + (None, self.hidden_size) + }; + + let fc = LinearConfig::new(hidden_size, self.output_size).init(device); + let dropout = DropoutConfig::new(self.dropout).init(); + + LstmNetwork { + stacked_lstm, + reverse_lstm, + dropout, + fc, + } + } +} + +impl LstmNetwork { + // Forward pass of the network. + // + // For bidirectional processing: + // 1. Process sequence normally with forward LSTM + // 2. Process reversed sequence with backward LSTM + // 3. Concatenate both outputs + // 4. Apply final linear transformation + // + // Args: + // x: Input tensor of shape (batch_size, seq_length, input_size) + // states: Optional initial states + // + // Returns: + // Output tensor of shape (batch_size, output_size) + pub fn forward( + &self, + x: Tensor, + states: Option>>, + ) -> Tensor { + let seq_length = x.dims()[1] as i64; + // Forward direction + let (mut output, _states) = self.stacked_lstm.forward(x.clone(), states); + + output = match &self.reverse_lstm { + Some(reverse_lstm) => { + //Process sequence in reverse direction + let (mut reverse_output, _states) = reverse_lstm.forward(x.flip([1]), None); + // Flip back to align with forward sequence + reverse_output = reverse_output.flip([1]); + // Concatenate forward and backward outputs along the feature dimension + output = Tensor::cat(vec![output, reverse_output], 2); + output + }, + None => output + }; + + // Apply dropout before final layer + output = self.dropout.forward(output); + // Use final timestep output for prediction + let final_output = self.fc.forward( + output.slice([None, Some((seq_length-1, seq_length)), None]).squeeze::<2>(1) + ); + + final_output + } +} \ No newline at end of file diff --git a/examples/modern-lstm/src/training.rs b/examples/modern-lstm/src/training.rs new file mode 100644 index 0000000000..5da43e4355 --- /dev/null +++ b/examples/modern-lstm/src/training.rs @@ -0,0 +1,125 @@ +use burn::{ + data::dataloader::DataLoaderBuilder, + module::AutodiffModule, + nn::loss::{MseLoss, Reduction::Mean}, + optim::{AdamConfig, GradientsParams, Optimizer}, + prelude::*, + record::CompactRecorder, + tensor::backend::AutodiffBackend, +}; + +use crate::dataset::{ + SequenceBatcher, + SequenceDataset, + NUM_SEQUENCES, SEQ_LENGTH, NOISE_LEVEL, RANDOM_SEED, +}; +use crate::model::{LstmNetwork, LstmNetworkConfig}; + +#[derive(Config)] +pub struct TrainingConfig { + pub model: LstmNetworkConfig, + pub optimizer: AdamConfig, + pub num_epochs: usize, + pub batch_size: usize, + pub num_workers: usize, + pub lr: f64, +} + +// Create the directory to save the model and model config +fn create_artifact_dir(artifact_dir: &str) { + // Remove existing artifacts + std::fs::remove_dir_all(artifact_dir).ok(); + std::fs::create_dir_all(artifact_dir).ok(); +} + +pub fn train(artifact_dir: &str, config: TrainingConfig, device: B::Device) { + create_artifact_dir(artifact_dir); + + // Save training config + config + .save(format!("{artifact_dir}/config.json")) + .expect("Config should be saved successfully"); + B::seed(RANDOM_SEED); + + // Create the model and optimizer + let mut model = config.model.init::(&device); + let mut optim = config.optimizer.init::>(); + + // Create the batcher + let batcher_train = SequenceBatcher::::new(device.clone()); + let batcher_valid = SequenceBatcher::::new(device.clone()); + + // Create the dataloaders + let dataloader_train = DataLoaderBuilder::new(batcher_train) + .batch_size(config.batch_size) + .shuffle(RANDOM_SEED) + .num_workers(config.num_workers) + .build(SequenceDataset::new(NUM_SEQUENCES, SEQ_LENGTH, NOISE_LEVEL)); + + let dataloader_valid = DataLoaderBuilder::new(batcher_valid) + .batch_size(config.batch_size) + .shuffle(RANDOM_SEED) + .num_workers(config.num_workers) + // 20% size of training + .build(SequenceDataset::new(NUM_SEQUENCES / 5, SEQ_LENGTH, NOISE_LEVEL)); + + let train_num_items = dataloader_train.num_items(); + let valid_num_items = dataloader_valid.num_items(); + + println!("Starting training..."); + // Iterate over our training for X epochs + for epoch in 1..config.num_epochs + 1 { + // Initialize the training and validation metrics at the start of each epoch + let mut train_losses = vec![]; + let mut train_loss = 0.0; + let mut valid_losses = vec![]; + let mut valid_loss = 0.0; + + // Implement our training loop + for (_iteration, batch) in dataloader_train.iter().enumerate() { + let output = model.forward(batch.sequences, None); + let loss = MseLoss::new().forward(output, batch.targets.clone(), Mean); + train_loss += loss.clone().into_scalar().elem::() * batch.targets.dims()[0] as f32; + + // Gradients for the current backward pass + let grads = loss.backward(); + // Gradients linked to each parameter of the model + let grads = GradientsParams::from_grads(grads, &model); + // Update the model using the optimizer + model = optim.step(config.lr, model, grads); + } + + // The averaged train loss per epoch + let avg_train_loss = train_loss / train_num_items as f32; + train_losses.push(avg_train_loss); + + // Get the model without autodiff + let valid_model = model.valid(); + + // Implement our validation loop + for (_iteration, batch) in dataloader_valid.iter().enumerate() { + let output = valid_model.forward(batch.sequences, None); + let loss = MseLoss::new().forward(output, batch.targets.clone(), Mean); + valid_loss += loss.clone().into_scalar().elem::() * batch.targets.dims()[0] as f32; + } + // The averaged train loss per epoch + let avg_valid_loss = valid_loss / valid_num_items as f32; + valid_losses.push(avg_valid_loss); + + // Display the averaged training and validataion metrics every 10 epochs + if (epoch + 1) % 5 == 0 { + println!( + "Epoch {}/{}, Avg Loss {:.4}, Avg Val Loss: {:.4}", + epoch + 1, + config.num_epochs, + avg_train_loss, + avg_valid_loss, + ); + } + } + + // Save the trained model + model + .save_file(format!("{artifact_dir}/model"), &CompactRecorder::new()) + .expect("Trained model should be saved successfully"); +} From 31477f2c5245e5f19c4b633f92560c4a24287c5a Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Tue, 28 Jan 2025 12:45:23 +0800 Subject: [PATCH 02/14] format --- examples/modern-lstm/src/cli.rs | 10 +-- examples/modern-lstm/src/dataset.rs | 17 +++-- examples/modern-lstm/src/inference.rs | 15 ++-- examples/modern-lstm/src/lib.rs | 4 +- examples/modern-lstm/src/main.rs | 100 ++++++++++++++++++-------- examples/modern-lstm/src/model.rs | 99 +++++++++++++++---------- examples/modern-lstm/src/training.rs | 10 +-- 7 files changed, 161 insertions(+), 94 deletions(-) diff --git a/examples/modern-lstm/src/cli.rs b/examples/modern-lstm/src/cli.rs index 8d3f4a9582..0f008e14a2 100644 --- a/examples/modern-lstm/src/cli.rs +++ b/examples/modern-lstm/src/cli.rs @@ -17,19 +17,19 @@ pub enum Commands { artifact_dir: String, /// Number of epochs of training - #[arg(long, default_value="200")] + #[arg(long, default_value = "200")] num_epochs: usize, /// Size of the batches - #[arg(long, default_value="64")] + #[arg(long, default_value = "64")] batch_size: usize, /// Number of cpu threads to use during batch generation - #[arg(long, default_value="8")] + #[arg(long, default_value = "8")] num_workers: usize, /// Learning rate - #[arg(long, default_value="0.00005")] + #[arg(long, default_value = "0.00005")] lr: f64, }, @@ -38,5 +38,5 @@ pub enum Commands { /// Path to the trained model #[arg(long)] artifact_dir: String, - } + }, } \ No newline at end of file diff --git a/examples/modern-lstm/src/dataset.rs b/examples/modern-lstm/src/dataset.rs index 7845159b1d..d9c61b7e5d 100644 --- a/examples/modern-lstm/src/dataset.rs +++ b/examples/modern-lstm/src/dataset.rs @@ -6,7 +6,7 @@ use burn::{ prelude::*, }; use rand::Rng; -use rand_distr::{Normal, Distribution}; +use rand_distr::{Distribution, Normal}; use serde::{Deserialize, Serialize}; // Dataset parameters @@ -31,14 +31,15 @@ impl SequenceDatasetItem { for _i in 0..seq_length { // Next number is sum of previous two plus noise let normal = Normal::new(0.0, noise_level).unwrap(); - let next_val = seq[seq.len()-2] + seq[seq.len()-1] + normal.sample(&mut rand::thread_rng()); + let next_val = + seq[seq.len()-2] + seq[seq.len()-1] + normal.sample(&mut rand::thread_rng()); seq.push(next_val); } Self { // Convert to sequence and target - sequence: seq[0..seq.len()-1].to_vec(), // All but last - target: seq[seq.len()-1], // Last value + sequence: seq[0..seq.len() - 1].to_vec(), // All but last + target: seq[seq.len() - 1], // Last value } } } @@ -78,14 +79,12 @@ pub struct SequenceBatcher { #[derive(Clone, Debug)] pub struct SequenceBatch { pub sequences: Tensor, // [batch_size, seq_length, input_size] - pub targets: Tensor, // [batch_size, 1] + pub targets: Tensor, // [batch_size, 1] } impl SequenceBatcher { pub fn new(device: B::Device) -> Self { - Self { - device, - } + Self { device } } } @@ -108,4 +107,4 @@ impl Batcher> for SequenceBatc SequenceBatch { sequences, targets } } -} \ No newline at end of file +} diff --git a/examples/modern-lstm/src/inference.rs b/examples/modern-lstm/src/inference.rs index 3cd23c75a0..cec68f2bd3 100644 --- a/examples/modern-lstm/src/inference.rs +++ b/examples/modern-lstm/src/inference.rs @@ -1,19 +1,17 @@ use crate::{ dataset::{ - SequenceBatcher, - SequenceDataset, - SequenceDatasetItem, - NUM_SEQUENCES, SEQ_LENGTH, NOISE_LEVEL, + SequenceBatcher, SequenceDataset, SequenceDatasetItem, NOISE_LEVEL, NUM_SEQUENCES, + SEQ_LENGTH, }, - training::TrainingConfig, model::LstmNetwork, + training::TrainingConfig, }; -use polars::prelude::*; use burn::{ - data::{dataset::Dataset, dataloader::batcher::Batcher}, + data::{dataloader::batcher::Batcher, dataset::Dataset}, prelude::*, record::{CompactRecorder, Recorder}, }; +use polars::prelude::*; pub fn infer(artifact_dir: &str, device: B::Device) { // Loading model @@ -41,6 +39,7 @@ pub fn infer(artifact_dir: &str, device: B::Device) { let results = df![ "predicted" => &predicted.to_vec::().unwrap(), "expected" => &expected.to_vec::().unwrap(), - ].unwrap(); + ] + .unwrap(); println!("{}", &results.head(Some(10))); } \ No newline at end of file diff --git a/examples/modern-lstm/src/lib.rs b/examples/modern-lstm/src/lib.rs index d355a91bc2..cf2fcd7afa 100644 --- a/examples/modern-lstm/src/lib.rs +++ b/examples/modern-lstm/src/lib.rs @@ -1,5 +1,5 @@ +pub mod cli; pub mod dataset; +pub mod inference; pub mod model; pub mod training; -pub mod inference; -pub mod cli; diff --git a/examples/modern-lstm/src/main.rs b/examples/modern-lstm/src/main.rs index a803578c32..9f8e9c048c 100644 --- a/examples/modern-lstm/src/main.rs +++ b/examples/modern-lstm/src/main.rs @@ -6,7 +6,10 @@ ))] mod ndarray { use burn::{ - backend::{ndarray::{NdArray, NdArrayDevice}, Autodiff}, + backend::{ + ndarray::{NdArray, NdArrayDevice}, + Autodiff, + }, grad_clipping::GradientClippingConfig, optim::AdamConfig, }; @@ -14,14 +17,20 @@ mod ndarray { cli::{Cli, Commands}, inference::infer, model::LstmNetworkConfig, - training::{TrainingConfig, train}, + training::{train, TrainingConfig}, }; pub fn run(cli: Cli) { let device = NdArrayDevice::Cpu; match cli.command { - Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + Commands::Train { + artifact_dir, + num_epochs, + batch_size, + num_workers, + lr, + } => { let config = TrainingConfig::new( LstmNetworkConfig::new(), // Gradient clipping via optimizer config @@ -29,12 +38,13 @@ mod ndarray { num_epochs, batch_size, num_workers, - lr); + lr, + ); train::>(&artifact_dir, config, device); - }, - Commands::Infer {artifact_dir} => { + } + Commands::Infer { artifact_dir } => { infer::(&artifact_dir, device); - }, + } } } } @@ -42,22 +52,31 @@ mod ndarray { #[cfg(feature = "tch-cpu")] mod tch_cpu { use burn::{ - backend::{libtorch::{LibTorch, LibTorchDevice}, Autodiff}, + backend::{ + libtorch::{LibTorch, LibTorchDevice}, + Autodiff, + }, grad_clipping::GradientClippingConfig, - optim::AdamConfig + optim::AdamConfig, }; use lstm::{ cli::{Cli, Commands}, inference::infer, model::LstmNetworkConfig, - training::{TrainingConfig, train}, + training::{train, TrainingConfig}, }; pub fn run(cli: Cli) { let device = LibTorchDevice::Cpu; match cli.command { - Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + Commands::Train { + artifact_dir, + num_epochs, + batch_size, + num_workers, + lr, + } => { let config = TrainingConfig::new( LstmNetworkConfig::new(), // Gradient clipping via optimizer config @@ -65,12 +84,13 @@ mod tch_cpu { num_epochs, batch_size, num_workers, - lr); + lr, + ); train::>(&artifact_dir, config, device); - }, - Commands::Infer {artifact_dir} => { + } + Commands::Infer { artifact_dir } => { infer::(&artifact_dir, device); - }, + } } } } @@ -78,15 +98,18 @@ mod tch_cpu { #[cfg(feature = "tch-gpu")] mod tch_gpu { use burn::{ - backend::{libtorch::{LibTorch, LibTorchDevice}, Autodiff}, + backend::{ + libtorch::{LibTorch, LibTorchDevice}, + Autodiff, + }, grad_clipping::GradientClippingConfig, - optim::AdamConfig + optim::AdamConfig, }; use lstm::{ cli::{Cli, Commands}, inference::infer, model::LstmNetworkConfig, - training::{TrainingConfig, train}, + training::{train, TrainingConfig}, }; pub fn run(cli: Cli) { @@ -96,7 +119,13 @@ mod tch_gpu { let device = LibTorchDevice::Mps; match cli.command { - Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + Commands::Train { + artifact_dir, + num_epochs, + batch_size, + num_workers, + lr, + } => { let config = TrainingConfig::new( LstmNetworkConfig::new(), // Gradient clipping via optimizer config @@ -104,12 +133,13 @@ mod tch_gpu { num_epochs, batch_size, num_workers, - lr); + lr, + ); train::>(&artifact_dir, config, device); }, - Commands::Infer {artifact_dir} => { + Commands::Infer { artifact_dir } => { infer::(&artifact_dir, device); - }, + } } } } @@ -117,22 +147,31 @@ mod tch_gpu { #[cfg(feature = "wgpu")] mod wgpu { use burn::{ - backend::{wgpu::{Wgpu, WgpuDevice}, Autodiff}, + backend::{ + wgpu::{Wgpu, WgpuDevice}, + Autodiff, + }, grad_clipping::GradientClippingConfig, - optim::AdamConfig + optim::AdamConfig, }; use lstm::{ cli::{Cli, Commands}, inference::infer, model::LstmNetworkConfig, - training::{TrainingConfig, train}, + training::{train, TrainingConfig}, }; pub fn run(cli: Cli) { let device = WgpuDevice::default(); match cli.command { - Commands::Train {artifact_dir, num_epochs, batch_size, num_workers, lr} => { + Commands::Train { + artifact_dir, + num_epochs, + batch_size, + num_workers, + lr, + } => { let config = TrainingConfig::new( LstmNetworkConfig::new(), // Gradient clipping via optimizer config @@ -140,12 +179,13 @@ mod wgpu { num_epochs, batch_size, num_workers, - lr); + lr, + ); train::>(&artifact_dir, config, device); - }, - Commands::Infer {artifact_dir} => { + } + Commands::Infer { artifact_dir } => { infer::(&artifact_dir, device); - }, + } } } } diff --git a/examples/modern-lstm/src/model.rs b/examples/modern-lstm/src/model.rs index f580554b18..7617c01a12 100644 --- a/examples/modern-lstm/src/model.rs +++ b/examples/modern-lstm/src/model.rs @@ -1,5 +1,8 @@ use burn::{ - nn::{LayerNorm, LayerNormConfig, Dropout, DropoutConfig, Initializer, Linear, LinearConfig, LstmState, Sigmoid, Tanh}, + nn::{ + Dropout, DropoutConfig, Initializer, LayerNorm, LayerNormConfig, Linear, LinearConfig, + LstmState, Sigmoid, Tanh, + }, prelude::*, }; @@ -50,20 +53,30 @@ impl LstmCellConfig { // 1. Orthogonal initialization for better gradient flow (here we use Xavier because of the lack of Orthogonal in burn) // 2. Initialize forget gate bias to 1.0 to prevent forgetting at start of training pub fn init(&self, device: &B::Device) -> LstmCell { - let initializer = Initializer::XavierNormal{gain:1.0}; + let initializer = Initializer::XavierNormal { gain: 1.0 }; let init_bias = Tensor::::ones([self.hidden_size], &device); let mut weight_ih = LinearConfig::new(self.input_size, 4 * self.hidden_size) .with_initializer(initializer.clone()) .init(device); // Set forget gate bias to 1.0 (helps with learning long sequences) - let bias = weight_ih.bias.clone().unwrap().val().slice_assign([self.hidden_size..2*self.hidden_size], init_bias.clone()); + let bias = weight_ih + .bias + .clone() + .unwrap() + .val() + .slice_assign([self.hidden_size..2*self.hidden_size], init_bias.clone()); weight_ih.bias = weight_ih.bias.map(|p| p.map(|_t| bias)); let mut weight_hh = LinearConfig::new(self.hidden_size, 4 * self.hidden_size) .with_initializer(initializer) .init(device); - let bias = weight_hh.bias.clone().unwrap().val().slice_assign([self.hidden_size..2*self.hidden_size], init_bias); + let bias = weight_hh + .bias + .clone() + .unwrap() + .val() + .slice_assign([self.hidden_size..2*self.hidden_size], init_bias); weight_hh.bias = weight_hh.bias.map(|p| p.map(|_t| bias)); LstmCell { @@ -85,17 +98,13 @@ impl LstmCell { // state: Tuple of (h_{t-1}, c_{t-1}) each of shape (batch_size, hidden_size) // Returns: // Tuple of (h_t, c_t) representing new hidden and cell states - pub fn forward( - &self, - x: Tensor, - state: LstmState, - ) -> LstmState { + pub fn forward(&self, x: Tensor, state: LstmState) -> LstmState { let (h_prev, c_prev) = (state.hidden, state.cell); // Combined matrix multiplication for all gates // Shape: (batch_size, 4 * hidden_size) - let gates_x = self.weight_ih.forward(x); // Transform input - let gates_h = self.weight_hh.forward(h_prev); // Transform previous hidden state + let gates_x = self.weight_ih.forward(x); // Transform input + let gates_h = self.weight_hh.forward(h_prev); // Transform previous hidden state // Apply layer normalization let gates_x = self.norm_x.forward(gates_x); @@ -130,11 +139,7 @@ impl LstmCell { } // Initialize cell state and hidden state if provided or with zeros - pub fn init_state( - &self, - batch_size: usize, - device: &B::Device, - ) -> LstmState { + pub fn init_state(&self, batch_size: usize, device: &B::Device) -> LstmState { let cell = Tensor::zeros([batch_size, self.hidden_size], device); let hidden = Tensor::zeros([batch_size, self.hidden_size], device); @@ -164,15 +169,25 @@ impl StackedLstmConfig { for i in 0..self.num_layers { if i == 0 { if i < self.num_layers - 1 { - layers.push(LstmCellConfig::new(self.input_size, self.hidden_size, self.dropout).init(device)); + layers.push( + LstmCellConfig::new(self.input_size, self.hidden_size, self.dropout) + .init(device), + ); } else { // No dropout on last layer - layers.push(LstmCellConfig::new(self.input_size, self.hidden_size, 0.0).init(device)); + layers.push( + LstmCellConfig::new(self.input_size, self.hidden_size, 0.0).init(device), + ); } } else { if i < self.num_layers -1 { - layers.push(LstmCellConfig::new(self.hidden_size, self.hidden_size, self.dropout).init(device)); + layers.push( + LstmCellConfig::new(self.hidden_size, self.hidden_size, self.dropout) + .init(device), + ); } else { // No dropout on last layer - layers.push(LstmCellConfig::new(self.hidden_size, self.hidden_size, 0.0).init(device)); + layers.push( + LstmCellConfig::new(self.hidden_size, self.hidden_size, 0.0).init(device), + ); } } } @@ -194,7 +209,7 @@ impl StackedLstm { &self, x: Tensor, states: Option>>, - ) -> (Tensor::, Vec>) { + ) -> (Tensor, Vec>) { let [batch_size, seq_length, _] = x.dims(); let device = x.device(); @@ -205,15 +220,19 @@ impl StackedLstm { temp.push(layer.init_state(batch_size, &device)); } temp - }, + } _ => states.unwrap(), }; let mut layer_outputs = vec![]; for t in 0..seq_length { - let mut input_t = x.clone().slice([None, Some((t as i64, t as i64 + 1)), None]).squeeze::<2>(1); + let mut input_t = x + .clone() + .slice([None, Some((t as i64, t as i64 + 1)), None]) + .squeeze::<2>(1); for (i, lstm_cell) in self.layers.iter().enumerate() { - let mut state: LstmState = LstmState::new(states[i].cell.clone(), states[i].hidden.clone()); + let mut state: LstmState = + LstmState::new(states[i].cell.clone(), states[i].hidden.clone()); state = lstm_cell.forward(input_t, state); input_t = state.hidden.clone(); states[i] = state; @@ -263,13 +282,23 @@ pub struct LstmNetworkConfig { impl LstmNetworkConfig { pub fn init(&self, device: &B::Device) -> LstmNetwork { // Forward direction LSTM - let stacked_lstm = StackedLstmConfig::new(self.input_size, self.hidden_size, self.num_layers, self.dropout) - .init(device); + let stacked_lstm = StackedLstmConfig::new( + self.input_size, + self.hidden_size, + self.num_layers, + self.dropout, + ) + .init(device); // Optional backward direction LSTM for bidirectional processing let (reverse_lstm, hidden_size) = if self.bidirectional { - let lstm = StackedLstmConfig::new(self.input_size, self.hidden_size, self.num_layers, self.dropout) - .init(device); + let lstm = StackedLstmConfig::new( + self.input_size, + self.hidden_size, + self.num_layers, + self.dropout, + ) + .init(device); (Some(lstm), 2*self.hidden_size) } else { (None, self.hidden_size) @@ -302,11 +331,7 @@ impl LstmNetwork { // // Returns: // Output tensor of shape (batch_size, output_size) - pub fn forward( - &self, - x: Tensor, - states: Option>>, - ) -> Tensor { + pub fn forward(&self, x: Tensor, states: Option>>) -> Tensor { let seq_length = x.dims()[1] as i64; // Forward direction let (mut output, _states) = self.stacked_lstm.forward(x.clone(), states); @@ -320,15 +345,17 @@ impl LstmNetwork { // Concatenate forward and backward outputs along the feature dimension output = Tensor::cat(vec![output, reverse_output], 2); output - }, - None => output + } + None => output, }; // Apply dropout before final layer output = self.dropout.forward(output); // Use final timestep output for prediction let final_output = self.fc.forward( - output.slice([None, Some((seq_length-1, seq_length)), None]).squeeze::<2>(1) + output + .slice([None, Some((seq_length-1, seq_length)), None]) + .squeeze::<2>(1), ); final_output diff --git a/examples/modern-lstm/src/training.rs b/examples/modern-lstm/src/training.rs index 5da43e4355..199b48d1a6 100644 --- a/examples/modern-lstm/src/training.rs +++ b/examples/modern-lstm/src/training.rs @@ -9,9 +9,7 @@ use burn::{ }; use crate::dataset::{ - SequenceBatcher, - SequenceDataset, - NUM_SEQUENCES, SEQ_LENGTH, NOISE_LEVEL, RANDOM_SEED, + SequenceBatcher, SequenceDataset, NOISE_LEVEL, NUM_SEQUENCES, RANDOM_SEED, SEQ_LENGTH, }; use crate::model::{LstmNetwork, LstmNetworkConfig}; @@ -61,7 +59,11 @@ pub fn train(artifact_dir: &str, config: TrainingConfig, dev .shuffle(RANDOM_SEED) .num_workers(config.num_workers) // 20% size of training - .build(SequenceDataset::new(NUM_SEQUENCES / 5, SEQ_LENGTH, NOISE_LEVEL)); + .build(SequenceDataset::new( + NUM_SEQUENCES / 5, + SEQ_LENGTH, + NOISE_LEVEL, + )); let train_num_items = dataloader_train.num_items(); let valid_num_items = dataloader_valid.num_items(); From 28721693630eea194b2db9712de1f113090df3de Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Tue, 28 Jan 2025 15:22:19 +0800 Subject: [PATCH 03/14] formatting --- examples/modern-lstm/src/dataset.rs | 2 +- examples/modern-lstm/src/main.rs | 2 +- examples/modern-lstm/src/model.rs | 28 +++++++++++++++------------- examples/modern-lstm/src/training.rs | 4 ++-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/examples/modern-lstm/src/dataset.rs b/examples/modern-lstm/src/dataset.rs index d9c61b7e5d..5820e3a73b 100644 --- a/examples/modern-lstm/src/dataset.rs +++ b/examples/modern-lstm/src/dataset.rs @@ -32,7 +32,7 @@ impl SequenceDatasetItem { // Next number is sum of previous two plus noise let normal = Normal::new(0.0, noise_level).unwrap(); let next_val = - seq[seq.len()-2] + seq[seq.len()-1] + normal.sample(&mut rand::thread_rng()); + seq[seq.len() - 2] + seq[seq.len() - 1] + normal.sample(&mut rand::thread_rng()); seq.push(next_val); } diff --git a/examples/modern-lstm/src/main.rs b/examples/modern-lstm/src/main.rs index 9f8e9c048c..f37afbb321 100644 --- a/examples/modern-lstm/src/main.rs +++ b/examples/modern-lstm/src/main.rs @@ -136,7 +136,7 @@ mod tch_gpu { lr, ); train::>(&artifact_dir, config, device); - }, + } Commands::Infer { artifact_dir } => { infer::(&artifact_dir, device); } diff --git a/examples/modern-lstm/src/model.rs b/examples/modern-lstm/src/model.rs index 7617c01a12..3afbf797da 100644 --- a/examples/modern-lstm/src/model.rs +++ b/examples/modern-lstm/src/model.rs @@ -30,7 +30,7 @@ pub struct LstmCell { // weight_hh layer uses combined weights for [i_t, f_t, g_t, o_t] for hidden state h_{t-1} pub weight_ih: Linear, pub weight_hh: Linear, - // Layer Normalization for better training stability. Don't use BatchNorm because the input distribution is always changing for LSTM. + // Layer Normalization for better training stability. Don't use BatchNorm because the input distribution is always changing for LSTM. pub norm_x: LayerNorm, // Normalize gate pre-activations pub norm_h: LayerNorm, // Normalize hidden state pub norm_c: LayerNorm, // Normalize cell state @@ -55,7 +55,7 @@ impl LstmCellConfig { pub fn init(&self, device: &B::Device) -> LstmCell { let initializer = Initializer::XavierNormal { gain: 1.0 }; let init_bias = Tensor::::ones([self.hidden_size], &device); - + let mut weight_ih = LinearConfig::new(self.input_size, 4 * self.hidden_size) .with_initializer(initializer.clone()) .init(device); @@ -65,7 +65,7 @@ impl LstmCellConfig { .clone() .unwrap() .val() - .slice_assign([self.hidden_size..2*self.hidden_size], init_bias.clone()); + .slice_assign([self.hidden_size..2 * self.hidden_size], init_bias.clone()); weight_ih.bias = weight_ih.bias.map(|p| p.map(|_t| bias)); let mut weight_hh = LinearConfig::new(self.hidden_size, 4 * self.hidden_size) @@ -76,7 +76,7 @@ impl LstmCellConfig { .clone() .unwrap() .val() - .slice_assign([self.hidden_size..2*self.hidden_size], init_bias); + .slice_assign([self.hidden_size..2 * self.hidden_size], init_bias); weight_hh.bias = weight_hh.bias.map(|p| p.map(|_t| bias)); LstmCell { @@ -173,18 +173,20 @@ impl StackedLstmConfig { LstmCellConfig::new(self.input_size, self.hidden_size, self.dropout) .init(device), ); - } else { // No dropout on last layer + } else { + // No dropout on last layer layers.push( LstmCellConfig::new(self.input_size, self.hidden_size, 0.0).init(device), ); } } else { - if i < self.num_layers -1 { + if i < self.num_layers - 1 { layers.push( LstmCellConfig::new(self.hidden_size, self.hidden_size, self.dropout) .init(device), ); - } else { // No dropout on last layer + } else { + // No dropout on last layer layers.push( LstmCellConfig::new(self.hidden_size, self.hidden_size, 0.0).init(device), ); @@ -239,7 +241,7 @@ impl StackedLstm { } layer_outputs.push(input_t); } - + // Stack output along sequence dimension let output = Tensor::stack(layer_outputs, 1); @@ -299,11 +301,11 @@ impl LstmNetworkConfig { self.dropout, ) .init(device); - (Some(lstm), 2*self.hidden_size) + (Some(lstm), 2 * self.hidden_size) } else { (None, self.hidden_size) }; - + let fc = LinearConfig::new(hidden_size, self.output_size).init(device); let dropout = DropoutConfig::new(self.dropout).init(); @@ -335,7 +337,7 @@ impl LstmNetwork { let seq_length = x.dims()[1] as i64; // Forward direction let (mut output, _states) = self.stacked_lstm.forward(x.clone(), states); - + output = match &self.reverse_lstm { Some(reverse_lstm) => { //Process sequence in reverse direction @@ -354,10 +356,10 @@ impl LstmNetwork { // Use final timestep output for prediction let final_output = self.fc.forward( output - .slice([None, Some((seq_length-1, seq_length)), None]) + .slice([None, Some((seq_length - 1, seq_length)), None]) .squeeze::<2>(1), ); final_output } -} \ No newline at end of file +} diff --git a/examples/modern-lstm/src/training.rs b/examples/modern-lstm/src/training.rs index 199b48d1a6..beb2e875b6 100644 --- a/examples/modern-lstm/src/training.rs +++ b/examples/modern-lstm/src/training.rs @@ -53,7 +53,7 @@ pub fn train(artifact_dir: &str, config: TrainingConfig, dev .shuffle(RANDOM_SEED) .num_workers(config.num_workers) .build(SequenceDataset::new(NUM_SEQUENCES, SEQ_LENGTH, NOISE_LEVEL)); - + let dataloader_valid = DataLoaderBuilder::new(batcher_valid) .batch_size(config.batch_size) .shuffle(RANDOM_SEED) @@ -82,7 +82,7 @@ pub fn train(artifact_dir: &str, config: TrainingConfig, dev let output = model.forward(batch.sequences, None); let loss = MseLoss::new().forward(output, batch.targets.clone(), Mean); train_loss += loss.clone().into_scalar().elem::() * batch.targets.dims()[0] as f32; - + // Gradients for the current backward pass let grads = loss.backward(); // Gradients linked to each parameter of the model From a32e01f89006d8485fbbd3380258141f85aea47b Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Tue, 28 Jan 2025 15:28:28 +0800 Subject: [PATCH 04/14] formatting --- examples/modern-lstm/src/cli.rs | 2 +- examples/modern-lstm/src/dataset.rs | 4 ++-- examples/modern-lstm/src/inference.rs | 2 +- examples/modern-lstm/src/model.rs | 2 +- examples/modern-lstm/src/training.rs | 3 +-- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/modern-lstm/src/cli.rs b/examples/modern-lstm/src/cli.rs index 0f008e14a2..4e815ee7c0 100644 --- a/examples/modern-lstm/src/cli.rs +++ b/examples/modern-lstm/src/cli.rs @@ -39,4 +39,4 @@ pub enum Commands { #[arg(long)] artifact_dir: String, }, -} \ No newline at end of file +} diff --git a/examples/modern-lstm/src/dataset.rs b/examples/modern-lstm/src/dataset.rs index 5820e3a73b..b2d04d525f 100644 --- a/examples/modern-lstm/src/dataset.rs +++ b/examples/modern-lstm/src/dataset.rs @@ -8,7 +8,7 @@ use burn::{ use rand::Rng; use rand_distr::{Distribution, Normal}; use serde::{Deserialize, Serialize}; - + // Dataset parameters pub const NUM_SEQUENCES: usize = 1000; pub const SEQ_LENGTH: usize = 10; @@ -26,7 +26,7 @@ impl SequenceDatasetItem { pub fn new(seq_length: usize, noise_level: f32) -> Self { // Start with two random numbers between 0 and 1 let mut seq = vec![rand::thread_rng().gen(), rand::thread_rng().gen()]; - + // Generate sequence for _i in 0..seq_length { // Next number is sum of previous two plus noise diff --git a/examples/modern-lstm/src/inference.rs b/examples/modern-lstm/src/inference.rs index cec68f2bd3..bad0af2996 100644 --- a/examples/modern-lstm/src/inference.rs +++ b/examples/modern-lstm/src/inference.rs @@ -42,4 +42,4 @@ pub fn infer(artifact_dir: &str, device: B::Device) { ] .unwrap(); println!("{}", &results.head(Some(10))); -} \ No newline at end of file +} diff --git a/examples/modern-lstm/src/model.rs b/examples/modern-lstm/src/model.rs index 3afbf797da..9a659e7693 100644 --- a/examples/modern-lstm/src/model.rs +++ b/examples/modern-lstm/src/model.rs @@ -142,7 +142,7 @@ impl LstmCell { pub fn init_state(&self, batch_size: usize, device: &B::Device) -> LstmState { let cell = Tensor::zeros([batch_size, self.hidden_size], device); let hidden = Tensor::zeros([batch_size, self.hidden_size], device); - + LstmState::new(cell, hidden) } } diff --git a/examples/modern-lstm/src/training.rs b/examples/modern-lstm/src/training.rs index beb2e875b6..583c05ab0d 100644 --- a/examples/modern-lstm/src/training.rs +++ b/examples/modern-lstm/src/training.rs @@ -7,9 +7,8 @@ use burn::{ record::CompactRecorder, tensor::backend::AutodiffBackend, }; - use crate::dataset::{ - SequenceBatcher, SequenceDataset, NOISE_LEVEL, NUM_SEQUENCES, RANDOM_SEED, SEQ_LENGTH, + SequenceBatcher, SequenceDataset, NOISE_LEVEL, NUM_SEQUENCES, RANDOM_SEED, SEQ_LENGTH, }; use crate::model::{LstmNetwork, LstmNetworkConfig}; From 1cf29c190cada9896604c9340abacc32577ebdbe Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Tue, 28 Jan 2025 15:44:12 +0800 Subject: [PATCH 05/14] formatting --- examples/modern-lstm/src/training.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/modern-lstm/src/training.rs b/examples/modern-lstm/src/training.rs index 583c05ab0d..2da5f4c205 100644 --- a/examples/modern-lstm/src/training.rs +++ b/examples/modern-lstm/src/training.rs @@ -1,3 +1,7 @@ +use crate::dataset::{ + SequenceBatcher, SequenceDataset, NOISE_LEVEL, NUM_SEQUENCES, RANDOM_SEED, SEQ_LENGTH, +}; +use crate::model::{LstmNetwork, LstmNetworkConfig}; use burn::{ data::dataloader::DataLoaderBuilder, module::AutodiffModule, @@ -7,10 +11,6 @@ use burn::{ record::CompactRecorder, tensor::backend::AutodiffBackend, }; -use crate::dataset::{ - SequenceBatcher, SequenceDataset, NOISE_LEVEL, NUM_SEQUENCES, RANDOM_SEED, SEQ_LENGTH, -}; -use crate::model::{LstmNetwork, LstmNetworkConfig}; #[derive(Config)] pub struct TrainingConfig { From 1717f71d885b5719fb451754a892105f5f7aaf19 Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Tue, 28 Jan 2025 15:55:56 +0800 Subject: [PATCH 06/14] formatting --- examples/modern-lstm/src/model.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/examples/modern-lstm/src/model.rs b/examples/modern-lstm/src/model.rs index 9a659e7693..fc06b341b1 100644 --- a/examples/modern-lstm/src/model.rs +++ b/examples/modern-lstm/src/model.rs @@ -54,7 +54,7 @@ impl LstmCellConfig { // 2. Initialize forget gate bias to 1.0 to prevent forgetting at start of training pub fn init(&self, device: &B::Device) -> LstmCell { let initializer = Initializer::XavierNormal { gain: 1.0 }; - let init_bias = Tensor::::ones([self.hidden_size], &device); + let init_bias = Tensor::::ones([self.hidden_size], device); let mut weight_ih = LinearConfig::new(self.input_size, 4 * self.hidden_size) .with_initializer(initializer.clone()) @@ -179,18 +179,16 @@ impl StackedLstmConfig { LstmCellConfig::new(self.input_size, self.hidden_size, 0.0).init(device), ); } + } else if i < self.num_layers - 1 { + layers.push( + LstmCellConfig::new(self.hidden_size, self.hidden_size, self.dropout) + .init(device), + ); } else { - if i < self.num_layers - 1 { - layers.push( - LstmCellConfig::new(self.hidden_size, self.hidden_size, self.dropout) - .init(device), - ); - } else { - // No dropout on last layer - layers.push( - LstmCellConfig::new(self.hidden_size, self.hidden_size, 0.0).init(device), - ); - } + // No dropout on last layer + layers.push( + LstmCellConfig::new(self.hidden_size, self.hidden_size, 0.0).init(device), + ); } } StackedLstm { layers } From dbf7639595dc48a8e5da9d2b59a8329a7a868ab0 Mon Sep 17 00:00:00 2001 From: jiawen wang Date: Tue, 28 Jan 2025 16:31:04 +0800 Subject: [PATCH 07/14] fix a typo --- examples/modern-lstm/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/modern-lstm/README.md b/examples/modern-lstm/README.md index 5a41f078b1..b71a14a491 100644 --- a/examples/modern-lstm/README.md +++ b/examples/modern-lstm/README.md @@ -4,8 +4,8 @@ A sophisticated implementation of Long Short-Term Memory (LSTM) networks in Burn `LstmNetwork` is the top-level module with bidirectional support and output projection. It can support multiple LSTM variants by setting appropriate `bidirectional` and `num_layers`: * LSTM: `num_layers = 1` and `bidirectional = false` * Stacked LSTM: `num_layers > 1` and `bidirectional = false` -* Birectional LSTM: `num_layers = 1` and `bidirectional = true` -* Birectional Stacked LSTM: `num_layers > 1` and `birectional = true` +* Bidirectional LSTM: `num_layers = 1` and `bidirectional = true` +* Bidirectional Stacked LSTM: `num_layers > 1` and `bidirectional = true` This implementation is complementary to Burn's official LSTM, users can choose either one depends on the project's specific needs. From 64f10aba9e357b72bf950ba194d2e4e1bae31759 Mon Sep 17 00:00:00 2001 From: jiawen wang Date: Thu, 30 Jan 2025 10:13:00 +0800 Subject: [PATCH 08/14] Update examples/modern-lstm/Cargo.toml Co-authored-by: Guillaume Lagrange --- examples/modern-lstm/Cargo.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/modern-lstm/Cargo.toml b/examples/modern-lstm/Cargo.toml index a37f651d09..4c7ecf2e89 100644 --- a/examples/modern-lstm/Cargo.toml +++ b/examples/modern-lstm/Cargo.toml @@ -13,17 +13,17 @@ tch-gpu = ["burn/tch"] wgpu = ["burn/wgpu"] [dependencies] -burn = { version="0.16.0", features=["train"] } +burn = { path = "../../crates/burn", features=["train"] } # Random number generator -rand = { version="0.8.5" } -rand_distr = { version="0.4.3" } +rand = { workspace = true } +rand_distr = { workspace = true } # Serialization -serde = { version="1.0.210", features=["std", "derive"] } +serde = {workspace = true, features = ["std", "derive"]} # Organise the results in dataframe -polars = { version="0.44.1" } +polars = { workspace = true } # Command line parser -clap = { version="4.5.21", features=["derive"] } \ No newline at end of file +clap = { workspace = true } \ No newline at end of file From 2690895bdb44252b34573871198615ff5ff4eeea Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Fri, 31 Jan 2025 00:22:31 +0800 Subject: [PATCH 09/14] use generic backend --- examples/modern-lstm/Cargo.toml | 6 +- examples/modern-lstm/README.md | 28 +++- examples/modern-lstm/examples/infer.rs | 95 +++++++++++ examples/modern-lstm/examples/train.rs | 106 ++++++++++++ examples/modern-lstm/output/config.json | 23 +++ examples/modern-lstm/output/model.mpk | Bin 0 -> 58001 bytes examples/modern-lstm/src/cli.rs | 42 ----- examples/modern-lstm/src/lib.rs | 1 - examples/modern-lstm/src/main.rs | 210 ------------------------ examples/modern-lstm/src/model.rs | 106 ++++++------ examples/modern-lstm/src/training.rs | 5 + 11 files changed, 308 insertions(+), 314 deletions(-) create mode 100644 examples/modern-lstm/examples/infer.rs create mode 100644 examples/modern-lstm/examples/train.rs create mode 100644 examples/modern-lstm/output/config.json create mode 100644 examples/modern-lstm/output/model.mpk delete mode 100644 examples/modern-lstm/src/cli.rs delete mode 100644 examples/modern-lstm/src/main.rs diff --git a/examples/modern-lstm/Cargo.toml b/examples/modern-lstm/Cargo.toml index 4c7ecf2e89..74f0e62015 100644 --- a/examples/modern-lstm/Cargo.toml +++ b/examples/modern-lstm/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "lstm" +name = "modern-lstm" version = "0.1.0" edition = "2021" @@ -11,6 +11,7 @@ ndarray-blas-openblas = ["burn/ndarray", "burn/openblas"] tch-cpu = ["burn/tch"] tch-gpu = ["burn/tch"] wgpu = ["burn/wgpu"] +cuda-jit = ["burn/cuda-jit"] [dependencies] burn = { path = "../../crates/burn", features=["train"] } @@ -24,6 +25,3 @@ serde = {workspace = true, features = ["std", "derive"]} # Organise the results in dataframe polars = { workspace = true } - -# Command line parser -clap = { workspace = true } \ No newline at end of file diff --git a/examples/modern-lstm/README.md b/examples/modern-lstm/README.md index b71a14a491..8a5f75ba95 100644 --- a/examples/modern-lstm/README.md +++ b/examples/modern-lstm/README.md @@ -9,14 +9,34 @@ A sophisticated implementation of Long Short-Term Memory (LSTM) networks in Burn This implementation is complementary to Burn's official LSTM, users can choose either one depends on the project's specific needs. -## Example Usage +## Usage + + +## Training -### Training ```sh -cargo run --release --features ndarray -- train --artifact-dir /home/wangjw/data/work/projects/lstm/output --num-epochs 30 --batch-size 32 --num-workers 2 --lr 0.001 +# Cuda backend +cargo run --example train --release --features cuda-jit + +# Wgpu backend +cargo run --example train --release --features wgpu + +# Tch GPU backend +export TORCH_CUDA_VERSION=cu121 # Set the cuda version +cargo run --example train --release --features tch-gpu + +# Tch CPU backend +cargo run --example train --release --features tch-cpu + +# NdArray backend (CPU) +cargo run --example train --release --features ndarray # f32 - single thread +cargo run --example train --release --features ndarray-blas-openblas # f32 - blas with openblas +cargo run --example train --release --features ndarray-blas-netlib # f32 - blas with netlib ``` + ### Inference + ```sh -cargo run --release --features ndarray -- infer --artifact-dir /home/wangjw/data/work/projects/lstm/output +cargo run --example infer --release --features cuda-jit ``` diff --git a/examples/modern-lstm/examples/infer.rs b/examples/modern-lstm/examples/infer.rs new file mode 100644 index 0000000000..50cd80b541 --- /dev/null +++ b/examples/modern-lstm/examples/infer.rs @@ -0,0 +1,95 @@ +use burn::tensor::backend::Backend; + +pub fn launch(device: B::Device) { + modern_lstm::inference::infer::("/tmp/modern-lstm", device); +} + +#[cfg(any( + feature = "ndarray", + feature = "ndarray-blas-netlib", + feature = "ndarray-blas-openblas", + feature = "ndarray-blas-accelerate", +))] +mod ndarray { + use burn::backend::{ + ndarray::{NdArray, NdArrayDevice}, + Autodiff, + }; + + use crate::launch; + + pub fn run() { + launch::>(NdArrayDevice::Cpu); + } +} + +#[cfg(feature = "tch-gpu")] +mod tch_gpu { + use burn::backend::{ + libtorch::{LibTorch, LibTorchDevice}, + Autodiff, + }; + + use crate::launch; + + pub fn run() { + #[cfg(not(target_os = "macos"))] + let device = LibTorchDevice::Cuda(0); + #[cfg(target_os = "macos")] + let device = LibTorchDevice::Mps; + + launch::>(device); + } +} + +#[cfg(feature = "tch-cpu")] +mod tch_cpu { + use burn::backend::{ + libtorch::{LibTorch, LibTorchDevice}, + Autodiff, + }; + + use crate::launch; + + pub fn run() { + launch::>(LibTorchDevice::Cpu); + } +} + +#[cfg(feature = "wgpu")] +mod wgpu { + use crate::launch; + use burn::backend::{wgpu::Wgpu, Autodiff}; + + pub fn run() { + launch::>(Default::default()); + } +} + +#[cfg(feature = "cuda-jit")] +mod cuda_jit { + use crate::launch; + use burn::backend::{Autodiff, CudaJit}; + + pub fn run() { + launch::>(Default::default()); + } +} + +fn main() { + #[cfg(any( + feature = "ndarray", + feature = "ndarray-blas-netlib", + feature = "ndarray-blas-openblas", + feature = "ndarray-blas-accelerate", + ))] + ndarray::run(); + #[cfg(feature = "tch-gpu")] + tch_gpu::run(); + #[cfg(feature = "tch-cpu")] + tch_cpu::run(); + #[cfg(feature = "wgpu")] + wgpu::run(); + #[cfg(feature = "cuda-jit")] + cuda_jit::run(); +} diff --git a/examples/modern-lstm/examples/train.rs b/examples/modern-lstm/examples/train.rs new file mode 100644 index 0000000000..a4288564b5 --- /dev/null +++ b/examples/modern-lstm/examples/train.rs @@ -0,0 +1,106 @@ +use burn::{ + grad_clipping::GradientClippingConfig, + optim::AdamConfig, + tensor::backend::AutodiffBackend +}; +use modern_lstm::{model::LstmNetworkConfig, training::TrainingConfig}; + +pub fn launch(device: B::Device) { + let config = TrainingConfig::new( + LstmNetworkConfig::new(), + // Gradient clipping via optimizer config + AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))) + ); + + modern_lstm::training::train::("/tmp/modern-lstm", config, device); +} + +#[cfg(any( + feature = "ndarray", + feature = "ndarray-blas-netlib", + feature = "ndarray-blas-openblas", + feature = "ndarray-blas-accelerate", +))] +mod ndarray { + use burn::backend::{ + ndarray::{NdArray, NdArrayDevice}, + Autodiff, + }; + + use crate::launch; + + pub fn run() { + launch::>(NdArrayDevice::Cpu); + } +} + +#[cfg(feature = "tch-gpu")] +mod tch_gpu { + use burn::backend::{ + libtorch::{LibTorch, LibTorchDevice}, + Autodiff, + }; + + use crate::launch; + + pub fn run() { + #[cfg(not(target_os = "macos"))] + let device = LibTorchDevice::Cuda(0); + #[cfg(target_os = "macos")] + let device = LibTorchDevice::Mps; + + launch::>(device); + } +} + +#[cfg(feature = "tch-cpu")] +mod tch_cpu { + use burn::backend::{ + libtorch::{LibTorch, LibTorchDevice}, + Autodiff, + }; + + use crate::launch; + + pub fn run() { + launch::>(LibTorchDevice::Cpu); + } +} + +#[cfg(feature = "wgpu")] +mod wgpu { + use crate::launch; + use burn::backend::{wgpu::Wgpu, Autodiff}; + + pub fn run() { + launch::>(Default::default()); + } +} + +#[cfg(feature = "cuda-jit")] +mod cuda_jit { + use crate::launch; + use burn::backend::{cuda_jit::CudaDevice, Autodiff, CudaJit}; + + pub fn run() { + launch::>(CudaDevice::default()); + } +} + +fn main() { + #[cfg(any( + feature = "ndarray", + feature = "ndarray-blas-netlib", + feature = "ndarray-blas-openblas", + feature = "ndarray-blas-accelerate", + ))] + ndarray::run(); + #[cfg(feature = "tch-gpu")] + tch_gpu::run(); + #[cfg(feature = "tch-cpu")] + tch_cpu::run(); + #[cfg(feature = "wgpu")] + wgpu::run(); + #[cfg(feature = "cuda-jit")] + cuda_jit::run(); +} diff --git a/examples/modern-lstm/output/config.json b/examples/modern-lstm/output/config.json new file mode 100644 index 0000000000..cebd85f7ce --- /dev/null +++ b/examples/modern-lstm/output/config.json @@ -0,0 +1,23 @@ +{ + "model": { + "input_size": 1, + "hidden_size": 32, + "num_layers": 2, + "output_size": 1, + "dropout": 0.1, + "bidirectional": true + }, + "optimizer": { + "weight_decay": null, + "grad_clipping": { + "Norm": 1.0 + }, + "beta_1": 0.9, + "beta_2": 0.999, + "epsilon": 0.00001 + }, + "num_epochs": 30, + "batch_size": 32, + "num_workers": 2, + "lr": 0.001 +} \ No newline at end of file diff --git a/examples/modern-lstm/output/model.mpk b/examples/modern-lstm/output/model.mpk new file mode 100644 index 0000000000000000000000000000000000000000..7d6a853be5909bc1e2f34d3f19f4269cb8475d73 GIT binary patch literal 58001 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 z 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 Chd=@V literal 0 HcmV?d00001 diff --git a/examples/modern-lstm/src/cli.rs b/examples/modern-lstm/src/cli.rs deleted file mode 100644 index 4e815ee7c0..0000000000 --- a/examples/modern-lstm/src/cli.rs +++ /dev/null @@ -1,42 +0,0 @@ -use clap::{Parser, Subcommand}; - -/// A CLI for long short-term memory network -#[derive(Parser, Debug)] -#[command(version, author, about, long_about=None)] -pub struct Cli { - #[command(subcommand)] - pub command: Commands, -} - -#[derive(Subcommand, Debug)] -pub enum Commands { - /// Train a model - Train { - /// Path to save trained model - #[arg(long)] - artifact_dir: String, - - /// Number of epochs of training - #[arg(long, default_value = "200")] - num_epochs: usize, - - /// Size of the batches - #[arg(long, default_value = "64")] - batch_size: usize, - - /// Number of cpu threads to use during batch generation - #[arg(long, default_value = "8")] - num_workers: usize, - - /// Learning rate - #[arg(long, default_value = "0.00005")] - lr: f64, - }, - - /// Inference - Infer { - /// Path to the trained model - #[arg(long)] - artifact_dir: String, - }, -} diff --git a/examples/modern-lstm/src/lib.rs b/examples/modern-lstm/src/lib.rs index cf2fcd7afa..1a167ffd75 100644 --- a/examples/modern-lstm/src/lib.rs +++ b/examples/modern-lstm/src/lib.rs @@ -1,4 +1,3 @@ -pub mod cli; pub mod dataset; pub mod inference; pub mod model; diff --git a/examples/modern-lstm/src/main.rs b/examples/modern-lstm/src/main.rs deleted file mode 100644 index f37afbb321..0000000000 --- a/examples/modern-lstm/src/main.rs +++ /dev/null @@ -1,210 +0,0 @@ -#[cfg(any( - feature = "ndarray", - feature = "ndarray-blas-netlib", - feature = "ndarray-blas-openblas", - feature = "ndarray-blas-accelerate", -))] -mod ndarray { - use burn::{ - backend::{ - ndarray::{NdArray, NdArrayDevice}, - Autodiff, - }, - grad_clipping::GradientClippingConfig, - optim::AdamConfig, - }; - use lstm::{ - cli::{Cli, Commands}, - inference::infer, - model::LstmNetworkConfig, - training::{train, TrainingConfig}, - }; - - pub fn run(cli: Cli) { - let device = NdArrayDevice::Cpu; - - match cli.command { - Commands::Train { - artifact_dir, - num_epochs, - batch_size, - num_workers, - lr, - } => { - let config = TrainingConfig::new( - LstmNetworkConfig::new(), - // Gradient clipping via optimizer config - AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), - num_epochs, - batch_size, - num_workers, - lr, - ); - train::>(&artifact_dir, config, device); - } - Commands::Infer { artifact_dir } => { - infer::(&artifact_dir, device); - } - } - } -} - -#[cfg(feature = "tch-cpu")] -mod tch_cpu { - use burn::{ - backend::{ - libtorch::{LibTorch, LibTorchDevice}, - Autodiff, - }, - grad_clipping::GradientClippingConfig, - optim::AdamConfig, - }; - use lstm::{ - cli::{Cli, Commands}, - inference::infer, - model::LstmNetworkConfig, - training::{train, TrainingConfig}, - }; - - pub fn run(cli: Cli) { - let device = LibTorchDevice::Cpu; - - match cli.command { - Commands::Train { - artifact_dir, - num_epochs, - batch_size, - num_workers, - lr, - } => { - let config = TrainingConfig::new( - LstmNetworkConfig::new(), - // Gradient clipping via optimizer config - AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), - num_epochs, - batch_size, - num_workers, - lr, - ); - train::>(&artifact_dir, config, device); - } - Commands::Infer { artifact_dir } => { - infer::(&artifact_dir, device); - } - } - } -} - -#[cfg(feature = "tch-gpu")] -mod tch_gpu { - use burn::{ - backend::{ - libtorch::{LibTorch, LibTorchDevice}, - Autodiff, - }, - grad_clipping::GradientClippingConfig, - optim::AdamConfig, - }; - use lstm::{ - cli::{Cli, Commands}, - inference::infer, - model::LstmNetworkConfig, - training::{train, TrainingConfig}, - }; - - pub fn run(cli: Cli) { - #[cfg(not(target_os = "macos"))] - let device = LibTorchDevice::Cuda(0); - #[cfg(target_os = "macos")] - let device = LibTorchDevice::Mps; - - match cli.command { - Commands::Train { - artifact_dir, - num_epochs, - batch_size, - num_workers, - lr, - } => { - let config = TrainingConfig::new( - LstmNetworkConfig::new(), - // Gradient clipping via optimizer config - AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), - num_epochs, - batch_size, - num_workers, - lr, - ); - train::>(&artifact_dir, config, device); - } - Commands::Infer { artifact_dir } => { - infer::(&artifact_dir, device); - } - } - } -} - -#[cfg(feature = "wgpu")] -mod wgpu { - use burn::{ - backend::{ - wgpu::{Wgpu, WgpuDevice}, - Autodiff, - }, - grad_clipping::GradientClippingConfig, - optim::AdamConfig, - }; - use lstm::{ - cli::{Cli, Commands}, - inference::infer, - model::LstmNetworkConfig, - training::{train, TrainingConfig}, - }; - - pub fn run(cli: Cli) { - let device = WgpuDevice::default(); - - match cli.command { - Commands::Train { - artifact_dir, - num_epochs, - batch_size, - num_workers, - lr, - } => { - let config = TrainingConfig::new( - LstmNetworkConfig::new(), - // Gradient clipping via optimizer config - AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), - num_epochs, - batch_size, - num_workers, - lr, - ); - train::>(&artifact_dir, config, device); - } - Commands::Infer { artifact_dir } => { - infer::(&artifact_dir, device); - } - } - } -} - -use clap::Parser; -use lstm::cli::Cli; -fn main() { - let cli = Cli::parse(); - #[cfg(any( - feature = "ndarray", - feature = "ndarray-blas-netlib", - feature = "ndarray-blas-openblas", - feature = "ndarray-blas-accelerate", - ))] - ndarray::run(cli); - #[cfg(feature = "tch-cpu")] - tch_cpu::run(cli); - #[cfg(feature = "tch-gpu")] - tch_gpu::run(cli); - #[cfg(feature = "wgpu")] - wgpu::run(cli); -} diff --git a/examples/modern-lstm/src/model.rs b/examples/modern-lstm/src/model.rs index fc06b341b1..ebf6b3bc08 100644 --- a/examples/modern-lstm/src/model.rs +++ b/examples/modern-lstm/src/model.rs @@ -6,21 +6,21 @@ use burn::{ prelude::*, }; -// LSTM Cell implementation with layer normalization. -// -// Mathematical formulation of LSTM: -// f_t = σ(W_f · [h_{t-1}, x_t] + b_f) # Forget gate -// i_t = σ(W_i · [h_{t-1}, x_t] + b_i] # Input gate -// g_t = tanh(W_g · [h_{t-1}, x_t] + b_g] # Candidate cell state -// o_t = σ(W_o · [h_{t-1}, x_t] + b_o) # Output gate -// -// c_t = f_t ⊙ c_{t-1} + i_t ⊙ g_t # New cell state -// h_t = o_t ⊙ tanh(c_t) # New hidden state -// -// where: -// - σ is the sigmoid function -// - ⊙ is the element-wise multiplication -// - [h_{t-1}, x_t] represents concatenation +/// LSTM Cell implementation with layer normalization. +/// +/// Mathematical formulation of LSTM: +/// f_t = σ(W_f · [h_{t-1}, x_t] + b_f) # Forget gate +/// i_t = σ(W_i · [h_{t-1}, x_t] + b_i] # Input gate +/// g_t = tanh(W_g · [h_{t-1}, x_t] + b_g] # Candidate cell state +/// o_t = σ(W_o · [h_{t-1}, x_t] + b_o) # Output gate +/// +/// c_t = f_t ⊙ c_{t-1} + i_t ⊙ g_t # New cell state +/// h_t = o_t ⊙ tanh(c_t) # New hidden state +/// +/// where: +/// - σ is the sigmoid function +/// - ⊙ is the element-wise multiplication +/// - [h_{t-1}, x_t] represents concatenation #[derive(Module, Debug)] pub struct LstmCell { @@ -37,7 +37,7 @@ pub struct LstmCell { pub dropout: Dropout, } -// Configuration to create a Lstm module using the init function. +/// Configuration to create a Lstm module using the init function. #[derive(Config, Debug)] pub struct LstmCellConfig { // The size of the input features @@ -92,12 +92,12 @@ impl LstmCellConfig { } impl LstmCell { - // Forward pass of LSTM cell. - // Args: - // x: Input tensor of shape (batch_size, input_size) - // state: Tuple of (h_{t-1}, c_{t-1}) each of shape (batch_size, hidden_size) - // Returns: - // Tuple of (h_t, c_t) representing new hidden and cell states + /// Forward pass of LSTM cell. + /// Args: + /// x: Input tensor of shape (batch_size, input_size) + /// state: Tuple of (h_{t-1}, c_{t-1}) each of shape (batch_size, hidden_size) + /// Returns: + /// Tuple of (h_t, c_t) representing new hidden and cell states pub fn forward(&self, x: Tensor, state: LstmState) -> LstmState { let (h_prev, c_prev) = (state.hidden, state.cell); @@ -147,8 +147,8 @@ impl LstmCell { } } -// Stacked LSTM implementation supporting multiple layers -// Each layer processes the output of the previous layer +/// Stacked LSTM implementation supporting multiple layers +/// Each layer processes the output of the previous layer #[derive(Module, Debug)] pub struct StackedLstm { pub layers: Vec>, @@ -196,15 +196,15 @@ impl StackedLstmConfig { } impl StackedLstm { - // Process input sequence through stacked LSTM layers. - // - // Args: - // x: Input tensor of shape (batch_size, seq_length, input_size) - // states: Optional initial states for each layer - // - // Returns: - // Tuple of (output, states) where output has shape (batch_size, seq_length, hidden_size) - // and states is a vector of length num_layers, both cell and hidden state in each element have shape (batch_size, hidden_size) + /// Process input sequence through stacked LSTM layers. + /// + /// Args: + /// x: Input tensor of shape (batch_size, seq_length, input_size) + /// states: Optional initial states for each layer + /// + /// Returns: + /// Tuple of (output, states) where output has shape (batch_size, seq_length, hidden_size) + /// and states is a vector of length num_layers, both cell and hidden state in each element have shape (batch_size, hidden_size) pub fn forward( &self, x: Tensor, @@ -247,12 +247,12 @@ impl StackedLstm { } } -// Complete LSTM network with bidirectional support. -// -// In bidirectional mode: -// - Forward LSTM processes sequence from left to right -// - Backward LSTM processes sequence from right to left -// - Outputs are concatenated for final prediction +/// Complete LSTM network with bidirectional support. +/// +/// In bidirectional mode: +/// - Forward LSTM processes sequence from left to right +/// - Backward LSTM processes sequence from right to left +/// - Outputs are concatenated for final prediction #[derive(Module, Debug)] pub struct LstmNetwork { // Forward direction LSTM @@ -317,20 +317,20 @@ impl LstmNetworkConfig { } impl LstmNetwork { - // Forward pass of the network. - // - // For bidirectional processing: - // 1. Process sequence normally with forward LSTM - // 2. Process reversed sequence with backward LSTM - // 3. Concatenate both outputs - // 4. Apply final linear transformation - // - // Args: - // x: Input tensor of shape (batch_size, seq_length, input_size) - // states: Optional initial states - // - // Returns: - // Output tensor of shape (batch_size, output_size) + /// Forward pass of the network. + /// + /// For bidirectional processing: + /// 1. Process sequence normally with forward LSTM + /// 2. Process reversed sequence with backward LSTM + /// 3. Concatenate both outputs + /// 4. Apply final linear transformation + /// + /// Args: + /// x: Input tensor of shape (batch_size, seq_length, input_size) + /// states: Optional initial states + /// + /// Returns: + /// Output tensor of shape (batch_size, output_size) pub fn forward(&self, x: Tensor, states: Option>>) -> Tensor { let seq_length = x.dims()[1] as i64; // Forward direction diff --git a/examples/modern-lstm/src/training.rs b/examples/modern-lstm/src/training.rs index 2da5f4c205..a74babd509 100644 --- a/examples/modern-lstm/src/training.rs +++ b/examples/modern-lstm/src/training.rs @@ -16,9 +16,14 @@ use burn::{ pub struct TrainingConfig { pub model: LstmNetworkConfig, pub optimizer: AdamConfig, + + #[config(default = 30)] pub num_epochs: usize, + #[config(default = 32)] pub batch_size: usize, + #[config(default = 2)] pub num_workers: usize, + #[config(default = 1e-3)] pub lr: f64, } From b27b228840230176b0de1b1e002205c52132e711 Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Fri, 31 Jan 2025 10:35:05 +0800 Subject: [PATCH 10/14] remove Cargo.lock --- Cargo.lock | 9529 ---------------------------------------------------- 1 file changed, 9529 deletions(-) delete mode 100644 Cargo.lock diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index c19478d646..0000000000 --- a/Cargo.lock +++ /dev/null @@ -1,9529 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "accelerate-src" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415ed64958754dbe991900f3940677e6a7eefb4d7367afd70d642677b0c7d19d" - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "aligned-vec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" -dependencies = [ - "anstyle", - "once_cell", - "windows-sys 0.59.0", -] - -[[package]] -name = "anyhow" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" - -[[package]] -name = "arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" -dependencies = [ - "derive_arbitrary", -] - -[[package]] -name = "arboard" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" -dependencies = [ - "clipboard-win", - "core-graphics", - "image", - "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "parking_lot 0.12.3", - "windows-sys 0.48.0", - "x11rb", -] - -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "argminmax" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52424b59d69d69d5056d508b260553afd91c57e21849579cd1f50ee8b8b88eaa" -dependencies = [ - "num-traits", -] - -[[package]] -name = "array-init-cursor" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7d0a018de4f6aa429b9d33d69edf69072b1c5b1cb8d3e4a5f7ef898fc3eb76" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "ash" -version = "0.38.0+1.3.281" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" -dependencies = [ - "libloading", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "async-trait" -version = "0.1.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "atoi_simd" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae037714f313c1353189ead58ef9eec30a8e8dc101b2622d461418fd59e28a9" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "atomic_float" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628d228f918ac3b82fe590352cc719d30664a0c13ca3a60266fe02c7132d480a" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "av1-grain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "axum" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" -dependencies = [ - "axum-core", - "base64 0.22.1", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sha1", - "sync_wrapper", - "tokio", - "tokio-tungstenite", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "backend-comparison" -version = "0.17.0" -dependencies = [ - "arboard", - "burn 0.17.0", - "burn-common 0.17.0", - "chrono", - "clap", - "colored", - "cubecl 0.5.0", - "derive-new 0.7.0", - "dirs", - "half", - "indicatif", - "log", - "os_info", - "percent-encoding", - "rand", - "reqwest", - "rstest", - "serde", - "serde_json", - "serial_test", - "strum", - "strum_macros", - "sysinfo 0.32.1", - "tracing-subscriber", - "wgpu 24.0.1", - "wsl", -] - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bincode" -version = "2.0.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen_cuda" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f8489af5b7d17a81bffe37e0f4d6e1e4de87c87329d05447f22c35d95a1227d" -dependencies = [ - "glob", - "num_cpus", - "rayon", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bit_field" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" -dependencies = [ - "serde", -] - -[[package]] -name = "bitstream-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" - -[[package]] -name = "blake3" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq 0.3.1", -] - -[[package]] -name = "blas-src" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95e83dc868db96e69795c0213143095f03de9dd3252f205d4ac716e4076a7e0" -dependencies = [ - "accelerate-src", - "netlib-src", - "openblas-src", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2", -] - -[[package]] -name = "brotli" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bstr" -version = "1.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "built" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "burn" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55af4c56b540bcf00cf1c7e13b1c60644734906495048afbd4a79aabd0a6efbe" -dependencies = [ - "burn-core 0.16.0", - "burn-train 0.16.0", -] - -[[package]] -name = "burn" -version = "0.17.0" -dependencies = [ - "burn-core 0.17.0", - "burn-train 0.17.0", -] - -[[package]] -name = "burn-autodiff" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa53181463ef16220438e240f10e1e8cb2fcf1824dbc33b8f259a454ff5f46f" -dependencies = [ - "burn-common 0.16.0", - "burn-tensor 0.16.0", - "derive-new 0.7.0", - "log", - "spin", -] - -[[package]] -name = "burn-autodiff" -version = "0.17.0" -dependencies = [ - "burn-common 0.17.0", - "burn-tensor 0.17.0", - "burn-tensor-testgen", - "derive-new 0.7.0", - "log", - "spin", -] - -[[package]] -name = "burn-candle" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b49a6da72c10ac552b3c023d74dade9714c10aac0fc5f33cfc4ca389463b99e" -dependencies = [ - "burn-tensor 0.16.0", - "candle-core", - "derive-new 0.7.0", - "half", -] - -[[package]] -name = "burn-candle" -version = "0.17.0" -dependencies = [ - "burn-autodiff 0.17.0", - "burn-tch 0.17.0", - "burn-tensor 0.17.0", - "candle-core", - "derive-new 0.7.0", - "half", -] - -[[package]] -name = "burn-common" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a1471949b06002c984df9d753a084a79149841dd7935911d9e432b8478f9fd5" -dependencies = [ - "cubecl-common 0.4.0", - "getrandom", - "rayon", - "serde", - "web-time", -] - -[[package]] -name = "burn-common" -version = "0.17.0" -dependencies = [ - "cubecl-common 0.5.0", - "dashmap", - "getrandom", - "indicatif", - "rayon", - "reqwest", - "serde", - "tokio", - "web-time", -] - -[[package]] -name = "burn-core" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f8ebbf7d5c8bdc269260bd8e7ce08e488e6625da19b3d80ca34a729d78a77ab" -dependencies = [ - "ahash", - "bincode", - "burn-autodiff 0.16.0", - "burn-candle 0.16.0", - "burn-common 0.16.0", - "burn-cuda 0.16.0", - "burn-dataset 0.16.0", - "burn-derive 0.16.0", - "burn-hip 0.16.0", - "burn-ndarray 0.16.0", - "burn-router 0.16.0", - "burn-tch 0.16.0", - "burn-tensor 0.16.0", - "burn-wgpu 0.16.0", - "data-encoding", - "derive-new 0.7.0", - "flate2", - "half", - "hashbrown 0.15.2", - "log", - "num-traits", - "portable-atomic-util", - "rand", - "rmp-serde", - "serde", - "serde_json", - "spin", - "uuid", -] - -[[package]] -name = "burn-core" -version = "0.17.0" -dependencies = [ - "ahash", - "bincode", - "burn-autodiff 0.17.0", - "burn-candle 0.17.0", - "burn-common 0.17.0", - "burn-cuda 0.17.0", - "burn-dataset 0.17.0", - "burn-derive 0.17.0", - "burn-hip 0.17.0", - "burn-ndarray 0.17.0", - "burn-remote", - "burn-router 0.17.0", - "burn-tch 0.17.0", - "burn-tensor 0.17.0", - "burn-wgpu 0.17.0", - "data-encoding", - "derive-new 0.7.0", - "flate2", - "half", - "hashbrown 0.15.2", - "log", - "num-traits", - "portable-atomic-util", - "rand", - "regex", - "rmp-serde", - "serde", - "serde_json", - "spin", - "tempfile", - "thiserror 2.0.11", - "uuid", -] - -[[package]] -name = "burn-cuda" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90534d6c7f909a8cad49470921dc3eb2b118f7a3c8bde313defba3f4cae3ac3" -dependencies = [ - "burn-fusion 0.16.0", - "burn-jit 0.16.0", - "burn-tensor 0.16.0", - "bytemuck", - "cubecl 0.4.0", - "derive-new 0.7.0", - "half", - "log", -] - -[[package]] -name = "burn-cuda" -version = "0.17.0" -dependencies = [ - "burn-fusion 0.17.0", - "burn-jit 0.17.0", - "burn-tensor 0.17.0", - "bytemuck", - "cubecl 0.5.0", - "derive-new 0.7.0", - "half", - "log", - "paste", -] - -[[package]] -name = "burn-dataset" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b851cb5165da57871bed2c48a29673dde0ddbd198a39b2a37411b6adf6df6ad" -dependencies = [ - "csv", - "derive-new 0.7.0", - "dirs", - "gix-tempfile", - "image", - "r2d2", - "r2d2_sqlite", - "rand", - "rmp-serde", - "rusqlite", - "sanitize-filename 0.6.0", - "serde", - "serde_json", - "serde_rusqlite", - "strum", - "strum_macros", - "tempfile", - "thiserror 2.0.11", -] - -[[package]] -name = "burn-dataset" -version = "0.17.0" -dependencies = [ - "burn-common 0.17.0", - "csv", - "derive-new 0.7.0", - "dirs", - "fake", - "flate2", - "gix-tempfile", - "globwalk", - "hound", - "image", - "polars", - "r2d2", - "r2d2_sqlite", - "rand", - "rayon", - "rmp-serde", - "rstest", - "rusqlite", - "sanitize-filename 0.6.0", - "serde", - "serde_json", - "serde_rusqlite", - "strum", - "strum_macros", - "tempfile", - "thiserror 2.0.11", -] - -[[package]] -name = "burn-derive" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f784ffe0df57848ba232e5f40a1c1f5df3571df59bec99ba32bc7610fd9e811" -dependencies = [ - "derive-new 0.7.0", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "burn-derive" -version = "0.17.0" -dependencies = [ - "derive-new 0.7.0", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "burn-fusion" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3753a33b8084516c0b9e3040d11ccfd3a52d88495318501138c29376a54ba81f" -dependencies = [ - "burn-common 0.16.0", - "burn-tensor 0.16.0", - "derive-new 0.7.0", - "half", - "hashbrown 0.15.2", - "log", - "serde", - "spin", -] - -[[package]] -name = "burn-fusion" -version = "0.17.0" -dependencies = [ - "burn-common 0.17.0", - "burn-tensor 0.17.0", - "derive-new 0.7.0", - "half", - "hashbrown 0.15.2", - "log", - "serde", - "spin", -] - -[[package]] -name = "burn-hip" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9fbfee77b3d2b67bf434b883ec6ed73f4f9bf1fd8d59f9dde217c7a4b5285d" -dependencies = [ - "burn-fusion 0.16.0", - "burn-jit 0.16.0", - "burn-tensor 0.16.0", - "bytemuck", - "cubecl 0.4.0", - "derive-new 0.7.0", - "half", - "log", -] - -[[package]] -name = "burn-hip" -version = "0.17.0" -dependencies = [ - "burn-fusion 0.17.0", - "burn-jit 0.17.0", - "burn-tensor 0.17.0", - "bytemuck", - "cubecl 0.5.0", - "derive-new 0.7.0", - "half", - "log", - "paste", -] - -[[package]] -name = "burn-import" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-ndarray 0.17.0", - "candle-core", - "derive-new 0.7.0", - "half", - "log", - "onnx-ir", - "pretty_assertions", - "proc-macro2", - "quote", - "regex", - "rstest", - "rust-format", - "serde", - "serde_json", - "syn 2.0.96", - "thiserror 2.0.11", - "tracing-core", - "tracing-subscriber", - "zip 2.2.2", -] - -[[package]] -name = "burn-jit" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6b06689c4e8d6cfdcaf0b0e168e58a931c3935414e48f4e3e3e85e8d7a77a0" -dependencies = [ - "burn-common 0.16.0", - "burn-fusion 0.16.0", - "burn-tensor 0.16.0", - "bytemuck", - "cubecl 0.4.0", - "derive-new 0.7.0", - "futures-lite", - "half", - "hashbrown 0.15.2", - "log", - "num-traits", - "rand", - "serde", - "spin", - "text_placeholder", -] - -[[package]] -name = "burn-jit" -version = "0.17.0" -dependencies = [ - "burn-autodiff 0.17.0", - "burn-common 0.17.0", - "burn-fusion 0.17.0", - "burn-ndarray 0.17.0", - "burn-tensor 0.17.0", - "burn-tensor-testgen", - "bytemuck", - "cubecl 0.5.0", - "derive-new 0.7.0", - "futures-lite", - "half", - "hashbrown 0.15.2", - "log", - "num-traits", - "paste", - "rand", - "serde", - "serial_test", - "spin", - "text_placeholder", -] - -[[package]] -name = "burn-ndarray" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419fa3eda8cf9fddce0d156946b3d46642c10a41569b23e7855f775f862d310a" -dependencies = [ - "atomic_float", - "blas-src", - "burn-autodiff 0.16.0", - "burn-common 0.16.0", - "burn-tensor 0.16.0", - "derive-new 0.7.0", - "libm", - "matrixmultiply", - "ndarray 0.16.1", - "num-traits", - "openblas-src", - "portable-atomic-util", - "rand", - "spin", -] - -[[package]] -name = "burn-ndarray" -version = "0.17.0" -dependencies = [ - "atomic_float", - "blas-src", - "burn-autodiff 0.17.0", - "burn-common 0.17.0", - "burn-tensor 0.17.0", - "derive-new 0.7.0", - "libm", - "matrixmultiply", - "ndarray 0.16.1", - "num-traits", - "openblas-src", - "portable-atomic-util", - "rand", - "spin", -] - -[[package]] -name = "burn-no-std-tests" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-ndarray 0.17.0", - "serde", -] - -[[package]] -name = "burn-remote" -version = "0.17.0" -dependencies = [ - "async-channel", - "axum", - "burn-common 0.17.0", - "burn-router 0.17.0", - "burn-tensor 0.17.0", - "derive-new 0.7.0", - "futures-util", - "log", - "rmp-serde", - "serde", - "serde_bytes", - "tokio", - "tokio-tungstenite", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "burn-router" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39bdb6d5c749221741a362da9b3ea3157304f831ab4b4a6902725a1efaea159" -dependencies = [ - "burn-common 0.16.0", - "burn-tensor 0.16.0", - "hashbrown 0.15.2", - "log", - "spin", -] - -[[package]] -name = "burn-router" -version = "0.17.0" -dependencies = [ - "burn-autodiff 0.17.0", - "burn-common 0.17.0", - "burn-ndarray 0.17.0", - "burn-tensor 0.17.0", - "burn-wgpu 0.17.0", - "hashbrown 0.15.2", - "log", - "spin", -] - -[[package]] -name = "burn-tch" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c22939f7a95b87e45ad4dadad812a96fb187dade1ceba8dc0cebc2fc451624" -dependencies = [ - "burn-tensor 0.16.0", - "half", - "libc", - "log", - "rand", - "tch", -] - -[[package]] -name = "burn-tch" -version = "0.17.0" -dependencies = [ - "burn-autodiff 0.17.0", - "burn-tensor 0.17.0", - "half", - "libc", - "log", - "rand", - "tch", -] - -[[package]] -name = "burn-tensor" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24db20273a636d5340e5a29af142722e0a657491e6b3cfcceb1e62eb862b3b37" -dependencies = [ - "burn-common 0.16.0", - "bytemuck", - "colored", - "cubecl 0.4.0", - "derive-new 0.7.0", - "half", - "hashbrown 0.15.2", - "num-traits", - "portable-atomic-util", - "rand", - "rand_distr", - "serde", - "serde_bytes", -] - -[[package]] -name = "burn-tensor" -version = "0.17.0" -dependencies = [ - "bincode", - "burn-common 0.17.0", - "burn-tensor-testgen", - "bytemuck", - "colored", - "cubecl 0.5.0", - "derive-new 0.7.0", - "half", - "hashbrown 0.15.2", - "num-traits", - "portable-atomic-util", - "rand", - "rand_distr", - "serde", - "serde_bytes", -] - -[[package]] -name = "burn-tensor-testgen" -version = "0.17.0" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "burn-train" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714298cbc0c41f48d53cb1e6aeb6203b49b6110620517f69fbcc37a9b41cb6c8" -dependencies = [ - "async-channel", - "burn-core 0.16.0", - "burn-ndarray 0.16.0", - "derive-new 0.7.0", - "log", - "nvml-wrapper", - "ratatui", - "rstest", - "serde", - "sysinfo 0.32.1", - "systemstat", - "tracing-appender", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "burn-train" -version = "0.17.0" -dependencies = [ - "async-channel", - "burn-core 0.17.0", - "burn-ndarray 0.17.0", - "derive-new 0.7.0", - "log", - "nvml-wrapper", - "ratatui", - "rstest", - "serde", - "sysinfo 0.32.1", - "systemstat", - "tracing-appender", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "burn-wgpu" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef5b6c56da563a708b2da16f0559a061e7b93f3acae63903734ee978c9b9f93" -dependencies = [ - "burn-fusion 0.16.0", - "burn-jit 0.16.0", - "burn-tensor 0.16.0", - "cubecl 0.4.0", -] - -[[package]] -name = "burn-wgpu" -version = "0.17.0" -dependencies = [ - "burn-fusion 0.17.0", - "burn-jit 0.17.0", - "burn-tensor 0.17.0", - "cubecl 0.5.0", - "half", - "paste", -] - -[[package]] -name = "bytemuck" -version = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "bytesize" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "candle-core" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855dfedff437d2681d68e1f34ae559d88b0dd84aa5a6b63f2c8e75ebdd875bbf" -dependencies = [ - "accelerate-src", - "byteorder", - "candle-kernels", - "candle-metal-kernels", - "cudarc", - "gemm", - "half", - "libc", - "memmap2 0.9.5", - "metal 0.27.0", - "num-traits", - "num_cpus", - "rand", - "rand_distr", - "rayon", - "safetensors 0.4.5", - "thiserror 1.0.69", - "ug", - "ug-cuda", - "ug-metal", - "yoke", - "zip 1.1.4", -] - -[[package]] -name = "candle-kernels" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53343628fa470b7075c28c589b98735b4220b464e37ddbb8e117040e199f4787" -dependencies = [ - "bindgen_cuda", -] - -[[package]] -name = "candle-metal-kernels" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50fa64274a009a5d95c542b10bf3a4ea809bd394654c6ae99233bcc35b3a33ef" -dependencies = [ - "metal 0.27.0", - "once_cell", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "cassowary" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" - -[[package]] -name = "castaway" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" -dependencies = [ - "rustversion", -] - -[[package]] -name = "cblas-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6feecd82cce51b0204cf063f0041d69f24ce83f680d87514b004248e7b0fa65" -dependencies = [ - "libc", -] - -[[package]] -name = "cc" -version = "1.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.6", -] - -[[package]] -name = "chrono-tz" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf", -] - -[[package]] -name = "chrono-tz-build" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" -dependencies = [ - "parse-zoneinfo", - "phf", - "phf_codegen", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clap" -version = "4.5.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "clipboard-win" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" -dependencies = [ - "error-code", -] - -[[package]] -name = "cmake" -version = "0.1.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" -dependencies = [ - "cc", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width 0.1.14", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "colored" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" -dependencies = [ - "lazy_static", - "windows-sys 0.59.0", -] - -[[package]] -name = "comfy-table" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f165e7b643266ea80cb858aed492ad9280e3e05ce24d4a99d7d7b889b6a4d9" -dependencies = [ - "crossterm", - "strum", - "strum_macros", - "unicode-width 0.2.0", -] - -[[package]] -name = "compact_str" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "serde", - "static_assertions", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width 0.2.0", - "windows-sys 0.59.0", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crossterm" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" -dependencies = [ - "bitflags 2.8.0", - "crossterm_winapi", - "mio", - "parking_lot 0.12.3", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "csv" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" -dependencies = [ - "memchr", -] - -[[package]] -name = "cubecl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecf090429a4172d94c819e2977f440d7f5846c09f31d36937de309f986c878e" -dependencies = [ - "cubecl-core 0.4.0", - "cubecl-cuda 0.4.0", - "cubecl-hip 0.4.0", - "cubecl-linalg 0.4.0", - "cubecl-reduce 0.4.0", - "cubecl-runtime 0.4.0", - "cubecl-wgpu 0.4.0", - "half", -] - -[[package]] -name = "cubecl" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "cubecl-core 0.5.0", - "cubecl-cuda 0.5.0", - "cubecl-hip 0.5.0", - "cubecl-linalg 0.5.0", - "cubecl-reduce 0.5.0", - "cubecl-runtime 0.5.0", - "cubecl-wgpu 0.5.0", - "half", -] - -[[package]] -name = "cubecl-common" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10239ee4800968f367fbc4828250d38acf5d14fa53e8d0370d5f474387591322" -dependencies = [ - "derive-new 0.6.0", - "embassy-futures", - "futures-lite", - "getrandom", - "log", - "portable-atomic", - "rand", - "serde", - "spin", - "web-time", -] - -[[package]] -name = "cubecl-common" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "bytemuck", - "derive-new 0.6.0", - "derive_more 1.0.0", - "embassy-futures", - "futures-lite", - "getrandom", - "half", - "log", - "num-traits", - "portable-atomic", - "rand", - "serde", - "spin", - "web-time", -] - -[[package]] -name = "cubecl-core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d249976814abe45ee5d04bdfd5e2359558b409affdc03914625bea778dab5ade" -dependencies = [ - "bytemuck", - "cubecl-common 0.4.0", - "cubecl-macros 0.4.0", - "cubecl-runtime 0.4.0", - "derive-new 0.6.0", - "derive_more 1.0.0", - "half", - "log", - "num-traits", - "paste", - "serde", - "serde_json", -] - -[[package]] -name = "cubecl-core" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "bitflags 2.8.0", - "bytemuck", - "cubecl-common 0.5.0", - "cubecl-ir", - "cubecl-macros 0.5.0", - "cubecl-runtime 0.5.0", - "derive-new 0.6.0", - "derive_more 1.0.0", - "half", - "log", - "num-traits", - "paste", - "serde", - "serde_json", -] - -[[package]] -name = "cubecl-cpp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8463629d0bdf4d09d47150bce35132236c1a597f65eba213b45073406048a596" -dependencies = [ - "bytemuck", - "cubecl-common 0.4.0", - "cubecl-core 0.4.0", - "cubecl-runtime 0.4.0", - "derive-new 0.6.0", - "half", - "log", -] - -[[package]] -name = "cubecl-cpp" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "bytemuck", - "cubecl-common 0.5.0", - "cubecl-core 0.5.0", - "cubecl-runtime 0.5.0", - "derive-new 0.6.0", - "half", - "log", -] - -[[package]] -name = "cubecl-cuda" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12c0b49113ba986e984538cf54c3d7390c0af934a80f083b6c99cad737d22c59" -dependencies = [ - "bytemuck", - "cubecl-common 0.4.0", - "cubecl-core 0.4.0", - "cubecl-cpp 0.4.0", - "cubecl-runtime 0.4.0", - "cudarc", - "derive-new 0.6.0", - "half", - "log", -] - -[[package]] -name = "cubecl-cuda" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "bytemuck", - "cubecl-common 0.5.0", - "cubecl-core 0.5.0", - "cubecl-cpp 0.5.0", - "cubecl-runtime 0.5.0", - "cudarc", - "derive-new 0.6.0", - "half", - "log", -] - -[[package]] -name = "cubecl-hip" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976e150315f9d7d6bb84c51cb13c19221ea5d185bb6d61347a3c392dd29720de" -dependencies = [ - "bytemuck", - "cubecl-common 0.4.0", - "cubecl-core 0.4.0", - "cubecl-cpp 0.4.0", - "cubecl-hip-sys", - "cubecl-runtime 0.4.0", - "derive-new 0.6.0", - "half", - "log", - "paste", -] - -[[package]] -name = "cubecl-hip" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "bytemuck", - "cubecl-common 0.5.0", - "cubecl-core 0.5.0", - "cubecl-cpp 0.5.0", - "cubecl-hip-sys", - "cubecl-runtime 0.5.0", - "derive-new 0.6.0", - "half", - "log", - "paste", -] - -[[package]] -name = "cubecl-hip-sys" -version = "6.3.1000" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d987c1720eab39c72c515377a8001f683a4c4d99232a29fc0de389d9a8ce4f" -dependencies = [ - "libc", -] - -[[package]] -name = "cubecl-ir" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "cubecl-common 0.5.0", - "cubecl-macros-internal", - "derive_more 1.0.0", - "float-ord", - "half", - "num-traits", - "serde", - "type_hash", -] - -[[package]] -name = "cubecl-linalg" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640c379e225fecb1336f963affd3b8f1ff66b9320a972dfe92d8158dca8b6382" -dependencies = [ - "bytemuck", - "cubecl-core 0.4.0", - "cubecl-runtime 0.4.0", - "half", - "serde", -] - -[[package]] -name = "cubecl-linalg" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "bytemuck", - "cubecl-core 0.5.0", - "cubecl-runtime 0.5.0", - "half", - "serde", -] - -[[package]] -name = "cubecl-macros" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05d95f3be436814f909a3ac97209159f63076d3d2b254914bc02db2ac7faefb" -dependencies = [ - "cubecl-common 0.4.0", - "darling", - "derive-new 0.6.0", - "ident_case", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "cubecl-macros" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "cubecl-common 0.5.0", - "darling", - "derive-new 0.6.0", - "ident_case", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "cubecl-macros-internal" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "cubecl-opt" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "cubecl-common 0.5.0", - "cubecl-ir", - "float-ord", - "log", - "num", - "petgraph", - "smallvec", - "stable-vec", - "type-map", -] - -[[package]] -name = "cubecl-reduce" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0912890b52cc6f9636e0070320ff93dec27af15d57453789081b9a8bdb49786d" -dependencies = [ - "cubecl-core 0.4.0", - "cubecl-runtime 0.4.0", - "num-traits", -] - -[[package]] -name = "cubecl-reduce" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "cubecl-core 0.5.0", - "cubecl-runtime 0.5.0", - "num-traits", -] - -[[package]] -name = "cubecl-runtime" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75e84f4ae5a096e4d0c410db01d18b673d6efcd6eea1724d1a001ab60484df87" -dependencies = [ - "async-channel", - "async-lock", - "cfg_aliases 0.2.1", - "cubecl-common 0.4.0", - "derive-new 0.6.0", - "dirs", - "hashbrown 0.14.5", - "log", - "md5", - "sanitize-filename 0.5.0", - "serde", - "serde_json", - "spin", - "wasm-bindgen-futures", -] - -[[package]] -name = "cubecl-runtime" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "async-channel", - "async-lock", - "cfg_aliases 0.2.1", - "cubecl-common 0.5.0", - "derive-new 0.6.0", - "dirs", - "hashbrown 0.14.5", - "log", - "md5", - "sanitize-filename 0.5.0", - "serde", - "serde_json", - "spin", - "variadics_please", - "wasm-bindgen-futures", -] - -[[package]] -name = "cubecl-spirv" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "bitflags 2.8.0", - "cubecl-common 0.5.0", - "cubecl-core 0.5.0", - "cubecl-opt", - "cubecl-runtime 0.5.0", - "half", - "hashbrown 0.14.5", - "rspirv", -] - -[[package]] -name = "cubecl-wgpu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf8105d01ef4cd103d4e31bee9ae583fabc807253234923fb08218b28db7d15" -dependencies = [ - "async-channel", - "bytemuck", - "cfg-if", - "cfg_aliases 0.2.1", - "cubecl-common 0.4.0", - "cubecl-core 0.4.0", - "cubecl-runtime 0.4.0", - "derive-new 0.6.0", - "hashbrown 0.14.5", - "log", - "web-time", - "wgpu 23.0.1", -] - -[[package]] -name = "cubecl-wgpu" -version = "0.5.0" -source = "git+https://github.com/tracel-ai/cubecl?rev=ff34667accfe077d4a1cd48ae419868e142acfd6#ff34667accfe077d4a1cd48ae419868e142acfd6" -dependencies = [ - "ash", - "async-channel", - "bytemuck", - "cfg-if", - "cfg_aliases 0.2.1", - "cubecl-common 0.5.0", - "cubecl-core 0.5.0", - "cubecl-runtime 0.5.0", - "cubecl-spirv", - "derive-new 0.6.0", - "hashbrown 0.14.5", - "log", - "web-time", - "wgpu 24.0.1", -] - -[[package]] -name = "cudarc" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd76de2aa3a7bdb9a65941ea5a3c688d941688f736a81b2fc5beb88747a7f25" -dependencies = [ - "half", - "libloading", -] - -[[package]] -name = "custom-csv-dataset" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "csv", - "reqwest", - "serde", -] - -[[package]] -name = "custom-cubecl-kernel" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-jit 0.17.0", - "bytemuck", - "cubecl 0.5.0", - "derive-new 0.7.0", - "log", - "serde", -] - -[[package]] -name = "custom-image-dataset" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "flate2", - "tar", -] - -[[package]] -name = "custom-renderer" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "bytemuck", - "derive-new 0.7.0", - "guide", - "log", - "serde", -] - -[[package]] -name = "custom-training-loop" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "bytemuck", - "derive-new 0.7.0", - "guide", - "log", - "serde", -] - -[[package]] -name = "custom-wgpu-kernel" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "bytemuck", - "cubecl 0.5.0", - "derive-new 0.7.0", - "log", - "serde", -] - -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.96", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "data-encoding" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" - -[[package]] -name = "deflate64" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derive-new" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "derive-new" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "derive_arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.96", -] - -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", - "unicode-xid", -] - -[[package]] -name = "deunicode" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00" - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "document-features" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" -dependencies = [ - "litrs", -] - -[[package]] -name = "drawille" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64e461c3f1e69d99372620640b3fd5f0309eeda2e26e4af69f6760c0e1df845" -dependencies = [ - "colored", - "fnv", -] - -[[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - -[[package]] -name = "dyn-stack" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" -dependencies = [ - "bytemuck", - "reborrow", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" -dependencies = [ - "serde", -] - -[[package]] -name = "embassy-futures" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "env_filter" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "humantime", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "error-code" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" - -[[package]] -name = "esaxx-rs" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d817e038c30374a4bcb22f94d0a8a0e216958d4c3dcde369b1439fec4bdda6e6" - -[[package]] -name = "ethnum" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" - -[[package]] -name = "event-listener" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "exr" -version = "1.73.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fake" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef603df4ba9adbca6a332db7da6f614f21eafefbaf8e087844e452fdec152d0" -dependencies = [ - "deunicode", - "rand", -] - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "fast-float" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95765f67b4b18863968b4a1bd5bb576f732b29a4a28c7cd84c09fa3e2875f33c" - -[[package]] -name = "faster-hex" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183" -dependencies = [ - "serde", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" -dependencies = [ - "num-traits", -] - -[[package]] -name = "float-ord" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs4" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c6b3bd49c37d2aa3f3f2220233b29a7cd23f79d1fe70e5337d25fb390793de" -dependencies = [ - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "gemm" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" -dependencies = [ - "dyn-stack", - "gemm-c32", - "gemm-c64", - "gemm-common", - "gemm-f16", - "gemm-f32", - "gemm-f64", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-c32" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-c64" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-common" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" -dependencies = [ - "bytemuck", - "dyn-stack", - "half", - "num-complex", - "num-traits", - "once_cell", - "paste", - "pulp", - "raw-cpuid 10.7.0", - "rayon", - "seq-macro", - "sysctl", -] - -[[package]] -name = "gemm-f16" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" -dependencies = [ - "dyn-stack", - "gemm-common", - "gemm-f32", - "half", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "rayon", - "seq-macro", -] - -[[package]] -name = "gemm-f32" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-f64" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gif" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "gix-features" -version = "0.39.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d85d673f2e022a340dba4713bed77ef2cf4cd737d2f3e0f159d45e0935fd81f" -dependencies = [ - "gix-hash", - "gix-trace", - "gix-utils", - "libc", -] - -[[package]] -name = "gix-fs" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3d4fac505a621f97e5ce2c69fdc425742af00c0920363ca4074f0eb48b1db9" -dependencies = [ - "fastrand", - "gix-features", - "gix-utils", -] - -[[package]] -name = "gix-hash" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5eccc17194ed0e67d49285e4853307e4147e95407f91c1c3e4a13ba9f4e4ce" -dependencies = [ - "faster-hex", - "thiserror 2.0.11", -] - -[[package]] -name = "gix-tempfile" -version = "15.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2feb86ef094cc77a4a9a5afbfe5de626897351bbbd0de3cb9314baf3049adb82" -dependencies = [ - "dashmap", - "gix-fs", - "libc", - "once_cell", - "parking_lot 0.12.3", - "signal-hook", - "signal-hook-registry", - "tempfile", -] - -[[package]] -name = "gix-trace" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04bdde120c29f1fc23a24d3e115aeeea3d60d8e65bab92cc5f9d90d9302eb952" - -[[package]] -name = "gix-utils" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba427e3e9599508ed98a6ddf8ed05493db114564e338e41f6a996d2e4790335f" -dependencies = [ - "fastrand", - "unicode-normalization", -] - -[[package]] -name = "gl_generator" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "globset" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "globwalk" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" -dependencies = [ - "bitflags 2.8.0", - "ignore", - "walkdir", -] - -[[package]] -name = "glow" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glow" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glutin_wgl_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.8.0", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "gpu-allocator" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" -dependencies = [ - "log", - "presser", - "thiserror 1.0.69", - "windows 0.58.0", -] - -[[package]] -name = "gpu-descriptor" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" -dependencies = [ - "bitflags 2.8.0", - "gpu-descriptor-types", - "hashbrown 0.15.2", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "guide" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "log", - "serde", -] - -[[package]] -name = "h2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "bytemuck", - "cfg-if", - "crunchy", - "num-traits", - "rand", - "rand_distr", - "serde", -] - -[[package]] -name = "halfbrown" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" -dependencies = [ - "hashbrown 0.14.5", - "serde", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", - "rayon", - "serde", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "rayon", - "serde", -] - -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "hf-hub" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b780635574b3d92f036890d8373433d6f9fc7abb320ee42a5c25897fc8ed732" -dependencies = [ - "dirs", - "indicatif", - "log", - "native-tls", - "rand", - "serde", - "serde_json", - "thiserror 1.0.69", - "ureq", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "hound" -version = "3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" - -[[package]] -name = "http" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-native-certs 0.8.1", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core 0.52.0", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata 0.4.9", - "same-file", - "walkdir", - "winapi-util", -] - -[[package]] -name = "image" -version = "0.25.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", - "num-traits", - "png", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-classification-web" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-candle 0.17.0", - "burn-import", - "console_error_panic_hook", - "js-sys", - "log", - "serde", - "serde-wasm-bindgen", - "serde_json", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-logger", - "wasm-timer", -] - -[[package]] -name = "image-webp" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imgref" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" - -[[package]] -name = "indexmap" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" -dependencies = [ - "equivalent", - "hashbrown 0.15.2", - "serde", -] - -[[package]] -name = "indicatif" -version = "0.17.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" -dependencies = [ - "console", - "number_prefix", - "portable-atomic", - "unicode-width 0.2.0", - "web-time", -] - -[[package]] -name = "indoc" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instability" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" -dependencies = [ - "darling", - "indoc", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "ipnet" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "itoap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" -dependencies = [ - "libc", - "libloading", - "pkg-config", -] - -[[package]] -name = "khronos_api" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - -[[package]] -name = "libc" -version = "0.2.169" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.8.0", - "libc", - "redox_syscall 0.5.8", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - -[[package]] -name = "litrs" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "lockfree-object-pool" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" - -[[package]] -name = "log" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.2", -] - -[[package]] -name = "lstm" -version = "0.1.0" -dependencies = [ - "burn 0.16.0", - "clap", - "polars", - "rand", - "rand_distr", - "serde", -] - -[[package]] -name = "lz4" -version = "1.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" -dependencies = [ - "lz4-sys", -] - -[[package]] -name = "lz4-sys" -version = "1.11.1+lz4-1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "lzma-rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" -dependencies = [ - "byteorder", - "crc", -] - -[[package]] -name = "macro_rules_attribute" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a82271f7bc033d84bbca59a3ce3e4159938cb08a9c3aebbe54d215131518a13" -dependencies = [ - "macro_rules_attribute-proc_macro", - "paste", -] - -[[package]] -name = "macro_rules_attribute-proc_macro" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dd856d451cc0da70e2ef2ce95a18e39a93b7558bedf10201ad28503f918568" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "matrixmultiply" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" -dependencies = [ - "autocfg", - "num_cpus", - "once_cell", - "rawpointer", - "thread-tree", -] - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "md5" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" -dependencies = [ - "libc", -] - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", - "stable_deref_trait", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metal" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" -dependencies = [ - "bitflags 2.8.0", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.8.0", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "metal" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" -dependencies = [ - "bitflags 2.8.0", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "mnist" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "log", - "serde", -] - -[[package]] -name = "mnist-inference-web" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "console_error_panic_hook", - "js-sys", - "serde", - "wasm-bindgen", - "wasm-bindgen-futures", -] - -[[package]] -name = "model" -version = "0.6.0" -dependencies = [ - "burn 0.17.0", - "burn-import", -] - -[[package]] -name = "monostate" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d208407d7552cd041d8cdb69a1bc3303e029c598738177a3d87082004dc0e1e" -dependencies = [ - "monostate-impl", - "serde", -] - -[[package]] -name = "monostate-impl" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "multiversion" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4851161a11d3ad0bf9402d90ffc3967bf231768bfd7aeb61755ad06dbf1a142" -dependencies = [ - "multiversion-macros", - "target-features", -] - -[[package]] -name = "multiversion-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a74ddee9e0c27d2578323c13905793e91622148f138ba29738f9dddb835e90" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "target-features", -] - -[[package]] -name = "naga" -version = "23.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags 2.8.0", - "cfg_aliases 0.1.1", - "codespan-reporting", - "hexf-parse", - "indexmap", - "log", - "rustc-hash 1.1.0", - "spirv 0.3.0+sdk-1.3.268.0", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "naga" -version = "24.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags 2.8.0", - "cfg_aliases 0.2.1", - "codespan-reporting", - "hexf-parse", - "indexmap", - "log", - "rustc-hash 1.1.0", - "spirv 0.3.0+sdk-1.3.268.0", - "strum", - "termcolor", - "thiserror 2.0.11", - "unicode-xid", -] - -[[package]] -name = "named-tensor" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "serde", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", -] - -[[package]] -name = "ndarray" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" -dependencies = [ - "cblas-sys", - "libc", - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "portable-atomic", - "portable-atomic-util", - "rawpointer", - "rayon", -] - -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "netlib-src" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f41f36bb4d46906d5a72da5b73a804d9de1a7282eb7c89617201acda7b8212" -dependencies = [ - "cmake", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "no-std-compat" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df270209a7f04d62459240d890ecb792714d5db12c92937823574a09930276b4" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "now" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89e9874397a1f0a52fc1f197a8effd9735223cb2390e9dcc83ac6cd02923d0" -dependencies = [ - "chrono", -] - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "bytemuck", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "nvml-wrapper" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9bff0aa1d48904a1385ea2a8b97576fbdcbc9a3cfccd0d31fe978e1c4038c5" -dependencies = [ - "bitflags 2.8.0", - "libloading", - "nvml-wrapper-sys", - "static_assertions", - "thiserror 1.0.69", - "wrapcenum-derive", -] - -[[package]] -name = "nvml-wrapper-sys" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "698d45156f28781a4e79652b6ebe2eaa0589057d588d3aec1333f6466f13fcb5" -dependencies = [ - "libloading", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.8.0", - "block2", - "libc", - "objc2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc2-encode" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.8.0", - "block2", - "libc", - "objc2", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "object_store" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6da452820c715ce78221e8202ccc599b4a52f3e1eb3eedb487b680c81a8e3f3" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bytes", - "chrono", - "futures", - "humantime", - "hyper", - "itertools 0.13.0", - "md-5", - "parking_lot 0.12.3", - "percent-encoding", - "quick-xml", - "rand", - "reqwest", - "ring", - "serde", - "serde_json", - "snafu", - "tokio", - "tracing", - "url", - "walkdir", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "onig" -version = "6.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f" -dependencies = [ - "bitflags 1.3.2", - "libc", - "once_cell", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "onnx-inference" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-import", - "serde", -] - -[[package]] -name = "onnx-ir" -version = "0.17.0" -dependencies = [ - "bytemuck", - "half", - "log", - "pretty_assertions", - "protobuf", - "protobuf-codegen", - "regex", - "rstest", - "serde", - "strum", - "strum_macros", -] - -[[package]] -name = "onnx-tests" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-import", - "burn-ndarray 0.17.0", - "float-cmp", - "serde", -] - -[[package]] -name = "openblas-build" -version = "0.10.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8140c0c1afaf88d2d30c48abad86b3bdd2334d691e08f7325a960d784240647" -dependencies = [ - "anyhow", - "cc", - "flate2", - "native-tls", - "tar", - "thiserror 2.0.11", - "ureq", -] - -[[package]] -name = "openblas-src" -version = "0.10.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252f22774417be65f908a20f7721a97e33a253acad4f28370408b7f1baea0629" -dependencies = [ - "dirs", - "openblas-build", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "openssl" -version = "0.10.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" -dependencies = [ - "bitflags 2.8.0", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" -dependencies = [ - "num-traits", -] - -[[package]] -name = "os_info" -version = "3.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6520c8cc998c5741ee68ec1dc369fc47e5f0ea5320018ecf2a1ccd6328f48b" -dependencies = [ - "log", - "serde", - "windows-sys 0.52.0", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.8", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "parse-zoneinfo" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" -dependencies = [ - "regex", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", - "hmac", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "planus" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1691dd09e82f428ce8d6310bd6d5da2557c82ff17694d2a32cad7242aea89f" -dependencies = [ - "array-init-cursor", -] - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polars" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65c6aa86d991a64c95416a61202f7952da2f8cccefa448f9a23c1b8f2301ecc" -dependencies = [ - "getrandom", - "polars-arrow", - "polars-core", - "polars-error", - "polars-io", - "polars-lazy", - "polars-ops", - "polars-parquet", - "polars-sql", - "polars-time", - "polars-utils", - "version_check", -] - -[[package]] -name = "polars-arrow" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dbb24d29ddea5abb73d7954df8b8d3d4bb7f02a3e5c96d1519cdad9e816a3d" -dependencies = [ - "ahash", - "atoi", - "atoi_simd", - "bytemuck", - "chrono", - "chrono-tz", - "dyn-clone", - "either", - "ethnum", - "fast-float", - "getrandom", - "hashbrown 0.15.2", - "itoa", - "itoap", - "lz4", - "multiversion", - "num-traits", - "parking_lot 0.12.3", - "polars-arrow-format", - "polars-error", - "polars-schema", - "polars-utils", - "ryu", - "serde", - "simdutf8", - "streaming-iterator", - "strength_reduce", - "strum_macros", - "version_check", - "zstd 0.13.2", -] - -[[package]] -name = "polars-arrow-format" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b0ef2474af9396b19025b189d96e992311e6a47f90c53cd998b36c4c64b84c" -dependencies = [ - "planus", - "serde", -] - -[[package]] -name = "polars-compute" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb1071147452a4c4b25560f23d2fbaffef255b04757291131b22fc2c0d35b2" -dependencies = [ - "bytemuck", - "either", - "num-traits", - "polars-arrow", - "polars-error", - "polars-utils", - "strength_reduce", - "version_check", -] - -[[package]] -name = "polars-core" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5df9b55e614088a3270b06f8649dce76537c268d6b1ca4d9c37008b2be5949" -dependencies = [ - "ahash", - "bitflags 2.8.0", - "bytemuck", - "chrono", - "chrono-tz", - "comfy-table", - "either", - "hashbrown 0.14.5", - "hashbrown 0.15.2", - "indexmap", - "num-traits", - "once_cell", - "polars-arrow", - "polars-compute", - "polars-error", - "polars-row", - "polars-schema", - "polars-utils", - "rand", - "rand_distr", - "rayon", - "regex", - "serde", - "serde_json", - "strum_macros", - "thiserror 1.0.69", - "version_check", - "xxhash-rust", -] - -[[package]] -name = "polars-error" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4643898a644f30c83737db85f942f8c8956b0c11190b39afec745218eae1746b" -dependencies = [ - "object_store", - "polars-arrow-format", - "regex", - "simdutf8", - "thiserror 1.0.69", -] - -[[package]] -name = "polars-expr" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea1b431ed816cba1120cff200f06b962748001bbb2e615ce53cfbbdf701cc136" -dependencies = [ - "ahash", - "bitflags 2.8.0", - "hashbrown 0.15.2", - "num-traits", - "once_cell", - "polars-arrow", - "polars-compute", - "polars-core", - "polars-io", - "polars-ops", - "polars-plan", - "polars-row", - "polars-time", - "polars-utils", - "rand", - "rayon", -] - -[[package]] -name = "polars-io" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2fab2c016635cb416b49461fd6419b0208c6c13a4fd065bd65e4a87dbb66314" -dependencies = [ - "ahash", - "async-trait", - "atoi_simd", - "blake3", - "bytes", - "chrono", - "fast-float", - "fs4", - "futures", - "glob", - "hashbrown 0.15.2", - "home", - "itoa", - "memchr", - "memmap2 0.7.1", - "num-traits", - "object_store", - "once_cell", - "percent-encoding", - "polars-arrow", - "polars-core", - "polars-error", - "polars-json", - "polars-parquet", - "polars-schema", - "polars-time", - "polars-utils", - "pyo3", - "rayon", - "regex", - "reqwest", - "ryu", - "serde", - "serde_json", - "simd-json", - "simdutf8", - "tokio", - "tokio-util", - "url", -] - -[[package]] -name = "polars-json" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5c8c057ef04feaf34b6ce52096bdea3a766fa4725f50442078c8a4ee86397bf" -dependencies = [ - "ahash", - "chrono", - "fallible-streaming-iterator", - "hashbrown 0.15.2", - "indexmap", - "itoa", - "num-traits", - "polars-arrow", - "polars-error", - "polars-utils", - "ryu", - "simd-json", - "streaming-iterator", -] - -[[package]] -name = "polars-lazy" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a8ca74f42e7b47cad241b36b98d991cc7fbb51b8d0695a055eb937588d1f310" -dependencies = [ - "ahash", - "bitflags 2.8.0", - "memchr", - "once_cell", - "polars-arrow", - "polars-core", - "polars-expr", - "polars-io", - "polars-mem-engine", - "polars-ops", - "polars-pipe", - "polars-plan", - "polars-stream", - "polars-time", - "polars-utils", - "rayon", - "version_check", -] - -[[package]] -name = "polars-mem-engine" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a32614e5b52c9b83856d80c7e2880b79d83055bfd59969bd1d0b148f9cfdc7a" -dependencies = [ - "futures", - "memmap2 0.7.1", - "polars-arrow", - "polars-core", - "polars-error", - "polars-expr", - "polars-io", - "polars-json", - "polars-ops", - "polars-plan", - "polars-time", - "polars-utils", - "pyo3", - "rayon", - "tokio", -] - -[[package]] -name = "polars-ops" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "035c800fbe5bbd820afeb8313713ed345853bb014e0f821a4025d40cf0d60e1a" -dependencies = [ - "ahash", - "argminmax", - "base64 0.22.1", - "bytemuck", - "chrono", - "chrono-tz", - "either", - "hashbrown 0.15.2", - "hex", - "indexmap", - "memchr", - "num-traits", - "polars-arrow", - "polars-compute", - "polars-core", - "polars-error", - "polars-schema", - "polars-utils", - "rayon", - "regex", - "regex-syntax 0.8.5", - "serde", - "strum_macros", - "unicode-reverse", - "version_check", -] - -[[package]] -name = "polars-parquet" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91dcf1d9f048079376949eaf2e24e240b313ff4a102fb83b57c9a5f807cdca52" -dependencies = [ - "ahash", - "async-stream", - "base64 0.22.1", - "brotli", - "bytemuck", - "ethnum", - "flate2", - "futures", - "hashbrown 0.15.2", - "lz4", - "num-traits", - "polars-arrow", - "polars-compute", - "polars-error", - "polars-parquet-format", - "polars-utils", - "serde", - "simdutf8", - "snap", - "streaming-decompression", - "zstd 0.13.2", -] - -[[package]] -name = "polars-parquet-format" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c025243dcfe8dbc57e94d9f82eb3bef10b565ab180d5b99bed87fd8aea319ce1" -dependencies = [ - "async-trait", - "futures", -] - -[[package]] -name = "polars-pipe" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05936f2b3981eecb2fe74d8ef092bb75a93d2a056b3e4f339f4ac20c71c9e331" -dependencies = [ - "crossbeam-channel", - "crossbeam-queue", - "enum_dispatch", - "hashbrown 0.15.2", - "num-traits", - "polars-arrow", - "polars-compute", - "polars-core", - "polars-expr", - "polars-io", - "polars-ops", - "polars-plan", - "polars-row", - "polars-utils", - "rayon", - "uuid", - "version_check", -] - -[[package]] -name = "polars-plan" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23de436f33f4d1134c58f24e7059a221b957ec20730807e0ef0c80c8e4b3d06a" -dependencies = [ - "ahash", - "bitflags 2.8.0", - "bytemuck", - "bytes", - "chrono", - "chrono-tz", - "ciborium", - "either", - "futures", - "hashbrown 0.15.2", - "memmap2 0.7.1", - "num-traits", - "once_cell", - "percent-encoding", - "polars-arrow", - "polars-core", - "polars-io", - "polars-json", - "polars-ops", - "polars-parquet", - "polars-time", - "polars-utils", - "pyo3", - "rayon", - "recursive", - "regex", - "serde", - "strum_macros", - "version_check", -] - -[[package]] -name = "polars-row" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3823d3de3e614509bba6929798f1f3d5ae05c1cdfc4eb7029d2ec6ad77201da2" -dependencies = [ - "bytemuck", - "polars-arrow", - "polars-error", - "polars-utils", -] - -[[package]] -name = "polars-schema" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88667f770291cefa2e8cd366a54f29dc6fe362e9a263914c903db411a58ac1d" -dependencies = [ - "indexmap", - "polars-error", - "polars-utils", - "serde", - "version_check", -] - -[[package]] -name = "polars-sql" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69451f08363bb497407f6ebebe00bc01972a51716d20d115b75f9b5326f1f3c8" -dependencies = [ - "hex", - "once_cell", - "polars-arrow", - "polars-core", - "polars-error", - "polars-lazy", - "polars-ops", - "polars-plan", - "polars-time", - "polars-utils", - "rand", - "serde", - "serde_json", - "sqlparser", -] - -[[package]] -name = "polars-stream" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "188622b0a4bc4530cf91a288134254ffa065d18932e261075377914225e757c2" -dependencies = [ - "atomic-waker", - "crossbeam-deque", - "crossbeam-utils", - "futures", - "memmap2 0.7.1", - "parking_lot 0.12.3", - "pin-project-lite", - "polars-core", - "polars-error", - "polars-expr", - "polars-io", - "polars-mem-engine", - "polars-parquet", - "polars-plan", - "polars-utils", - "rand", - "rayon", - "recursive", - "slotmap", - "tokio", - "version_check", -] - -[[package]] -name = "polars-time" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f36e4d6b19f2c406faea585b9a1814f422fc5b310f65ccf8a55216df0754ef" -dependencies = [ - "atoi", - "bytemuck", - "chrono", - "chrono-tz", - "now", - "once_cell", - "polars-arrow", - "polars-core", - "polars-error", - "polars-ops", - "polars-utils", - "regex", - "serde", - "strum_macros", -] - -[[package]] -name = "polars-utils" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96186b70bda00c90b5027bf2f69193c5c40571e80d3e8ec505c22cdc8e3e39aa" -dependencies = [ - "ahash", - "bytemuck", - "bytes", - "compact_str", - "hashbrown 0.15.2", - "indexmap", - "libc", - "memmap2 0.7.1", - "num-traits", - "once_cell", - "polars-error", - "pyo3", - "raw-cpuid 11.2.0", - "rayon", - "serde", - "stacker", - "sysinfo 0.31.4", - "version_check", -] - -[[package]] -name = "portable-atomic" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" - -[[package]] -name = "portable-atomic-util" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "presser" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" - -[[package]] -name = "pretty_assertions" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" -dependencies = [ - "diff", - "yansi", -] - -[[package]] -name = "prettyplease" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" -dependencies = [ - "proc-macro2", - "syn 2.0.96", -] - -[[package]] -name = "proc-macro-crate" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" -dependencies = [ - "quote", - "syn 2.0.96", -] - -[[package]] -name = "protobuf" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" -dependencies = [ - "bytes", - "once_cell", - "protobuf-support", - "thiserror 1.0.69", -] - -[[package]] -name = "protobuf-codegen" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" -dependencies = [ - "anyhow", - "once_cell", - "protobuf", - "protobuf-parse", - "regex", - "tempfile", - "thiserror 1.0.69", -] - -[[package]] -name = "protobuf-parse" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" -dependencies = [ - "anyhow", - "indexmap", - "log", - "protobuf", - "protobuf-support", - "tempfile", - "thiserror 1.0.69", - "which", -] - -[[package]] -name = "protobuf-support" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" -dependencies = [ - "thiserror 1.0.69", -] - -[[package]] -name = "psm" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" -dependencies = [ - "cc", -] - -[[package]] -name = "pulp" -version = "0.18.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" -dependencies = [ - "bytemuck", - "libm", - "num-complex", - "reborrow", -] - -[[package]] -name = "pyo3" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8" -dependencies = [ - "cfg-if", - "indoc", - "libc", - "memoffset", - "parking_lot 0.12.3", - "portable-atomic", - "pyo3-build-config", - "pyo3-ffi", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7883df5835fafdad87c0d888b266c8ec0f4c9ca48a5bed6bbb592e8dedee1b50" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-ffi" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01be5843dc60b916ab4dad1dca6d20b9b4e6ddc8e15f50c47fe6d85f1fb97403" -dependencies = [ - "libc", - "pyo3-build-config", -] - -[[package]] -name = "pyo3-macros" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b34069fc0682e11b31dbd10321cbf94808394c56fd996796ce45217dfac53c" -dependencies = [ - "proc-macro2", - "pyo3-macros-backend", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08260721f32db5e1a5beae69a55553f56b99bd0e1c3e6e0a5e8851a9d0f5a85c" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "pyo3-build-config", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "pytorch-import" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-import", - "model", -] - -[[package]] -name = "pytorch-tests" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "burn-autodiff 0.17.0", - "burn-import", - "burn-ndarray 0.17.0", - "float-cmp", - "serde", -] - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quick-xml" -version = "0.36.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quinn" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.0", - "rustls", - "socket2", - "thiserror 2.0.11", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" -dependencies = [ - "bytes", - "getrandom", - "rand", - "ring", - "rustc-hash 2.1.0", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.11", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" -dependencies = [ - "cfg_aliases 0.2.1", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r2d2" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" -dependencies = [ - "log", - "parking_lot 0.12.3", - "scheduled-thread-pool", -] - -[[package]] -name = "r2d2_sqlite" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb14dba8247a6a15b7fdbc7d389e2e6f03ee9f184f87117706d509c092dfe846" -dependencies = [ - "r2d2", - "rusqlite", - "uuid", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "range-alloc" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" - -[[package]] -name = "ratatui" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" -dependencies = [ - "bitflags 2.8.0", - "cassowary", - "compact_str", - "crossterm", - "indoc", - "instability", - "itertools 0.13.0", - "lru", - "paste", - "strum", - "time", - "unicode-segmentation", - "unicode-truncate", - "unicode-width 0.2.0", -] - -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.12.1", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand", - "rand_chacha", - "simd_helpers", - "system-deps", - "thiserror 1.0.69", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "raw-cpuid" -version = "10.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "raw-cpuid" -version = "11.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-cond" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059f538b55efd2309c9794130bc149c6a553db90e9d99c2030785c82f0bd7df9" -dependencies = [ - "either", - "itertools 0.11.0", - "rayon", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "reborrow" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" - -[[package]] -name = "recursive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0786a43debb760f491b1bc0269fe5e84155353c67482b9e60d0cfb596054b43e" -dependencies = [ - "recursive-proc-macro-impl", - "stacker", -] - -[[package]] -name = "recursive-proc-macro-impl" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" -dependencies = [ - "quote", - "syn 2.0.96", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "ref-cast" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "relative-path" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" - -[[package]] -name = "renderdoc-sys" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" - -[[package]] -name = "reqwest" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-native-certs 0.8.1", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-util", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "windows-registry", -] - -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rmp" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - -[[package]] -name = "rspirv" -version = "0.12.0+sdk-1.3.296.0" -source = "git+https://github.com/gfx-rs/rspirv.git?rev=e19c11fdb30295127cff1d018189bd436892415e#e19c11fdb30295127cff1d018189bd436892415e" -dependencies = [ - "rustc-hash 1.1.0", - "spirv 0.3.0+sdk-1.3.296.0", -] - -[[package]] -name = "rstest" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a2c585be59b6b5dd66a9d2084aa1d8bd52fbdb806eafdeffb52791147862035" -dependencies = [ - "futures", - "futures-timer", - "rstest_macros", - "rustc_version", -] - -[[package]] -name = "rstest_macros" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825ea780781b15345a146be27eaefb05085e337e869bff01b4306a4fd4a9ad5a" -dependencies = [ - "cfg-if", - "glob", - "proc-macro-crate", - "proc-macro2", - "quote", - "regex", - "relative-path", - "rustc_version", - "syn 2.0.96", - "unicode-ident", -] - -[[package]] -name = "rusqlite" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" -dependencies = [ - "bitflags 2.8.0", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rust-format" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60e7c00b6c3bf5e38a880eec01d7e829d12ca682079f8238a464def3c4b31627" -dependencies = [ - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" -dependencies = [ - "bitflags 2.8.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework 2.11.1", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.2.0", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" -dependencies = [ - "web-time", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "safetensors" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93279b86b3de76f820a8854dd06cbc33cfa57a417b19c47f6a25280112fb1df" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "safetensors" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "sanitize-filename" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "sanitize-filename" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc984f4f9ceb736a7bb755c3e3bd17dc56370af2600c9780dcc48c66453da34d" -dependencies = [ - "regex", -] - -[[package]] -name = "scc" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e1c91382686d21b5ac7959341fcb9780fa7c03773646995a87c950fa7be640" -dependencies = [ - "sdd", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scheduled-thread-pool" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" -dependencies = [ - "parking_lot 0.12.3", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sdd" -version = "3.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478f121bb72bbf63c52c93011ea1791dca40140dfe13f8336c4c5ac952c33aa9" - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" -dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.10.0", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" - -[[package]] -name = "seq-macro" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" - -[[package]] -name = "serde" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "serde_bytes" -version = "0.11.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "serde_json" -version = "1.0.137" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_rusqlite" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b741cc5ef185cd96157e762c3bba743c4e94c8dc6af0edb053c48d2b3c27e691" -dependencies = [ - "rusqlite", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serial_test" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" -dependencies = [ - "futures", - "log", - "once_cell", - "parking_lot 0.12.3", - "scc", - "serial_test_derive", -] - -[[package]] -name = "serial_test_derive" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "server" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "cfg-if", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simd-json" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" -dependencies = [ - "ahash", - "getrandom", - "halfbrown", - "once_cell", - "ref-cast", - "serde", - "serde_json", - "simdutf8", - "value-trait", -] - -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "simple-regression" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "log", - "rgb", - "serde", - "textplots", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "snafu" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" -dependencies = [ - "doc-comment", - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "snap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", - "portable-atomic", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.268.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.296.0" -source = "git+https://github.com/gfx-rs/rspirv.git?rev=e19c11fdb30295127cff1d018189bd436892415e#e19c11fdb30295127cff1d018189bd436892415e" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "spm_precompiled" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326" -dependencies = [ - "base64 0.13.1", - "nom", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "sqlparser" -version = "0.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a404d0e14905361b918cb8afdb73605e25c1d5029312bd9785142dcb3aa49e" -dependencies = [ - "log", -] - -[[package]] -name = "stable-vec" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1dff32a2ce087283bec878419027cebd888760d8760b2941ad0843531dc9ec8" -dependencies = [ - "no-std-compat", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stacker" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.59.0", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "streaming-decompression" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf6cc3b19bfb128a8ad11026086e31d3ce9ad23f8ea37354b31383a187c44cf3" -dependencies = [ - "fallible-streaming-iterator", -] - -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" - -[[package]] -name = "strength_reduce" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.96", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.96" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "sysctl" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" -dependencies = [ - "bitflags 2.8.0", - "byteorder", - "enum-as-inner", - "libc", - "thiserror 1.0.69", - "walkdir", -] - -[[package]] -name = "sysinfo" -version = "0.31.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "windows 0.57.0", -] - -[[package]] -name = "sysinfo" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c33cd241af0f2e9e3b5c32163b873b29956890b5342e6745b917ce9d490f4af" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "rayon", - "serde", - "windows 0.57.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "systemstat" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668a4db78b439df482c238f559e4ea869017f9e62ef0a059c8bfcd841a4df544" -dependencies = [ - "bytesize", - "lazy_static", - "libc", - "nom", - "time", - "winapi", -] - -[[package]] -name = "tar" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "target-features" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1bbb9f3c5c463a01705937a24fdabc5047929ac764b2d5b9cf681c1f5041ed5" - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tch" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7cb00bc2770454b515388d45be7097a3ded2eca172f3dcdb7ca4cc06c40bf1" -dependencies = [ - "half", - "lazy_static", - "libc", - "ndarray 0.15.6", - "rand", - "safetensors 0.3.3", - "thiserror 1.0.69", - "torch-sys", - "zip 0.6.6", -] - -[[package]] -name = "tempfile" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" -dependencies = [ - "cfg-if", - "fastrand", - "getrandom", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "text-classification" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "derive-new 0.7.0", - "serde", - "tokenizers", -] - -[[package]] -name = "text-generation" -version = "0.17.0" -dependencies = [ - "burn 0.17.0", - "derive-new 0.7.0", - "log", - "serde", - "tokenizers", -] - -[[package]] -name = "text_placeholder" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5008f74a09742486ef0047596cf35df2b914e2a8dca5727fcb6ba6842a766b" -dependencies = [ - "hashbrown 0.13.2", - "serde", - "serde_json", -] - -[[package]] -name = "textplots" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f59b64803118dbff62f92842b3154a2c802dfd8e18660132bbcbfb141c637ae3" -dependencies = [ - "drawille", - "rgb", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" -dependencies = [ - "thiserror-impl 2.0.11", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "thread-tree" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbd370cb847953a25954d9f63e14824a36113f8c72eecf6eccef5dc4b45d630" -dependencies = [ - "crossbeam-channel", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "tiff" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - -[[package]] -name = "time" -version = "0.3.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokenizers" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecededfed68a69bc657e486510089e255e53c3d38cc7d4d59c8742668ca2cae" -dependencies = [ - "aho-corasick", - "derive_builder", - "esaxx-rs", - "getrandom", - "hf-hub", - "itertools 0.12.1", - "lazy_static", - "log", - "macro_rules_attribute", - "monostate", - "onig", - "paste", - "rand", - "rayon", - "rayon-cond", - "regex", - "regex-syntax 0.8.5", - "serde", - "serde_json", - "spm_precompiled", - "thiserror 1.0.69", - "unicode-normalization-alignments", - "unicode-segmentation", - "unicode_categories", -] - -[[package]] -name = "tokio" -version = "1.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4bf6fecd69fcdede0ec680aaf474cdab988f9de6bc73d3758f0160e3b7025a" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite", -] - -[[package]] -name = "tokio-util" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "torch-sys" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e0244e5b148a31dd7fe961165037d1927754d024095c1013937532d7e73a22" -dependencies = [ - "anyhow", - "cc", - "libc", - "serde", - "serde_json", - "ureq", - "zip 0.6.6", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracel-xtask" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fccce80a2ef6bc32a512514a53cf853d438a44abaea286a4acb0c9f8566860" -dependencies = [ - "anyhow", - "clap", - "derive_more 0.99.18", - "env_logger", - "log", - "rand", - "regex", - "serde_json", - "strum", - "tracel-xtask-macros", - "tracing-subscriber", -] - -[[package]] -name = "tracel-xtask-macros" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3a646485f7cd8f580749ab94718ad3d344bcc0cc5b0fefe43c15fdd898bb96" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror 1.0.69", - "time", - "tracing-subscriber", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413083a99c579593656008130e29255e54dcaae495be556cc26888f211648c24" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "sha1", - "thiserror 2.0.11", - "utf-8", -] - -[[package]] -name = "type-map" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" -dependencies = [ - "rustc-hash 1.1.0", -] - -[[package]] -name = "type_hash" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c86f48f11992d3e379358c63cb25736c0b23944ff000d1583bbccad2b0b7c6" -dependencies = [ - "type_hash_core", - "type_hash_macros", -] - -[[package]] -name = "type_hash_core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87b1e93e2cd97790892dbe2d2813fbaa6eebaeb960265f59e363e79e51e4997a" -dependencies = [ - "fnv", -] - -[[package]] -name = "type_hash_macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "746fc164e076483ef087b3989f7aa80ffd9320fa558f3cb72cecfb9bb1dbc41e" -dependencies = [ - "either", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ug" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4eef2ebfc18c67a6dbcacd9d8a4d85e0568cc58c82515552382312c2730ea13" -dependencies = [ - "half", - "num", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "ug-cuda" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4dcab280ad0ef3957e153a82dcad608c954d02cf253b695322f502d1f8902e" -dependencies = [ - "cudarc", - "half", - "serde", - "serde_json", - "thiserror 1.0.69", - "ug", -] - -[[package]] -name = "ug-metal" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4ed1df2c20a1a138f993041f650cc84ff27aaefb4342b7f986e77d00e80799" -dependencies = [ - "half", - "metal 0.29.0", - "objc", - "serde", - "serde_json", - "thiserror 1.0.69", - "ug", -] - -[[package]] -name = "unicode-ident" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-normalization-alignments" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f613e4fa046e69818dd287fdc4bc78175ff20331479dab6e1b0f98d57062de" -dependencies = [ - "smallvec", -] - -[[package]] -name = "unicode-reverse" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6f4888ebc23094adfb574fdca9fdc891826287a6397d2cd28802ffd6f20c76" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-truncate" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" -dependencies = [ - "itertools 0.13.0", - "unicode-segmentation", - "unicode-width 0.1.14", -] - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unindent" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" -dependencies = [ - "base64 0.22.1", - "flate2", - "log", - "native-tls", - "once_cell", - "rustls", - "rustls-native-certs 0.7.3", - "rustls-pki-types", - "serde", - "serde_json", - "url", - "webpki-roots", -] - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" -dependencies = [ - "getrandom", - "rand", -] - -[[package]] -name = "v_frame" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "value-trait" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" -dependencies = [ - "float-cmp", - "halfbrown", - "itoa", - "ryu", -] - -[[package]] -name = "variadics_please" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.96", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-logger" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "074649a66bb306c8f2068c9016395fa65d8e08d2affcbf95acf3c24c3ab19718" -dependencies = [ - "log", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasm-timer" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" -dependencies = [ - "futures", - "js-sys", - "parking_lot 0.11.2", - "pin-utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "weezl" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" - -[[package]] -name = "wgan" -version = "0.1.0" -dependencies = [ - "burn 0.17.0", - "image", -] - -[[package]] -name = "wgpu" -version = "23.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" -dependencies = [ - "arrayvec", - "cfg_aliases 0.1.1", - "document-features", - "js-sys", - "log", - "naga 23.1.0", - "parking_lot 0.12.3", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core 23.0.1", - "wgpu-hal 23.0.1", - "wgpu-types 23.0.0", -] - -[[package]] -name = "wgpu" -version = "24.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47f55718f85c2fa756edffa0e7f0e0a60aba463d1362b57e23123c58f035e4b6" -dependencies = [ - "arrayvec", - "bitflags 2.8.0", - "cfg_aliases 0.2.1", - "document-features", - "js-sys", - "log", - "naga 24.0.0", - "parking_lot 0.12.3", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core 24.0.0", - "wgpu-hal 24.0.0", - "wgpu-types 24.0.0", -] - -[[package]] -name = "wgpu-core" -version = "23.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" -dependencies = [ - "arrayvec", - "bit-vec", - "bitflags 2.8.0", - "cfg_aliases 0.1.1", - "document-features", - "indexmap", - "log", - "naga 23.1.0", - "once_cell", - "parking_lot 0.12.3", - "profiling", - "raw-window-handle", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 1.0.69", - "wgpu-hal 23.0.1", - "wgpu-types 23.0.0", -] - -[[package]] -name = "wgpu-core" -version = "24.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a39b8842dc9ffcbe34346e3ab6d496b32a47f6497e119d762c97fcaae3cb37" -dependencies = [ - "arrayvec", - "bit-vec", - "bitflags 2.8.0", - "cfg_aliases 0.2.1", - "document-features", - "indexmap", - "log", - "naga 24.0.0", - "once_cell", - "parking_lot 0.12.3", - "profiling", - "raw-window-handle", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 2.0.11", - "wgpu-hal 24.0.0", - "wgpu-types 24.0.0", -] - -[[package]] -name = "wgpu-hal" -version = "23.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bit-set", - "bitflags 2.8.0", - "block", - "bytemuck", - "cfg_aliases 0.1.1", - "core-graphics-types", - "glow 0.14.2", - "glutin_wgl_sys", - "gpu-alloc", - "gpu-allocator", - "gpu-descriptor", - "js-sys", - "khronos-egl", - "libc", - "libloading", - "log", - "metal 0.29.0", - "naga 23.1.0", - "ndk-sys", - "objc", - "once_cell", - "parking_lot 0.12.3", - "profiling", - "range-alloc", - "raw-window-handle", - "renderdoc-sys", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 1.0.69", - "wasm-bindgen", - "web-sys", - "wgpu-types 23.0.0", - "windows 0.58.0", - "windows-core 0.58.0", -] - -[[package]] -name = "wgpu-hal" -version = "24.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a782e5056b060b0b4010881d1decddd059e44f2ecd01e2db2971b48ad3627e5" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bit-set", - "bitflags 2.8.0", - "block", - "bytemuck", - "cfg_aliases 0.2.1", - "core-graphics-types", - "glow 0.16.0", - "glutin_wgl_sys", - "gpu-alloc", - "gpu-allocator", - "gpu-descriptor", - "js-sys", - "khronos-egl", - "libc", - "libloading", - "log", - "metal 0.31.0", - "naga 24.0.0", - "ndk-sys", - "objc", - "once_cell", - "ordered-float", - "parking_lot 0.12.3", - "profiling", - "range-alloc", - "raw-window-handle", - "renderdoc-sys", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 2.0.11", - "wasm-bindgen", - "web-sys", - "wgpu-types 24.0.0", - "windows 0.58.0", - "windows-core 0.58.0", -] - -[[package]] -name = "wgpu-types" -version = "23.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" -dependencies = [ - "bitflags 2.8.0", - "js-sys", - "web-sys", -] - -[[package]] -name = "wgpu-types" -version = "24.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" -dependencies = [ - "bitflags 2.8.0", - "js-sys", - "log", - "web-sys", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result 0.2.0", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.6.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" -dependencies = [ - "memchr", -] - -[[package]] -name = "wrapcenum-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76ff259533532054cfbaefb115c613203c73707017459206380f03b3b3f266e" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "wsl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dab7ac864710bdea6594becbea5b5050333cf34fefb0dc319567eb347950d4" - -[[package]] -name = "x11rb" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" -dependencies = [ - "gethostname", - "rustix", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" - -[[package]] -name = "xattr" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" -dependencies = [ - "libc", - "linux-raw-sys", - "rustix", -] - -[[package]] -name = "xml-rs" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" - -[[package]] -name = "xtask" -version = "1.2.0" -dependencies = [ - "log", - "rstest", - "strum", - "tracel-xtask", -] - -[[package]] -name = "xxhash-rust" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq 0.1.5", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "zip" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" -dependencies = [ - "arbitrary", - "crc32fast", - "crossbeam-utils", - "displaydoc", - "indexmap", - "num_enum", - "thiserror 1.0.69", -] - -[[package]] -name = "zip" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" -dependencies = [ - "aes", - "arbitrary", - "bzip2", - "constant_time_eq 0.3.1", - "crc32fast", - "crossbeam-utils", - "deflate64", - "displaydoc", - "flate2", - "hmac", - "indexmap", - "lzma-rs", - "memchr", - "pbkdf2 0.12.2", - "rand", - "sha1", - "thiserror 2.0.11", - "time", - "zeroize", - "zopfli", - "zstd 0.13.2", -] - -[[package]] -name = "zopfli" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" -dependencies = [ - "bumpalo", - "crc32fast", - "lockfree-object-pool", - "log", - "once_cell", - "simd-adler32", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" -dependencies = [ - "zstd-safe 7.2.1", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-safe" -version = "7.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zune-jpeg" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" -dependencies = [ - "zune-core", -] From d5553186562b3f9e58de46238fc977c407fa5805 Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Fri, 31 Jan 2025 11:17:08 +0800 Subject: [PATCH 11/14] use backend for inference --- examples/modern-lstm/README.md | 6 +++--- examples/modern-lstm/examples/infer.rs | 23 ++++++++++------------- examples/modern-lstm/output/config.json | 23 ----------------------- examples/modern-lstm/output/model.mpk | Bin 58001 -> 0 bytes 4 files changed, 13 insertions(+), 39 deletions(-) delete mode 100644 examples/modern-lstm/output/config.json delete mode 100644 examples/modern-lstm/output/model.mpk diff --git a/examples/modern-lstm/README.md b/examples/modern-lstm/README.md index 8a5f75ba95..f9225e31c0 100644 --- a/examples/modern-lstm/README.md +++ b/examples/modern-lstm/README.md @@ -29,9 +29,9 @@ cargo run --example train --release --features tch-gpu cargo run --example train --release --features tch-cpu # NdArray backend (CPU) -cargo run --example train --release --features ndarray # f32 - single thread -cargo run --example train --release --features ndarray-blas-openblas # f32 - blas with openblas -cargo run --example train --release --features ndarray-blas-netlib # f32 - blas with netlib +cargo run --example train --release --features ndarray +cargo run --example train --release --features ndarray-blas-openblas +cargo run --example train --release --features ndarray-blas-netlib ``` diff --git a/examples/modern-lstm/examples/infer.rs b/examples/modern-lstm/examples/infer.rs index 50cd80b541..e7618775f9 100644 --- a/examples/modern-lstm/examples/infer.rs +++ b/examples/modern-lstm/examples/infer.rs @@ -12,22 +12,20 @@ pub fn launch(device: B::Device) { ))] mod ndarray { use burn::backend::{ - ndarray::{NdArray, NdArrayDevice}, - Autodiff, + ndarray::{NdArray, NdArrayDevice} }; use crate::launch; pub fn run() { - launch::>(NdArrayDevice::Cpu); + launch::(NdArrayDevice::Cpu); } } #[cfg(feature = "tch-gpu")] mod tch_gpu { use burn::backend::{ - libtorch::{LibTorch, LibTorchDevice}, - Autodiff, + libtorch::{LibTorch, LibTorchDevice} }; use crate::launch; @@ -38,41 +36,40 @@ mod tch_gpu { #[cfg(target_os = "macos")] let device = LibTorchDevice::Mps; - launch::>(device); + launch::(device); } } #[cfg(feature = "tch-cpu")] mod tch_cpu { use burn::backend::{ - libtorch::{LibTorch, LibTorchDevice}, - Autodiff, + libtorch::{LibTorch, LibTorchDevice} }; use crate::launch; pub fn run() { - launch::>(LibTorchDevice::Cpu); + launch::(LibTorchDevice::Cpu); } } #[cfg(feature = "wgpu")] mod wgpu { use crate::launch; - use burn::backend::{wgpu::Wgpu, Autodiff}; + use burn::backend::wgpu::Wgpu; pub fn run() { - launch::>(Default::default()); + launch::(Default::default()); } } #[cfg(feature = "cuda-jit")] mod cuda_jit { use crate::launch; - use burn::backend::{Autodiff, CudaJit}; + use burn::backend::CudaJit; pub fn run() { - launch::>(Default::default()); + launch::(Default::default()); } } diff --git a/examples/modern-lstm/output/config.json b/examples/modern-lstm/output/config.json deleted file mode 100644 index cebd85f7ce..0000000000 --- a/examples/modern-lstm/output/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "model": { - "input_size": 1, - "hidden_size": 32, - "num_layers": 2, - "output_size": 1, - "dropout": 0.1, - "bidirectional": true - }, - "optimizer": { - "weight_decay": null, - "grad_clipping": { - "Norm": 1.0 - }, - "beta_1": 0.9, - "beta_2": 0.999, - "epsilon": 0.00001 - }, - "num_epochs": 30, - "batch_size": 32, - "num_workers": 2, - "lr": 0.001 -} \ No newline at end of file diff --git a/examples/modern-lstm/output/model.mpk b/examples/modern-lstm/output/model.mpk deleted file mode 100644 index 7d6a853be5909bc1e2f34d3f19f4269cb8475d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58001 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 z 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 Chd=@V From 68a0f93219c6482a7ef853dfac8a0e936c0b1fc1 Mon Sep 17 00:00:00 2001 From: wangjiawen2013 Date: Fri, 31 Jan 2025 11:24:50 +0800 Subject: [PATCH 12/14] update readme --- examples/modern-lstm/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/modern-lstm/README.md b/examples/modern-lstm/README.md index f9225e31c0..d5a851baa1 100644 --- a/examples/modern-lstm/README.md +++ b/examples/modern-lstm/README.md @@ -1,5 +1,5 @@ # Advanced LSTM Implementation with Burn -A sophisticated implementation of Long Short-Term Memory (LSTM) networks in Burn, featuring state-of-the-art architectural enhancements and optimizations. This implementation includes bidirectional processing capabilities and advanced regularization techniques, making it suitable for both research and production environments. More details can be found at the [PyTorch implementation](https://github.com/shiv08/Advanced-LSTM-Implementation-with-PyTorch). +A sophisticated implementation of Long Short-Term Memory (LSTM) networks in Burn, featuring state-of-the-art architectural enhancements and optimizations. This implementation includes bidirectional processing capabilities and advanced regularization techniques. More details can be found at the [PyTorch implementation](https://github.com/shiv08/Advanced-LSTM-Implementation-with-PyTorch). `LstmNetwork` is the top-level module with bidirectional support and output projection. It can support multiple LSTM variants by setting appropriate `bidirectional` and `num_layers`: * LSTM: `num_layers = 1` and `bidirectional = false` From 9bdc8e90317539de7ef6296634c9969fec2d39cd Mon Sep 17 00:00:00 2001 From: Guillaume Lagrange Date: Mon, 3 Feb 2025 10:38:55 -0500 Subject: [PATCH 13/14] Update README + fix main changes --- Cargo.lock | 11 ++++++ examples/modern-lstm/Cargo.toml | 2 +- examples/modern-lstm/README.md | 38 ++++++++++--------- .../examples/{infer.rs => lstm-infer.rs} | 24 +++++------- .../examples/{train.rs => lstm-train.rs} | 18 ++++----- 5 files changed, 50 insertions(+), 43 deletions(-) rename examples/modern-lstm/examples/{infer.rs => lstm-infer.rs} (78%) rename examples/modern-lstm/examples/{train.rs => lstm-train.rs} (85%) diff --git a/Cargo.lock b/Cargo.lock index ab9eddb0bd..c9ce522699 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3855,6 +3855,17 @@ dependencies = [ "burn-import", ] +[[package]] +name = "modern-lstm" +version = "0.1.0" +dependencies = [ + "burn", + "polars", + "rand", + "rand_distr", + "serde", +] + [[package]] name = "monostate" version = "0.1.13" diff --git a/examples/modern-lstm/Cargo.toml b/examples/modern-lstm/Cargo.toml index 74f0e62015..86855e9ad4 100644 --- a/examples/modern-lstm/Cargo.toml +++ b/examples/modern-lstm/Cargo.toml @@ -11,7 +11,7 @@ ndarray-blas-openblas = ["burn/ndarray", "burn/openblas"] tch-cpu = ["burn/tch"] tch-gpu = ["burn/tch"] wgpu = ["burn/wgpu"] -cuda-jit = ["burn/cuda-jit"] +cuda = ["burn/cuda"] [dependencies] burn = { path = "../../crates/burn", features=["train"] } diff --git a/examples/modern-lstm/README.md b/examples/modern-lstm/README.md index d5a851baa1..832851a1f0 100644 --- a/examples/modern-lstm/README.md +++ b/examples/modern-lstm/README.md @@ -1,42 +1,46 @@ # Advanced LSTM Implementation with Burn -A sophisticated implementation of Long Short-Term Memory (LSTM) networks in Burn, featuring state-of-the-art architectural enhancements and optimizations. This implementation includes bidirectional processing capabilities and advanced regularization techniques. More details can be found at the [PyTorch implementation](https://github.com/shiv08/Advanced-LSTM-Implementation-with-PyTorch). -`LstmNetwork` is the top-level module with bidirectional support and output projection. It can support multiple LSTM variants by setting appropriate `bidirectional` and `num_layers`: -* LSTM: `num_layers = 1` and `bidirectional = false` -* Stacked LSTM: `num_layers > 1` and `bidirectional = false` -* Bidirectional LSTM: `num_layers = 1` and `bidirectional = true` -* Bidirectional Stacked LSTM: `num_layers > 1` and `bidirectional = true` +A more advanced implementation of Long Short-Term Memory (LSTM) networks in Burn with combined +weight matrices for the input and hidden states, based on the +[PyTorch implementation](https://github.com/shiv08/Advanced-LSTM-Implementation-with-PyTorch). -This implementation is complementary to Burn's official LSTM, users can choose either one depends on the project's specific needs. +`LstmNetwork` is the top-level module with bidirectional and regularization support. The LSTM +variants differ by `bidirectional` and `num_layers` settings: -## Usage +- LSTM: `num_layers = 1` and `bidirectional = false` +- Stacked LSTM: `num_layers > 1` and `bidirectional = false` +- Bidirectional LSTM: `num_layers = 1` and `bidirectional = true` +- Bidirectional Stacked LSTM: `num_layers > 1` and `bidirectional = true` + +This implementation is complementary to Burn's official LSTM, users can choose either one depends on +the project's specific needs. +## Usage ## Training ```sh # Cuda backend -cargo run --example train --release --features cuda-jit +cargo run --example lstm-train --release --features cuda-jit # Wgpu backend -cargo run --example train --release --features wgpu +cargo run --example lstm-train --release --features wgpu # Tch GPU backend export TORCH_CUDA_VERSION=cu121 # Set the cuda version -cargo run --example train --release --features tch-gpu +cargo run --example lstm-train --release --features tch-gpu # Tch CPU backend -cargo run --example train --release --features tch-cpu +cargo run --example lstm-train --release --features tch-cpu # NdArray backend (CPU) -cargo run --example train --release --features ndarray -cargo run --example train --release --features ndarray-blas-openblas -cargo run --example train --release --features ndarray-blas-netlib +cargo run --example lstm-train --release --features ndarray +cargo run --example lstm-train --release --features ndarray-blas-openblas +cargo run --example lstm-train --release --features ndarray-blas-netlib ``` - ### Inference ```sh -cargo run --example infer --release --features cuda-jit +cargo run --example lstm-infer --release --features cuda-jit ``` diff --git a/examples/modern-lstm/examples/infer.rs b/examples/modern-lstm/examples/lstm-infer.rs similarity index 78% rename from examples/modern-lstm/examples/infer.rs rename to examples/modern-lstm/examples/lstm-infer.rs index e7618775f9..f601d08c79 100644 --- a/examples/modern-lstm/examples/infer.rs +++ b/examples/modern-lstm/examples/lstm-infer.rs @@ -11,9 +11,7 @@ pub fn launch(device: B::Device) { feature = "ndarray-blas-accelerate", ))] mod ndarray { - use burn::backend::{ - ndarray::{NdArray, NdArrayDevice} - }; + use burn::backend::ndarray::{NdArray, NdArrayDevice}; use crate::launch; @@ -24,9 +22,7 @@ mod ndarray { #[cfg(feature = "tch-gpu")] mod tch_gpu { - use burn::backend::{ - libtorch::{LibTorch, LibTorchDevice} - }; + use burn::backend::libtorch::{LibTorch, LibTorchDevice}; use crate::launch; @@ -42,9 +38,7 @@ mod tch_gpu { #[cfg(feature = "tch-cpu")] mod tch_cpu { - use burn::backend::{ - libtorch::{LibTorch, LibTorchDevice} - }; + use burn::backend::libtorch::{LibTorch, LibTorchDevice}; use crate::launch; @@ -63,13 +57,13 @@ mod wgpu { } } -#[cfg(feature = "cuda-jit")] -mod cuda_jit { +#[cfg(feature = "cuda")] +mod cuda { use crate::launch; - use burn::backend::CudaJit; + use burn::backend::Cuda; pub fn run() { - launch::(Default::default()); + launch::(Default::default()); } } @@ -87,6 +81,6 @@ fn main() { tch_cpu::run(); #[cfg(feature = "wgpu")] wgpu::run(); - #[cfg(feature = "cuda-jit")] - cuda_jit::run(); + #[cfg(feature = "cuda")] + cuda::run(); } diff --git a/examples/modern-lstm/examples/train.rs b/examples/modern-lstm/examples/lstm-train.rs similarity index 85% rename from examples/modern-lstm/examples/train.rs rename to examples/modern-lstm/examples/lstm-train.rs index a4288564b5..454263d331 100644 --- a/examples/modern-lstm/examples/train.rs +++ b/examples/modern-lstm/examples/lstm-train.rs @@ -1,7 +1,5 @@ use burn::{ - grad_clipping::GradientClippingConfig, - optim::AdamConfig, - tensor::backend::AutodiffBackend + grad_clipping::GradientClippingConfig, optim::AdamConfig, tensor::backend::AutodiffBackend, }; use modern_lstm::{model::LstmNetworkConfig, training::TrainingConfig}; @@ -9,7 +7,7 @@ pub fn launch(device: B::Device) { let config = TrainingConfig::new( LstmNetworkConfig::new(), // Gradient clipping via optimizer config - AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))) + AdamConfig::new().with_grad_clipping(Some(GradientClippingConfig::Norm(1.0))), ); modern_lstm::training::train::("/tmp/modern-lstm", config, device); @@ -77,13 +75,13 @@ mod wgpu { } } -#[cfg(feature = "cuda-jit")] -mod cuda_jit { +#[cfg(feature = "cuda")] +mod cuda { use crate::launch; - use burn::backend::{cuda_jit::CudaDevice, Autodiff, CudaJit}; + use burn::backend::{cuda::CudaDevice, Autodiff, Cuda}; pub fn run() { - launch::>(CudaDevice::default()); + launch::>(CudaDevice::default()); } } @@ -101,6 +99,6 @@ fn main() { tch_cpu::run(); #[cfg(feature = "wgpu")] wgpu::run(); - #[cfg(feature = "cuda-jit")] - cuda_jit::run(); + #[cfg(feature = "cuda")] + cuda::run(); } From af755645b20b2b2bac8fb0b634d4690e83afaffd Mon Sep 17 00:00:00 2001 From: Guillaume Lagrange Date: Mon, 3 Feb 2025 10:48:31 -0500 Subject: [PATCH 14/14] Fix clippy --- examples/modern-lstm/src/model.rs | 7 +++---- examples/modern-lstm/src/training.rs | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/modern-lstm/src/model.rs b/examples/modern-lstm/src/model.rs index ebf6b3bc08..268de59a0b 100644 --- a/examples/modern-lstm/src/model.rs +++ b/examples/modern-lstm/src/model.rs @@ -52,6 +52,7 @@ impl LstmCellConfig { // Initialize parameters using best practices: // 1. Orthogonal initialization for better gradient flow (here we use Xavier because of the lack of Orthogonal in burn) // 2. Initialize forget gate bias to 1.0 to prevent forgetting at start of training + #[allow(clippy::single_range_in_vec_init)] pub fn init(&self, device: &B::Device) -> LstmCell { let initializer = Initializer::XavierNormal { gain: 1.0 }; let init_bias = Tensor::::ones([self.hidden_size], device); @@ -352,12 +353,10 @@ impl LstmNetwork { // Apply dropout before final layer output = self.dropout.forward(output); // Use final timestep output for prediction - let final_output = self.fc.forward( + self.fc.forward( output .slice([None, Some((seq_length - 1, seq_length)), None]) .squeeze::<2>(1), - ); - - final_output + ) } } diff --git a/examples/modern-lstm/src/training.rs b/examples/modern-lstm/src/training.rs index a74babd509..9f6af81328 100644 --- a/examples/modern-lstm/src/training.rs +++ b/examples/modern-lstm/src/training.rs @@ -82,7 +82,7 @@ pub fn train(artifact_dir: &str, config: TrainingConfig, dev let mut valid_loss = 0.0; // Implement our training loop - for (_iteration, batch) in dataloader_train.iter().enumerate() { + for batch in dataloader_train.iter() { let output = model.forward(batch.sequences, None); let loss = MseLoss::new().forward(output, batch.targets.clone(), Mean); train_loss += loss.clone().into_scalar().elem::() * batch.targets.dims()[0] as f32; @@ -103,7 +103,7 @@ pub fn train(artifact_dir: &str, config: TrainingConfig, dev let valid_model = model.valid(); // Implement our validation loop - for (_iteration, batch) in dataloader_valid.iter().enumerate() { + for batch in dataloader_valid.iter() { let output = valid_model.forward(batch.sequences, None); let loss = MseLoss::new().forward(output, batch.targets.clone(), Mean); valid_loss += loss.clone().into_scalar().elem::() * batch.targets.dims()[0] as f32;