From 5c6151c7c210f7b215364e84e4e304a5035961b2 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 27 Jun 2024 11:26:18 +0200 Subject: [PATCH 01/36] fix: use malloc_trim to cleanup pages (#307) --- Cargo.lock | 1455 ++++++++++++++++++++++++------------ Cargo.toml | 15 +- backends/Cargo.toml | 6 +- backends/candle/Cargo.toml | 16 +- backends/core/Cargo.toml | 6 +- backends/src/lib.rs | 11 +- core/Cargo.toml | 13 +- core/src/infer.rs | 179 ++--- core/src/queue.rs | 29 +- core/src/tokenization.rs | 36 +- load_tests/load.js | 7 +- load_tests/load_grpc.js | 4 +- router/Cargo.toml | 51 +- router/src/grpc/server.rs | 59 +- router/src/http/server.rs | 114 ++- router/src/lib.rs | 27 +- router/src/logging.rs | 8 +- router/src/main.rs | 18 +- router/src/shutdown.rs | 1 - 19 files changed, 1317 insertions(+), 738 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2b494010..cf8e1c0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "415ed64958754dbe991900f3940677e6a7eefb4d7367afd70d642677b0c7d19d" [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -61,47 +61,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -109,13 +110,34 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" dependencies = [ "backtrace", ] +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[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-stream" version = "0.3.5" @@ -135,7 +157,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -146,14 +168,47 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "aws-lc-rs" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a47f2fb521b70c11ce7369a6c5fa4bd6af7e5d62ec06303875bafe7c6ba245" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2927c7af777b460b7ccd95f8b67acd7b4c04ec8896bf0c8e80ba30523cffc057" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] [[package]] name = "axum" @@ -168,7 +223,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "itoa", "matchit", "memchr", @@ -257,19 +312,19 @@ dependencies = [ [[package]] name = "axum-tracing-opentelemetry" -version = "0.17.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91387a3e9f6aa45f112cd05d1e5430f9ba40b51440849e4760a5dd51b736149f" +checksum = "f26965dca35be1ca4a128177b9302c4c04f0661443621171adb09d002dcdf1d5" dependencies = [ "axum 0.7.5", "futures-core", "futures-util", "http 1.1.0", - "opentelemetry 0.21.0", + "opentelemetry 0.22.0", "pin-project-lite", "tower", "tracing", - "tracing-opentelemetry 0.22.0", + "tracing-opentelemetry 0.23.0", "tracing-opentelemetry-instrumentation-sdk", ] @@ -290,9 +345,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -323,9 +378,32 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease 0.2.20", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.68", + "which", +] [[package]] name = "bindgen_cuda" @@ -361,9 +439,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block" @@ -388,22 +466,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -442,7 +520,7 @@ dependencies = [ "safetensors", "thiserror", "yoke", - "zip", + "zip 0.6.6", ] [[package]] @@ -558,9 +636,23 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.95" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cexpr" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] [[package]] name = "cfg-if" @@ -582,11 +674,22 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" -version = "4.5.4" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" dependencies = [ "clap_builder", "clap_derive", @@ -594,39 +697,57 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + +[[package]] +name = "cmake" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[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" @@ -679,18 +800,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -716,9 +837,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -746,9 +867,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -756,27 +877,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.60", + "strsim", + "syn 2.0.68", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -786,7 +907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -801,6 +922,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "derive_builder" version = "0.20.0" @@ -819,7 +951,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -829,7 +961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -872,6 +1004,23 @@ dependencies = [ "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.68", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "dyn-stack" version = "0.10.0" @@ -884,9 +1033,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -912,7 +1061,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -923,9 +1072,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -940,6 +1089,27 @@ dependencies = [ "cc", ] +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fancy-regex" version = "0.13.0" @@ -947,15 +1117,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "filetime" @@ -965,7 +1135,7 @@ checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "windows-sys 0.52.0", ] @@ -977,9 +1147,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -1018,7 +1188,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1042,6 +1212,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" version = "0.3.30" @@ -1098,7 +1274,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1147,7 +1323,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1162,7 +1338,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1177,7 +1353,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1195,7 +1371,7 @@ dependencies = [ "once_cell", "paste", "pulp", - "raw-cpuid", + "raw-cpuid 10.7.0", "rayon", "seq-macro", "sysctl", @@ -1214,7 +1390,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "rayon", "seq-macro", ] @@ -1230,7 +1406,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1245,7 +1421,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1261,9 +1437,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1284,9 +1460,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1323,6 +1499,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.4.1" @@ -1345,19 +1540,13 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.13.1" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - [[package]] name = "heck" version = "0.4.1" @@ -1379,17 +1568,17 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hf-hub" version = "0.3.2" -source = "git+https://github.com/huggingface/hf-hub?rev=b167f69692be5f49eb8003788f7f8a499a98b096#b167f69692be5f49eb8003788f7f8a499a98b096" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b780635574b3d92f036890d8373433d6f9fc7abb320ee42a5c25897fc8ed732" dependencies = [ "dirs", "futures", - "http 1.1.0", "indicatif", "log", "native-tls", "num_cpus", "rand", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1451,12 +1640,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http 1.1.0", "http-body 1.0.0", "pin-project-lite", @@ -1464,9 +1653,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1476,15 +1665,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -1507,6 +1696,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -1515,6 +1705,27 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.3.1", + "hyper-util", + "log", + "rustls 0.23.10", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", ] [[package]] @@ -1523,7 +1734,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.28", + "hyper 0.14.29", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1536,19 +1747,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.28", + "hyper 0.14.29", "native-tls", "tokio", "tokio-native-tls", ] +[[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 1.3.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", + "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", @@ -1556,6 +1784,9 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -1614,7 +1845,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "serde", ] @@ -1633,15 +1864,16 @@ dependencies = [ [[package]] name = "init-tracing-opentelemetry" -version = "0.14.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bd26b1b737bc11f183620072e188d1c6ede67e0e78682228d66b49ec510e17" +checksum = "754367a7e7f9314afe3ee9780ba8b8ea2cab487cdc8017c9794793051242f878" dependencies = [ - "opentelemetry 0.20.0", - "opentelemetry-otlp", + "opentelemetry 0.22.0", + "opentelemetry-otlp 0.15.0", + "opentelemetry_sdk 0.22.1", "thiserror", "tracing", - "tracing-opentelemetry 0.21.0", + "tracing-opentelemetry 0.23.0", ] [[package]] @@ -1660,9 +1892,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -1704,6 +1936,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.10.5" @@ -1737,6 +1975,15 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -1748,15 +1995,31 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloading" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] [[package]] name = "libm" @@ -1766,9 +2029,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libmimalloc-sys" -version = "0.1.37" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81eb4061c0582dedea1cbc7aff2240300dd6982e0239d1c99e65c1dbf4a30ba7" +checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" dependencies = [ "cc", "libc", @@ -1780,7 +2043,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -1792,15 +2055,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1812,15 +2075,6 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - [[package]] name = "macro_rules_attribute" version = "0.2.0" @@ -1863,9 +2117,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -1883,7 +2137,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -1894,24 +2148,26 @@ dependencies = [ [[package]] name = "metrics" -version = "0.21.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +checksum = "884adb57038347dfbaf2d5065887b6cf4312330dc8e94bc30a1a839bd79d3261" dependencies = [ "ahash", - "metrics-macros", "portable-atomic", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.12.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" +checksum = "bf0af7a0d7ced10c0151f870e5e3f3f8bc9ffc5992d32873566ca1f9169ae776" dependencies = [ - "base64 0.21.7", - "hyper 0.14.28", - "indexmap 1.9.3", + "base64 0.22.1", + "http-body-util", + "hyper 1.3.1", + "hyper-rustls", + "hyper-util", + "indexmap 2.2.6", "ipnet", "metrics", "metrics-util", @@ -1921,26 +2177,15 @@ dependencies = [ "tracing", ] -[[package]] -name = "metrics-macros" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] - [[package]] name = "metrics-util" -version = "0.15.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +checksum = "4259040465c955f9f2f1a4a8a16dc46726169bca0f88e8fb2dbeced487c3e828" dependencies = [ "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.13.1", + "hashbrown 0.14.5", "metrics", "num_cpus", "quanta", @@ -1949,9 +2194,9 @@ dependencies = [ [[package]] name = "mimalloc" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f41a2280ded0da56c8cf898babb86e8f10651a34adcfff190ae9a1159c6908d" +checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633" dependencies = [ "libmimalloc-sys", ] @@ -1980,9 +2225,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -1998,11 +2243,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + [[package]] name = "monostate" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20fffcd8ca4c69d31e036a71abc400147b41f90895df4edcb36497a1f8af8bf" +checksum = "0d208407d7552cd041d8cdb69a1bc3303e029c598738177a3d87082004dc0e1e" dependencies = [ "monostate-impl", "serde", @@ -2010,13 +2261,13 @@ dependencies = [ [[package]] name = "monostate-impl" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf307cbbbd777a9c10cec88ddafee572b3484caad5cce0c9236523c3803105a6" +checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2033,11 +2284,10 @@ checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2077,9 +2327,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "bytemuck", "num-traits", @@ -2093,9 +2343,9 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -2111,6 +2361,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -2147,9 +2418,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] @@ -2174,7 +2445,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb3293021f06540803301af45e7ab81693d50e89a7398a3420bdab139e7ba5e" dependencies = [ "base16ct", - "base64 0.22.0", + "base64 0.22.1", "chrono", "directories", "flate2", @@ -2228,7 +2499,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2245,7 +2516,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2272,102 +2543,116 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" dependencies = [ - "opentelemetry_api 0.19.0", + "opentelemetry_api", "opentelemetry_sdk 0.19.0", ] [[package]] name = "opentelemetry" -version = "0.20.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" +checksum = "900d57987be3f2aeb70d385fff9b27fb74c5723cc9a52d904d4f9c807a0667bf" dependencies = [ - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", ] [[package]] name = "opentelemetry" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" +checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.2.6", "js-sys", "once_cell", "pin-project-lite", "thiserror", - "urlencoding", ] [[package]] name = "opentelemetry-otlp" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" +checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" dependencies = [ "async-trait", "futures-core", "http 0.2.12", - "opentelemetry-proto", + "opentelemetry 0.22.0", + "opentelemetry-proto 0.5.0", "opentelemetry-semantic-conventions", - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", - "prost 0.11.9", + "opentelemetry_sdk 0.22.1", + "prost 0.12.6", "thiserror", "tokio", - "tonic 0.9.2", + "tonic 0.11.0", ] [[package]] -name = "opentelemetry-proto" -version = "0.3.0" +name = "opentelemetry-otlp" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb" +checksum = "a94c69209c05319cdf7460c6d4c055ed102be242a0a6245835d7bc42c6ec7f54" dependencies = [ - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", - "prost 0.11.9", - "tonic 0.9.2", + "async-trait", + "futures-core", + "http 0.2.12", + "opentelemetry 0.23.0", + "opentelemetry-proto 0.6.0", + "opentelemetry_sdk 0.23.0", + "prost 0.12.6", + "thiserror", + "tokio", + "tonic 0.11.0", ] [[package]] -name = "opentelemetry-semantic-conventions" -version = "0.12.0" +name = "opentelemetry-proto" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269" +checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" dependencies = [ - "opentelemetry 0.20.0", + "opentelemetry 0.22.0", + "opentelemetry_sdk 0.22.1", + "prost 0.12.6", + "tonic 0.11.0", ] [[package]] -name = "opentelemetry_api" -version = "0.19.0" +name = "opentelemetry-proto" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" +checksum = "984806e6cf27f2b49282e2a05e288f30594f3dbc74eb7a6e99422bc48ed78162" dependencies = [ - "fnv", - "futures-channel", - "futures-util", - "indexmap 1.9.3", - "once_cell", - "pin-project-lite", - "thiserror", - "urlencoding", + "opentelemetry 0.23.0", + "opentelemetry_sdk 0.23.0", + "prost 0.12.6", + "tonic 0.11.0", ] +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" + [[package]] name = "opentelemetry_api" -version = "0.20.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" +checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" dependencies = [ + "fnv", "futures-channel", "futures-util", "indexmap 1.9.3", - "js-sys", "once_cell", "pin-project-lite", "thiserror", @@ -2388,7 +2673,7 @@ dependencies = [ "futures-executor", "futures-util", "once_cell", - "opentelemetry_api 0.19.0", + "opentelemetry_api", "percent-encoding", "rand", "thiserror", @@ -2396,22 +2681,21 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.20.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" +checksum = "9e90c7113be649e31e9a0f8b5ee24ed7a16923b322c3c5ab6367469c049d6b7e" dependencies = [ "async-trait", "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", + "glob", "once_cell", - "opentelemetry_api 0.20.0", - "ordered-float 3.9.2", + "opentelemetry 0.22.0", + "ordered-float", "percent-encoding", "rand", - "regex", - "serde_json", "thiserror", "tokio", "tokio-stream", @@ -2419,38 +2703,31 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.21.2" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f16aec8a98a457a52664d69e0091bac3a0abd18ead9b641cb00202ba4e0efe4" +checksum = "ae312d58eaa90a82d2e627fd86e075cf5230b3f11794e2ed74199ebbe572d4fd" dependencies = [ "async-trait", - "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", "glob", + "lazy_static", "once_cell", - "opentelemetry 0.21.0", - "ordered-float 4.2.0", + "opentelemetry 0.23.0", + "ordered-float", "percent-encoding", "rand", "thiserror", + "tokio", + "tokio-stream", ] [[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 = "3.9.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" -dependencies = [ - "num-traits", -] +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" @@ -2467,11 +2744,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2479,22 +2762,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" @@ -2504,9 +2787,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap 2.2.6", @@ -2529,7 +2812,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2580,12 +2863,21 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.19" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.60", + "syn 2.0.68", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", ] [[package]] @@ -2614,9 +2906,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -2633,12 +2925,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.12.4", + "prost-derive 0.12.6", ] [[package]] @@ -2665,9 +2957,9 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", "heck 0.5.0", @@ -2676,11 +2968,11 @@ dependencies = [ "multimap 0.10.0", "once_cell", "petgraph", - "prettyplease 0.2.19", - "prost 0.12.4", - "prost-types 0.12.4", + "prettyplease 0.2.20", + "prost 0.12.6", + "prost-types 0.12.6", "regex", - "syn 2.0.60", + "syn 2.0.68", "tempfile", ] @@ -2699,15 +2991,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2721,18 +3013,18 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ - "prost 0.12.4", + "prost 0.12.6", ] [[package]] name = "pulp" -version = "0.18.10" +version = "0.18.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14989307e408d9f4245d4fda09a7b144a08114ba124e26cab60ab83dc98db10" +checksum = "0ec8d02258294f59e4e223b41ad7e81c874aa6b15bc4ced9ba3965826da0eed5" dependencies = [ "bytemuck", "libm", @@ -2742,20 +3034,66 @@ dependencies = [ [[package]] name = "quanta" -version = "0.11.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" dependencies = [ "crossbeam-utils", "libc", - "mach2", "once_cell", - "raw-cpuid", + "raw-cpuid 11.0.2", "wasi", "web-sys", "winapi", ] +[[package]] +name = "quinn" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.10", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls 0.23.10", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.36" @@ -2814,6 +3152,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "raw-cpuid" +version = "11.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "rayon" version = "1.10.0" @@ -2860,6 +3207,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "redox_users" version = "0.4.5" @@ -2873,14 +3229,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -2894,13 +3250,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] @@ -2911,9 +3267,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -2926,11 +3282,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", - "hyper-tls", + "hyper 0.14.29", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", @@ -2939,7 +3295,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", @@ -2952,7 +3308,56 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.10", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg 0.52.0", ] [[package]] @@ -2972,9 +3377,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.3.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" +checksum = "19549741604902eb99a7ed0ee177a0663ee1eda51a29f71401f166e47e77806a" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -2983,22 +3388,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.3.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" +checksum = "cb9f96e283ec64401f30d3df8ee2aaeb2561f34c824381efa24a35f79bf40ee4" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.60", + "syn 2.0.68", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.3.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" +checksum = "38c74a686185620830701348de757fd36bef4aa9680fd23c49fc539ddcc1af32" dependencies = [ "sha2", "walkdir", @@ -3006,9 +3411,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +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 = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" @@ -3016,7 +3427,7 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3037,6 +3448,35 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls" +version = "0.23.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3046,18 +3486,29 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -3065,15 +3516,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safetensors" @@ -3111,11 +3562,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3124,9 +3575,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -3140,29 +3591,29 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", @@ -3190,9 +3641,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -3244,7 +3695,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3267,6 +3718,12 @@ 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-registry" version = "1.4.2" @@ -3305,25 +3762,14 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "socks" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" -dependencies = [ - "byteorder", - "libc", - "winapi", -] - [[package]] name = "spin" version = "0.9.8" @@ -3348,12 +3794,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -3362,9 +3802,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3379,9 +3819,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -3408,7 +3848,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3417,7 +3857,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "byteorder", "enum-as-inner", "libc", @@ -3448,9 +3888,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -3538,6 +3978,7 @@ dependencies = [ name = "text-embeddings-core" version = "1.2.3" dependencies = [ + "async-channel", "hf-hub", "metrics", "text-embeddings-backend", @@ -3555,7 +3996,7 @@ dependencies = [ "async-stream", "axum 0.7.5", "axum-tracing-opentelemetry", - "base64 0.21.7", + "base64 0.22.1", "clap", "futures", "hf-hub", @@ -3563,14 +4004,16 @@ dependencies = [ "init-tracing-opentelemetry", "insta", "is_close", + "libc", "metrics", "metrics-exporter-prometheus", "mimalloc", "num_cpus", - "opentelemetry 0.20.0", - "opentelemetry-otlp", - "prost 0.12.4", - "reqwest", + "opentelemetry 0.23.0", + "opentelemetry-otlp 0.16.0", + "opentelemetry_sdk 0.23.0", + "prost 0.12.6", + "reqwest 0.12.5", "serde", "serde_json", "text-embeddings-backend", @@ -3580,12 +4023,12 @@ dependencies = [ "tokio", "tokio-stream", "tonic 0.11.0", - "tonic-build 0.10.2", + "tonic-build 0.11.0", "tonic-health", "tonic-reflection", "tower-http", "tracing", - "tracing-opentelemetry 0.21.0", + "tracing-opentelemetry 0.24.0", "tracing-subscriber", "utoipa", "utoipa-swagger-ui", @@ -3595,22 +4038,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3658,9 +4101,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -3692,7 +4135,7 @@ dependencies = [ "rayon", "rayon-cond", "regex", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", "serde", "serde_json", "spm_precompiled", @@ -3704,9 +4147,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -3733,13 +4176,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3752,6 +4195,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.10", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -3765,50 +4219,60 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.14", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.12" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.13", ] [[package]] @@ -3823,10 +4287,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "hyper-timeout", "percent-encoding", "pin-project", @@ -3850,14 +4314,14 @@ dependencies = [ "axum 0.6.20", "base64 0.21.7", "bytes", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.4", + "prost 0.12.6", "tokio", "tokio-stream", "tower", @@ -3881,15 +4345,15 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" +checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ - "prettyplease 0.2.19", + "prettyplease 0.2.20", "proc-macro2", - "prost-build 0.12.4", + "prost-build 0.12.6", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3899,7 +4363,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cef6e24bc96871001a7e48e820ab240b3de2201e59b517cf52835df2f1d2350" dependencies = [ "async-stream", - "prost 0.12.4", + "prost 0.12.6", "tokio", "tokio-stream", "tonic 0.11.0", @@ -3911,8 +4375,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "548c227bd5c0fae5925812c4ec6c66ffcfced23ea370cb823f4d18f0fc1cb6a7" dependencies = [ - "prost 0.12.4", - "prost-types 0.12.4", + "prost 0.12.6", + "prost-types 0.12.6", "tokio", "tokio-stream", "tonic 0.11.0", @@ -3944,7 +4408,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "bytes", "http 1.1.0", "http-body 1.0.0", @@ -3986,7 +4450,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -4037,30 +4501,32 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75327c6b667828ddc28f5e3f169036cb793c3f588d83bf0f262a7f062ffed3c8" +checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" dependencies = [ + "js-sys", "once_cell", - "opentelemetry 0.20.0", - "opentelemetry_sdk 0.20.0", + "opentelemetry 0.22.0", + "opentelemetry_sdk 0.22.1", "smallvec", "tracing", "tracing-core", - "tracing-log 0.1.4", + "tracing-log 0.2.0", "tracing-subscriber", + "web-time", ] [[package]] name = "tracing-opentelemetry" -version = "0.22.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" +checksum = "f68803492bf28ab40aeccaecc7021096bd256baf7ca77c3d425d89b35a7be4e4" dependencies = [ "js-sys", "once_cell", - "opentelemetry 0.21.0", - "opentelemetry_sdk 0.21.2", + "opentelemetry 0.23.0", + "opentelemetry_sdk 0.23.0", "smallvec", "tracing", "tracing-core", @@ -4071,14 +4537,14 @@ dependencies = [ [[package]] name = "tracing-opentelemetry-instrumentation-sdk" -version = "0.17.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db99a4f5224920c499515a737e2749eb9a19b729b3880afc24594524e9861de" +checksum = "9a276058193f1b03d8279356215ec4c8c1bb21e40e5554bb239aa94fb2d8e189" dependencies = [ "http 1.1.0", - "opentelemetry 0.21.0", + "opentelemetry 0.22.0", "tracing", - "tracing-opentelemetry 0.22.0", + "tracing-opentelemetry 0.23.0", ] [[package]] @@ -4171,9 +4637,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode_categories" @@ -4195,30 +4661,29 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.6" +version = "2.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" +checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "flate2", "log", "native-tls", "once_cell", - "rustls", + "rustls 0.22.4", "rustls-pki-types", "rustls-webpki", "serde", "serde_json", - "socks", "url", "webpki-roots", ] [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -4233,15 +4698,15 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "utoipa" -version = "4.2.0" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "272ebdfbc99111033031d2f10e018836056e4d2c8e2acda76450ec7974269fa7" +checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ "indexmap 2.2.6", "serde", @@ -4251,38 +4716,40 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "4.2.0" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c9f4d08338c1bfa70dde39412a040a884c6f318b3d09aaaf3437a1e52027fc" +checksum = "7bf0e16c02bc4bf5322ab65f10ab1149bdbcaa782cba66dc7057370a3f8190be" dependencies = [ "proc-macro-error", "proc-macro2", "quote", "regex", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "utoipa-swagger-ui" -version = "6.0.0" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b39868d43c011961e04b41623e050aedf2cc93652562ff7935ce0f819aaf2da" +checksum = "943e0ff606c6d57d410fd5663a4d7c074ab2c5f14ab903b9514565e59fa1189e" dependencies = [ "axum 0.7.5", "mime_guess", "regex", + "reqwest 0.12.5", "rust-embed", "serde", "serde_json", + "url", "utoipa", - "zip", + "zip 1.1.4", ] [[package]] name = "uuid" -version = "1.8.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" dependencies = [ "getrandom", ] @@ -4317,7 +4784,7 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -4384,7 +4851,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -4418,7 +4885,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4441,9 +4908,9 @@ dependencies = [ [[package]] name = "web-time" -version = "0.2.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -4451,9 +4918,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] @@ -4651,9 +5118,18 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.6" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] @@ -4668,6 +5144,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "xattr" version = "1.3.1" @@ -4690,9 +5176,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" dependencies = [ "serde", "stable_deref_trait", @@ -4702,62 +5188,76 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "zerofrom" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.0" +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 = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] [[package]] name = "zip" @@ -4768,5 +5268,20 @@ dependencies = [ "byteorder", "crc32fast", "crossbeam-utils", +] + +[[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", "flate2", + "indexmap 2.2.6", + "num_enum", + "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index f8198679..950c900c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,13 +16,26 @@ edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" +[workspace.dependencies] +anyhow = "1.0.75" +clap = { version = "4.1", features = ["derive", "env"] } +hf-hub = { version = "0.3.2", features = ["tokio", "online"], default-features = false } +metrics = "0.23" +nohash-hasher = "0.2" +tokenizers = { version = "0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } +tokio = { version = "1.25", features = ["rt", "rt-multi-thread", "parking_lot", "sync", "signal"] } +tracing = "0.1" +serde = { version = "1.0", features = ["serde_derive"] } +serde_json = "1.0" +thiserror = "1.0" + + [patch.crates-io] cudarc = { git = "https://github.com/coreylowman/cudarc", rev = "c388e724af93a3e8fbe484f5ded2d8b3c1badd8e" } candle = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-core" } candle-nn = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-nn" } candle-transformers = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-transformers" } candle-flash-attn = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-flash-attn" } -hf-hub = { git = "https://github.com/huggingface/hf-hub", rev = "b167f69692be5f49eb8003788f7f8a499a98b096" } [profile.release] debug = 0 diff --git a/backends/Cargo.toml b/backends/Cargo.toml index 3a6797cb..d5659b18 100644 --- a/backends/Cargo.toml +++ b/backends/Cargo.toml @@ -6,12 +6,12 @@ authors.workspace = true homepage.workspace = true [dependencies] -clap = { version = "4.1.4", features = ["derive"], optional = true } +clap = { workspace = true, optional = true } text-embeddings-backend-core = { path = "core" } text-embeddings-backend-python = { path = "python", optional = true } text-embeddings-backend-candle = { path = "candle", optional = true } -tokio = { version = "^1.25", features = ["sync"] } -tracing = "^0.1" +tokio = { workspace = true } +tracing = { workspace = true } [features] clap = ["dep:clap", "text-embeddings-backend-core/clap"] diff --git a/backends/candle/Cargo.toml b/backends/candle/Cargo.toml index 9fb300b9..f26d213a 100644 --- a/backends/candle/Cargo.toml +++ b/backends/candle/Cargo.toml @@ -6,7 +6,7 @@ authors.workspace = true homepage.workspace = true [dependencies] -anyhow = "^1.0" +anyhow = { workspace = true } accelerate-src = { version = "0.3.2", optional = true } intel-mkl-src = { version = "0.8.1", optional = true } candle = { version = "*", package = "candle-core", default-features = false } @@ -17,21 +17,21 @@ candle-flash-attn-v1 = { git = "https://github.com/huggingface/candle-flash-attn candle-cublaslt = { git = "https://github.com/huggingface/candle-cublaslt", rev = "cf789b7dd6d4abb19b03b9556442f94f0588b4a0", optional = true } candle-layer-norm = { git = "https://github.com/huggingface/candle-layer-norm", rev = "94c2add7d94c2d63aebde77f7534614e04dbaea1", optional = true } candle-rotary = { git = "https://github.com/huggingface/candle-rotary", rev = "0a718a0856569a92f3112e64f10d07e4447822e8", optional = true } -nohash-hasher = "^0.2" +nohash-hasher = { workspace = true } text-embeddings-backend-core = { path = "../core" } -tracing = "^0.1" +tracing = { workspace = true } safetensors = "^0.4" -thiserror = "^1.0" -serde = { version = "^1.0", features = ["serde_derive"] } -serde_json = "^1.0" +thiserror = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } memmap2 = "^0.9" [dev-dependencies] insta = { git = "https://github.com/OlivierDehaene/insta", rev = "f4f98c0410b91fb5a28b10df98e4422955be9c2c", features = ["yaml"] } is_close = "0.1.3" hf-hub = "0.3.2" -anyhow = "1.0.75" -tokenizers = { version = "^0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } +anyhow = { workspace = true } +tokenizers = { workspace = true } serial_test = "2.0.0" [build-dependencies] diff --git a/backends/core/Cargo.toml b/backends/core/Cargo.toml index 5e330715..754f9526 100644 --- a/backends/core/Cargo.toml +++ b/backends/core/Cargo.toml @@ -6,9 +6,9 @@ authors.workspace = true homepage.workspace = true [dependencies] -thiserror = "^1.0" -clap = { version = "^4.1", features = ["derive"], optional = true } -nohash-hasher = "^0.2" +thiserror = { workspace = true } +clap = { workspace = true, optional = true } +nohash-hasher = { workspace = true } [features] clap = ["dep:clap"] diff --git a/backends/src/lib.rs b/backends/src/lib.rs index d332b4a7..220e05cb 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -22,7 +22,7 @@ use text_embeddings_backend_python::PythonBackend; #[derive(Debug, Clone)] pub struct Backend { /// Channel to communicate with the background thread - backend_sender: mpsc::UnboundedSender, + backend_sender: mpsc::Sender, /// Health status health_receiver: watch::Receiver, _backend_thread: Arc, @@ -40,7 +40,7 @@ impl Backend { otlp_endpoint: Option, otlp_service_name: String, ) -> Result { - let (backend_sender, backend_receiver) = mpsc::unbounded_channel(); + let (backend_sender, backend_receiver) = mpsc::channel(8); let backend = init_backend( model_path, @@ -76,6 +76,7 @@ impl Backend { let (sender, receiver) = oneshot::channel(); self.backend_sender .send(BackendCommand::Health(Span::current(), sender)) + .await .expect("No backend receiver. This is a bug."); receiver.await.expect( "Backend blocking task dropped the sender without sending a response. This is a bug.", @@ -110,7 +111,7 @@ impl Backend { let (sender, receiver) = oneshot::channel(); self.backend_sender - .send(BackendCommand::Embed(batch, Span::current(), sender)) + .try_send(BackendCommand::Embed(batch, Span::current(), sender)) .expect("No backend receiver. This is a bug."); receiver.await.expect( "Backend blocking task dropped the sender without send a response. This is a bug.", @@ -122,7 +123,7 @@ impl Backend { let (sender, receiver) = oneshot::channel(); self.backend_sender - .send(BackendCommand::Predict(batch, Span::current(), sender)) + .try_send(BackendCommand::Predict(batch, Span::current(), sender)) .expect("No backend receiver. This is a bug."); receiver.await.expect( "Backend blocking task dropped the sender without send a response. This is a bug.", @@ -174,7 +175,7 @@ struct BackendThread(Option>); impl BackendThread { fn new( backend: Box, - mut backend_receiver: mpsc::UnboundedReceiver, + mut backend_receiver: mpsc::Receiver, health_sender: watch::Sender, ) -> Self { let handle = std::thread::spawn(move || { diff --git a/core/Cargo.toml b/core/Cargo.toml index 0e83c744..d2f23eb0 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -6,10 +6,11 @@ authors.workspace = true homepage.workspace = true [dependencies] -hf-hub = { version = "^0.3.0", features = ["tokio"], default-features = false } -metrics = "^0.21" +async-channel = "^2.3" +hf-hub = { workspace = true } +metrics = { workspace = true } text-embeddings-backend = { path = "../backends" } -thiserror = "^1.0" -tokenizers = { version = "^0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } -tracing = "^0.1" -tokio = { version = "^1.25", features = ["rt", "rt-multi-thread", "parking_lot", "sync"] } +thiserror = { workspace = true } +tokenizers = { workspace = true } +tracing = { workspace = true } +tokio = { workspace = true } diff --git a/core/src/infer.rs b/core/src/infer.rs index 0f95ff8b..66d04e19 100644 --- a/core/src/infer.rs +++ b/core/src/infer.rs @@ -30,14 +30,10 @@ impl Infer { ) -> Self { let notify_batching_task = Arc::new(Notify::new()); - let (embed_sender, embed_receiver) = mpsc::unbounded_channel(); + // Bound channel to 1 to be able to prefetch one batch + let (embed_sender, embed_receiver) = mpsc::channel(1); - // Create two batching tasks to prefetch batches - tokio::spawn(batching_task( - queue.clone(), - notify_batching_task.clone(), - embed_sender.clone(), - )); + // Batching task tokio::spawn(batching_task( queue.clone(), notify_batching_task.clone(), @@ -59,7 +55,7 @@ impl Infer { } } - #[instrument(skip(self))] + #[instrument(skip(self, inputs))] pub async fn tokenize + std::fmt::Debug>( &self, inputs: I, @@ -69,13 +65,14 @@ impl Infer { .tokenize(inputs.into(), add_special_tokens) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err }) } - #[instrument(skip(self))] + #[instrument(skip(self, ids))] pub async fn decode( &self, ids: Vec, @@ -85,7 +82,8 @@ impl Infer { .decode(ids, skip_special_tokens) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err }) @@ -98,11 +96,13 @@ impl Infer { .limit_concurrent_requests .try_acquire_owned() .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "overloaded"); + let counter = metrics::counter!("te_request_failure", "err" => "overloaded"); + counter.increment(1); tracing::error!("{err}"); TextEmbeddingsError::from(err) }) } + #[instrument(skip(self))] pub async fn acquire_permit(&self) -> OwnedSemaphorePermit { // Limit concurrent requests by acquiring a permit from the semaphore @@ -113,7 +113,7 @@ impl Infer { .expect("Semaphore has been closed. This is a bug.") } - #[instrument(skip(self, permit))] + #[instrument(skip(self, inputs, permit))] pub async fn embed_all + std::fmt::Debug>( &self, inputs: I, @@ -124,7 +124,8 @@ impl Infer { let start_time = Instant::now(); if self.is_splade() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "`embed_all` is not available for SPLADE models".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -151,25 +152,21 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_embed_success"); - metrics::histogram!("te_embed_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_embed_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_embed_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_embed_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_embed_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_embed_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } - #[instrument(skip(self, permit))] + #[instrument(skip(self, inputs, permit))] pub async fn embed_sparse + std::fmt::Debug>( &self, inputs: I, @@ -180,7 +177,8 @@ impl Infer { let start_time = Instant::now(); if !self.is_splade() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "Model is not an embedding model with SPLADE pooling".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -207,25 +205,21 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_embed_success"); - metrics::histogram!("te_embed_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_embed_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_embed_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_embed_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_embed_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_embed_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } - #[instrument(skip(self, permit))] + #[instrument(skip(self, inputs, permit))] pub async fn embed_pooled + std::fmt::Debug>( &self, inputs: I, @@ -237,7 +231,8 @@ impl Infer { let start_time = Instant::now(); if self.is_splade() && normalize { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "`normalize` is not available for SPLADE models".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -281,20 +276,16 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_embed_success"); - metrics::histogram!("te_embed_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_embed_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_embed_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_embed_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_embed_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_embed_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } @@ -309,7 +300,8 @@ impl Infer { _permit: OwnedSemaphorePermit, ) -> Result { if self.is_classifier() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "Model is not an embedding model".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -317,7 +309,8 @@ impl Infer { ))); } - metrics::increment_counter!("te_embed_count"); + let counter = metrics::counter!("te_embed_count"); + counter.increment(1); // Tokenization let encoding = self @@ -325,7 +318,8 @@ impl Infer { .encode(inputs.into(), truncate, truncation_direction) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -353,7 +347,8 @@ impl Infer { "Infer batching task dropped the sender without sending a response. This is a bug.", ) .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "inference"); + let counter = metrics::counter!("te_request_failure", "err" => "inference"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -361,7 +356,7 @@ impl Infer { Ok(response) } - #[instrument(skip(self, _permit))] + #[instrument(skip(self, inputs, _permit))] pub async fn predict + std::fmt::Debug>( &self, inputs: I, @@ -371,7 +366,8 @@ impl Infer { _permit: OwnedSemaphorePermit, ) -> Result { if !self.is_classifier() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "Model is not a classifier model".to_string(); return Err(TextEmbeddingsError::Backend(BackendError::Inference( message, @@ -379,7 +375,8 @@ impl Infer { } let start_time = Instant::now(); - metrics::increment_counter!("te_predict_count"); + let counter = metrics::counter!("te_predict_count"); + counter.increment(1); // Tokenization let encoding = self @@ -387,7 +384,8 @@ impl Infer { .encode(inputs.into(), truncate, truncation_direction) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -415,7 +413,8 @@ impl Infer { "Infer batching task dropped the sender without sending a response. This is a bug.", ) .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "inference"); + let counter = metrics::counter!("te_request_failure", "err" => "inference"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -452,20 +451,16 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_predict_success"); - metrics::histogram!("te_predict_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_predict_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_predict_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_predict_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_predict_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_predict_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_predict_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_predict_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_predict_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } @@ -495,30 +490,22 @@ impl Infer { } #[instrument(skip_all)] -async fn batching_task( - queue: Queue, - notify: Arc, - embed_sender: mpsc::UnboundedSender<(NextBatch, oneshot::Sender<()>)>, -) { +async fn batching_task(queue: Queue, notify: Arc, embed_sender: mpsc::Sender) { loop { notify.notified().await; while let Some(next_batch) = queue.next_batch().await { - let (callback_sender, callback_receiver) = oneshot::channel(); embed_sender - .send((next_batch, callback_sender)) + .send(next_batch) + .await .expect("embed receiver was dropped. This is a bug."); - let _ = callback_receiver.await; } } } #[instrument(skip_all)] -async fn backend_task( - backend: Backend, - mut embed_receiver: mpsc::UnboundedReceiver<(NextBatch, oneshot::Sender<()>)>, -) { - while let Some((batch, _callback)) = embed_receiver.recv().await { +async fn backend_task(backend: Backend, mut embed_receiver: mpsc::Receiver) { + while let Some(batch) = embed_receiver.recv().await { match &backend.model_type { ModelType::Classifier => { let results = backend.predict(batch.1).await; diff --git a/core/src/queue.rs b/core/src/queue.rs index dfefda21..3fd8b771 100644 --- a/core/src/queue.rs +++ b/core/src/queue.rs @@ -35,7 +35,7 @@ pub struct Metadata { #[derive(Debug, Clone)] pub struct Queue { /// Channel to communicate with the background queue task - queue_sender: mpsc::UnboundedSender, + queue_sender: mpsc::Sender, } impl Queue { @@ -46,7 +46,7 @@ impl Queue { max_concurrent_requests: usize, ) -> Self { // Create channels - let (queue_sender, queue_receiver) = mpsc::unbounded_channel(); + let (queue_sender, queue_receiver) = mpsc::channel(max_concurrent_requests); // Launch background queue task std::thread::spawn(move || { @@ -68,8 +68,8 @@ impl Queue { // Send append command to the background task managing the state // Unwrap is safe here self.queue_sender - .send(QueueCommand::Append(Box::new(entry), Span::current())) - .expect("Queue background task dropped the receiver. This is a bug."); + .try_send(QueueCommand::Append(Box::new(entry), Span::current())) + .expect("Queue background task dropped the receiver or the receiver is too behind. This is a bug."); } /// Get the next batch from the queue @@ -80,11 +80,11 @@ impl Queue { // Send next batch command to the background task managing the state // Unwrap is safe here self.queue_sender - .send(QueueCommand::NextBatch { + .try_send(QueueCommand::NextBatch { response_sender, span: Span::current(), }) - .expect("Queue background task dropped the receiver. This is a bug."); + .expect("Queue background task dropped the receiver or the receiver is too behind. This is a bug."); // Await on response channel // Unwrap is safe here response_receiver.await.expect( @@ -99,7 +99,7 @@ fn queue_blocking_task( max_batch_tokens: usize, max_batch_requests: Option, max_concurrent_requests: usize, - mut queue_receiver: mpsc::UnboundedReceiver, + mut queue_receiver: mpsc::Receiver, ) { let capacity = max_batch_requests.unwrap_or(max_concurrent_requests); @@ -110,7 +110,8 @@ fn queue_blocking_task( QueueCommand::Append(entry, span) => { let _span = span.entered(); entries.push_back(*entry); - metrics::increment_gauge!("te_queue_size", 1.0); + let gauge = metrics::gauge!("te_queue_size"); + gauge.increment(1.0); } QueueCommand::NextBatch { response_sender, @@ -137,7 +138,8 @@ fn queue_blocking_task( // Filter entries where the response receiver was dropped (== entries where the request // was dropped by the client) if entry.metadata.response_tx.is_closed() { - metrics::increment_counter!("te_request_failure", "err" => "dropped"); + let counter = metrics::counter!("te_request_failure", "err" => "dropped"); + counter.increment(1); continue; } @@ -197,9 +199,12 @@ fn queue_blocking_task( let _ = response_sender.send(next_batch); - metrics::histogram!("te_batch_next_size", batch_size as f64); - metrics::histogram!("te_batch_next_tokens", current_tokens as f64); - metrics::gauge!("te_queue_size", entries.len() as f64); + let histogram = metrics::histogram!("te_batch_next_size"); + histogram.record(batch_size as f64); + let histogram = metrics::histogram!("te_batch_next_tokens"); + histogram.record(current_tokens as f64); + let gauge = metrics::gauge!("te_queue_size"); + gauge.set(entries.len() as f64) } } } diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index 07226823..ae281691 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -3,14 +3,14 @@ use crate::TextEmbeddingsError; use tokenizers::tokenizer::Tokenizer; pub use tokenizers::Encoding as RawEncoding; use tokenizers::{TruncationDirection, TruncationParams, TruncationStrategy}; -use tokio::sync::{mpsc, oneshot}; +use tokio::sync::oneshot; use tracing::{instrument, Span}; /// Validation #[derive(Debug, Clone)] pub struct Tokenization { /// Channel to communicate with the background tokenization task - sender: mpsc::UnboundedSender, + sender: async_channel::Sender, } impl Tokenization { @@ -23,39 +23,23 @@ impl Tokenization { tracing::info!("Starting {workers} tokenization workers"); // Create channel - let (sender, mut round_robin_receiver) = mpsc::unbounded_channel(); - let mut senders = Vec::with_capacity(workers); + let (sender, receiver) = async_channel::bounded(workers * 4); // Create workers for _ in 0..workers { let tokenizer_clone = tokenizer.clone(); - let (tokenizer_sender, tokenizer_receiver) = mpsc::unbounded_channel(); - senders.push(tokenizer_sender); - + let receiver_clone = receiver.clone(); // Spawn worker std::thread::spawn(move || { tokenizer_worker( tokenizer_clone, max_input_length, position_offset, - tokenizer_receiver, + receiver_clone, ) }); } - // Create tokenization round robin task - tokio::spawn(async move { - // Loop over requests - loop { - for sender in &senders { - match round_robin_receiver.recv().await { - None => return, - Some(request) => sender.send(request).unwrap(), - }; - } - } - }); - Self { sender } } @@ -85,6 +69,7 @@ impl Tokenization { response_sender, Span::current(), )) + .await .expect("Tokenization background task dropped the receiver. This is a bug."); // Await on response channel @@ -116,6 +101,7 @@ impl Tokenization { response_sender, Span::current(), )) + .await .expect("Tokenization background task dropped the receiver. This is a bug."); // Await on response channel @@ -147,6 +133,7 @@ impl Tokenization { response_sender, Span::current(), )) + .await .expect("Tokenization background task dropped the receiver. This is a bug."); // Await on response channel @@ -160,10 +147,10 @@ fn tokenizer_worker( mut tokenizer: Tokenizer, max_input_length: usize, position_offset: usize, - mut receiver: mpsc::UnboundedReceiver, + receiver: async_channel::Receiver, ) { // Loop over requests - while let Some(request) = receiver.blocking_recv() { + while let Ok(request) = receiver.recv_blocking() { match request { TokenizerRequest::Encode( inputs, @@ -277,7 +264,8 @@ fn encode_input( "`inputs` must have less than {max_input_length} tokens. Given: {seq_len}" ))); } - metrics::histogram!("te_request_input_length", seq_len as f64); + let histogram = metrics::histogram!("te_request_input_length"); + histogram.record(seq_len as f64); Ok(ValidEncoding { input_ids: encoding.get_ids().to_vec(), token_type_ids: encoding.get_type_ids().to_vec(), diff --git a/load_tests/load.js b/load_tests/load.js index b7e4524e..86719b25 100644 --- a/load_tests/load.js +++ b/load_tests/load.js @@ -2,7 +2,7 @@ import {check} from 'k6'; import http from 'k6/http'; import {Trend} from 'k6/metrics'; -const host = __ENV.HOST || '127.0.0.1:8080'; +const host = __ENV.HOST || '127.0.0.1:3000'; const totalTime = new Trend('total_time', true); const tokenizationTIme = new Trend('tokenization_time', true); @@ -36,8 +36,9 @@ export const options = { export default function () { const payload = JSON.stringify({ - query: inputs, - texts: [inputs], + inputs: inputs, + // query: inputs, + // texts: [inputs], truncate: true, }); diff --git a/load_tests/load_grpc.js b/load_tests/load_grpc.js index bce6834e..30d2676a 100644 --- a/load_tests/load_grpc.js +++ b/load_tests/load_grpc.js @@ -2,7 +2,7 @@ import {check} from 'k6'; import grpc from 'k6/experimental/grpc'; import {Trend} from 'k6/metrics'; -const host = __ENV.HOST || '127.0.0.1:8080'; +const host = __ENV.HOST || '127.0.0.1:3000'; const totalTime = new Trend('total_time', true); const tokenizationTIme = new Trend('tokenization_time', true); @@ -25,7 +25,7 @@ export const options = { // }, load_test: { executor: 'constant-arrival-rate', - duration: '30s', + duration: '5m', preAllocatedVUs: 5000, rate: 1000, timeUnit: '1s', diff --git a/router/Cargo.toml b/router/Cargo.toml index 2f2b0815..44e56015 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -15,38 +15,38 @@ name = "text-embeddings-router" path = "src/main.rs" [dependencies] -anyhow = "1.0.71" +anyhow = { workspace = true } text-embeddings-backend = { path = "../backends", features = ["clap"] } text-embeddings-core = { path = "../core" } -clap = { version = "4.1.4", features = ["derive", "env"] } +clap = { workspace = true } futures = "^0.3" -init-tracing-opentelemetry = { version = "0.14.1", features = ["opentelemetry-otlp"] } -hf-hub = { version = "0.3.0", features = ["tokio"] } +init-tracing-opentelemetry = { version = "0.18.1", features = ["opentelemetry-otlp"] } +hf-hub = { workspace = true } http = "1.0.0" num_cpus = "1.16.0" -metrics = "0.21.0" -metrics-exporter-prometheus = { version = "0.12.1", features = [] } -opentelemetry = { version = "0.20.0", features = ["rt-tokio"] } -opentelemetry-otlp = "0.13.0" -reqwest = { version = "0.11.14", features = [] } -serde = "1.0.152" -serde_json = "1.0.93" -thiserror = "1.0.38" -tokenizers = { version = "0.19.1", default-features=false, features=["onig", "esaxx_fast"] } -tokio = { version = "1.25.0", features = ["rt", "rt-multi-thread", "parking_lot", "signal", "sync"] } -tracing = "0.1.37" -tracing-opentelemetry = "0.21.0" +metrics = { workspace = true } +metrics-exporter-prometheus = { version = "0.15.1", features = [] } +opentelemetry = "0.23.0" +opentelemetry_sdk = { version = "0.23.0", features = ["rt-tokio"] } +opentelemetry-otlp = "0.16.0" +reqwest = { version = "0.12.5", features = [] } +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } +tokenizers = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } +tracing-opentelemetry = "0.24.0" tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } veil = "0.1.6" -mimalloc = { version = "*", default-features = false } # HTTP dependencies axum = { version = "0.7.4", features = ["json"], optional = true } -axum-tracing-opentelemetry = { version = "0.17.0", optional = true } -base64 = { version = "0.21.4", optional = true } +axum-tracing-opentelemetry = { version = "0.18.1", optional = true } +base64 = { version = "0.22.1", optional = true } tower-http = { version = "0.5.1", features = ["cors"], optional = true } utoipa = { version = "4.2", features = ["axum_extras"], optional = true } -utoipa-swagger-ui = { version = "6.0", features = ["axum"], optional = true } +utoipa-swagger-ui = { version = "7.1", features = ["axum"], optional = true } # gRPC dependencies async-stream = { version = "0.3.5", optional = true } @@ -56,14 +56,21 @@ tonic-health = { version = "0.11.0", optional = true } tonic-reflection = { version = "0.11.0", optional = true } tokio-stream = { version = "0.1.14", optional = true } +# Malloc trim hack for linux +[target.'cfg(target_os = "linux")'.dependencies] +libc = "0.2.149" +# else use mimalloc +[target.'cfg(not(target_os = "linux"))'.dependencies] +mimalloc = { version = "*", features = ["no_thp"] } + [dev-dependencies] insta = { git = "https://github.com/OlivierDehaene/insta", rev = "f4f98c0410b91fb5a28b10df98e4422955be9c2c", features = ["yaml"] } is_close = "0.1.3" -reqwest = { version = "0.11.22", features = ["json"] } +reqwest = { version = "0.12.5", features = ["json"] } [build-dependencies] vergen = { version = "8.0.0", features = ["build", "git", "gitcl"] } -tonic-build = { version = "0.10.2", optional = true } +tonic-build = { version = "0.11.0", optional = true } [features] default = ["candle", "http"] diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index 98ee5601..389e3848 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -589,7 +589,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -600,7 +601,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { let (response, metadata) = self.embed_pooled_inner(request, permit).await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -629,7 +631,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -640,7 +643,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { let (response, metadata) = self.embed_sparse_inner(request, permit).await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -669,7 +673,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -680,7 +685,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { let (response, metadata) = self.embed_all_inner(request, permit).await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -713,7 +719,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -733,7 +740,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { .await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -746,7 +754,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let request = request.into_inner(); let mut inputs = request.inputs; @@ -782,7 +791,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { .await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -886,20 +896,21 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } match &self.info.model_type { ModelType::Classifier(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); let message = "model is not a re-ranker model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) } ModelType::Reranker(_) => Ok(()), ModelType::Embedding(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); let message = "model is not a classifier model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) @@ -937,7 +948,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { )) }; - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let batch_size = request.texts.len(); if batch_size > self.info.max_client_batch_size { @@ -950,7 +962,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -1015,7 +1028,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); let response_metadata = ResponseMetadata::new( total_compute_chars, @@ -1065,14 +1079,14 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { // Check model type match &self.info.model_type { ModelType::Classifier(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); let message = "model is not a re-ranker model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) } ModelType::Reranker(_) => Ok(()), ModelType::Embedding(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); let message = "model is not a classifier model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) @@ -1112,7 +1126,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { )) }; - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let mut request_stream = request.into_inner(); @@ -1261,7 +1276,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { error: message, error_type: ErrorType::Backend, }; - metrics::increment_counter!("te_request_failure", "err" => "missing_values"); + let counter = metrics::counter!("te_request_failure", "err" => "missing_values"); + counter.increment(1); Err(err)?; } @@ -1271,7 +1287,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); let response_metadata = ResponseMetadata::new( total_compute_chars, diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 11b3a521..3e09101d 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -163,14 +163,16 @@ async fn predict( let (response, metadata) = match req.inputs { PredictInput::Single(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = inputs.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let (prompt_tokens, tokenization, queue, inference, predictions) = predict_inner(inputs, truncate, infer.0, info.0, Some(permit)).await?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( PredictResponse::Single(predictions), @@ -185,7 +187,8 @@ async fn predict( ) } PredictInput::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let batch_size = inputs.len(); if batch_size > info.max_client_batch_size { @@ -198,7 +201,8 @@ async fn predict( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -237,7 +241,8 @@ async fn predict( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( PredictResponse::Batch(predictions), @@ -301,14 +306,16 @@ async fn rerank( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } match &info.model_type { ModelType::Reranker(_) => Ok(()), ModelType::Classifier(_) | ModelType::Embedding(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a re-ranker model".to_string(); Err(TextEmbeddingsError::Backend(BackendError::Inference( message, @@ -349,7 +356,8 @@ async fn rerank( let truncate = req.truncate.unwrap_or(info.auto_truncate); let (response, metadata) = { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let batch_size = req.texts.len(); if batch_size > info.max_client_batch_size { @@ -362,7 +370,8 @@ async fn rerank( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -420,7 +429,8 @@ async fn rerank( let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( RerankResponse(ranks), @@ -479,7 +489,8 @@ async fn embed( let (response, metadata) = match req.inputs { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); @@ -495,7 +506,8 @@ async fn embed( .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( EmbedResponse(vec![response.results]), @@ -510,7 +522,8 @@ async fn embed( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); @@ -519,7 +532,8 @@ async fn embed( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -534,7 +548,8 @@ async fn embed( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -579,7 +594,8 @@ async fn embed( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( EmbedResponse(embeddings), @@ -648,7 +664,8 @@ async fn embed_sparse( let (response, metadata) = match req.inputs { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); @@ -658,7 +675,8 @@ async fn embed_sparse( .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( EmbedSparseResponse(vec![sparsify(response.results)]), @@ -673,7 +691,8 @@ async fn embed_sparse( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); @@ -682,7 +701,8 @@ async fn embed_sparse( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -697,7 +717,8 @@ async fn embed_sparse( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -737,7 +758,8 @@ async fn embed_sparse( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( EmbedSparseResponse(embeddings), @@ -798,7 +820,8 @@ async fn embed_all( let (response, metadata) = match req.inputs { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); @@ -808,7 +831,8 @@ async fn embed_all( .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( EmbedAllResponse(vec![response.results]), @@ -823,7 +847,8 @@ async fn embed_all( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); @@ -832,7 +857,8 @@ async fn embed_all( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -847,7 +873,8 @@ async fn embed_all( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -886,7 +913,8 @@ async fn embed_all( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( EmbedAllResponse(embeddings), @@ -962,7 +990,8 @@ async fn openai_embed( let (embeddings, metadata) = match req.input { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); @@ -972,7 +1001,8 @@ async fn openai_embed( .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let embedding = encode_embedding(response.results); ( @@ -992,7 +1022,8 @@ async fn openai_embed( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); @@ -1001,7 +1032,8 @@ async fn openai_embed( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -1016,7 +1048,8 @@ async fn openai_embed( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -1060,7 +1093,8 @@ async fn openai_embed( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( embeddings, @@ -1163,7 +1197,8 @@ async fn tokenize( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -1178,7 +1213,8 @@ async fn tokenize( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -1236,7 +1272,8 @@ async fn decode( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -1251,7 +1288,8 @@ async fn decode( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } diff --git a/router/src/lib.rs b/router/src/lib.rs index d2023515..eca9c61f 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -289,7 +289,7 @@ pub async fn run( api_key, cors_allow_origin, ) - .await?; + .await } #[cfg(feature = "grpc")] @@ -297,10 +297,8 @@ pub async fn run( // cors_allow_origin and payload_limit are not used for gRPC servers let _ = cors_allow_origin; let _ = payload_limit; - grpc::server::run(infer, info, addr, prom_builder, api_key).await?; + grpc::server::run(infer, info, addr, prom_builder, api_key).await } - - Ok(()) } fn get_backend_model_type( @@ -512,19 +510,14 @@ impl ResponseMetadata { fn record_metrics(&self) { // Metrics - metrics::histogram!( - "te_request_duration", - self.start_time.elapsed().as_secs_f64() - ); - metrics::histogram!( - "te_request_tokenization_duration", - self.tokenization_time.as_secs_f64() - ); - metrics::histogram!("te_request_queue_duration", self.queue_time.as_secs_f64()); - metrics::histogram!( - "te_request_inference_duration", - self.inference_time.as_secs_f64() - ); + let histogram = metrics::histogram!("te_request_duration"); + histogram.record(self.start_time.elapsed().as_secs_f64()); + let histogram = metrics::histogram!("te_request_tokenization_duration"); + histogram.record(self.tokenization_time.as_secs_f64()); + let histogram = metrics::histogram!("te_request_queue_duration"); + histogram.record(self.queue_time.as_secs_f64()); + let histogram = metrics::histogram!("te_request_inference_duration"); + histogram.record(self.inference_time.as_secs_f64()); } } diff --git a/router/src/logging.rs b/router/src/logging.rs index 7d5eb11e..7a8fe810 100644 --- a/router/src/logging.rs +++ b/router/src/logging.rs @@ -1,8 +1,8 @@ -use opentelemetry::sdk::propagation::TraceContextPropagator; -use opentelemetry::sdk::trace::Sampler; -use opentelemetry::sdk::{trace, Resource}; use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::propagation::TraceContextPropagator; +use opentelemetry_sdk::trace::Sampler; +use opentelemetry_sdk::{trace, Resource}; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; use tracing_subscriber::{EnvFilter, Layer}; @@ -48,7 +48,7 @@ pub fn init_logging( )])) .with_sampler(Sampler::AlwaysOn), ) - .install_batch(opentelemetry::runtime::Tokio); + .install_batch(opentelemetry_sdk::runtime::Tokio); if let Ok(tracer) = tracer { layers.push(tracing_opentelemetry::layer().with_tracer(tracer).boxed()); diff --git a/router/src/main.rs b/router/src/main.rs index 2cdc7095..3c85f5f7 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -1,12 +1,12 @@ use anyhow::Result; use clap::Parser; -use mimalloc::MiMalloc; use opentelemetry::global; use text_embeddings_backend::DType; use veil::Redact; +#[cfg(not(target_os = "linux"))] #[global_allocator] -static GLOBAL: MiMalloc = MiMalloc; +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; /// App Configuration #[derive(Parser, Redact)] @@ -147,6 +147,20 @@ async fn main() -> Result<()> { tracing::info!("{args:?}"); + // Hack to trim pages regularly + // see: https://www.algolia.com/blog/engineering/when-allocators-are-hoarding-your-precious-memory/ + // and: https://github.com/huggingface/text-embeddings-inference/issues/156 + #[cfg(target_os = "linux")] + tokio::spawn(async move { + use tokio::time::Duration; + loop { + tokio::time::sleep(Duration::from_millis(100)).await; + unsafe { + libc::malloc_trim(0); + } + } + }); + text_embeddings_router::run( args.model_id, args.revision, diff --git a/router/src/shutdown.rs b/router/src/shutdown.rs index 471eaf14..15fc8ea7 100644 --- a/router/src/shutdown.rs +++ b/router/src/shutdown.rs @@ -25,5 +25,4 @@ pub(crate) async fn shutdown_signal() { } tracing::info!("signal received, starting graceful shutdown"); - opentelemetry::global::shutdown_tracer_provider(); } From 7c9b7cb251858b84bbcb7d4abc476ffa2c42b0d9 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 27 Jun 2024 15:29:11 +0200 Subject: [PATCH 02/36] feat(candle): add FlashMistral (#308) --- Cargo.lock | 1 + backends/candle/src/flash_attn.rs | 18 +- backends/candle/src/layers/linear.rs | 1 + backends/candle/src/layers/mod.rs | 4 + backends/candle/src/layers/rms_norm.rs | 96 + backends/candle/src/lib.rs | 97 +- backends/candle/src/models/bert.rs | 6 + backends/candle/src/models/distilbert.rs | 9 +- backends/candle/src/models/flash_bert.rs | 60 +- .../candle/src/models/flash_distilbert.rs | 58 +- backends/candle/src/models/flash_jina.rs | 30 +- backends/candle/src/models/flash_jina_code.rs | 30 +- backends/candle/src/models/flash_mistral.rs | 442 + backends/candle/src/models/flash_nomic.rs | 30 +- backends/candle/src/models/jina.rs | 5 + backends/candle/src/models/jina_code.rs | 9 +- backends/candle/src/models/mistral.rs | 19 + backends/candle/src/models/mod.rs | 8 + backends/candle/src/models/nomic.rs | 5 + backends/candle/tests/common.rs | 97 +- .../test_flash_mistral__mistral_batch.snap | 12293 ++++++++++++++++ .../test_flash_mistral__mistral_single.snap | 4101 ++++++ backends/candle/tests/test_bert.rs | 24 +- backends/candle/tests/test_flash_bert.rs | 24 +- backends/candle/tests/test_flash_jina.rs | 10 +- backends/candle/tests/test_flash_jina_code.rs | 10 +- backends/candle/tests/test_flash_mistral.rs | 53 + backends/candle/tests/test_flash_nomic.rs | 10 +- backends/candle/tests/test_jina.rs | 10 +- backends/candle/tests/test_jina_code.rs | 10 +- backends/candle/tests/test_nomic.rs | 10 +- backends/core/src/lib.rs | 3 + backends/src/lib.rs | 57 + core/Cargo.toml | 1 + core/src/download.rs | 56 +- core/src/infer.rs | 14 +- load_tests/load.js | 2 +- router/src/grpc/server.rs | 4 + router/src/lib.rs | 37 +- 39 files changed, 17578 insertions(+), 176 deletions(-) create mode 100644 backends/candle/src/layers/rms_norm.rs create mode 100644 backends/candle/src/models/flash_mistral.rs create mode 100644 backends/candle/src/models/mistral.rs create mode 100644 backends/candle/tests/snapshots/test_flash_mistral__mistral_batch.snap create mode 100644 backends/candle/tests/snapshots/test_flash_mistral__mistral_single.snap create mode 100644 backends/candle/tests/test_flash_mistral.rs diff --git a/Cargo.lock b/Cargo.lock index cf8e1c0f..134036f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3981,6 +3981,7 @@ dependencies = [ "async-channel", "hf-hub", "metrics", + "serde_json", "text-embeddings-backend", "thiserror", "tokenizers", diff --git a/backends/candle/src/flash_attn.rs b/backends/candle/src/flash_attn.rs index 3afc6517..f2016928 100644 --- a/backends/candle/src/flash_attn.rs +++ b/backends/candle/src/flash_attn.rs @@ -31,6 +31,7 @@ pub(crate) fn flash_attn_varlen( max_seqlen_k: usize, softmax_scale: f32, causal: bool, + window_size_left: Option, ) -> Result { let runtime_compute_cap = get_runtime_compute_cap(); @@ -38,6 +39,9 @@ pub(crate) fn flash_attn_varlen( if alibi_slopes.is_some() { candle::bail!("Flash attention v1 does not support alibi"); } + if window_size_left.is_some() { + candle::bail!("Flash attention v1 does not support attention windowing"); + } #[cfg(feature = "flash-attn-v1")] { @@ -59,10 +63,12 @@ pub(crate) fn flash_attn_varlen( } else if (80..90).contains(&runtime_compute_cap) || runtime_compute_cap == 90 { #[cfg(feature = "flash-attn")] { - use candle_flash_attn::{flash_attn_varlen, flash_attn_varlen_alibi}; + use candle_flash_attn::{flash_attn_varlen_alibi_windowed, flash_attn_varlen_windowed}; + + let window_size_right = if causal { Some(0) } else { None }; let attention = if let Some(alibi_slopes) = alibi_slopes { - flash_attn_varlen_alibi( + flash_attn_varlen_alibi_windowed( q, k, v, @@ -72,10 +78,11 @@ pub(crate) fn flash_attn_varlen( max_seqlen_q, max_seqlen_k, softmax_scale, - causal, + window_size_left, + window_size_right, ) } else { - flash_attn_varlen( + flash_attn_varlen_windowed( q, k, v, @@ -84,7 +91,8 @@ pub(crate) fn flash_attn_varlen( max_seqlen_q, max_seqlen_k, softmax_scale, - causal, + window_size_left, + window_size_right, ) }; diff --git a/backends/candle/src/layers/linear.rs b/backends/candle/src/layers/linear.rs index 3fdd025b..fc8af1dd 100644 --- a/backends/candle/src/layers/linear.rs +++ b/backends/candle/src/layers/linear.rs @@ -7,6 +7,7 @@ use serde::Deserialize; pub enum HiddenAct { Gelu, Relu, + #[serde(alias = "silu")] Swiglu, } diff --git a/backends/candle/src/layers/mod.rs b/backends/candle/src/layers/mod.rs index 8e108fc2..81f63310 100644 --- a/backends/candle/src/layers/mod.rs +++ b/backends/candle/src/layers/mod.rs @@ -2,7 +2,11 @@ mod cublaslt; mod layer_norm; mod linear; +#[allow(dead_code, unused)] +mod rms_norm; pub use cublaslt::get_cublas_lt_wrapper; pub use layer_norm::LayerNorm; pub use linear::{HiddenAct, Linear}; +#[allow(unused_imports)] +pub use rms_norm::RMSNorm; diff --git a/backends/candle/src/layers/rms_norm.rs b/backends/candle/src/layers/rms_norm.rs new file mode 100644 index 00000000..e7dab642 --- /dev/null +++ b/backends/candle/src/layers/rms_norm.rs @@ -0,0 +1,96 @@ +use candle::{DType, Device, Result, Tensor, D}; +use candle_nn::VarBuilder; + +#[derive(Debug)] +pub struct RMSNorm { + weight: Tensor, + epsilon: f32, + span: tracing::Span, +} + +impl RMSNorm { + pub fn load(vb: VarBuilder, hidden_size: usize, epsilon: f32) -> Result { + Ok(Self { + weight: vb + .get(hidden_size, "weight") + .or_else(|_| vb.get(hidden_size, "gamma"))?, + epsilon, + span: tracing::span!(tracing::Level::TRACE, "rms-norm"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + residual: Option<&Tensor>, + ) -> Result<(Tensor, Tensor)> { + let _enter = self.span.enter(); + + match hidden_states.device() { + Device::Cpu | Device::Metal(_) => { + let mut hidden_states = hidden_states.clone(); + let residual_add = if let Some(residual) = residual { + let residual_add = hidden_states.add(residual)?; + hidden_states = residual_add.clone(); + residual_add + } else { + hidden_states.clone() + }; + + let hidden_states_dtype = hidden_states.dtype(); + let internal_dtype = match hidden_states_dtype { + DType::F16 | DType::BF16 => DType::F32, + d => d, + }; + let hidden_size = hidden_states.dim(D::Minus1)?; + let hidden_states = hidden_states.to_dtype(internal_dtype)?; + let norm_hidden_states = + (hidden_states.sqr()?.sum_keepdim(D::Minus1)? / hidden_size as f64)?; + let hidden_states_normed = hidden_states + .broadcast_div(&(norm_hidden_states + self.epsilon as f64)?.sqrt()?)?; + Ok(( + hidden_states_normed + .to_dtype(hidden_states_dtype)? + .broadcast_mul(&self.weight)?, + residual_add, + )) + } + Device::Cuda(_) => { + #[cfg(feature = "cuda")] + { + use candle_layer_norm::{fused_add_rms_norm, rms_norm}; + + let original_shape = hidden_states.shape(); + let hidden_states = hidden_states.flatten_to(D::Minus2)?; + + if let Some(residual) = residual { + let residual = residual.flatten_to(D::Minus2)?; + + let (result, residual_add) = fused_add_rms_norm( + &hidden_states, + &residual, + &self.weight, + None, + self.epsilon, + )?; + Ok(( + result.reshape(original_shape)?, + residual_add.reshape(original_shape)?, + )) + } else { + let residual_add = hidden_states.clone(); + + let result = rms_norm(&hidden_states, &self.weight, None, self.epsilon)?; + + Ok(( + result.reshape(original_shape)?, + residual_add.reshape(original_shape)?, + )) + } + } + #[cfg(not(feature = "cuda"))] + candle::bail!("`cuda` feature is not enabled") + } + } + } +} diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index a7a5dcf0..b9d750dc 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -12,12 +12,12 @@ use crate::compute_cap::{ }; use crate::models::{ BertConfig, BertModel, DistilBertConfig, DistilBertModel, JinaBertModel, JinaCodeBertModel, - Model, NomicBertModel, NomicConfig, + MistralConfig, Model, NomicBertModel, NomicConfig, }; #[cfg(feature = "cuda")] use crate::models::{ FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashJinaCodeBertModel, - FlashNomicBertModel, + FlashMistralModel, FlashNomicBertModel, }; use anyhow::Context; use candle::{DType, Device}; @@ -56,6 +56,7 @@ enum Config { DistilBert(DistilBertConfig), #[serde(rename(deserialize = "nomic_bert"))] NomicBert(NomicConfig), + Mistral(MistralConfig), } pub struct CandleBackend { @@ -69,6 +70,54 @@ impl CandleBackend { dtype: String, model_type: ModelType, ) -> Result { + // Default files + let default_safetensors = model_path.join("model.safetensors"); + let default_pytorch = model_path.join("pytorch_model.bin"); + + // Single Files + let model_files = if default_safetensors.exists() { + vec![default_safetensors] + } else if default_pytorch.exists() { + vec![default_pytorch] + } + // Sharded weights + else { + // Get index file + let index_file = model_path.join("model.safetensors.index.json"); + + // Parse file + let index_file_string: String = std::fs::read_to_string(&index_file) + .map_err(|err| BackendError::Start(err.to_string()))?; + let json: serde_json::Value = serde_json::from_str(&index_file_string) + .map_err(|err| BackendError::Start(err.to_string()))?; + + let weight_map = match json.get("weight_map") { + None => { + return Err(BackendError::Start(format!( + "no weight map in {index_file:?}" + ))); + } + Some(serde_json::Value::Object(map)) => map, + Some(_) => { + return Err(BackendError::Start(format!( + "weight map in {index_file:?} is not a map" + ))); + } + }; + let mut safetensors_files = std::collections::HashSet::new(); + for value in weight_map.values() { + if let Some(file) = value.as_str() { + safetensors_files.insert(file.to_string()); + } + } + + // Collect paths + safetensors_files + .iter() + .map(|n| model_path.join(n)) + .collect() + }; + // Load config let config: String = std::fs::read_to_string(model_path.join("config.json")) .context("Unable to read config file") @@ -115,17 +164,10 @@ impl CandleBackend { ))) }?; - let safetensors_path = model_path.join("model.safetensors"); - let vb = if safetensors_path.exists() { - unsafe { - VarBuilder::from_mmaped_safetensors( - &[model_path.join("model.safetensors")], - dtype, - &device, - ) - } + let vb = if model_files.len() == 1 && model_files[0].extension().unwrap() == "bin" { + VarBuilder::from_pth(&model_files[0], dtype, &device) } else { - VarBuilder::from_pth(model_path.join("pytorch_model.bin"), dtype, &device) + unsafe { VarBuilder::from_mmaped_safetensors(&model_files, dtype, &device) } } .s()?; @@ -136,7 +178,7 @@ impl CandleBackend { )), (Config::Bert(config), Device::Cpu | Device::Metal(_)) => match config { BertConfigWrapper::JinaBert(config) => { - tracing::info!("Starting JinaBertModel model on {:?}", device); + tracing::info!("Starting JinaBert model on {:?}", device); Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) } BertConfigWrapper::JinaCodeBert(config) => { @@ -160,15 +202,19 @@ impl CandleBackend { )) } (Config::DistilBert(config), Device::Cpu | Device::Metal(_)) => { - tracing::info!("Starting DistilBertModel model on {:?}", device); + tracing::info!("Starting DistilBert model on {:?}", device); Ok(Box::new( DistilBertModel::load(vb, &config, model_type).s()?, )) } (Config::NomicBert(config), Device::Cpu | Device::Metal(_)) => { - tracing::info!("Starting NomicBertModel model on {:?}", device); + tracing::info!("Starting NomicBert model on {:?}", device); Ok(Box::new(NomicBertModel::load(vb, &config, model_type).s()?)) } + (Config::Mistral(_), Device::Cpu | Device::Metal(_)) => Err(BackendError::Start( + "Mistral is only supported on Cuda devices in fp16 with flash attention enabled" + .to_string(), + )), #[cfg(feature = "cuda")] (Config::Bert(config), Device::Cuda(_)) => { if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) @@ -198,7 +244,7 @@ impl CandleBackend { } else { match config { BertConfigWrapper::JinaBert(config) => { - tracing::info!("Starting JinaBertModel model on {:?}", device); + tracing::info!("Starting JinaBert model on {:?}", device); Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) } BertConfigWrapper::JinaCodeBert(config) => { @@ -245,7 +291,7 @@ impl CandleBackend { .to_lowercase() == "true" { - tracing::info!("Starting FlashDistilBertModel model on {:?}", device); + tracing::info!("Starting FlashDistilBert model on {:?}", device); Ok(Box::new( FlashDistilBertModel::load(vb, &config, model_type).s()?, )) @@ -265,15 +311,28 @@ impl CandleBackend { .to_lowercase() == "true" { - tracing::info!("Starting FlashNomicBertModel model on {:?}", device); + tracing::info!("Starting FlashNomicBert model on {:?}", device); Ok(Box::new( FlashNomicBertModel::load(vb, &config, model_type).s()?, )) } else { - tracing::info!("Starting NomicBertModel model on {:?}", device); + tracing::info!("Starting NomicBert model on {:?}", device); Ok(Box::new(NomicBertModel::load(vb, &config, model_type).s()?)) } } + #[cfg(feature = "cuda")] + (Config::Mistral(config), Device::Cuda(_)) => { + if dtype != DType::F16 + || !cfg!(feature = "flash-attn") + || get_runtime_compute_cap().unwrap() < 80 + { + return Err(BackendError::Start("Mistral is only supported on Cuda devices in fp16 with flash attention v2 enabled".to_string())); + } + tracing::info!("Starting FlashMistral model on {:?}", device); + Ok(Box::new( + FlashMistralModel::load(vb, &config, model_type).s()?, + )) + } }; Ok(Self { diff --git a/backends/candle/src/models/bert.rs b/backends/candle/src/models/bert.rs index d12d90d2..5795fa27 100644 --- a/backends/candle/src/models/bert.rs +++ b/backends/candle/src/models/bert.rs @@ -638,6 +638,10 @@ impl BertModel { (pool, Some(classifier), None) } ModelType::Embedding(pool) => { + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for Bert"); + } + let splade = if pool == Pool::Splade { Some(BertSpladeHead::load_roberta(vb.clone(), config)?) } else { @@ -832,6 +836,8 @@ impl BertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/distilbert.rs b/backends/candle/src/models/distilbert.rs index e7145309..2cf62081 100644 --- a/backends/candle/src/models/distilbert.rs +++ b/backends/candle/src/models/distilbert.rs @@ -389,7 +389,12 @@ impl DistilBertModel { ModelType::Classifier => { candle::bail!("`classifier` model type is not supported for DistilBert") } - ModelType::Embedding(pool) => pool, + ModelType::Embedding(pool) => { + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for DistilBert"); + } + pool + } }; let (embeddings, encoder) = match ( @@ -564,6 +569,8 @@ impl DistilBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/flash_bert.rs b/backends/candle/src/models/flash_bert.rs index d248c91f..8f20f027 100644 --- a/backends/candle/src/models/flash_bert.rs +++ b/backends/candle/src/models/flash_bert.rs @@ -5,7 +5,7 @@ use crate::models::bert::{ PositionEmbeddingType, RobertaClassificationHead, }; use crate::models::Model; -use candle::{DType, Device, Result, Tensor}; +use candle::{DType, Device, IndexOp, Result, Tensor}; use candle_nn::VarBuilder; use text_embeddings_backend_core::{Batch, ModelType, Pool}; @@ -103,6 +103,7 @@ impl BertAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -393,27 +394,44 @@ impl FlashBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; - - // If raw_indices is empty, we don't need to do anything with - // the pooled_indices - if has_raw_requests { - // We need the pooled indices to select the correct cls indices - let pooled_indices = Tensor::from_vec( - batch.pooled_indices.clone(), - batch.pooled_indices.len(), - &self.device, - )?; - - // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } - - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) } // Mean pooling Pool::Mean => { diff --git a/backends/candle/src/models/flash_distilbert.rs b/backends/candle/src/models/flash_distilbert.rs index 3d30c3a8..f8dd294b 100644 --- a/backends/candle/src/models/flash_distilbert.rs +++ b/backends/candle/src/models/flash_distilbert.rs @@ -4,7 +4,7 @@ use crate::models::distilbert::{ DistilBertConfig, DistilBertEmbeddings, DistilBertMLP, DistilBertSpladeHead, }; use crate::models::Model; -use candle::{DType, Device, Result, Tensor}; +use candle::{DType, Device, IndexOp, Result, Tensor}; use candle_nn::VarBuilder; use text_embeddings_backend_core::{Batch, ModelType, Pool}; @@ -84,6 +84,7 @@ impl DistilBertAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -259,27 +260,42 @@ impl FlashDistilBertModel { let pooled_embeddings = if has_pooling_requests { let pooled_embeddings = match self.pool { - // CLS pooling - Pool::Cls => { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; - - // If raw_indices is empty, we don't need to do anything with - // the pooled_indices - if has_raw_requests { - // We need the pooled indices to select the correct cls indices - let pooled_indices = Tensor::from_vec( - batch.pooled_indices.clone(), - batch.pooled_indices.len(), - &self.device, - )?; - - // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + outputs.index_select(&indices, 0)? + } else { + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)? } - - // Select cls tokens - outputs.index_select(&cls_indices, 0)? } // Mean pooling Pool::Mean => { diff --git a/backends/candle/src/models/flash_jina.rs b/backends/candle/src/models/flash_jina.rs index b2d47e51..c8efee18 100644 --- a/backends/candle/src/models/flash_jina.rs +++ b/backends/candle/src/models/flash_jina.rs @@ -105,6 +105,7 @@ impl JinaAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -319,11 +320,15 @@ impl FlashJinaBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { if batch_size > 1 { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + _ => unreachable!(), + }; // If raw_indices is empty, we don't need to do anything with // the pooled_indices @@ -336,13 +341,22 @@ impl FlashJinaBertModel { )?; // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + indices = indices.index_select(&pooled_indices, 0)? } - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) + // Select tokens + Some(outputs.index_select(&indices, 0)?) } else { - Some(outputs.i(0)?) + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } } // Mean pooling diff --git a/backends/candle/src/models/flash_jina_code.rs b/backends/candle/src/models/flash_jina_code.rs index 5df80be2..06ade2d5 100644 --- a/backends/candle/src/models/flash_jina_code.rs +++ b/backends/candle/src/models/flash_jina_code.rs @@ -141,6 +141,7 @@ impl JinaCodeAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -372,11 +373,15 @@ impl FlashJinaCodeBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { if batch_size > 1 { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + _ => unreachable!(), + }; // If raw_indices is empty, we don't need to do anything with // the pooled_indices @@ -389,13 +394,22 @@ impl FlashJinaCodeBertModel { )?; // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + indices = indices.index_select(&pooled_indices, 0)? } - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) + // Select tokens + Some(outputs.index_select(&indices, 0)?) } else { - Some(outputs.i(0)?) + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } } // Mean pooling diff --git a/backends/candle/src/models/flash_mistral.rs b/backends/candle/src/models/flash_mistral.rs new file mode 100644 index 00000000..53e5d3c4 --- /dev/null +++ b/backends/candle/src/models/flash_mistral.rs @@ -0,0 +1,442 @@ +use crate::flash_attn::flash_attn_varlen; +use crate::layers::{HiddenAct, Linear, RMSNorm}; +use crate::models::{MistralConfig, Model}; +use candle::{DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{Embedding, Module, VarBuilder}; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +struct MistralAttention { + qkv_linear: Linear, + o_proj: Linear, + + window_size_left: Option, + + num_attention_heads: usize, + num_key_value_heads: usize, + attention_head_size: usize, + + softmax_scale: f32, + + span: tracing::Span, +} + +impl MistralAttention { + pub fn load(vb: VarBuilder, config: &MistralConfig) -> Result { + let window_size_left = config.sliding_window; + let num_attention_heads = config.num_attention_heads; + let attention_head_size = config.hidden_size / config.num_attention_heads; + let num_key_value_heads = config.num_key_value_heads; + let hidden_size = config.hidden_size; + + let query_weight = vb.pp("q_proj").get((hidden_size, hidden_size), "weight")?; + + let key_weight = vb.pp("k_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + + let value_weight = vb.pp("v_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + + let qkv_weight = Tensor::cat(&[&query_weight, &key_weight, &value_weight], 0)?; + let qkv_linear = Linear::new(qkv_weight, None, None); + + let o_proj_weight = vb.pp("o_proj").get((hidden_size, hidden_size), "weight")?; + + let o_proj = Linear::new(o_proj_weight, None, None); + + let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; + + Ok(Self { + qkv_linear, + o_proj, + window_size_left, + num_attention_heads, + num_key_value_heads, + attention_head_size, + softmax_scale, + span: tracing::span!(tracing::Level::TRACE, "attention"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let qkv = self.qkv_linear.forward(hidden_states)?; + + // Reshape to [tokens, heads, head_size] + let mut new_qkv_shape = qkv.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads + 2 * self.num_key_value_heads); + new_qkv_shape.push(self.attention_head_size); + + let qkv = qkv.reshape(new_qkv_shape)?; + + // Split qkv tensor + let q = qkv.narrow(1, 0, self.num_attention_heads)?; + let k = qkv.narrow(1, self.num_attention_heads, self.num_key_value_heads)?; + let v = qkv.narrow( + 1, + self.num_attention_heads + self.num_key_value_heads, + self.num_key_value_heads, + )?; + + candle_rotary::apply_rotary_inplace(&q, &k, &cos, &sin, true)?; + + let attention = flash_attn_varlen( + &q, + &k, + &v, + None, + cu_seqlens, + cu_seqlens, + max_s, + max_s, + self.softmax_scale, + true, + self.window_size_left, + )?; + let attention = attention.flatten_from(candle::D::Minus2)?; + + self.o_proj.forward(&attention) + } +} + +struct MistralMLP { + gate_up_proj: Linear, + down_proj: Linear, + + act: HiddenAct, + intermediate_size: usize, + + span: tracing::Span, +} + +impl MistralMLP { + pub fn load(vb: VarBuilder, config: &MistralConfig) -> Result { + let intermediate_size = config.intermediate_size; + + let gate_proj_weight = vb + .pp("gate_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let up_proj_weight = vb + .pp("up_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let gate_up_proj_weight = Tensor::cat(&[&gate_proj_weight, &up_proj_weight], 0)?; + let gate_up_proj = Linear::new(gate_up_proj_weight, None, None); + + let down_proj_weight = vb + .pp("down_proj") + .get((config.hidden_size, intermediate_size), "weight")?; + let down_proj = Linear::new(down_proj_weight, None, None); + + Ok(Self { + gate_up_proj, + down_proj, + intermediate_size, + act: config.hidden_act.clone(), + span: tracing::span!(tracing::Level::TRACE, "mlp"), + }) + } + + pub fn forward(&self, hidden_states: &Tensor) -> Result { + let _enter = self.span.enter(); + + let gate_up_states = self.gate_up_proj.forward(hidden_states)?; + let gate_states = gate_up_states.narrow(1, 0, self.intermediate_size)?; + let up_states = gate_up_states.narrow(1, self.intermediate_size, self.intermediate_size)?; + + let gate_states = match self.act { + HiddenAct::Gelu => gate_states.gelu(), + HiddenAct::Relu => gate_states.relu(), + HiddenAct::Swiglu => gate_states.silu(), + }?; + let r = self.down_proj.forward(&(gate_states * up_states)?); + r + } +} + +struct MistralLayer { + attention: MistralAttention, + mlp: MistralMLP, + input_layer_norm: RMSNorm, + post_attention_layer_norm: RMSNorm, + + span: tracing::Span, +} + +impl MistralLayer { + pub fn load(vb: VarBuilder, config: &MistralConfig) -> Result { + let attention = MistralAttention::load(vb.pp("self_attn"), config)?; + let mlp = MistralMLP::load(vb.pp("mlp"), config)?; + + let input_layer_norm = RMSNorm::load( + vb.pp("input_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + let post_attention_layer_norm = RMSNorm::load( + vb.pp("post_attention_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + + Ok(Self { + attention, + mlp, + input_layer_norm, + post_attention_layer_norm, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + residual: Option<&Tensor>, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result<(Tensor, Tensor)> { + let _enter = self.span.enter(); + + let (normed_hidden_states, res) = self.input_layer_norm.forward(hidden_states, residual)?; + let attn_output = + self.attention + .forward(&normed_hidden_states, cu_seqlens, cos, sin, max_s)?; + let (normed_attn_res_output, attn_res) = self + .post_attention_layer_norm + .forward(&attn_output, Some(&res))?; + let mlp_output = self.mlp.forward(&normed_attn_res_output)?; + + Ok((mlp_output, attn_res)) + } +} + +pub struct FlashMistralModel { + embeddings: Embedding, + layers: Vec, + norm: RMSNorm, + cos_cache: Tensor, + sin_cache: Tensor, + pool: Pool, + pub device: Device, + + span: tracing::Span, +} + +impl FlashMistralModel { + pub fn load(vb: VarBuilder, config: &MistralConfig, model_type: ModelType) -> Result { + match vb.device() { + Device::Cuda(_) => {} + _ => candle::bail!("FlashMistral requires Cuda"), + } + + if vb.dtype() != DType::F16 { + candle::bail!("FlashMistral requires DType::F16") + } + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for Mistral") + } + ModelType::Embedding(pool) => pool, + }; + + let embeddings = Embedding::new( + vb.pp("embed_tokens") + .get((config.vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ); + + let layers = (0..config.num_hidden_layers) + .map(|index| MistralLayer::load(vb.pp(format!("layers.{index}")), config)) + .collect::>>()?; + + let norm = RMSNorm::load(vb.pp("norm"), config.hidden_size, config.rms_norm_eps)?; + + let inv_freqs = candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta, + vb.device(), + )?; + let (cos_cache, sin_cache) = + candle_rotary::cos_sin(config.max_position_embeddings, &inv_freqs, vb.dtype())?; + + Ok(Self { + embeddings, + layers, + norm, + cos_cache, + sin_cache, + pool, + device: vb.device().clone(), + span: tracing::span!(tracing::Level::TRACE, "model"), + }) + } + + pub fn forward(&self, batch: Batch) -> Result<(Option, Option)> { + let _enter = self.span.enter(); + + let batch_size = batch.cumulative_seq_lengths.len() - 1; + let shape = batch.input_ids.len(); + + // Create Cuda tensors + let input_ids = Tensor::from_vec(batch.input_ids, shape, &self.device)?; + let position_ids = Tensor::from_vec(batch.position_ids, shape, &self.device)?; + let cu_seqlens = Tensor::from_vec( + batch.cumulative_seq_lengths.clone(), + batch_size + 1, + &self.device, + )?; + + let mut hidden_states = self.embeddings.forward(&input_ids)?; + + let cos = self.cos_cache.index_select(&position_ids, 0)?; + let sin = self.sin_cache.index_select(&position_ids, 0)?; + + let mut residual = None; + for layer in &self.layers { + let (h, r) = layer.forward( + &hidden_states, + residual.as_ref(), + &cu_seqlens, + &cos, + &sin, + batch.max_length as usize, + )?; + hidden_states = h; + residual = Some(r); + } + + let (outputs, _) = self.norm.forward(&hidden_states, residual.as_ref())?; + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + let pooled_embeddings = if has_pooling_requests { + match self.pool { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) + } + } + // Mean pooling + Pool::Mean => { + if batch_size > 1 { + // for each request that requires pooling + let results: Result> = batch + .pooled_indices + .into_iter() + .map(|i| { + let i = i as usize; + let start = batch.cumulative_seq_lengths[i]; + let len = batch.cumulative_seq_lengths[i + 1] - start; + + // Mean + let embeddings = outputs.narrow(0, start as usize, len as usize)?; + embeddings.sum_keepdim(0)? / (len as f64) + }) + .collect(); + + // Concatenate all results + Some(Tensor::cat(&results?, 0)?) + } else { + Some((outputs.sum_keepdim(0)? / (batch.max_length as f64))?) + } + } + Pool::Splade => { + unreachable!(); + } + } + } else { + None + }; + + let raw_embeddings = if has_raw_requests { + if batch_size > 1 && has_pooling_requests { + // Create indexing vector for the embeddings + let mut final_indices: Vec = Vec::with_capacity(shape); + for i in batch.raw_indices.into_iter() { + let i = i as usize; + // Get start/end token index of this specific member of the batch + let start = batch.cumulative_seq_lengths[i]; + let end = batch.cumulative_seq_lengths[i + 1]; + + for j in start..end { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j); + } + } + + let final_indices_length = final_indices.len(); + let final_indices = + Tensor::from_vec(final_indices, final_indices_length, &self.device)?; + + // Select the tokens with final indices + Some(outputs.index_select(&final_indices, 0)?) + } else { + Some(outputs) + } + } else { + None + }; + + Ok((pooled_embeddings, raw_embeddings)) + } +} + +impl Model for FlashMistralModel { + fn is_padded(&self) -> bool { + false + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} diff --git a/backends/candle/src/models/flash_nomic.rs b/backends/candle/src/models/flash_nomic.rs index 12eff0f1..8ad1ab89 100644 --- a/backends/candle/src/models/flash_nomic.rs +++ b/backends/candle/src/models/flash_nomic.rs @@ -81,6 +81,7 @@ impl NomicAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(D::Minus2)?; @@ -304,11 +305,15 @@ impl FlashNomicBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { if batch_size > 1 { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + _ => unreachable!(), + }; // If raw_indices is empty, we don't need to do anything with // the pooled_indices @@ -321,13 +326,22 @@ impl FlashNomicBertModel { )?; // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + indices = indices.index_select(&pooled_indices, 0)? } - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) + // Select tokens + Some(outputs.index_select(&indices, 0)?) } else { - Some(outputs.i(0)?) + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } } // Mean pooling diff --git a/backends/candle/src/models/jina.rs b/backends/candle/src/models/jina.rs index 768e1a6f..6884fcae 100644 --- a/backends/candle/src/models/jina.rs +++ b/backends/candle/src/models/jina.rs @@ -373,6 +373,9 @@ impl JinaBertModel { if pool == Pool::Splade { candle::bail!("`splade` is not supported for Jina") } + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for Jina"); + } pool } }; @@ -594,6 +597,8 @@ impl JinaBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/jina_code.rs b/backends/candle/src/models/jina_code.rs index 348f5892..fd004bc6 100644 --- a/backends/candle/src/models/jina_code.rs +++ b/backends/candle/src/models/jina_code.rs @@ -356,11 +356,14 @@ impl JinaCodeBertModel { let pool = match model_type { ModelType::Classifier => { - candle::bail!("`classifier` model type is not supported for Jina") + candle::bail!("`classifier` model type is not supported for JinaCode") } ModelType::Embedding(pool) => { if pool == Pool::Splade { - candle::bail!("`splade` is not supported for Jina") + candle::bail!("`splade` is not supported for JinaCode") + } + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for JinaCode"); } pool } @@ -583,6 +586,8 @@ impl JinaCodeBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/mistral.rs b/backends/candle/src/models/mistral.rs new file mode 100644 index 00000000..33c5ab00 --- /dev/null +++ b/backends/candle/src/models/mistral.rs @@ -0,0 +1,19 @@ +use crate::layers::HiddenAct; +use serde::Deserialize; + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct MistralConfig { + pub vocab_size: usize, + pub hidden_size: usize, + pub intermediate_size: usize, + pub num_hidden_layers: usize, + pub num_attention_heads: usize, + pub num_key_value_heads: usize, + pub hidden_act: HiddenAct, + pub max_position_embeddings: usize, + pub initializer_range: f64, + pub rms_norm_eps: f32, + pub model_type: Option, + pub rope_theta: f32, + pub sliding_window: Option, +} diff --git a/backends/candle/src/models/mod.rs b/backends/candle/src/models/mod.rs index a7d6b267..3e4a5785 100644 --- a/backends/candle/src/models/mod.rs +++ b/backends/candle/src/models/mod.rs @@ -8,6 +8,7 @@ mod bert; mod distilbert; mod jina; mod jina_code; +mod mistral; mod nomic; #[cfg(feature = "cuda")] @@ -25,11 +26,15 @@ mod flash_nomic; #[cfg(feature = "cuda")] mod flash_distilbert; +#[cfg(feature = "cuda")] +mod flash_mistral; + pub use bert::{BertConfig, BertModel, PositionEmbeddingType}; use candle::{Result, Tensor}; pub use distilbert::{DistilBertConfig, DistilBertModel}; pub use jina::JinaBertModel; pub use jina_code::JinaCodeBertModel; +pub use mistral::MistralConfig; pub use nomic::{NomicBertModel, NomicConfig}; use text_embeddings_backend_core::Batch; @@ -48,6 +53,9 @@ pub use flash_nomic::FlashNomicBertModel; #[cfg(feature = "cuda")] pub use flash_distilbert::FlashDistilBertModel; +#[cfg(feature = "cuda")] +pub use flash_mistral::FlashMistralModel; + pub(crate) trait Model { fn is_padded(&self) -> bool; diff --git a/backends/candle/src/models/nomic.rs b/backends/candle/src/models/nomic.rs index 4f9e7551..cdaaea92 100644 --- a/backends/candle/src/models/nomic.rs +++ b/backends/candle/src/models/nomic.rs @@ -405,6 +405,9 @@ impl NomicBertModel { if pool == Pool::Splade { candle::bail!("`splade` is not supported for Nomic") } + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for Nomic"); + } pool } }; @@ -610,6 +613,8 @@ impl NomicBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/tests/common.rs b/backends/candle/tests/common.rs index d7ebc67d..a3d74d16 100644 --- a/backends/candle/tests/common.rs +++ b/backends/candle/tests/common.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use hf_hub::api::sync::ApiBuilder; +use hf_hub::api::sync::{ApiBuilder, ApiError, ApiRepo}; use hf_hub::{Repo, RepoType}; use insta::internals::YamlMatcher; use serde::{Deserialize, Serialize}; @@ -25,7 +25,7 @@ impl Score { impl PartialEq for Score { fn eq(&self, other: &Self) -> bool { // Default tolerance for equality - self.is_close(other, 6e-3) + self.is_close(other, 5e-3) } } @@ -51,6 +51,44 @@ impl From>> for SnapshotScores { } } +#[derive(Serialize, Deserialize, Debug)] +pub struct SnapEmbedding(Vec); + +impl PartialEq for SnapEmbedding { + fn eq(&self, other: &Self) -> bool { + assert_eq!(self.0.len(), other.0.len()); + + let mut sumxx = 0.0; + let mut sumyy = 0.0; + let mut sumxy = 0.0; + + for (x, y) in self.0.iter().zip(other.0.iter()) { + sumxx += x * x; + sumyy += y * y; + sumxy += x * y; + } + + (sumxy / (sumxx * sumyy).sqrt()) > 0.999 + } +} + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct SnapshotEmbeddings(Vec); + +impl Deref for SnapshotEmbeddings { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From>> for SnapshotEmbeddings { + fn from(value: Vec>) -> Self { + Self(value.into_iter().map(|v| SnapEmbedding(v)).collect()) + } +} + pub fn sort_embeddings(embeddings: Embeddings) -> (Vec>, Vec>) { let mut pooled_embeddings = Vec::new(); let mut raw_embeddings = Vec::new(); @@ -85,23 +123,66 @@ pub fn download_artifacts( api_repo.get("config.json")?; api_repo.get("tokenizer.json")?; - let model_root = match api_repo.get("model.safetensors") { + let model_files = match download_safetensors(&api_repo) { Ok(p) => p, Err(_) => { + tracing::warn!("safetensors weights not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); + tracing::info!("Downloading `pytorch_model.bin`"); let p = api_repo.get("pytorch_model.bin")?; - tracing::warn!("`model.safetensors` not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); - p + vec![p] } - } - .parent().unwrap() - .to_path_buf(); + }; + let model_root = model_files[0].parent().unwrap().to_path_buf(); Ok(model_root) } +fn download_safetensors(api: &ApiRepo) -> Result, ApiError> { + // Single file + tracing::info!("Downloading `model.safetensors`"); + match api.get("model.safetensors") { + Ok(p) => return Ok(vec![p]), + Err(err) => tracing::warn!("Could not download `model.safetensors`: {}", err), + }; + + // Sharded weights + // Download and parse index file + tracing::info!("Downloading `model.safetensors.index.json`"); + let index_file = api.get("model.safetensors.index.json")?; + let index_file_string: String = + std::fs::read_to_string(index_file).expect("model.safetensors.index.json is corrupted"); + let json: serde_json::Value = serde_json::from_str(&index_file_string) + .expect("model.safetensors.index.json is corrupted"); + + let weight_map = match json.get("weight_map") { + Some(serde_json::Value::Object(map)) => map, + _ => panic!("model.safetensors.index.json is corrupted"), + }; + + let mut safetensors_filenames = std::collections::HashSet::new(); + for value in weight_map.values() { + if let Some(file) = value.as_str() { + safetensors_filenames.insert(file.to_string()); + } + } + + // Download weight files + let mut safetensors_files = Vec::new(); + for n in safetensors_filenames { + tracing::info!("Downloading `{}`", n); + safetensors_files.push(api.get(&n)?); + } + + Ok(safetensors_files) +} + pub fn relative_matcher() -> YamlMatcher { YamlMatcher::new() } +pub fn cosine_matcher() -> YamlMatcher { + YamlMatcher::new() +} + pub fn load_tokenizer(model_root: &Path) -> Result { // Load tokenizer let tokenizer_path = model_root.join("tokenizer.json"); diff --git a/backends/candle/tests/snapshots/test_flash_mistral__mistral_batch.snap b/backends/candle/tests/snapshots/test_flash_mistral__mistral_batch.snap new file mode 100644 index 00000000..acea099b --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_mistral__mistral_batch.snap @@ -0,0 +1,12293 @@ +--- +source: backends/candle/tests/test_flash_mistral.rs +assertion_line: 37 +expression: embeddings_batch +--- +- - 3.2363281 + - -1.1582031 + - 1.0810547 + - -2.0292969 + - 1.609375 + - -1.0048828 + - 0.43676758 + - -0.8769531 + - 0.79785156 + - -0.27612305 + - 0.4963379 + - -0.82128906 + - 0.16906738 + - -0.734375 + - -0.34936523 + - 0.03515625 + - 0.34375 + - 1.3769531 + - 1.5234375 + - -1.875 + - -1.4082031 + - 1.6289063 + - -1.1650391 + - 0.65234375 + - 1.796875 + - 1.984375 + - -0.4350586 + - 1.4003906 + - -0.34985352 + - -2.5253906 + - 2.5351563 + - 0.32348633 + - 2.3007813 + - 1.5195313 + - -0.28295898 + - 1.1650391 + - -3.4472656 + - 0.07421875 + - -5.28125 + - -0.8310547 + - 0.7524414 + - -2.4257813 + - -0.91845703 + - -0.9814453 + - -1.7285156 + - 2.0761719 + - 0.23657227 + - -3.9003906 + - -1.4052734 + - 0.8310547 + - 3.9140625 + - -0.43408203 + - -3.0429688 + - -100.5625 + - -3.0703125 + - -0.93652344 + - 2.71875 + - -1.0527344 + - -1.3789063 + - -7.3671875 + - -2.3789063 + - 0.58251953 + - 0.8388672 + - 0.13110352 + - 2.4003906 + - 0.07421875 + - -2.5488281 + - 0.5126953 + - 2.0644531 + - -1.5556641 + - -4.6679688 + - 0.055236816 + - -2.9921875 + - -0.9038086 + - -1.2294922 + - -0.3984375 + - 2.9863281 + - 3.1328125 + - -0.13867188 + - -0.36523438 + - -0.63916016 + - -0.6064453 + - -1.5869141 + - -0.3425293 + - -2.0234375 + - 0.5336914 + - -1.8027344 + - -0.15185547 + - 2.2578125 + - 0.86376953 + - -1.234375 + - 5.9453125 + - 2.7089844 + - -19.703125 + - -2.8125 + - -2.7832031 + - -4.4375 + - 0.35595703 + - 1.5751953 + - -4.09375 + - 1.6884766 + - -1.3564453 + - -3.8652344 + - -0.61035156 + - 0.0055770874 + - -2.7949219 + - 0.08062744 + - -1.3369141 + - -1.5839844 + - -0.056915283 + - 0.04058838 + - 0.4296875 + - 0.47753906 + - -1.5585938 + - -0.055511475 + - 3.03125 + - 2.8515625 + - 0.70947266 + - -0.18884277 + - 0.29467773 + - 2.2421875 + - 0.59472656 + - 0.15393066 + - -2.4863281 + - -2.1992188 + - -0.27172852 + - 2.40625 + - -0.73095703 + - 0.32299805 + - 1.59375 + - 2.3808594 + - 0.17297363 + - -3.2519531 + - 1.1630859 + - 1.234375 + - 2.40625 + - -0.3088379 + - 0.78564453 + - -1.2050781 + - -1.4824219 + - 1.5166016 + - -0.4206543 + - 1.3535156 + - -2.7734375 + - 1.1757813 + - -2.8027344 + - -1.7998047 + - -0.9379883 + - -2.5703125 + - 4.5820313 + - 0.78564453 + - -1.9257813 + - -1.0478516 + - 0.03515625 + - 0.5151367 + - -2.7832031 + - 0.90722656 + - -0.5102539 + - -3.0390625 + - -3.1289063 + - -1.2509766 + - -2.6191406 + - -0.5546875 + - -1.1376953 + - 0.51416016 + - 1.3994141 + - 3.3613281 + - -1.1591797 + - -0.7583008 + - -0.46289063 + - -2.6386719 + - -1.9306641 + - -0.43896484 + - -2.9863281 + - -0.09875488 + - 0.25195313 + - -1.3115234 + - 2.09375 + - -4.265625 + - -2.2519531 + - 1.7910156 + - 0.8022461 + - -1.8603516 + - -1.8544922 + - 0.13891602 + - 5.1054688 + - -3.4863281 + - -0.85253906 + - -1.1806641 + - 0.07336426 + - -1.9082031 + - -3.7753906 + - -0.5541992 + - 0.640625 + - -2.2460938 + - 1.4951172 + - 3.6328125 + - -2.1640625 + - -1.4921875 + - 0.13476563 + - 0.44189453 + - -2.359375 + - 1.9189453 + - 0.7114258 + - 7.9375 + - 3.2929688 + - 4.2617188 + - -2.8378906 + - -0.3474121 + - -2.2304688 + - -2.0644531 + - -0.7504883 + - -2.9101563 + - -0.859375 + - 0.8330078 + - 3.9570313 + - -0.0036258698 + - -2.5214844 + - 3.0898438 + - -0.70458984 + - -3.8535156 + - 0.6298828 + - -0.32739258 + - 3.1289063 + - -0.08618164 + - -1.21875 + - 0.09649658 + - 0.7675781 + - 0.39672852 + - -3.1464844 + - 0.7763672 + - -0.7680664 + - -1.0068359 + - -0.88671875 + - -0.2064209 + - 1.5820313 + - 0.7441406 + - 2.3671875 + - 2.8554688 + - 1.6601563 + - 6.0390625 + - -0.35351563 + - -3.4589844 + - 0.23046875 + - -2.2324219 + - -1.7626953 + - 3.2714844 + - 2.5566406 + - -0.61572266 + - 0.20751953 + - 1.2539063 + - 0.4423828 + - -2.1269531 + - 0.5131836 + - 0.62353516 + - -0.6958008 + - -0.33032227 + - -2.28125 + - 0.032348633 + - 0.3408203 + - 1.4726563 + - 1.8486328 + - 1.890625 + - 1.8886719 + - -0.37426758 + - 2.4140625 + - -2.3027344 + - 3.9121094 + - 0.85546875 + - -4.6953125 + - 0.32983398 + - 0.8154297 + - 3.2304688 + - 0.8305664 + - -0.42773438 + - -1.1630859 + - -3.9277344 + - 1.3681641 + - 0.18469238 + - 1.0292969 + - -2.1328125 + - -2.6738281 + - 1.3876953 + - 0.1361084 + - 0.99902344 + - -0.77783203 + - -0.064697266 + - 1.828125 + - 0.65771484 + - 0.03390503 + - 1.7265625 + - 1.2138672 + - 10.0703125 + - 0.064697266 + - 0.6723633 + - -0.4819336 + - 1.8457031 + - -1.4023438 + - 2.2148438 + - -0.5493164 + - -0.07574463 + - -0.20422363 + - 2.7597656 + - 3.3242188 + - -1.6425781 + - 1.5322266 + - 2.4785156 + - 1.4394531 + - -0.09094238 + - -1.203125 + - -1.6650391 + - -0.10546875 + - -0.8964844 + - 0.072509766 + - 1.1875 + - -2.4375 + - 0.08258057 + - -0.14453125 + - -3.1816406 + - 1.2851563 + - 1.8339844 + - 1.2412109 + - -3.8457031 + - 2.5703125 + - -1.4052734 + - -0.78564453 + - -1.3427734 + - -1.5039063 + - 2.3652344 + - -3.5820313 + - -4.078125 + - 1.7050781 + - 1.5644531 + - 0.7709961 + - 2.34375 + - -0.11657715 + - 2.7832031 + - -0.49926758 + - 0.08984375 + - 0.105285645 + - 2.7597656 + - -0.4482422 + - 2.1015625 + - 1.5488281 + - 1.9433594 + - 1.1533203 + - -0.21252441 + - 2.6777344 + - -5.0664063 + - -0.8847656 + - 2.1464844 + - -1.265625 + - 0.3330078 + - 0.5102539 + - -2.1738281 + - -0.7841797 + - -4.1015625 + - -1.609375 + - -1.6220703 + - -1.4111328 + - -1.4921875 + - 1.7324219 + - 4.359375 + - -1.3857422 + - 2.9726563 + - -2.90625 + - 6.1757813 + - 1.6982422 + - 1.4638672 + - -2.6894531 + - 0.7714844 + - -1.5244141 + - -2.125 + - 3.5058594 + - -0.3996582 + - 3.5996094 + - -1.4482422 + - 0.3935547 + - 0.7109375 + - 2.4746094 + - -1.3896484 + - -1.2880859 + - -1.9433594 + - -0.859375 + - -0.703125 + - 1.8554688 + - 1.8632813 + - -4.2226563 + - -8.125 + - -2.1074219 + - 0.453125 + - -0.09375 + - -2.6660156 + - -0.95751953 + - 0.047698975 + - -0.29663086 + - 2.6464844 + - 2.1074219 + - -2.1464844 + - 1.5498047 + - -2.3339844 + - 1.5898438 + - -0.5654297 + - -4.3476563 + - -0.1673584 + - 1.7988281 + - 2.0488281 + - -2.1660156 + - -14.390625 + - -0.12243652 + - -2.2089844 + - -1.6064453 + - 3.1171875 + - -1.1591797 + - 1.4433594 + - -0.19689941 + - -3.6835938 + - -1.4238281 + - -3.6152344 + - 5.109375 + - -0.5004883 + - -0.4736328 + - 2.7988281 + - -0.32592773 + - -0.75927734 + - 1.0458984 + - 0.1619873 + - -2.0371094 + - 2.2246094 + - -1.4375 + - -1.921875 + - -1.7138672 + - -3.8613281 + - 0.85009766 + - -0.37939453 + - -1.8525391 + - 0.5839844 + - -1.9013672 + - 0.7519531 + - 1.6748047 + - -1.3095703 + - -1.5087891 + - -0.6269531 + - -1.6445313 + - -2.2011719 + - -0.9091797 + - 0.06640625 + - 2.7050781 + - -2.1679688 + - -3.5800781 + - -0.009483337 + - 1.5244141 + - -0.58935547 + - -2.0390625 + - -0.47583008 + - 5.609375 + - 4.625 + - -0.033477783 + - 0.07110596 + - 3.2851563 + - -0.44482422 + - -2.8945313 + - -1.7675781 + - 2.7714844 + - -0.9301758 + - -0.84521484 + - -0.9785156 + - 0.27197266 + - 0.33666992 + - -2.3515625 + - 4.9375 + - 2.3125 + - 0.29882813 + - 1.015625 + - 0.35131836 + - 0.43896484 + - 0.8076172 + - -0.91064453 + - -0.6064453 + - 3.8203125 + - 0.5683594 + - 0.55908203 + - 0.9736328 + - -1.9970703 + - -0.3269043 + - 1.2158203 + - -6.0039063 + - 0.13977051 + - 3.71875 + - -0.5605469 + - 0.46313477 + - 1.5683594 + - -0.7011719 + - -0.46362305 + - -2.6328125 + - -1.3330078 + - 2.4570313 + - -2.0488281 + - -2.9238281 + - 5.375 + - 0.21679688 + - -5.9726563 + - 2.0390625 + - 0.055786133 + - 1.3359375 + - 3.8378906 + - -0.6225586 + - -0.6113281 + - -1.5830078 + - 2.8535156 + - 3.6679688 + - -2.5703125 + - -1.5019531 + - 0.69091797 + - -2.0332031 + - 1.6210938 + - -0.3408203 + - -0.5522461 + - -1.4355469 + - -0.5078125 + - 0.5957031 + - 1.5869141 + - 3.6757813 + - -0.018692017 + - 0.55566406 + - 1.4609375 + - 0.20336914 + - -1.3769531 + - 1.6767578 + - 2.1894531 + - 0.85253906 + - 0.4519043 + - -0.00390625 + - -1.8789063 + - 3.5800781 + - 0.16516113 + - -4.5117188 + - -0.12890625 + - -0.3557129 + - -1.6269531 + - -1.9589844 + - -1.0107422 + - 3.1054688 + - -0.8457031 + - -4.8476563 + - -2.3652344 + - -1.3818359 + - 0.20703125 + - 1.9863281 + - 1.4814453 + - 0.6333008 + - 1.9667969 + - -17.671875 + - -1.453125 + - -1.0478516 + - -2.0019531 + - -1.3818359 + - 0.61279297 + - 0.20227051 + - 0.0055770874 + - 2.3476563 + - -3.4804688 + - -1.0546875 + - -2.2363281 + - 1.2685547 + - -1.0302734 + - 0.87597656 + - -2.4453125 + - -1.4394531 + - -2.3496094 + - -2.2890625 + - -0.8925781 + - -1.9296875 + - 0.9921875 + - 0.2939453 + - -1.2851563 + - 1.1201172 + - 0.578125 + - 0.30908203 + - 0.7246094 + - -3.2089844 + - 0.65478516 + - 2.5683594 + - -3.2148438 + - -2.9394531 + - 1.6816406 + - 1.6416016 + - -2.3417969 + - -3.5 + - -1.1904297 + - 1.4462891 + - -3.1875 + - -1.890625 + - -0.1015625 + - -1.9082031 + - 1.4306641 + - 5.1757813 + - 3.9101563 + - 1.0263672 + - 3.2402344 + - -0.8222656 + - -0.68603516 + - 0.055786133 + - -2.2578125 + - -2.3261719 + - 0.15234375 + - -3.6972656 + - 0.5625 + - -4.3789063 + - 0.9506836 + - 2.5957031 + - -1.7587891 + - -1.9824219 + - 1.9609375 + - -0.60595703 + - -0.2524414 + - -1.5576172 + - 1.8701172 + - -2.1386719 + - 0.00390625 + - 1.4619141 + - 1.8613281 + - 0.00027894974 + - 0.44140625 + - -1.6054688 + - 3.4902344 + - 0.036834717 + - 1.4169922 + - 0.7788086 + - -0.12384033 + - 1.7070313 + - -0.52197266 + - -3.2265625 + - -2.6875 + - 0.61572266 + - 2.6113281 + - -2.8164063 + - -0.83251953 + - -0.25439453 + - 0.037384033 + - -2.2226563 + - -2.5703125 + - -0.08013916 + - 2.7851563 + - 4.390625 + - -1.0810547 + - 0.59375 + - -4.6757813 + - 7.9140625 + - -3.1503906 + - 0.73339844 + - 3.3554688 + - -1.6220703 + - -2.59375 + - 0.984375 + - -1.6298828 + - -0.5546875 + - 2.6933594 + - 3.8125 + - -0.45922852 + - 1.4638672 + - 1.0556641 + - 1.6621094 + - 3.1113281 + - -0.55126953 + - 2.4003906 + - 1.8222656 + - -2.0507813 + - 0.22314453 + - 0.98535156 + - -0.5253906 + - -1.0029297 + - 0.6152344 + - 0.6113281 + - -0.71191406 + - -2.9492188 + - -0.19580078 + - -0.98828125 + - -0.1899414 + - 0.044067383 + - 1.5214844 + - 1.734375 + - 1.0146484 + - -1.4179688 + - 7.7578125 + - 3.3652344 + - 7.0976563 + - 1.4726563 + - -5.7226563 + - -5.890625 + - -0.3828125 + - -1.3154297 + - -0.31958008 + - -1.5888672 + - 0.1907959 + - -0.23181152 + - -1.046875 + - 1.6132813 + - -1.9482422 + - 2.6699219 + - 3.2246094 + - 3.6679688 + - -0.9091797 + - -2.5136719 + - 0.5102539 + - 24.09375 + - 1.2988281 + - 0.88183594 + - 0.09313965 + - -3.0195313 + - 1.8251953 + - 0.71484375 + - 0.77197266 + - -2.15625 + - 1.1113281 + - 3 + - 2.96875 + - -0.28686523 + - -0.0496521 + - 0.5957031 + - 4.7929688 + - 1.4414063 + - 3.0625 + - -5.0664063 + - -0.17687988 + - -1.8623047 + - -1.8876953 + - -3.6367188 + - 0.9038086 + - -0.4519043 + - 1.453125 + - -0.27124023 + - -1.8652344 + - 2.1582031 + - 0.65771484 + - -3.4160156 + - -5.7304688 + - -0.22070313 + - -3.03125 + - -0.9975586 + - 1.8378906 + - -1.4101563 + - 1.4414063 + - 3.9804688 + - -1.9648438 + - -1.5292969 + - -1.8769531 + - 2.2949219 + - -0.23254395 + - -0.5600586 + - 1.2783203 + - 0.60791016 + - 1.453125 + - 0.8408203 + - -0.73535156 + - -0.99658203 + - -3.1132813 + - 2.9472656 + - -0.5136719 + - 0.32617188 + - -2.6640625 + - -1.5917969 + - 1.0527344 + - 0.119384766 + - -1.2695313 + - -1.6621094 + - 2.1621094 + - -1.7226563 + - -1.7275391 + - -0.45898438 + - -0.26733398 + - 2.6152344 + - 0.4230957 + - -1.1201172 + - -0.47021484 + - 4.1289063 + - 1.4775391 + - -0.26342773 + - 2.9726563 + - -2.859375 + - 2.3222656 + - 0.52197266 + - -1.1865234 + - -3.2050781 + - -1.1943359 + - 2.2285156 + - -2.5 + - 5.8789063 + - -0.001953125 + - 2.4101563 + - -0.78027344 + - -1.4560547 + - 0.8540039 + - 2.6914063 + - 0.49853516 + - -1.1474609 + - -0.55566406 + - 0.46972656 + - 1.1582031 + - -3.6191406 + - 2.3203125 + - -4.75 + - -4.75 + - -3.7871094 + - 1.0068359 + - 3.9179688 + - 1.4345703 + - -1.3925781 + - 0.171875 + - 2.4257813 + - 1.21875 + - -2.6074219 + - 1.1171875 + - -1.5332031 + - -4.0273438 + - -0.3540039 + - 5.6328125 + - 0.23010254 + - 2.109375 + - 1.9853516 + - -0.9951172 + - 2.140625 + - -0.2705078 + - -2.8164063 + - -0.19946289 + - 4.5820313 + - -2.5664063 + - -0.3581543 + - 2.8847656 + - -1.4316406 + - 0.06585693 + - 1.0810547 + - -1.1972656 + - -9.3359375 + - 1.4482422 + - -47.25 + - -1.2919922 + - -0.6015625 + - -2.0625 + - -3.9179688 + - -0.47729492 + - 0.296875 + - 1.0654297 + - 1.6640625 + - 1.0595703 + - 0.18188477 + - -1.796875 + - 4.6875 + - -0.5253906 + - -2.0019531 + - 1.5869141 + - 1.1044922 + - -0.7211914 + - 16.984375 + - 0.42285156 + - -0.9765625 + - -1.2626953 + - -0.9379883 + - -0.57958984 + - 0.4038086 + - 2.8007813 + - 0.87353516 + - -1.625 + - -0.4267578 + - -2.6699219 + - -0.9609375 + - -2.4199219 + - 0.1784668 + - 0.49438477 + - -0.88183594 + - 2.4472656 + - 1.0351563 + - 0.8046875 + - 1.4453125 + - 0.5073242 + - 3.921875 + - -0.3798828 + - 1.046875 + - 0.2524414 + - -3.1367188 + - 2.5292969 + - 0.12658691 + - -1.2939453 + - -0.52246094 + - -2.9902344 + - 0.3515625 + - -1.6132813 + - -0.08203125 + - -0.66015625 + - -0.059143066 + - 0.21252441 + - 1.9482422 + - -4.1484375 + - -2.4863281 + - 0.35864258 + - 0.18481445 + - -1.0009766 + - -2.59375 + - 1.2685547 + - 6.6015625 + - -0.65283203 + - -0.7451172 + - 4.7226563 + - -2.2519531 + - 2.3105469 + - -2.0625 + - -0.16796875 + - 0.17907715 + - -2.3144531 + - 2.8964844 + - -4.5703125 + - 3.5996094 + - -1.0625 + - 5.2304688 + - 0.46972656 + - 0.31811523 + - -3.0722656 + - 1.9150391 + - 0.18713379 + - 1.9267578 + - 2.9316406 + - -1.0644531 + - -0.28515625 + - 0.26489258 + - -0.71972656 + - 2.5703125 + - -1.4707031 + - -1.5351563 + - -2.7070313 + - 1.2441406 + - -0.47607422 + - -0.3474121 + - -0.8457031 + - -3.4179688 + - -1.0927734 + - -2.1328125 + - -5.7382813 + - -1.1689453 + - 0.2512207 + - 1.3505859 + - 3.4101563 + - 3.4472656 + - 0.40112305 + - 0.56689453 + - 0.064697266 + - 0.7753906 + - 0.9980469 + - -1.6445313 + - 2.921875 + - 0.97314453 + - 1.3320313 + - -2.6816406 + - 2.3125 + - -2.0449219 + - 2.2089844 + - 1.6376953 + - 0.4819336 + - -1.6738281 + - -1.7792969 + - 0.17663574 + - 0.31298828 + - 4.0273438 + - -0.7270508 + - 3.1933594 + - 2.3964844 + - 2.65625 + - 1.4794922 + - -0.0524292 + - 1.9814453 + - 0.39282227 + - 0.23828125 + - 2.7226563 + - -0.80126953 + - -2.8105469 + - 0.1665039 + - -2.1660156 + - -2.0292969 + - -2.4453125 + - -3.0078125 + - 1.9033203 + - 2.8339844 + - 2.7753906 + - -2.4765625 + - 0.8408203 + - -3.203125 + - 2.265625 + - -1.7246094 + - 4.75 + - 4.6875 + - 0.59472656 + - -0.53466797 + - 1.7792969 + - 0.2956543 + - 2.3515625 + - -4.1757813 + - 3.9179688 + - -1.46875 + - -4.9453125 + - -1.9033203 + - -1.0390625 + - -0.34399414 + - -2.9414063 + - -15.546875 + - 2.0390625 + - -1.2695313 + - 4.1445313 + - 1.2197266 + - 3.3535156 + - 1.3818359 + - 1.5996094 + - -0.45141602 + - -0.6635742 + - 1.65625 + - -2.0996094 + - 2.4941406 + - 1.4921875 + - 2.0800781 + - -3.2675781 + - 0.96191406 + - -0.0072517395 + - -0.21252441 + - 1.2314453 + - 2.2519531 + - -1.0253906 + - 0.35327148 + - -0.015625 + - 1.5966797 + - -4.4726563 + - 0.20471191 + - -1.7744141 + - -16.671875 + - 0.61865234 + - 0.1204834 + - 2.9863281 + - -4.984375 + - -1.5673828 + - 0.2685547 + - 1.1904297 + - -5.015625 + - -2.6191406 + - -2.6132813 + - 3.6992188 + - -0.53271484 + - -0.45141602 + - -2.3652344 + - 0.70166016 + - -6.203125 + - -1.1904297 + - -0.35180664 + - 0.74072266 + - 1.1875 + - -0.9941406 + - -0.24536133 + - -2.4628906 + - -0.63623047 + - 2.921875 + - -3.5 + - -0.0418396 + - -0.52783203 + - 1.5361328 + - 3.4628906 + - -1.8183594 + - 0.32592773 + - -1.4794922 + - -0.74853516 + - 2.2285156 + - -0.75097656 + - 0.43237305 + - -18.859375 + - -0.33251953 + - -1.9013672 + - 2.4355469 + - -4.1875 + - 2.4121094 + - 0.5698242 + - 1.2294922 + - 1.6337891 + - -0.6972656 + - 1.4189453 + - -1.1513672 + - 2.2636719 + - -1.9921875 + - 0.50927734 + - -0.11621094 + - 0.58740234 + - 0.045196533 + - 1.4101563 + - -4.8007813 + - -1.421875 + - 2.3144531 + - -2.7324219 + - -0.19055176 + - 2.9023438 + - -1.4501953 + - 3.1484375 + - -2.5957031 + - -1.5234375 + - 2.0722656 + - 1.359375 + - 3.15625 + - -2.1503906 + - -1.5009766 + - -1.6464844 + - -0.4116211 + - -0.60595703 + - -1.6875 + - 1.4931641 + - 1.8671875 + - 3.7695313 + - 1.6650391 + - 2.296875 + - 3.6601563 + - -2.0839844 + - 0.4116211 + - -2.2988281 + - -1.4267578 + - -6.0625 + - 1.0380859 + - 2.4628906 + - 0.46191406 + - 0.2548828 + - 0.19689941 + - -2.0976563 + - 0.6020508 + - 0.14929199 + - 8.09375 + - -0.37939453 + - -1.6357422 + - -1.1328125 + - 1.1572266 + - 1.5166016 + - 1.8105469 + - -1.7607422 + - -1.9306641 + - 0.43115234 + - 2.6933594 + - 0.68603516 + - 3.0800781 + - -3.4238281 + - -4.5898438 + - 0.8173828 + - 0.81689453 + - 1.5869141 + - 0.9785156 + - 0.3359375 + - -0.2454834 + - 4.140625 + - 0.45922852 + - 0.1227417 + - -2.3183594 + - 1.6416016 + - -0.86376953 + - 1.2724609 + - -3.3242188 + - -0.48486328 + - 1.7539063 + - -2.6875 + - 1.2851563 + - 3.9628906 + - 2.2578125 + - -0.9003906 + - -0.890625 + - 1.5214844 + - 1.3681641 + - 0.6738281 + - 2.875 + - 4.9257813 + - -0.41552734 + - 1.0478516 + - -0.67822266 + - 0.17907715 + - 0.7519531 + - 2.2324219 + - 1.2285156 + - 1.1103516 + - 0.13671875 + - -4.5898438 + - -0.58251953 + - 3.1289063 + - -2.9101563 + - -0.5 + - -3.109375 + - -0.7890625 + - 2.46875 + - 6.3671875 + - 1.0234375 + - -1.5839844 + - 1.7226563 + - 2.2578125 + - -0.53271484 + - -1.3720703 + - 1.2597656 + - -5.4179688 + - 1.2451172 + - 2.6855469 + - 5.4140625 + - -0.4560547 + - 0.5136719 + - -1.0898438 + - -0.8725586 + - -2.5917969 + - -3.6132813 + - 3.6015625 + - -0.8730469 + - 0.97802734 + - 5.375 + - -2.1015625 + - -1.2539063 + - -2.5039063 + - -0.38916016 + - -0.047546387 + - 0.2939453 + - -1.1806641 + - -0.13952637 + - 3.3027344 + - -0.9951172 + - 0.3881836 + - 1.9726563 + - 0.578125 + - -0.53564453 + - -0.30908203 + - 3.3164063 + - -0.27539063 + - 0.8676758 + - 1.8466797 + - 2.5957031 + - 0.625 + - -0.63427734 + - -3.7246094 + - -3.3027344 + - 0.061645508 + - 3.0683594 + - -0.9375 + - 2.4726563 + - -0.6616211 + - 1.5009766 + - -0.15673828 + - -3.625 + - 0.9790039 + - 0.10180664 + - -0.1430664 + - -1.1445313 + - -2.4355469 + - 6.703125 + - -2.4082031 + - 0.82666016 + - -1.2753906 + - 2.6503906 + - 0.7402344 + - -0.68408203 + - -2.0527344 + - 0.01701355 + - -3.9707031 + - 0.9741211 + - 0.3684082 + - 1.9746094 + - 1.2275391 + - 11.5703125 + - -1.9726563 + - -1.2568359 + - 1.5556641 + - 0.38720703 + - 6.0625 + - 4.03125 + - 0.3269043 + - -1.5058594 + - -0.7089844 + - 0.52783203 + - 8.3125 + - 0.38867188 + - -0.64453125 + - 0.23876953 + - -1.2001953 + - 0.69921875 + - -3.109375 + - -2.7402344 + - -2.3964844 + - -3.6738281 + - 1.8652344 + - -3.6816406 + - -1.0703125 + - 1.0126953 + - 0.83251953 + - -4.9414063 + - -0.2487793 + - 0.36669922 + - 1.9873047 + - -0.4453125 + - -1.421875 + - 1.3291016 + - -1.1318359 + - -1.125 + - 2.25 + - 0.49023438 + - 1.9892578 + - 4.171875 + - -1.8466797 + - 1.5117188 + - 0.41845703 + - -4.1914063 + - -1.8828125 + - -0.3010254 + - -1.7539063 + - 3.1015625 + - -1.0146484 + - 0.4970703 + - 3.1601563 + - 0.080078125 + - 3.5722656 + - -0.74072266 + - 3.1738281 + - -1.8457031 + - 3.15625 + - -0.88671875 + - -3.90625 + - -2.7324219 + - -3.7539063 + - 1.6591797 + - 1.1328125 + - -0.9873047 + - -0.70703125 + - -0.78564453 + - -0.30078125 + - -2.2480469 + - -1.0400391 + - 1.1386719 + - 1.0878906 + - -0.74658203 + - 2.7128906 + - -9.265625 + - 3.6757813 + - 3.4140625 + - -0.7910156 + - 0.8730469 + - -2.4628906 + - -0.8623047 + - 0.82128906 + - -0.09765625 + - 1.9785156 + - 0.9145508 + - -0.8256836 + - 3.8378906 + - 0.45043945 + - -1.5556641 + - -2.703125 + - -0.60546875 + - 1.1132813 + - -0.43652344 + - -2.0175781 + - -0.31958008 + - -0.07867432 + - -1.5126953 + - 3.2539063 + - 0.37036133 + - -6.2109375 + - 1.9072266 + - 4.3515625 + - -0.01171875 + - 0.04852295 + - 0.296875 + - 0.8154297 + - 1.7441406 + - 2.4199219 + - 3.375 + - 0.42578125 + - 0.5605469 + - -0.43188477 + - -0.09667969 + - 1.4482422 + - 2.7324219 + - -0.17468262 + - -3.9589844 + - 10.7734375 + - 2.2988281 + - -3.1738281 + - -71 + - 0.8598633 + - -1.671875 + - -0.8847656 + - 2.8320313 + - 4.7929688 + - 1.6953125 + - 0.8984375 + - -0.09063721 + - -2.2050781 + - -2.765625 + - 1.6904297 + - -0.7163086 + - 2.3457031 + - 0.35083008 + - -5.0625 + - -2.6972656 + - -3.0078125 + - -0.32592773 + - 1.7851563 + - 2.4550781 + - 0.5205078 + - 1.1357422 + - -0.9584961 + - -1.6064453 + - -2.7480469 + - -1.6689453 + - -3.2753906 + - 1.0966797 + - -1.7207031 + - 1.1298828 + - -4.6367188 + - 0.08984375 + - -1.109375 + - -3.8867188 + - 1.0859375 + - 1.0166016 + - -0.043792725 + - 1.3095703 + - -2.6269531 + - -0.30297852 + - -1.3212891 + - 4.2148438 + - 1.796875 + - 1.2851563 + - -2.6074219 + - 2.0527344 + - 1.4707031 + - 2.9453125 + - 0.33374023 + - 1.2978516 + - -0.5600586 + - 1.0791016 + - 9.7578125 + - -4.8945313 + - 1.8242188 + - 0.14147949 + - 0.9223633 + - 0.3815918 + - -2.0175781 + - 0.9194336 + - 2.046875 + - 0.3852539 + - -3.15625 + - -0.7392578 + - 0.11602783 + - -4.640625 + - 0.7426758 + - -0.93603516 + - 0.4621582 + - -2.9628906 + - 2.0625 + - 2.890625 + - 0.58935547 + - 1.4394531 + - 0.2878418 + - -2.2128906 + - -0.7866211 + - 0.54345703 + - 1.0351563 + - -0.11187744 + - 0.4152832 + - -1.7988281 + - -1.1962891 + - 0.7685547 + - -2.7597656 + - 2.4375 + - 3.6503906 + - -0.6088867 + - -1.0214844 + - -1.2431641 + - 2.0878906 + - -0.15905762 + - 2.8632813 + - 2.4941406 + - 7.8046875 + - 1.8417969 + - 3.0839844 + - -1.7001953 + - 0.81103516 + - 1.5585938 + - -0.31445313 + - 0.3947754 + - 1.9375 + - -0.9941406 + - 0.13220215 + - -0.83740234 + - -2.9550781 + - 0.67822266 + - -1.1914063 + - 5.3007813 + - 16.75 + - 1.0976563 + - -0.65185547 + - -3.8984375 + - 1.375 + - -0.75 + - 1.6728516 + - 2.3945313 + - -0.31225586 + - -0.9316406 + - 3.2753906 + - 0.94970703 + - 1.359375 + - -1.875 + - 2.1777344 + - 2.2441406 + - -4.0898438 + - 1.3691406 + - 0.30395508 + - 2.1152344 + - 0.1126709 + - -1.7089844 + - 1.3037109 + - -0.82666016 + - 3.9414063 + - 1.4775391 + - -1.4306641 + - 3.2910156 + - 1.3632813 + - -1.796875 + - -3.2226563 + - 1.6689453 + - -0.072509766 + - -2.9960938 + - 0.76416016 + - 0.1616211 + - -2.6503906 + - 0.085510254 + - 1.9941406 + - 0.55908203 + - 0.34423828 + - 3.0351563 + - 1.4033203 + - -0.54785156 + - 0.37817383 + - 3.5644531 + - -0.7607422 + - 2.7578125 + - 0.76660156 + - 3.2304688 + - 2.390625 + - -2.2675781 + - -1.4804688 + - 2.2480469 + - 6.3867188 + - -2.7519531 + - -0.3305664 + - 3.0195313 + - -4.2539063 + - 0.103515625 + - -0.5175781 + - -2.2578125 + - 0.27441406 + - 0.76660156 + - 2.3105469 + - 1.1015625 + - 0.081726074 + - -0.16015625 + - -0.0078125 + - -1.9619141 + - -0.63720703 + - -2.21875 + - 0.4033203 + - 1.1953125 + - 0.39013672 + - -2.21875 + - -1.65625 + - -2.0566406 + - -1.6669922 + - -10.375 + - 0.6894531 + - 0.6230469 + - -0.0446167 + - -0.6328125 + - -1.4785156 + - -3.3125 + - 1.4169922 + - -0.5205078 + - 1.609375 + - 3.4453125 + - 1.1767578 + - 2.6171875 + - 5.765625 + - -1.453125 + - 1.8847656 + - -3.3789063 + - -3.6875 + - -2.703125 + - 1.6894531 + - 0.23828125 + - -2.6445313 + - 2.9140625 + - -2.3457031 + - -0.65478516 + - 0.69970703 + - 1.2314453 + - 5.4804688 + - -0.18164063 + - 0.48754883 + - 3.3339844 + - 4.1132813 + - -3.0664063 + - -5.390625 + - -0.29589844 + - 0.8984375 + - 1.0292969 + - 2.5839844 + - -0.093444824 + - -1.4394531 + - 2.6972656 + - 2.3828125 + - -0.29467773 + - -1.8320313 + - -1.3818359 + - 2.1191406 + - 0.82128906 + - 3.8769531 + - 1.8378906 + - -0.46313477 + - 3.375 + - 1.1123047 + - 1.0087891 + - 2.1347656 + - -3.4277344 + - -2.8945313 + - -2.65625 + - 2.4277344 + - 2.7734375 + - -1.9775391 + - -3.71875 + - -3.6953125 + - -1.5332031 + - -4.8945313 + - 0.98828125 + - -1.0302734 + - 2.1640625 + - 0.5756836 + - -2.96875 + - -4.15625 + - -0.06274414 + - 0.03515625 + - 3.4160156 + - 0.92285156 + - -0.64697266 + - -1.0117188 + - 20.421875 + - 1.1201172 + - 0.58251953 + - 2.1933594 + - 8.015625 + - -0.35546875 + - -0.2253418 + - 0.3088379 + - 0.7392578 + - -3.4335938 + - -0.8833008 + - 4.125 + - -2.3203125 + - 4.7304688 + - 0.66845703 + - 0.73535156 + - -0.64697266 + - 0.68310547 + - -2.9316406 + - -2.5644531 + - 5.1523438 + - -0.84277344 + - 0.48046875 + - 3.7089844 + - 0.16040039 + - -3.9765625 + - 1.3769531 + - 2.2441406 + - 0.9951172 + - 0.20532227 + - 0.63134766 + - 0.3720703 + - 3.1738281 + - 0.61279297 + - -4.0507813 + - 0.96191406 + - -0.62353516 + - -0.9472656 + - -1.0126953 + - -4.5390625 + - 5.3164063 + - 2.5136719 + - -6.2109375 + - -1.0478516 + - 1.4082031 + - 2.2832031 + - -1.5019531 + - 1.1425781 + - 1.7949219 + - -2.5058594 + - 3.6738281 + - 0.515625 + - 2.3613281 + - 0.29858398 + - 6.1289063 + - 1.1318359 + - 0.29174805 + - 1.046875 + - -2.0136719 + - -3.8242188 + - 4.546875 + - 3.0429688 + - 2.7207031 + - 0.028457642 + - 0.33691406 + - 0.15515137 + - 2.9394531 + - -3.4550781 + - 0.39282227 + - 0.38305664 + - -4.5078125 + - -1.8945313 + - 1.9765625 + - 2.75 + - -4.6992188 + - -2.0136719 + - -1.1396484 + - -3.2890625 + - -1.2226563 + - -2.7890625 + - 1.3349609 + - 1.0654297 + - 0.18237305 + - -3.5683594 + - -0.7392578 + - 2.5644531 + - 1.5683594 + - -1.3681641 + - -2.8691406 + - 1.3779297 + - -1.5214844 + - -0.83691406 + - -4.0742188 + - -2.375 + - -4.5429688 + - 2.6953125 + - 0.6816406 + - -3.203125 + - -2.5175781 + - -2.1894531 + - 1.2763672 + - 0.5151367 + - -0.6088867 + - 4.1289063 + - -3.0625 + - 0.6694336 + - -0.07446289 + - -1.6347656 + - 4.0546875 + - -3.6660156 + - 1.1875 + - -2.1308594 + - 2.0566406 + - -0.37890625 + - -4.78125 + - -1.0332031 + - 3.9765625 + - 0.3557129 + - 1.2753906 + - -2.8867188 + - 2.3613281 + - -6.140625 + - 1.2578125 + - 0.69873047 + - -0.89160156 + - 3.6640625 + - 3.5039063 + - 1.4873047 + - 2.4082031 + - -0.64160156 + - 0.66015625 + - -2.4589844 + - -3.3144531 + - -2.1328125 + - 2.8867188 + - 0.7421875 + - -1.4570313 + - 1.7060547 + - 1.0664063 + - -0.52685547 + - 2.5371094 + - -1.890625 + - -1.6679688 + - 1.2255859 + - -0.51953125 + - -1.5722656 + - 1.5800781 + - 0.42919922 + - 0.4934082 + - 3.7558594 + - 2.6347656 + - 0.0892334 + - -1.2910156 + - -5.2148438 + - 3.09375 + - 1.4492188 + - -2.1113281 + - 2.4453125 + - 1.5205078 + - -3.7050781 + - 2.1386719 + - 1.9863281 + - -1.7480469 + - 2.6875 + - -2.9941406 + - -1.9804688 + - -1.8417969 + - 0.51708984 + - 1.8808594 + - 0.34106445 + - -1.5683594 + - -5.5898438 + - -0.23840332 + - -1.6435547 + - -0.86816406 + - -1.3125 + - -5.1445313 + - 3.1347656 + - 0.6113281 + - -2.2421875 + - 1.0253906 + - -1.7421875 + - 3.6621094 + - -2.1660156 + - 2.3730469 + - -1.4462891 + - 0.33862305 + - -0.83984375 + - -0.49267578 + - 1.8681641 + - -0.2175293 + - -0.25854492 + - -3.2089844 + - 0.10430908 + - -1.5869141 + - 1.0126953 + - 1.2773438 + - 3.75 + - -1.6982422 + - -2.1621094 + - -0.034454346 + - 3.90625 + - 2.0703125 + - -1.0029297 + - -3.7441406 + - -1.1357422 + - -2.8867188 + - 8.7734375 + - -1.75 + - -0.11102295 + - -1.7871094 + - 4.3984375 + - 1.2919922 + - 1.1982422 + - 0.79785156 + - -1.3037109 + - 0.2175293 + - -0.7133789 + - 2.1738281 + - -5.390625 + - -2.6777344 + - 5.7382813 + - -4.1210938 + - 3.6914063 + - -1.0966797 + - 0.49926758 + - 0.63720703 + - 3.8164063 + - 0.39770508 + - -1.3974609 + - -0.011154175 + - 0.9560547 + - 2.171875 + - -4.8320313 + - 1.7783203 + - 0.55126953 + - -3.1738281 + - -1.4326172 + - -0.23596191 + - -1.140625 + - -0.22290039 + - -1.1679688 + - 0.34204102 + - 1.5605469 + - -0.85595703 + - -2.0996094 + - -3.8925781 + - 0.55126953 + - -1.4453125 + - -1.6191406 + - 0.23510742 + - 2.6875 + - 0.5488281 + - 2.5390625 + - -0.30566406 + - -0.31054688 + - -1.75 + - 3.4765625 + - 2.8691406 + - -1.8105469 + - -0.67822266 + - -3.6894531 + - -2.2324219 + - 1.7548828 + - 0.15344238 + - -2.2128906 + - -2.3222656 + - -0.578125 + - 1.2382813 + - -0.4765625 + - 0.88134766 + - 2.4453125 + - -0.92285156 + - -3.0878906 + - -2.65625 + - 0.1439209 + - -2.96875 + - -1.8652344 + - -1.0390625 + - -2.1757813 + - -2.8847656 + - -0.6171875 + - -0.8310547 + - -1.3662109 + - 5.4140625 + - 4.6992188 + - -4.21875 + - -0.35668945 + - -1.2822266 + - 1.4794922 + - -2.3300781 + - -2.2949219 + - 3.5800781 + - -1.3066406 + - -2.5527344 + - 1.4326172 + - 2.2753906 + - -2.203125 + - -3.6445313 + - -0.66503906 + - -1.7519531 + - -1.0224609 + - 0.15905762 + - -0.32299805 + - -0.7036133 + - -1.9609375 + - -1.0732422 + - -1.2900391 + - -0.7626953 + - -2.0644531 + - -2.2519531 + - -0.75390625 + - -0.3725586 + - 3.9863281 + - -2.7480469 + - 3.9023438 + - -1.9814453 + - -0.93847656 + - 6.5117188 + - 0.60546875 + - -0.82666016 + - -1.3544922 + - 0.6323242 + - -2.96875 + - 3.3164063 + - 6.4257813 + - -2.3164063 + - -0.70703125 + - 5.7226563 + - 0.9033203 + - 1.3867188 + - 0.39868164 + - -1.9765625 + - 1.0751953 + - 0.51123047 + - -2.9804688 + - 1.3408203 + - -0.8623047 + - -0.3305664 + - 2.6601563 + - -7.1601563 + - 0.71728516 + - 4.21875 + - -2.4765625 + - -0.79003906 + - -2.1503906 + - 4.2460938 + - -5.1679688 + - -2.3320313 + - -0.23156738 + - 1.5947266 + - 2.4082031 + - -0.6894531 + - 1.6523438 + - -2.3300781 + - -2.6777344 + - 2.3339844 + - -0.69189453 + - 0.39379883 + - -2.3339844 + - 3.765625 + - 0.6713867 + - -1.71875 + - -2.4199219 + - -1.2382813 + - -0.22509766 + - 0.57373047 + - -0.34472656 + - 0.5488281 + - 2.0214844 + - -2.5917969 + - -0.09649658 + - -2.7949219 + - 0.71972656 + - 0.95751953 + - 1.1845703 + - -1.2763672 + - -2.2324219 + - -3.1464844 + - 1.2744141 + - 0.5834961 + - 1.15625 + - -0.36157227 + - -2.1542969 + - -2.1152344 + - 1.2978516 + - -3.0253906 + - -2.5078125 + - -1.9648438 + - 3.6992188 + - -3.4804688 + - -1.9482422 + - -0.6015625 + - 2.3535156 + - -1.609375 + - 0.017578125 + - -1.0625 + - -0.9248047 + - -0.30395508 + - -4.1132813 + - 0.8129883 + - 1.6357422 + - 4.8632813 + - -1.6777344 + - 1.4501953 + - -0.2841797 + - 6.375 + - 1.9326172 + - -0.73095703 + - 1.4150391 + - 1.7363281 + - -0.64941406 + - -1.9150391 + - -1.2910156 + - 1.2724609 + - 1.7753906 + - 3.4375 + - -1.9316406 + - 2.3691406 + - -0.04574585 + - -0.054595947 + - 2.40625 + - -0.54248047 + - -0.9785156 + - 1.7080078 + - -1.4541016 + - -2.8515625 + - 0.9140625 + - 0.92041016 + - -3.3164063 + - -0.5415039 + - 1.859375 + - -1.9082031 + - -1.2275391 + - -0.16516113 + - -0.29711914 + - 4.4257813 + - 6.828125 + - -1.8183594 + - -0.18664551 + - -3.7402344 + - -2.1445313 + - 0.515625 + - 1.0849609 + - -2.375 + - 1.8476563 + - -3.6679688 + - -2.8671875 + - -0.51171875 + - -2.3496094 + - -0.9980469 + - -2.3925781 + - -0.021759033 + - 1.8232422 + - 1.421875 + - -0.38916016 + - 1.7294922 + - 2.8515625 + - -0.71875 + - -2.0195313 + - 1.3427734 + - 2.3515625 + - 0.8647461 + - -1.6259766 + - -0.9580078 + - 0.50634766 + - 0.05996704 + - -0.2841797 + - -3.6992188 + - -1.28125 + - -1.3017578 + - 1.7587891 + - -0.9296875 + - 0.9707031 + - 0.14562988 + - 2.8203125 + - -0.19946289 + - -1.4619141 + - 8.03125 + - -2.1171875 + - 3.65625 + - -4.03125 + - 3.6367188 + - 4.2148438 + - -4.0703125 + - 1.1347656 + - 1.7832031 + - -0.21923828 + - -1.1455078 + - -0.35864258 + - -0.16906738 + - 1.8251953 + - -1.71875 + - -1.2568359 + - -1.7851563 + - 3.9589844 + - -0.72753906 + - 1.2275391 + - 0.44628906 + - -1.2568359 + - 0.9194336 + - -0.515625 + - -0.5131836 + - -1.1142578 + - 3.3339844 + - 0.8959961 + - -2.1777344 + - 1.6064453 + - -0.6953125 + - -2.7265625 + - 0.44482422 + - -2.1367188 + - -0.85253906 + - 2.6328125 + - 2.1464844 + - 2.1816406 + - -8.9609375 + - 4.40625 + - -0.578125 + - 0.32617188 + - 0.48632813 + - -3.5039063 + - 1.9033203 + - 0.44970703 + - -1.4980469 + - 1.4433594 + - -4.6289063 + - 0.4033203 + - -0.2097168 + - -0.4741211 + - 0.07739258 + - 0.23547363 + - 1.1494141 + - -0.3383789 + - -0.7475586 + - 0.73291016 + - 2.0761719 + - -2.421875 + - 1.4589844 + - -2.5488281 + - 1.5820313 + - 2.3574219 + - 0.77978516 + - 1.0751953 + - 1.9609375 + - -0.33642578 + - 0.08258057 + - -1.2607422 + - 4.4570313 + - 1.421875 + - 2.5390625 + - 1.0185547 + - -4.046875 + - 0.6635742 + - -0.4050293 + - -0.3876953 + - -0.26391602 + - 1.1337891 + - -0.93896484 + - 1.3505859 + - 6.3554688 + - 1.0771484 + - -8.7421875 + - 1.2646484 + - 1.3359375 + - -0.11853027 + - -0.98535156 + - 2.9433594 + - 6.1757813 + - -1.8076172 + - -0.09399414 + - -0.6176758 + - -1.4550781 + - 1.4707031 + - -0.77441406 + - 0.2220459 + - -0.23046875 + - -2.4199219 + - -0.43237305 + - -0.49902344 + - 4.078125 + - -1.9355469 + - -1.4414063 + - 0.12658691 + - 1.7949219 + - 3.6269531 + - 2.203125 + - 1.0576172 + - 0.4970703 + - 2.703125 + - 0.66748047 + - -24.875 + - 1.6738281 + - -4.6367188 + - -1.8183594 + - -15.671875 + - -1.2578125 + - -0.6875 + - 3.0644531 + - -3.7109375 + - 2.6074219 + - -7.5507813 + - -7.9296875 + - 0.8076172 + - -0.953125 + - 2.0195313 + - -1.1660156 + - 0.38110352 + - 4.4414063 + - -0.9458008 + - 1.5400391 + - 1.0097656 + - 2.0351563 + - 1.9921875 + - -2.9023438 + - -2.4785156 + - 3.6640625 + - -2.578125 + - 1.8388672 + - 1.6982422 + - -5.0117188 + - 1.9042969 + - -0.31152344 + - -0.0836792 + - 2.3574219 + - 0.6328125 + - -1.6601563 + - 1.71875 + - -1.8515625 + - 0.73095703 + - -0.04421997 + - 0.4597168 + - 0.034576416 + - 3.46875 + - 1.4013672 + - 0.056915283 + - 3.71875 + - 2.7539063 + - 1.515625 + - -1.0654297 + - -1.0966797 + - 1.7587891 + - -1.0693359 + - -2.015625 + - 2.0742188 + - 1.3916016 + - 3.1171875 + - -1.6464844 + - -4.7148438 + - 0.67529297 + - -2.6191406 + - 0.16125488 + - 2.4453125 + - -3.1289063 + - -0.6386719 + - -0.37548828 + - -0.41308594 + - -0.12719727 + - 4.5664063 + - 2.8710938 + - 1.4658203 + - -4.6757813 + - -0.140625 + - 3.0175781 + - 0.5756836 + - -0.4440918 + - 1.3955078 + - 0.27856445 + - -0.7294922 + - -1.0048828 + - 2.1171875 + - -3.4804688 + - -0.22387695 + - 1.3056641 + - -0.33764648 + - 0.57910156 + - 4.0429688 + - -0.57177734 + - 0.72314453 + - -1.4560547 + - -3.84375 + - 0.8569336 + - -1.7167969 + - 0.9316406 + - -1.5507813 + - -2.4707031 + - 0.9458008 + - -3.0820313 + - -8.6328125 + - 0.87353516 + - -3.7128906 + - 0.2854004 + - 2.3984375 + - 1.1992188 + - -3.4628906 + - 0.6176758 + - -3.5625 + - -1.8496094 + - -5.140625 + - -0.8227539 + - 0.005859375 + - -0.0052986145 + - 3.953125 + - -0.890625 + - 1.4560547 + - -3.1464844 + - -2.7402344 + - -1.1064453 + - 0.2019043 + - -0.8989258 + - -3.078125 + - 0.8232422 + - -2.5 + - -0.43896484 + - -0.1282959 + - 1.2353516 + - -0.3251953 + - 0.5102539 + - -3.4140625 + - -1.6064453 + - 0.57910156 + - -5.2148438 + - -2.2265625 + - 2.5878906 + - 5.3945313 + - 5.4765625 + - -0.2890625 + - 0.234375 + - 4.4335938 + - 3.2617188 + - -1.6669922 + - -0.90234375 + - -2.3027344 + - 0.3310547 + - 2.8554688 + - -1.0009766 + - -0.7446289 + - -0.61035156 + - -0.75390625 + - -2.0234375 + - -2.2988281 + - 2.4609375 + - -1.8125 + - 1.2353516 + - -0.21203613 + - -2.3457031 + - -0.0234375 + - 0.78027344 + - 1.3662109 + - -0.5136719 + - -0.7988281 + - 0.52685547 + - 2.2109375 + - -0.9453125 + - -1.5009766 + - -4.6523438 + - -0.0446167 + - 0.20629883 + - 3.40625 + - -0.46484375 + - 0.18688965 + - 2.3476563 + - 23.5 + - -0.89501953 + - -3.078125 + - 4.3554688 + - 0.5859375 + - 4.0507813 + - -2.0214844 + - -13.3359375 + - 1.4970703 + - -1.0517578 + - 4.7578125 + - 0.66796875 + - 0.11383057 + - 1.2236328 + - 0.84375 + - 2.2851563 + - 1.4814453 + - -4.9257813 + - 0.3095703 + - -4.7148438 + - 1.0253906 + - -3.7539063 + - 0.3647461 + - -0.20080566 + - -1.4785156 + - 3.5820313 + - -0.93603516 + - -2.2539063 + - 0.28979492 + - 3.0644531 + - -0.5317383 + - -0.69189453 + - 1.3955078 + - -1.6269531 + - -1.3457031 + - -2.0546875 + - -0.33032227 + - -0.26245117 + - -0.96191406 + - 0.11212158 + - -2.59375 + - 2.2695313 + - -1.0654297 + - -1.7246094 + - 1.9658203 + - -0.79833984 + - 0.2915039 + - 1.7851563 + - -3.4238281 + - 3.5742188 + - 1.0439453 + - -1.3769531 + - 5.90625 + - -2.6601563 + - -2.3691406 + - 0.82666016 + - 0.78759766 + - 2.9375 + - -2.3515625 + - 1.5 + - -2.4375 + - 3.8339844 + - 0.71240234 + - -1.1992188 + - -0.064697266 + - 6.109375 + - 3.3691406 + - -0.4128418 + - -1.7158203 + - -0.36547852 + - -1.1796875 + - -0.25268555 + - -0.30004883 + - -0.19189453 + - -2.7128906 + - -5.9140625 + - 6.5351563 + - 0.93652344 + - -2.375 + - -1.8955078 + - 1.6201172 + - 0.37719727 + - -0.3203125 + - -0.21618652 + - 0.5834961 + - 1.2314453 + - 0.7866211 + - 1.6142578 + - -3.2421875 + - 0.8457031 + - 1.3232422 + - -1.9501953 + - 0.4663086 + - 0.171875 + - 5.1757813 + - 2.1445313 + - -1.6201172 + - 4.75 + - -1.0703125 + - 2.4765625 + - 4.703125 + - -0.546875 + - -1.9902344 + - 5.75 + - 0.78759766 + - 0.38598633 + - -1.2539063 + - -0.17272949 + - 2.4550781 + - 1.6503906 + - -1.2587891 + - -1.6191406 + - -1.8496094 + - -0.71777344 + - -0.42578125 + - 0.38891602 + - 0.73339844 + - 0.124572754 + - 0.29614258 + - -2.078125 + - 2.2597656 + - 23.0625 + - -3.9101563 + - 2.9414063 + - -0.17468262 + - 0.92871094 + - 2.359375 + - 0.18408203 + - -2.0410156 + - 0.2841797 + - -0.84375 + - -1.4482422 + - 1.9472656 + - -2.3066406 + - -1.7001953 + - -0.2607422 + - 0.31054688 + - -5.1601563 + - 1.984375 + - 2.1582031 + - 14.546875 + - -2.6972656 + - 1.4003906 + - -0.11602783 + - -1.4023438 + - 0.2097168 + - -0.65283203 + - 0.63623047 + - 0.6635742 + - -0.21679688 + - -1.2744141 + - -26 + - -0.5024414 + - 0.55078125 + - 1.0732422 + - -2.9140625 + - -0.4934082 + - -0.6484375 + - 0.9169922 + - -2.46875 + - 0.9277344 + - 0.59472656 + - -3.8222656 + - -1.3505859 + - -0.8232422 + - -0.15454102 + - -1.0322266 + - -1.2919922 + - -2.9804688 + - 0.62353516 + - -0.2298584 + - -2.3261719 + - 0.8232422 + - 2.6308594 + - 0.26000977 + - 3.421875 + - -1.4072266 + - 3.1738281 + - -0.5625 + - 7.6953125 + - -1.9335938 + - 2.5839844 + - 4.0078125 + - -6.6484375 + - 2.421875 + - -2.1796875 + - 4.359375 + - -0.8208008 + - -0.51123047 + - -1.7314453 + - 0.5083008 + - 0.62841797 + - 0.9926758 + - -5.5351563 + - 2.9492188 + - -0.17919922 + - -2.4003906 + - 0.0287323 + - 2.7089844 + - 2.53125 + - 2.6328125 + - 2.5039063 + - -1.953125 + - -1.2744141 + - 1.8378906 + - 4.15625 + - 1.4326172 + - -1.4902344 + - -3.828125 + - -0.64501953 + - -4.1679688 + - -1.1298828 + - 2.1113281 + - 2.2246094 + - 3.640625 + - -1.1396484 + - 4.890625 + - 4.9960938 + - 2.046875 + - -0.7363281 + - -1.0830078 + - 0.77001953 + - -1.2724609 + - 1.3398438 + - -1.2626953 + - 1.3603516 + - -1.4814453 + - -2.6640625 + - 0.6230469 + - -3.5585938 + - -0.33764648 + - -3.3710938 + - -3.9375 + - -0.76416016 + - 0.515625 + - 3.0039063 + - -1.4169922 + - -0.14941406 + - 2.9160156 + - 0.7988281 + - 0.52783203 + - -2.7890625 + - 3.3554688 + - 2.0605469 + - -1.4150391 + - -3.3203125 + - 3.6054688 + - -0.5683594 + - 3.9394531 + - -2.7871094 + - -0.92089844 + - -1.0517578 + - 0.8227539 + - 3.4941406 + - 2.4726563 + - -0.17443848 + - 0.9404297 + - -3.7363281 + - -6.046875 + - -0.46191406 + - -1.4882813 + - 2.6621094 + - 2.6914063 + - 0.81933594 + - 1.0390625 + - 2.1582031 + - 0.5991211 + - -0.0715332 + - 2.3574219 + - -1.8457031 + - 2.953125 + - 1 + - -0.45532227 + - -0.33251953 + - -0.8066406 + - -0.6645508 + - 12.1953125 + - 0.5239258 + - 2.53125 + - 5.7851563 + - 7.796875 + - -1.2158203 + - 0.42822266 + - -1.0888672 + - 1.4638672 + - -2.6542969 + - -1.7939453 + - 1.3466797 + - 0.6689453 + - 0.30126953 + - -2.5625 + - -0.71875 + - 1.0185547 + - 1.890625 + - 1.9335938 + - 0.34350586 + - -0.17382813 + - -0.18469238 + - -0.78125 + - -1.9404297 + - -2.1035156 + - -1.4277344 + - 1.2451172 + - -0.46313477 + - -2.4238281 + - -3.4238281 + - 2.7890625 + - 2.1503906 + - 1.9921875 + - 1.015625 + - 0.2241211 + - -0.98291016 + - 1.9423828 + - -1.75 + - 0.74072266 + - 1.8212891 + - -1.4931641 + - 1.2539063 + - -1.7744141 + - -0.55615234 + - 3.9394531 + - -0.7192383 + - 1.7138672 + - -2.6484375 + - -1.0947266 + - -2.9023438 + - 3.21875 + - 1.0126953 + - -2.4042969 + - -1.1142578 + - 4.1015625 + - 1.8300781 + - 1.0361328 + - 1.5976563 + - 4.1875 + - 0.8457031 + - -1.8183594 + - -1.6669922 + - 1.4794922 + - 1.5244141 + - 1.203125 + - 4.1875 + - 2.5175781 + - 2.2617188 + - 1.9628906 + - -1.4160156 + - -0.6542969 + - -1.8525391 + - 1.2382813 + - 0.2019043 + - -0.050201416 + - -1.1044922 + - 0.3461914 + - 1.390625 + - 0.10290527 + - 3.0859375 + - -0.97753906 + - 0.08258057 + - 0.86376953 + - -0.26757813 + - 23.46875 + - -3.4707031 + - -1.1474609 + - -4.2460938 + - -0.22851563 + - 0.73583984 + - 2.34375 + - -0.092041016 + - -4.7851563 + - 1.6845703 + - 2.5976563 + - -1.359375 + - 3.3945313 + - 2.5351563 + - 1.9492188 + - 0.52001953 + - 1.6367188 + - -3.0742188 + - 1.7148438 + - 0.96191406 + - -2.2128906 + - 1.7011719 + - -3.6757813 + - 1.7763672 + - 0.0758667 + - 0.82177734 + - -2.2089844 + - 0.11645508 + - 2.3359375 + - -3.7753906 + - -0.76953125 + - 1.3154297 + - 2.078125 + - 2.1328125 + - 2.4160156 + - -1.5634766 + - 6.2851563 + - -0.03125 + - 0.32592773 + - -0.65625 + - -4.3359375 + - -3.5664063 + - 0.5019531 + - 4.9257813 + - 0.38012695 + - 0.20166016 + - -1.5683594 + - 1.7353516 + - 2.8164063 + - 3.9121094 + - -0.57470703 + - -1.8261719 + - 0.39379883 + - 8.6640625 + - -3.2226563 + - -1.2158203 + - 0.6328125 + - -1.2607422 + - 1.1367188 + - 0.51123047 + - 1.3037109 + - -0.11773682 + - -0.11462402 + - -4.2421875 + - -3.546875 + - -2.6640625 + - -3.1269531 + - -2.9941406 + - 0.49536133 + - -2.1972656 + - -1.2841797 + - 3.2851563 + - -0.7211914 + - -1.8222656 + - 0.68310547 + - -3.3378906 + - -4.3945313 + - -0.29614258 + - 2.0722656 + - -2.6777344 + - -0.19885254 + - 1.1748047 + - 2.1855469 + - 1.2265625 + - -1.1201172 + - -3.0878906 + - -1.4257813 + - -0.8696289 + - -2.9550781 + - 0.012275696 + - -0.5029297 + - -0.26831055 + - 4.1679688 + - -1.1015625 + - 2.6386719 + - -3.3066406 + - -2.3125 + - -1.2939453 + - -0.6850586 + - 1.2021484 + - -1.3095703 + - 1.4707031 + - 1.0224609 + - 0.8652344 + - 0.40429688 + - -1.2783203 + - -1.6054688 + - 1.5166016 + - -1.4238281 + - 1.6367188 + - 0.48046875 + - -0.32885742 + - 2.7402344 + - 0.9326172 + - 0.21398926 + - 1.2578125 + - -3.8359375 + - -2.6425781 + - -3.2421875 + - -1.3925781 + - 0.29956055 + - -0.22302246 + - 0.52734375 + - 1.0439453 + - 1.1669922 + - 1.2773438 + - -1.2041016 + - -2.421875 + - 1.2001953 + - 2.1035156 + - -2.71875 + - 2.1171875 + - 0.453125 + - 0.3317871 + - 1.2675781 + - 0.6713867 + - -5.578125 + - -3.3398438 + - -1.0908203 + - 1.5175781 + - 0.0262146 + - -2.25 + - -0.95703125 + - 4.9179688 + - -0.171875 + - 1.3681641 + - 6.5859375 + - 2.5625 + - -2.6875 + - 0.84033203 + - -0.055236816 + - 6.015625 + - -4.9648438 + - -2.1777344 + - 0.98876953 + - -2.1269531 + - -0.57470703 + - -2.3886719 + - 1.8857422 + - -3.3496094 + - 3.1972656 + - -1.1943359 + - 0.71972656 + - 0.15234375 + - -0.51708984 + - -1.1992188 + - 0.9658203 + - -0.23144531 + - -1.9414063 + - 5.9726563 + - 0.78759766 + - 2.4453125 + - -0.31518555 + - -4.4648438 + - 2.4316406 + - 0.24658203 + - 1.3349609 + - -0.71484375 + - -1.3564453 + - -0.7675781 + - 1.1240234 + - -2.0175781 + - -3.0800781 + - -0.032348633 + - 0.69873047 + - 1.7294922 + - 2.8203125 + - -2.3183594 + - 1.2373047 + - 0.30688477 + - -2.703125 + - 0.3466797 + - 3.5585938 + - 1.3242188 + - 5.7539063 + - 0.24804688 + - 0.0625 + - 16.203125 + - -0.41845703 + - 2.3027344 + - -3.5488281 + - -0.90771484 + - -0.89697266 + - 0.5410156 + - 1.4794922 + - 4.1484375 + - -0.92089844 + - -3.5253906 + - -1.8222656 + - 0.8720703 + - 1.9169922 + - 1.0517578 + - -1.1318359 + - 4.453125 + - -0.26391602 + - -0.66796875 + - 0.24523926 + - -1.6455078 + - 0.3034668 + - -1.5175781 + - -2.2949219 + - -1.6777344 + - 2.3652344 + - -0.2253418 + - -3.9960938 + - -3.1015625 + - 0.74316406 + - -0.99609375 + - -0.87890625 + - -1.8613281 + - -1.890625 + - 0.1751709 + - -0.083984375 + - 3.0117188 + - 0.75634766 + - 2.7890625 + - 0.2861328 + - 1.9648438 + - -4.5898438 + - 0.88720703 + - 0.65283203 + - -0.06890869 + - 4.2070313 + - -1.3691406 + - -1.3691406 + - -2.0625 + - -5.4882813 + - 2.1308594 + - 1.9013672 + - -0.30786133 + - 2.8808594 + - 4.703125 + - -1.6386719 + - -0.17785645 + - -3.8339844 + - -0.13439941 + - -1.8310547 + - -0.77441406 + - -1.1064453 + - 1.7431641 + - -2.7011719 + - -0.38720703 + - 1.0185547 + - 1.9091797 + - -4.953125 + - 3.3925781 + - 0.92626953 + - -0.5727539 + - -1.6923828 + - 4.6914063 + - 0.94384766 + - 1.1826172 + - 1.0126953 + - -1.9609375 + - -2.4472656 + - 1.6650391 + - 1.3632813 + - 2.3925781 + - 0.17211914 + - 4.7539063 + - -1.6230469 + - -1.1386719 + - 0.9663086 + - -1.5556641 + - -0.7675781 + - -1.5439453 + - 0.62353516 + - -4.34375 + - -0.8286133 + - 1.6669922 + - 1.9033203 + - -2.3789063 + - 2.5566406 + - -3.9316406 + - 2.6816406 + - 0.78759766 + - -0.73876953 + - 4.6054688 + - -0.89160156 + - -2.6074219 + - 1.9169922 + - 2.4316406 + - 3.3085938 + - 1.7695313 + - -1.0097656 + - -0.22338867 + - 0.45361328 + - 33.40625 + - 13.4765625 + - -9.1796875 + - 2.265625 + - -1.0507813 + - 1.4277344 + - -2.734375 + - -4.1757813 + - -0.36376953 + - -0.20703125 + - 1.9589844 + - 0.51464844 + - -0.34057617 + - 1.5166016 + - -2.7890625 + - 1.9707031 + - -1.0009766 + - 0.91259766 + - -2.6933594 + - 0.7138672 + - 1.8779297 + - 3.4140625 + - -1.3193359 + - -1.1445313 + - -0.2253418 + - -2.1523438 + - 0.08703613 + - -0.4038086 + - -4.6054688 + - 0.75097656 + - -0.119384766 + - -0.16101074 + - 1.4169922 + - 2.4785156 + - 1.6337891 + - -4.3789063 + - -1.8554688 + - 2.0644531 + - -2.1699219 + - 1.2451172 + - 2.2324219 + - 1.5371094 + - -0.27978516 + - 4.2304688 + - -1.2050781 + - 0.29345703 + - -3.4941406 + - 2.1425781 + - 1.3066406 + - 0.5107422 + - 2.2910156 + - 8.7265625 + - -0.5673828 + - -1.4306641 + - 1.7226563 + - -0.9453125 + - -0.84521484 + - 0.05606079 + - 1.4580078 + - 0.2175293 + - 2.9785156 + - 2.3984375 + - 1.2050781 + - -3.9238281 + - -1.7402344 + - -1.1376953 + - 1.9384766 + - -0.83203125 + - -2.6855469 + - 0.2565918 + - -2.9277344 + - -0.20385742 + - -1.5039063 + - -2.265625 + - 0.92822266 + - -2.6640625 + - -0.18579102 + - 1.3486328 + - 5.4453125 + - 0.41503906 + - -1.7626953 + - -1.4189453 + - 1.6337891 + - 1.8632813 + - 1.6875 + - 2.3808594 + - 1.1025391 + - 0.22314453 + - 1.9453125 + - -1.5341797 + - 1.3691406 + - 0.5053711 + - -0.8886719 + - -0.99902344 + - 3.6582031 + - 1.2080078 + - -1.3974609 + - 4.03125 + - -1.9023438 + - 0.5214844 + - -3.4609375 + - -1.0595703 + - 0.75097656 + - 1.15625 + - 0.11743164 + - 0.4892578 + - 0.32250977 + - -2.3222656 + - -0.081970215 + - 1.4853516 + - -3.2910156 + - 3.6777344 + - -0.69384766 + - 4.28125 + - 1.8076172 + - 2.8300781 + - -2.9140625 + - -1.3212891 + - 3.5175781 + - 0.42773438 + - -2.3886719 + - -1.8847656 + - 0.8803711 + - 1.109375 + - 3.6132813 + - 1.3603516 + - -3.2714844 + - 2.0566406 + - 2.4140625 + - 0.1307373 + - -0.87890625 + - -1.2529297 + - -1.1123047 + - 1.2490234 + - 0.28198242 + - 0.3125 + - -0.18469238 + - -3.4375 + - 1.5390625 + - -1.3007813 + - -0.4399414 + - 1.9648438 + - 1.7783203 + - -2.1347656 + - -0.296875 + - -0.17236328 + - 2.0097656 + - -1.2041016 + - -0.14453125 + - -4.1132813 + - 1.1660156 + - 1.3193359 + - -1.4667969 + - -1.4375 + - 0.4111328 + - -0.91552734 + - -1.1474609 + - 0.41748047 + - 0.4025879 + - 2.1621094 + - 0.09051514 + - -2.5625 + - 2.7890625 + - 1.7763672 + - -0.9404297 + - 0.4248047 + - 0.32739258 + - 2.3457031 + - -0.119506836 + - -2.5625 + - -0.5102539 + - -0.26660156 + - -2.6132813 + - -1.3476563 + - 0.5800781 + - 0.7158203 + - 1.4140625 + - 1.9658203 + - -1.1708984 + - -1.7529297 + - -0.59765625 + - 0.38500977 + - -0.5258789 + - 0.9008789 + - 1.5195313 + - -1.5722656 + - -0.06945801 + - 1.7695313 + - 1.7246094 + - -1.2783203 + - 2.3789063 + - 2.3203125 + - 1.78125 + - 0.7128906 + - -2.4902344 + - -1.8623047 + - 2.984375 + - 1.1738281 + - 0.92285156 + - -3.3925781 + - -2.7636719 + - -1.4267578 + - -2.8496094 + - -0.41601563 + - 0.39208984 + - -12.4453125 + - -0.31689453 + - -0.46142578 + - 0.21984863 + - -0.89160156 + - 0.5493164 + - -1.2490234 + - 1.6689453 + - 0.4597168 + - -1.7109375 + - 2.34375 + - -5.3710938 + - 0.48706055 + - 0.3251953 + - -1.1757813 + - 1.375 + - 1.5214844 + - -2.0566406 + - -0.022598267 + - 3.4277344 + - 0.61816406 + - 1.828125 + - -0.5341797 + - 9.390625 + - 1.4433594 + - -2.1386719 + - 0.72509766 + - -0.5239258 + - 0.89208984 + - -0.89160156 + - -0.083618164 + - -2.6601563 + - 6.7539063 + - 0.6816406 + - -1.7734375 + - 0.74072266 + - 1.0400391 + - -6.0976563 + - 0.71777344 + - 0.2915039 + - 1.3701172 + - 0.43798828 + - 6.2929688 + - -0.5932617 + - -2.7695313 + - 1.8964844 + - 2.2207031 + - 2.4609375 + - 2.1035156 + - 1.1425781 + - -2.8378906 + - 1.5439453 + - 1.7998047 + - -3.1582031 + - -1.0820313 + - -0.32714844 + - -0.43115234 + - -3.2050781 + - -1.8183594 + - -3.2753906 + - -0.1986084 + - -3.8652344 + - 2.4101563 + - -1.6953125 + - -1.7978516 + - 3.5683594 + - -2.4199219 + - 0.19494629 + - -1.6347656 + - -1.6376953 + - 2.0566406 + - -0.3552246 + - -1.3388672 + - 1.7587891 + - 1.6367188 + - -0.61572266 + - 0.6455078 + - 0.6113281 + - 2.1738281 + - 0.86376953 + - 3.7558594 + - 0.019104004 + - -0.2692871 + - -1.7851563 + - 2.6640625 + - 0.18725586 + - -2.0234375 + - -1.2880859 + - -1.5732422 + - -0.09063721 + - 5.2382813 + - 4.703125 + - -1.1416016 + - 1.9345703 + - 2.3378906 + - -0.7207031 + - -1.2539063 + - -0.4033203 + - 2.0351563 + - -1.9433594 + - 2.2792969 + - -3.4765625 + - 2.8359375 + - 0.7871094 + - -3.9589844 + - -0.11071777 + - -2.6660156 + - 3.2460938 + - 0.30151367 + - -5.5117188 + - -0.2685547 + - -1.7626953 + - 1.6542969 + - 0.42626953 + - 0.66503906 + - 3.4492188 + - 0.47387695 + - 1.28125 + - -0.3215332 + - -3.09375 + - -1.6669922 + - -0.59765625 + - -3.7890625 + - 8.9296875 + - 1.1962891 + - 1.4658203 + - -0.5292969 + - 0.5283203 + - -1.4980469 + - 0.4362793 + - 1.1601563 + - -1.2988281 + - -5.4726563 + - -3.3964844 + - 4.6328125 + - -4.1757813 + - 1.8066406 + - -1.8466797 + - -2.8164063 + - 1.296875 + - 0.8886719 + - -0.58203125 + - 0.27270508 + - 1.25 + - 1.1113281 + - -3.1777344 + - 0.07476807 + - -4.0429688 + - 1.7041016 + - -1.5908203 + - 1.2070313 + - -3.5976563 + - 0.81103516 + - -1.4306641 + - 0.9394531 + - -2.4980469 + - -1.0517578 + - 0.07281494 + - 2.2519531 + - 3.2441406 + - 0.49902344 + - 1.6640625 + - -1.6152344 + - 2.421875 + - 1.2851563 + - -0.71875 + - -1.1757813 + - -2.6894531 + - -0.24438477 + - 0.5205078 + - 2.5664063 + - -2.8769531 + - -0.093566895 + - -0.00390625 + - 4.234375 + - -0.012275696 + - -2.2246094 + - 0.36572266 + - 1.9814453 + - -2.2167969 + - -2.3164063 + - -0.9794922 + - 1.2119141 + - 1.9492188 + - -0.5366211 + - 0.7207031 + - -1.4638672 + - -0.29589844 + - 0.8256836 + - 3.0742188 + - -2.9179688 + - -2.7089844 + - 1.5957031 + - 1.8466797 + - 5.8125 + - 2.6308594 + - -1.5351563 + - 1.4619141 + - -0.5991211 + - 1.0800781 + - -1.6582031 + - -2.0136719 + - -0.91308594 + - 1.2207031 + - -1.9169922 + - 1.1708984 + - -1.0449219 + - 3.5253906 + - 4.34375 + - -0.51708984 + - 0.18188477 + - -0.23486328 + - -1.4326172 + - -3.3300781 + - -2.8691406 + - -0.890625 + - 1.3818359 + - -1.0712891 + - 0.85791016 + - 2.171875 + - 1.5488281 + - 1.4101563 + - -0.41503906 + - 0.8691406 + - -4.9179688 + - -0.90283203 + - -8.3046875 + - -1.7314453 + - -2.0175781 + - -2.2753906 + - -2.9023438 + - -0.96533203 + - 2.8378906 + - -6.7421875 + - -4.4335938 + - 24.671875 + - -1.7314453 + - -1.6464844 + - -0.65722656 + - -0.1796875 + - 0.51416016 + - 2.3203125 + - 3.0976563 + - -2.1542969 + - 1.1396484 + - 1.6914063 + - -0.0390625 + - 0.88378906 + - -1.4277344 + - 0.4267578 + - 0.08758545 + - -3.4179688 + - 0.72802734 + - 4.8867188 + - -0.75634766 + - -0.5488281 + - -1.4765625 + - -2.4765625 + - 0.65625 + - -0.3408203 + - 3.7578125 + - 0.36083984 + - -2.0878906 + - 2.2285156 + - -0.27612305 + - 1.5869141 + - -2.5488281 + - 0.7753906 + - 0.4025879 + - 1.2587891 + - -0.55908203 + - 1.6416016 + - 2.9863281 + - 4.1796875 + - 0.13830566 + - -0.85595703 + - -0.55566406 + - 2.0410156 + - -3.8964844 + - 0.77978516 + - -0.2824707 + - 3.2734375 + - 1.1845703 + - -2.0351563 + - 0.7270508 + - 2.3515625 + - 0.83691406 + - -3.1015625 + - -1.3193359 + - -2.0195313 + - -1.6425781 + - -2.9023438 + - -0.42871094 + - 2.3789063 + - -3.4550781 + - -2.8339844 + - 1.1816406 + - -0.5722656 + - 2.453125 + - -2.5 + - -0.10070801 + - -1.1962891 + - -0.010597229 + - -2.734375 + - 1.5898438 + - -4.609375 + - -4.359375 + - -0.1171875 + - -1.5556641 + - 1.4550781 + - 8.6328125 + - 0.89501953 + - 3.6816406 + - -4.7578125 + - 1.1894531 + - -0.67626953 + - 1.3095703 + - 0.9038086 + - 0.67626953 + - -0.16235352 + - -4.78125 + - 0.53125 + - 0.7607422 + - 2.5625 + - -0.83447266 + - -2.8378906 + - 0.44628906 + - -0.08538818 + - -0.5522461 + - -2.4765625 + - 1.4394531 + - 2.1074219 + - -2.5625 + - 5.3554688 + - 0.30908203 + - 0.36865234 + - 0.9243164 + - 0.52734375 + - 4.0117188 + - 0.27416992 + - 2.0800781 + - -1.8203125 + - -0.51904297 + - 0.5410156 + - 2.3886719 + - 7.1640625 + - 1.7148438 + - 1.0996094 + - -1.0556641 + - 3.5546875 + - 0.050476074 + - 1.7128906 + - 1.7871094 + - 2.2246094 + - -0.30566406 + - 3.09375 + - -0.69628906 + - 3.6015625 + - -4.4882813 + - -1.4697266 + - -2.0253906 + - 0.94189453 + - 0.001115799 + - 1.3408203 + - -0.42285156 + - 4.0742188 + - -1.9775391 + - -2.1054688 + - -0.84228516 + - 0.016174316 + - 2.9785156 + - 2.40625 + - 0.7363281 + - 1.1787109 + - 3.2851563 + - 4.1992188 + - 0.75634766 + - -0.5756836 + - 1.3769531 + - 2.0800781 + - -4.9882813 + - -4.578125 + - -0.9609375 + - 3.3125 + - -1.5917969 + - -0.75097656 + - -1.9638672 + - 2.8613281 + - 3.2753906 + - 3.265625 + - -0.8544922 + - -0.28344727 + - 1.3613281 + - -1.3515625 + - -0.44604492 + - 2.5839844 + - 2.6875 + - -0.9711914 + - -0.3581543 + - 0.4165039 + - 1.7861328 + - 0.39453125 + - -0.12207031 + - -0.35864258 + - 1.2529297 + - 2.140625 + - 0.9091797 + - -2.1191406 + - -0.3251953 + - -3.6425781 + - -4.8789063 + - -0.092163086 + - 2.5820313 + - -0.86035156 + - -0.36767578 + - 3.125 + - -2.1777344 + - 2.0097656 + - 0.5566406 + - -0.9897461 + - -2.9140625 + - 1.4013672 + - -0.5180664 + - 3.0625 + - 3.3476563 + - 1.2998047 + - -6.8359375 + - -0.47680664 + - -0.41845703 + - -5.390625 + - 2.1210938 + - -2.6621094 + - 2.4355469 + - 1.3867188 + - -6.4453125 + - 1.3076172 + - -0.65478516 + - -2.7988281 + - -2.4296875 + - 1.1220703 + - -0.37597656 + - 2.0761719 + - -0.4309082 + - -0.8129883 + - -33.875 + - -2.53125 + - -2.4140625 + - -0.3881836 + - -1.4277344 + - 2.09375 + - 2.4121094 + - -4.7539063 + - -4.6601563 + - -0.9038086 + - 1.1162109 + - -1.4375 + - -1.0976563 + - 6.7734375 + - 0.4885254 + - 4.7304688 + - -1.6601563 + - 4.3242188 + - -0.25097656 + - -1.4335938 + - 0.11437988 + - -0.45507813 + - 1.0791016 + - 1.8134766 + - -0.4350586 + - -4.0117188 + - -1.2519531 + - 0.053833008 + - 1.8681641 + - -0.36206055 + - 0.5722656 + - -1.265625 + - 0.3642578 + - -0.5629883 + - -3.4941406 + - 4.8632813 + - -3.3046875 + - -0.8071289 + - -2.328125 + - -3.4863281 + - 0.029571533 + - 1.9746094 + - 2.6328125 + - 0.01576233 + - 0.25268555 + - 1.7089844 + - 4.0039063 + - -0.63720703 + - 1.90625 + - -2.8339844 + - 2.6796875 + - -1.0927734 + - 0.26220703 + - -3.9238281 + - 3.0117188 + - 2.6074219 + - -2.9648438 + - 3.4550781 + - 2.6816406 + - 0.6645508 + - -1.0673828 + - -4.0117188 + - 3.0097656 + - 1.3544922 + - 1.5175781 + - -0.3876953 + - 0.039611816 + - -5.0078125 + - 0.8300781 + - 1.3789063 + - -2.2207031 + - 0.77441406 + - 2.6035156 + - 0.40454102 + - -0.56103516 + - 2.2070313 + - -1.4003906 + - -2.6953125 + - 0.8046875 + - 0.42114258 + - -1.2441406 + - 2.0878906 + - 0.47314453 + - 1.0439453 + - 3.0527344 + - 0.85058594 + - -1.2832031 + - 1.1123047 + - 2.0527344 + - 0.74658203 + - -2.3789063 + - 2.7949219 + - -1.0400391 + - 8.5703125 + - -1.4746094 + - 2.03125 + - -0.5991211 + - -0.8847656 + - -0.44628906 + - -0.66796875 + - 2.8222656 + - 0.049102783 + - 3.53125 + - 1.0810547 + - 2.125 + - -2.1464844 + - -2.4277344 + - 3.5800781 + - -0.17236328 + - 5.921875 + - -1.0566406 + - 5.921875 + - -2.0253906 + - -0.95410156 + - -1.4013672 + - 1.5019531 + - 0.3852539 + - 0.79003906 + - -1.5839844 + - 4.1132813 + - 2.96875 + - 2.4902344 + - 4.6875 + - -0.7216797 + - -2.0976563 + - 1.7167969 + - -1.4580078 + - -4.0742188 + - -3.1113281 + - 0.44921875 + - -4.3554688 + - -0.16064453 + - 1.7939453 + - 3.7304688 + - -1.1054688 + - -0.67529297 + - -30.3125 + - -0.85595703 + - -0.027618408 + - -0.6660156 + - 0.7626953 + - 3.5800781 + - 0.79296875 + - 1.8632813 + - 0.12609863 + - 2.0976563 + - 0.012275696 + - -0.1484375 + - -2.9160156 + - -2.2011719 + - 1.3662109 + - -2.3691406 + - 0.55859375 + - 0.073791504 + - -0.63134766 + - -1.5576172 + - 1.4433594 + - 10.890625 + - 3.125 + - -1.265625 + - 1.1884766 + - 0.94140625 + - -0.84814453 + - 2.3105469 + - 0.37841797 + - -2.6035156 + - 1.296875 + - 0.2529297 + - -2.203125 + - 0.34057617 + - 0.38110352 + - -2.0644531 + - -3.2285156 + - 0.17248535 + - -0.55126953 + - -1.90625 + - 5.6289063 + - 1.6572266 + - -1.2236328 + - 3.1679688 + - 1.0341797 + - 1.2763672 + - 0.0011701584 + - 3.1445313 + - 0.6489258 + - -1.7949219 + - 0.19189453 + - 3.5175781 + - -2.3945313 + - 2.4589844 + - -1.5351563 + - -2.0097656 + - -0.9692383 + - 4.3242188 + - 0.4519043 + - -4.0820313 + - 1.6386719 + - -0.49804688 + - -0.6801758 + - -1.8076172 + - -2.5019531 + - 0.077819824 + - -3.75 + - 0.7397461 + - 3.0078125 + - -6.9453125 + - 0.48876953 + - -1.3095703 + - -3.3691406 + - -3.0175781 + - 1.7734375 + - -0.8691406 + - -3.1191406 + - 0.06640625 + - 0.18615723 + - -0.3959961 + - -1.3349609 + - -0.6459961 + - 1.8984375 + - 1.75 + - 6.6757813 + - -1.4882813 + - -0.46704102 + - -1.2744141 + - -1.8183594 + - 2.0644531 + - -1.9638672 + - -0.7011719 + - 2.0664063 + - 0.15258789 + - 3.4492188 + - 0.890625 + - 0.921875 + - -1.0634766 + - 3.0039063 + - -0.6928711 + - 1.6298828 + - 0.5488281 + - -2.703125 + - -1.1425781 + - 0.41503906 + - -0.5839844 + - -0.2109375 + - 4.5625 + - 1.4433594 + - -0.11102295 + - -1.6738281 + - 4.5078125 + - -0.49682617 + - 2.0371094 + - -2.7558594 + - -1.8857422 + - 2.1015625 + - 2.515625 + - -0.82177734 + - 0.87597656 + - 1.6611328 + - -1.1982422 + - -1.96875 + - -1.2451172 + - 0.07476807 + - -0.46923828 + - -4.9023438 + - 0.047424316 + - -1.0195313 + - 3.3046875 + - 0.25048828 + - 0.66015625 + - -0.43066406 + - -0.13110352 + - 1.1132813 + - -0.35327148 + - -0.6738281 + - -0.47021484 + - -1.140625 + - -4.4179688 + - 0.7680664 + - 4.2070313 + - 0.112854004 + - 1.3613281 + - 1.8691406 + - 0.6191406 + - 3.9082031 + - -1.546875 + - 0.0418396 + - 2.265625 + - 2.2480469 + - 2.8027344 + - -1.9775391 + - 1.8564453 + - -1.6796875 + - 1.6044922 + - -2.3691406 + - 0.18969727 + - 1.0859375 + - 2.8300781 + - -0.6640625 + - 2.6914063 + - 2.7753906 + - 1.3164063 + - 2.5449219 + - -2.40625 + - 4.4960938 + - -2.4257813 + - -0.54003906 + - 1.7001953 + - -0.63427734 + - -2.5 + - 1.7324219 + - 0.1015625 + - -2.2871094 + - -1.5751953 + - -1.5019531 + - -1.6982422 + - -2.8789063 + - 3.1425781 + - 1.8701172 + - 1.7558594 + - -2.7441406 + - -0.32348633 + - -0.13171387 + - 2.4902344 + - 0.3330078 + - 2.4199219 + - -3.0214844 + - -0.18884277 + - 0.44799805 + - 1.0439453 + - 0.17492676 + - 4.0351563 + - -0.08843994 + - 1.4238281 + - -0.7919922 + - -1.9882813 + - -0.9272461 + - 1.3662109 + - 1.046875 + - 0.63427734 + - 1.2451172 + - -3.4550781 + - 0.17297363 + - 1.7441406 + - 0.62353516 + - -0.3647461 + - 1.515625 + - -1.1552734 + - -2.4160156 + - -5.5429688 + - -4.09375 + - 6.078125 + - -1.3701172 + - -0.91015625 + - 1.1992188 + - -1.7529297 + - 2.0800781 + - -1.6416016 + - -2.3925781 + - -3.8867188 + - -2.203125 + - -2.6425781 + - 0.7397461 + - 0.2734375 + - 1.4511719 + - -0.7939453 + - -1.1513672 + - 0.75683594 + - 0.1204834 + - -3.5039063 + - -1.7607422 + - -1.4775391 + - 3.1015625 + - 2.0839844 + - 6.2929688 + - -0.44384766 + - 2.5175781 + - -1.7080078 + - 1.8369141 +- - 1.3066406 + - -2.1523438 + - 0.703125 + - 0.2529297 + - 1.2626953 + - -1.46875 + - -0.19042969 + - -0.14892578 + - 3.3066406 + - -1.8222656 + - 1.0253906 + - -0.51953125 + - 0.8203125 + - 0.2109375 + - 1.1699219 + - 0.109680176 + - 1.5429688 + - 1.2597656 + - 2.3242188 + - -2.4765625 + - -1.4189453 + - -0.6923828 + - -0.0078125 + - 0.44189453 + - 2.7128906 + - 1.8183594 + - -0.043762207 + - 1.6103516 + - 0.77734375 + - 1.21875 + - 3.8847656 + - -0.7583008 + - 5.4765625 + - 1.6425781 + - -2.4707031 + - 1.5048828 + - -1.8222656 + - -1.1347656 + - -6.5820313 + - -0.45825195 + - 0.9609375 + - -1.4111328 + - 1.1171875 + - -1.0078125 + - -0.67578125 + - 1.3095703 + - 0.9667969 + - -3.625 + - 0.6777344 + - 2.6757813 + - 3.109375 + - -0.94970703 + - -3.96875 + - -79.125 + - -2.3476563 + - -1.6230469 + - 3.4257813 + - -1.3222656 + - -2.5878906 + - -10.5 + - -1.8828125 + - -0.7763672 + - -0.20166016 + - -0.38671875 + - 0.066223145 + - 0.24121094 + - -2.9160156 + - 2.1953125 + - -0.5649414 + - -0.8515625 + - -5.0117188 + - -1.8183594 + - -1.2324219 + - -2.1738281 + - -1.2753906 + - 0.38012695 + - 2.3984375 + - 1.7548828 + - 0.31445313 + - 0.1796875 + - 0.74609375 + - -1.5439453 + - -0.69970703 + - 1.3261719 + - -2.4179688 + - 3.9316406 + - -2.2070313 + - 0.7993164 + - 3.7070313 + - 2.0117188 + - -0.48486328 + - 2.3808594 + - 2.2070313 + - -26.71875 + - 0.13146973 + - -4.5546875 + - -5.8632813 + - -0.53515625 + - -0.08850098 + - -5.8359375 + - -1.0390625 + - -2.6054688 + - -6.5507813 + - -2.9179688 + - -1.4267578 + - -2.7207031 + - 1.1035156 + - -1.9316406 + - -1.3251953 + - 0.1217041 + - -0.5 + - 0.953125 + - 3.2734375 + - -1.8398438 + - -1.109375 + - 5.4570313 + - 2.2636719 + - 1.78125 + - -2.0039063 + - 0.7607422 + - 3.6132813 + - 1 + - -2.1503906 + - 0.3461914 + - -0.95410156 + - -0.73535156 + - 3.3984375 + - -1.7480469 + - 0.08428955 + - 2.4414063 + - 1.2148438 + - 1.2958984 + - -2.2597656 + - 1.1669922 + - 0.5546875 + - 0.6875 + - 1.953125 + - 0.578125 + - -2.1875 + - -1.5830078 + - 1.1005859 + - -0.66015625 + - 2.1269531 + - 0.39160156 + - 2.5273438 + - 0.61035156 + - -1.8222656 + - -1.2480469 + - -3.453125 + - 5.515625 + - 1.0234375 + - -1.2080078 + - -2.0703125 + - -0.7324219 + - -0.64697266 + - -4.796875 + - -1.21875 + - -0.30126953 + - -1.1337891 + - -2.234375 + - -0.036132813 + - -1.7109375 + - -3.625 + - -2.1074219 + - -0.7133789 + - 0.78759766 + - 1.7910156 + - -0.48364258 + - -0.57128906 + - -1.4111328 + - -1.8066406 + - -1.0322266 + - -0.9736328 + - -1.2832031 + - -1.4316406 + - -0.91503906 + - -2.0410156 + - 3.2207031 + - -1.1191406 + - -0.4609375 + - 3.4726563 + - 0.73046875 + - -1.2910156 + - -1.8994141 + - -0.70166016 + - 5.953125 + - -4.6757813 + - -0.33642578 + - -1.3808594 + - -1.0087891 + - -3.4550781 + - -2.0703125 + - -0.11456299 + - 1.4150391 + - -2.3164063 + - 4.3203125 + - 3.0625 + - -3.1289063 + - -1.7910156 + - 2.7265625 + - 0.49414063 + - -3.7148438 + - 1.8212891 + - 0.04296875 + - 1.7988281 + - 6.609375 + - 7.0976563 + - -2.7851563 + - -2.453125 + - -4.2226563 + - -2.7910156 + - -0.026031494 + - -2.6015625 + - -0.49658203 + - 0.26220703 + - 3.2597656 + - 1.1660156 + - -2.0742188 + - 6 + - 1.4511719 + - -2.2148438 + - 2.4785156 + - -3.1953125 + - 2.0566406 + - -0.5751953 + - -2.5722656 + - 1.0351563 + - 1.0371094 + - 0.7368164 + - -0.65478516 + - 2.015625 + - -0.5395508 + - -0.77197266 + - -1.8203125 + - -0.59814453 + - 0.77197266 + - 2.0957031 + - 2.0429688 + - 4.4296875 + - 0.26733398 + - 11.1640625 + - 0.024246216 + - -6.1328125 + - -0.7373047 + - -1.765625 + - -1.8984375 + - 5.2890625 + - 3.6191406 + - -0.52685547 + - 0.5571289 + - -0.6923828 + - -0.18676758 + - -2.1582031 + - -1.0644531 + - -1.4501953 + - -0.65527344 + - -3.2617188 + - -1.4257813 + - -2.375 + - 2.4433594 + - 0.8105469 + - -0.2290039 + - 3.6132813 + - 1.6386719 + - 0.17578125 + - -0.28222656 + - -3.4179688 + - 5.8007813 + - -0.8408203 + - -7.125 + - 0.4477539 + - 1.1816406 + - 2.8007813 + - -1.1210938 + - 1.6542969 + - 0.024734497 + - -3.390625 + - 2.2402344 + - 0.5571289 + - -0.67089844 + - -3.1210938 + - -0.091796875 + - 1.8320313 + - 2.421875 + - -0.43115234 + - -0.41845703 + - 1.9492188 + - -1.0253906 + - 1.8066406 + - -1.1699219 + - -0.04067993 + - -1.3125 + - 18.59375 + - -0.49267578 + - 2.1640625 + - -1.1904297 + - 2.046875 + - -2.9882813 + - 3.0351563 + - 0.070129395 + - -0.2932129 + - 0.14709473 + - 3.140625 + - 0.6411133 + - -1.734375 + - 1.0273438 + - 3.25 + - 0.66796875 + - -0.24633789 + - 1.0820313 + - -0.81152344 + - 2.8691406 + - -0.22851563 + - 0.8828125 + - -0.84765625 + - -3.078125 + - -0.53466797 + - -1.3183594 + - -2.9101563 + - 2.5097656 + - 0.9892578 + - -0.7841797 + - 1.0058594 + - 2.09375 + - -0.4638672 + - -0.27783203 + - -1.4726563 + - -0.58935547 + - 1.0644531 + - -3.0273438 + - -5.5820313 + - 2.59375 + - 0.8964844 + - 1.4658203 + - 2.8945313 + - -2.796875 + - 3.1347656 + - 0.73535156 + - -0.9921875 + - 0.6640625 + - 2.2148438 + - -0.47998047 + - 2.6660156 + - 0.028152466 + - 0.88671875 + - 1.6191406 + - 0.18554688 + - 1.1972656 + - -4.5234375 + - -0.7114258 + - 1.9296875 + - -0.3076172 + - 1.2744141 + - -0.19140625 + - -3.65625 + - -0.27856445 + - -5.1523438 + - -2.9882813 + - -1.6640625 + - -1.6660156 + - -1.7089844 + - 2.65625 + - 3.1875 + - -2.65625 + - 2.140625 + - -2.5976563 + - 5.9453125 + - 0.00032544136 + - 0.24072266 + - -2.453125 + - 0.00390625 + - -3.0390625 + - -2.8125 + - 2.1640625 + - 0.04296875 + - 3.2910156 + - -3.5351563 + - 1.5039063 + - -0.6879883 + - 2.1210938 + - -0.13867188 + - 1.2568359 + - -2.7675781 + - -1.9736328 + - -3.2578125 + - 2.8164063 + - 4.2734375 + - -2.6953125 + - -8.328125 + - -1.2773438 + - 0.95214844 + - -1.4785156 + - -2.8066406 + - -2.5625 + - 0.31762695 + - -0.07287598 + - 2.9238281 + - 1.5556641 + - -1.234375 + - 1.2900391 + - -3 + - 3.5097656 + - 1.1171875 + - -4.359375 + - 3.1347656 + - 2.8691406 + - 4.7421875 + - -2.5039063 + - -11.0078125 + - 0.47558594 + - -2.21875 + - -2.3964844 + - 2.8046875 + - -2.3085938 + - -0.24182129 + - 2.6953125 + - -3.296875 + - -2.3847656 + - -3.3535156 + - 4.9257813 + - -2.2988281 + - 0.1973877 + - -0.5859375 + - 0.66308594 + - 0.53564453 + - 0.9667969 + - 1.984375 + - 2.1015625 + - 2.3496094 + - -1.4863281 + - -1.3291016 + - -1.640625 + - -3.546875 + - -1.1943359 + - -0.7705078 + - -2.5976563 + - 3.5039063 + - -2.75 + - 0.234375 + - 3.1796875 + - -4.5703125 + - -1.8574219 + - -0.6586914 + - -3.6054688 + - -2.5800781 + - -0.04034424 + - 0.48876953 + - 1.9150391 + - -2.6191406 + - -4.1875 + - 1.2519531 + - 0.5439453 + - -0.16992188 + - -2.0195313 + - -0.70751953 + - 5.5 + - 6.0625 + - 1.9619141 + - 4.0234375 + - 2.5332031 + - -0.94384766 + - -3.8242188 + - -2.4726563 + - 2.765625 + - -2.5703125 + - 0.14868164 + - 2.1289063 + - -0.029937744 + - -0.19921875 + - -1.5585938 + - 6.5546875 + - 1.2070313 + - 2.3320313 + - 1.4941406 + - 0.030761719 + - 0.42529297 + - 0.30664063 + - -2.03125 + - -0.46142578 + - 3.5019531 + - -0.21740723 + - -0.52441406 + - -1.015625 + - -4.1601563 + - -1.5078125 + - 0.44873047 + - -8.125 + - 0.90625 + - 2.7226563 + - -0.7109375 + - 1.4423828 + - 2.125 + - -2.3691406 + - -1.2714844 + - -0.7314453 + - -0.96484375 + - 3.7441406 + - -3.65625 + - -2.484375 + - 2.5 + - 0.27734375 + - -4.84375 + - 2.875 + - 0.5957031 + - 0.23510742 + - 3.8359375 + - -3.4023438 + - -0.5209961 + - -3.359375 + - 3.0253906 + - 2.9003906 + - -2.6640625 + - -0.9140625 + - 2.1484375 + - -3.6914063 + - 0.123535156 + - -2.3554688 + - 0.50146484 + - -1.9921875 + - -0.22851563 + - 0.5620117 + - 1.7978516 + - 3.9921875 + - -0.01626587 + - -0.1796875 + - 2.0039063 + - 1.5117188 + - -2.890625 + - 0.7758789 + - 3.7070313 + - 0.9814453 + - 0.9794922 + - -0.5517578 + - -0.6455078 + - 2.3554688 + - -0.01953125 + - -2.6328125 + - 1.1054688 + - -2.5917969 + - -3.5273438 + - -1.4472656 + - -1.1289063 + - 2.1367188 + - -2.8125 + - -4.703125 + - -3.0390625 + - -0.091796875 + - 1.2519531 + - 2.8691406 + - 3.484375 + - 2.6757813 + - 0.5048828 + - -7.5664063 + - -2.5976563 + - -1.0341797 + - -2.0488281 + - -0.90234375 + - 1.21875 + - 0.26953125 + - 3.9453125 + - 2.328125 + - -4.9609375 + - -1.1132813 + - -2.7910156 + - 2.3945313 + - -1.1445313 + - 1.0087891 + - -0.83447266 + - -2.4648438 + - -0.38891602 + - -3.0117188 + - 0.21484375 + - -0.48168945 + - 2.1523438 + - 0.15002441 + - -2.8925781 + - 1.7236328 + - 0.44360352 + - 3.9707031 + - -1.6025391 + - -2.2929688 + - 0.46020508 + - 0.028640747 + - -2.1523438 + - -1.9892578 + - 1.4970703 + - 2.3457031 + - -0.55859375 + - -3.0625 + - -1.9150391 + - 0.8359375 + - -4.4101563 + - -0.057281494 + - -0.71777344 + - -0.5722656 + - 1.0957031 + - 2.4804688 + - 1.4980469 + - 3.0410156 + - 2.765625 + - -0.54296875 + - 0.7167969 + - -0.38964844 + - 0.04360962 + - -2.7753906 + - 0.73828125 + - -4.2109375 + - 0.7705078 + - -3.4160156 + - 1.1552734 + - 3.4472656 + - -4.21875 + - -1.2353516 + - 0.2746582 + - -1.8798828 + - -1.2822266 + - 0.84765625 + - 4.1015625 + - -0.5810547 + - -0.74316406 + - 3.453125 + - 3.3007813 + - 1.7714844 + - -0.7939453 + - -1.4003906 + - 1.6298828 + - 0.5395508 + - 1.3300781 + - 1.0800781 + - 0.8129883 + - 3.5078125 + - 0.4074707 + - -3.0820313 + - -2.296875 + - 1.3847656 + - 1.1904297 + - -1.0195313 + - -1.5390625 + - -0.69384766 + - 0.39990234 + - -3.1875 + - -2.2578125 + - -0.12902832 + - 0.36132813 + - 5.0039063 + - -0.61376953 + - -0.73291016 + - -1.8564453 + - 7.7382813 + - -3.71875 + - 2.96875 + - 1.3554688 + - -5.4609375 + - -3.0410156 + - 2.6503906 + - -0.4189453 + - -1.3085938 + - 0.0390625 + - 2.78125 + - -0.47607422 + - 1.9746094 + - 2.7519531 + - 2.3769531 + - 2.3945313 + - -1.4921875 + - 3.109375 + - 5.734375 + - -2.0976563 + - 1.2939453 + - 3.3359375 + - -3.3144531 + - -1.0683594 + - 0.3671875 + - -0.02017212 + - 0.77734375 + - -4.2382813 + - 0.35351563 + - -1.6689453 + - -0.40673828 + - 2.2109375 + - 1.5234375 + - 1.8798828 + - 1.8173828 + - -2.5605469 + - 6.0390625 + - 3.828125 + - 4.6328125 + - 2.7285156 + - -5.1875 + - -4.4101563 + - -1.4423828 + - -1.8642578 + - 0.46923828 + - -1.4111328 + - 0.05987549 + - -0.39941406 + - -1.3876953 + - 2.8222656 + - -3.46875 + - 1.0136719 + - 4.4101563 + - 6.9453125 + - 1.0126953 + - -2.71875 + - 0.9794922 + - 7.3203125 + - 2.2539063 + - 0.49658203 + - -0.67871094 + - -3.296875 + - 0.38500977 + - 1.3925781 + - -0.42626953 + - -3.1289063 + - 0.78515625 + - 4.7421875 + - 3.6015625 + - 0.7763672 + - 0.049621582 + - 1.4746094 + - 3.625 + - -0.47192383 + - 2.3632813 + - -5.40625 + - 0.7128906 + - -3.8945313 + - -1.4023438 + - -3.8359375 + - 1.1113281 + - 0.042297363 + - 3.78125 + - 1.6738281 + - -1.609375 + - 2.7207031 + - 1.1787109 + - -3.2285156 + - -3.4550781 + - 0.21582031 + - -3.3847656 + - -3.75 + - 3.0039063 + - -2.6367188 + - 2.1953125 + - 3.9414063 + - -1.2861328 + - -2.6171875 + - -2.7128906 + - 0.99658203 + - 1.4394531 + - -0.3371582 + - 1.3027344 + - -0.4399414 + - 2.7578125 + - 0.38012695 + - -0.80566406 + - -0.5805664 + - -2.9101563 + - 1.9453125 + - 0.02734375 + - -0.24279785 + - -2.90625 + - -2.3476563 + - 3.9804688 + - -1.3994141 + - 0.4699707 + - -1.8886719 + - 2.40625 + - -1.8144531 + - -2.8046875 + - -1.7939453 + - -0.06768799 + - 2.1445313 + - 0.60546875 + - -1.5830078 + - -0.48486328 + - 3.7910156 + - 0.011062622 + - 1.453125 + - 3.6347656 + - -2.609375 + - 2.3496094 + - -0.98828125 + - -4.1445313 + - -2.1210938 + - -1.0595703 + - 3.1601563 + - -2.0371094 + - 4.6328125 + - 1.4697266 + - 1.0527344 + - 0.29003906 + - -1.2949219 + - 0.875 + - 2.2636719 + - -0.86572266 + - -0.8051758 + - -0.8642578 + - -0.5673828 + - -1.8525391 + - -3.09375 + - 2.2988281 + - -5.9726563 + - -3.4921875 + - -4.34375 + - 1.7275391 + - 4.8203125 + - 1.8798828 + - -1.0244141 + - 0.47314453 + - 3.2109375 + - -0.9238281 + - -4.3125 + - -0.35668945 + - 0.37109375 + - -2.796875 + - -1.0546875 + - 5.34375 + - 2.2519531 + - -0.37158203 + - 0.5292969 + - -1.9462891 + - 1.5556641 + - 2.5175781 + - -1.3378906 + - 0.7993164 + - 3.6796875 + - -2.2441406 + - -1.6298828 + - 1.9345703 + - -0.6977539 + - -0.5083008 + - 1.5673828 + - -1.5605469 + - -9.109375 + - 1.8837891 + - -34.78125 + - 1.3105469 + - -0.103149414 + - -1.1875 + - -4.9765625 + - 1.0761719 + - 0.13500977 + - 0.5058594 + - 1.7402344 + - 0.8461914 + - 0.7192383 + - -1.0214844 + - 5.6796875 + - -0.13208008 + - -0.94921875 + - 2.671875 + - 0.30297852 + - -1.2099609 + - 12.359375 + - -3.2695313 + - -0.25585938 + - -0.054016113 + - 0.5961914 + - -0.43896484 + - 0.040039063 + - 6.9609375 + - -1.2011719 + - -1.4970703 + - 1.1767578 + - -2.3085938 + - -1.6259766 + - -3.5644531 + - 1.71875 + - 1.3642578 + - -1.265625 + - 2.4648438 + - 0.8828125 + - -0.21289063 + - 1.4453125 + - -1.09375 + - 3.5644531 + - -2.21875 + - -0.5566406 + - -0.55029297 + - -2.71875 + - 2.5644531 + - -0.98095703 + - 1.7158203 + - 1.4765625 + - -2.6171875 + - 0.5673828 + - -3.3632813 + - 0.09112549 + - -2.0703125 + - -1.0898438 + - 0.40039063 + - 4.875 + - -2.7441406 + - 0.22814941 + - 0.11846924 + - 0.8798828 + - -1.6914063 + - -2.1640625 + - 0.18225098 + - 7.140625 + - -0.023101807 + - 1.1025391 + - 4.8828125 + - -2.0175781 + - 2.109375 + - -1 + - -0.2578125 + - 1.65625 + - -2.5703125 + - 3.0019531 + - -2.7304688 + - 0.52197266 + - 0.45825195 + - 2.9921875 + - 0.4621582 + - -3.1210938 + - -3.3046875 + - 2.5996094 + - 0.71728516 + - 3.1191406 + - 2.5332031 + - -3.1132813 + - -0.6665039 + - 1.0673828 + - -1.2158203 + - 1.890625 + - -1.8837891 + - -0.33325195 + - -2.2519531 + - 0.7036133 + - -0.5732422 + - -3.0039063 + - 0.17382813 + - -1.0527344 + - -1.3515625 + - -2.8925781 + - -5.5546875 + - -1.2675781 + - -0.6269531 + - 0.14086914 + - 3.40625 + - 3.8125 + - 0.027496338 + - 2.4101563 + - 0.11578369 + - 1.0292969 + - 0.5839844 + - -3.0976563 + - 4.7382813 + - 0.32885742 + - 2.6835938 + - -0.51708984 + - 3.2363281 + - -1.53125 + - 3.2910156 + - 1.8261719 + - -0.6567383 + - -1.8789063 + - -1.4707031 + - 0.6298828 + - 3.1035156 + - 2.4707031 + - -0.15686035 + - 0.28808594 + - 2.7851563 + - 3.125 + - 1.9501953 + - -1.8330078 + - 1.6298828 + - 0.8754883 + - -0.6196289 + - 3.0664063 + - -1.8173828 + - -3.4101563 + - 0.859375 + - -0.61328125 + - -1.0517578 + - -2.4921875 + - -2.8378906 + - 1.5820313 + - -1.5546875 + - 3.2910156 + - -2.1308594 + - 0.8564453 + - -3.296875 + - 0.09240723 + - -1.2421875 + - 0.74072266 + - 4.7695313 + - -0.0982666 + - -0.59228516 + - 0.45825195 + - -2.6972656 + - 4.3203125 + - -2.3066406 + - 2.21875 + - -4.6015625 + - -5.1171875 + - -0.2705078 + - -2.2597656 + - -0.6220703 + - -4.3164063 + - -14.125 + - 0.76416016 + - -0.33007813 + - 6.03125 + - 2.125 + - 2.6347656 + - 0.8642578 + - 1.6621094 + - -0.38916016 + - 0.22521973 + - -1.3671875 + - -2.5566406 + - 1.9296875 + - 3.03125 + - 0.859375 + - -4.3398438 + - 1.1103516 + - -1.6923828 + - 0.54003906 + - 0.30200195 + - 2.8222656 + - 1.9316406 + - 1.0556641 + - 2.0976563 + - 2.4023438 + - -2.8769531 + - 0.9243164 + - -1.2138672 + - -20.15625 + - 1.4511719 + - -0.03125 + - 0.9589844 + - -2.6992188 + - -1.0195313 + - 1.3925781 + - 0.34179688 + - -3.6875 + - -3.0175781 + - -0.3359375 + - 1.4033203 + - -1.140625 + - -1.1269531 + - -1.1074219 + - 1.0742188 + - -6.1171875 + - -0.8149414 + - 0.15356445 + - -0.53222656 + - 1.6142578 + - 0.95166016 + - 3.1582031 + - -1.6103516 + - -0.7763672 + - 1.5488281 + - -5.1132813 + - -0.63720703 + - 1.2666016 + - -0.25048828 + - 4.2421875 + - -3.3457031 + - 0.8129883 + - 0.28076172 + - 0.28637695 + - 4.4453125 + - 0.453125 + - 1.8876953 + - -15.375 + - 0.6738281 + - -1.4277344 + - 1.5019531 + - -3.5664063 + - 2.2441406 + - -1.1171875 + - 1.8828125 + - 1.7548828 + - -0.8828125 + - 2.3339844 + - -2.0078125 + - 0.8935547 + - -0.69628906 + - 0.10107422 + - -1.4277344 + - 1.234375 + - 3.796875 + - 2.2988281 + - -5.8632813 + - -2.6738281 + - 2.9316406 + - -3.5800781 + - 0.058898926 + - 2.8007813 + - -0.007484436 + - 4.3828125 + - -2.140625 + - -3.0820313 + - 1.2695313 + - 1.8994141 + - 1.8564453 + - -0.27270508 + - -0.09033203 + - -2.21875 + - -0.3930664 + - -1.734375 + - -0.4819336 + - 0.97558594 + - 1.6064453 + - 5.0664063 + - 0.82910156 + - 1.2167969 + - 2.671875 + - -2.7382813 + - 2.1132813 + - -2.8320313 + - -1.8486328 + - -1.7109375 + - 1.9003906 + - 6.0820313 + - 1.2011719 + - 1.7392578 + - -2.7890625 + - -1.9960938 + - 2.4023438 + - 1.515625 + - 4.5390625 + - 1.1542969 + - -3.7695313 + - 2.203125 + - -0.9223633 + - 1.0097656 + - 1.5361328 + - -1.9609375 + - -3.4316406 + - 1.15625 + - 2.15625 + - -0.53125 + - 0.9609375 + - 0.53515625 + - -3.2910156 + - 2.3496094 + - -0.46484375 + - 2.5195313 + - 3.8847656 + - 0.37109375 + - -0.8173828 + - 3.7128906 + - 1.5595703 + - -2.5234375 + - -2.140625 + - 3.734375 + - -0.25878906 + - 2.7207031 + - -3.15625 + - 0.640625 + - 1.7597656 + - -2.0703125 + - 1.5878906 + - 4.65625 + - -2.2460938 + - -1.2089844 + - 0.4621582 + - 0.23046875 + - 0.65234375 + - 2.0859375 + - 1.1845703 + - 4.453125 + - 0.6455078 + - -1.2285156 + - -2.4882813 + - -2.3222656 + - 2.375 + - 0.95703125 + - 0.7109375 + - 0.83447266 + - -1.1503906 + - -4.890625 + - -0.58935547 + - 3.8535156 + - -3.0878906 + - -0.23120117 + - -2.2773438 + - -0.82421875 + - 3.7207031 + - 5.15625 + - -0.5644531 + - -3.6894531 + - 0.49169922 + - -1.1660156 + - -0.7832031 + - -1.6738281 + - 1.171875 + - -4.4453125 + - 1.03125 + - 2.7285156 + - 7.9257813 + - -1.6503906 + - 1.8007813 + - -0.10284424 + - 0.84765625 + - -1.7128906 + - -3.0039063 + - 5.2109375 + - -1.3691406 + - 3.3125 + - 3.4570313 + - -2.9375 + - -1.640625 + - -5.34375 + - 2.0117188 + - 1.3642578 + - -0.19213867 + - -2.0703125 + - -3.9003906 + - 3.3359375 + - -1.1699219 + - -1.5244141 + - 1.2226563 + - 0.6279297 + - 0.15734863 + - 2.0175781 + - 5.6484375 + - -0.7236328 + - -1.1660156 + - 0.6064453 + - 3.34375 + - 1.7587891 + - -0.8173828 + - -4.1953125 + - -2.0117188 + - -1.7128906 + - 0.82910156 + - 1.3769531 + - 4.546875 + - -1.8222656 + - 2.21875 + - 1.09375 + - -2.6308594 + - 4.1640625 + - 1.5439453 + - 0.26367188 + - -1.7441406 + - -3.578125 + - 3.9882813 + - -3.328125 + - 0.90722656 + - -2.671875 + - 2.7753906 + - 2.3183594 + - -1.0273438 + - -0.5024414 + - 1.0234375 + - -2.6289063 + - 2.1738281 + - -0.72265625 + - 3.3769531 + - -0.25805664 + - 6.3945313 + - -2.5878906 + - -2.703125 + - 1.6796875 + - -1.2431641 + - 7.5664063 + - 3.5898438 + - 0.035949707 + - 0.5727539 + - -0.50683594 + - -0.36083984 + - 4.1171875 + - -0.6035156 + - 0.020828247 + - -0.05987549 + - 0.39941406 + - 2.5273438 + - -1.7587891 + - -2.0585938 + - -1.0625 + - -4.734375 + - 2.828125 + - -3.1738281 + - -2.3417969 + - 0.9707031 + - 1.2626953 + - -5.4726563 + - -1.2929688 + - -0.06347656 + - 1.7470703 + - 0.00504303 + - -1.1835938 + - 1.6425781 + - 0.033233643 + - -2.4277344 + - 3.703125 + - -0.30297852 + - 2.53125 + - 2.7460938 + - -3.7070313 + - -0.54589844 + - 2.6015625 + - -5.0039063 + - -0.7246094 + - -0.12365723 + - 0.7236328 + - 1.2978516 + - -1.3496094 + - -1.1367188 + - 1.421875 + - -0.7368164 + - 4.34375 + - -0.6015625 + - 4.796875 + - -0.0065078735 + - 2.9765625 + - -3.8984375 + - -2.9101563 + - -1.9511719 + - -3.1132813 + - -0.38012695 + - 0.099609375 + - 2.0019531 + - -3.5 + - -0.16796875 + - -0.16796875 + - -4.3671875 + - 2.1914063 + - 1.4023438 + - 1.7861328 + - -1.3066406 + - -0.28515625 + - -12.4453125 + - 4.234375 + - 2.2773438 + - 0.4777832 + - 2.3027344 + - -1.7939453 + - -3.65625 + - -0.48291016 + - 0.83447266 + - 3.3320313 + - -1.3720703 + - -0.60253906 + - 3.6035156 + - 2.3222656 + - 0.12719727 + - -3.0273438 + - -3.0878906 + - -0.09765625 + - -1.046875 + - -3.7695313 + - -1.5283203 + - 0.57910156 + - -1.3457031 + - 2.0332031 + - -0.2524414 + - -4.9101563 + - 3.1757813 + - 5.2890625 + - 0.6801758 + - 2.0097656 + - 0.36767578 + - 1.0224609 + - 3.0175781 + - 1.7402344 + - 2.921875 + - -0.20898438 + - 0.8227539 + - -1.5205078 + - 1.2421875 + - 1.5644531 + - 2.0195313 + - 1.1933594 + - -2.1523438 + - 5.171875 + - 2.9472656 + - -4.359375 + - -74 + - 2.8378906 + - -2.5117188 + - -1.3486328 + - 2.9960938 + - 4.4765625 + - 1.4042969 + - 1.7890625 + - -0.31225586 + - -3.9003906 + - 0.15649414 + - 0.43408203 + - 1.59375 + - 1.7929688 + - 0.35351563 + - -4.7421875 + - -1.1943359 + - -4.5 + - 0.43603516 + - 1.1015625 + - 2.3300781 + - 0.76416016 + - 1.6015625 + - 0.009765625 + - -3.1367188 + - -3.609375 + - 0.69384766 + - -2.5351563 + - 2.0429688 + - -0.9970703 + - 0.6977539 + - -4.625 + - 1.1503906 + - -1.109375 + - -2.8691406 + - 0.057617188 + - 2.0605469 + - -0.8798828 + - -0.65625 + - -3.3476563 + - 1.0224609 + - 1.2070313 + - 2.9316406 + - 2.0273438 + - 0.46044922 + - -1.5625 + - 0.9404297 + - 0.9863281 + - 1.1357422 + - 0.92871094 + - 3.03125 + - -0.49072266 + - -0.23156738 + - 19.15625 + - -5.7578125 + - 2.671875 + - -0.35791016 + - 2.8398438 + - 1.6015625 + - -7.21875 + - 4.8789063 + - 3.3378906 + - -0.16320801 + - -1.0761719 + - 0.14282227 + - 1.4921875 + - -4.6132813 + - 1.3359375 + - -1.4375 + - -1.1367188 + - -2.4160156 + - 3.5351563 + - 3.3359375 + - 2.9257813 + - 1.546875 + - -1.859375 + - -2.5507813 + - -0.75439453 + - 0.39257813 + - 1.6806641 + - -0.29638672 + - 0.5517578 + - -2.9238281 + - -2.5488281 + - -0.09875488 + - -2.3613281 + - 0.80859375 + - 3.3671875 + - -0.37353516 + - -0.94189453 + - -2.9472656 + - -1.59375 + - 0.87353516 + - 3.4414063 + - -0.61572266 + - 6.9140625 + - 2.8085938 + - 4.1640625 + - -2.9472656 + - 0.04425049 + - -0.2512207 + - -0.36157227 + - -1.2441406 + - 2.7734375 + - 0.2548828 + - -1.2197266 + - -0.13867188 + - -0.88134766 + - 1.8203125 + - -0.86328125 + - 6.1328125 + - 23.078125 + - -0.640625 + - -1.1552734 + - -3.1484375 + - 1.96875 + - 0.2619629 + - 3.5 + - 2.5332031 + - -2.0078125 + - -2.0585938 + - 5.171875 + - 1.8515625 + - 0.49267578 + - -1.8642578 + - 1.5039063 + - 1.1074219 + - -3.0820313 + - 0.1126709 + - 0.020507813 + - 4.2539063 + - 0.5571289 + - 1.0449219 + - 1.2050781 + - -0.7529297 + - 1.6533203 + - 0.54345703 + - -1.1298828 + - 4.90625 + - 2.0253906 + - -1.7011719 + - -2.59375 + - 2.421875 + - 0.57714844 + - -2.9003906 + - 0.32543945 + - -2.1386719 + - -1.9335938 + - -2.2304688 + - 3.2929688 + - 1.0253906 + - 1.3085938 + - 3.3359375 + - 1.0859375 + - -2.28125 + - -0.46533203 + - 5.328125 + - -0.6411133 + - 0.8408203 + - 1.609375 + - 2.7539063 + - 1.0498047 + - -5.109375 + - -1.2265625 + - 2.2773438 + - 6.6171875 + - -0.80566406 + - -1.7910156 + - 0.9345703 + - -3.9726563 + - -0.38012695 + - 2.0957031 + - -2.3828125 + - -0.13085938 + - -0.83251953 + - 3.265625 + - 2.40625 + - 1.1796875 + - 1.0087891 + - 1.0927734 + - -1.578125 + - -1.7167969 + - -4.4414063 + - 1.3691406 + - 1.1953125 + - -0.39892578 + - -1.78125 + - 0.022125244 + - -1.5292969 + - -0.37841797 + - -12.890625 + - 0.45507813 + - 0.3371582 + - -2.0722656 + - 1.0898438 + - -2.3398438 + - -1.0986328 + - 0.5566406 + - -0.47998047 + - 0.8769531 + - 2.7753906 + - 1.2236328 + - 4.3203125 + - 0.9736328 + - -1.7363281 + - 1.8417969 + - -3.8476563 + - -4.1875 + - -3.3710938 + - 0.15356445 + - -0.93847656 + - -3.78125 + - 2.765625 + - 0.87597656 + - -0.59814453 + - 0.7939453 + - 2.0429688 + - 5.7382813 + - 1.1347656 + - 0.28833008 + - 1.3955078 + - 4.2421875 + - -3.3125 + - -3.8554688 + - -0.09729004 + - 0.62353516 + - 2.703125 + - 0.68652344 + - -0.009109497 + - -2.28125 + - 2.0820313 + - 1.9179688 + - 0.4663086 + - -1.8876953 + - -2.1523438 + - 1.4589844 + - -2.4394531 + - 2.921875 + - 1.8095703 + - 0.32348633 + - 2.796875 + - 2.1875 + - -0.23535156 + - 1.4736328 + - -5.1484375 + - -4.3945313 + - -2.734375 + - 1.6347656 + - 2.125 + - -2.2695313 + - -2.4472656 + - -2.3398438 + - -4.4101563 + - -5.8007813 + - 1.4511719 + - -0.27783203 + - 2.2617188 + - -0.6044922 + - -1.1474609 + - -4.0625 + - -0.54589844 + - 1.5429688 + - 0.8984375 + - -0.3857422 + - 0.41015625 + - 0.8071289 + - 18 + - 0.61035156 + - -0.3479004 + - 1.5517578 + - 15.2578125 + - 0.20629883 + - 0.33007813 + - -0.16113281 + - 1.203125 + - -3.4609375 + - -0.73876953 + - 5.375 + - -0.5419922 + - 6.1171875 + - 0.9165039 + - 2.5566406 + - 0.52783203 + - -0.033843994 + - -2.7851563 + - -3.9609375 + - 7.0195313 + - -0.013832092 + - 2.2988281 + - 5.2890625 + - 0.9433594 + - -4.2109375 + - 0.5439453 + - 3.828125 + - 1.3691406 + - 0.084472656 + - -0.51416016 + - 1.9941406 + - 1.6728516 + - -0.5073242 + - -5.7734375 + - 0.1652832 + - -0.6064453 + - -0.9238281 + - -1.2880859 + - -3.7226563 + - 2.8769531 + - -0.27929688 + - -5.875 + - -1.0927734 + - 2.8789063 + - 0.14172363 + - -0.5678711 + - 0.37646484 + - 0.35205078 + - -4.265625 + - 4.203125 + - -1.1142578 + - 4.21875 + - 2.7851563 + - 2.6621094 + - -2.9238281 + - -0.36621094 + - -0.20227051 + - -2.7597656 + - -3.7851563 + - 4.2851563 + - 2.3164063 + - 0.47387695 + - -1.5878906 + - 1.0175781 + - -2.8925781 + - 2.2695313 + - -3.6914063 + - -2.90625 + - 1.0556641 + - -2.7617188 + - -2.3828125 + - 1.1035156 + - 3.6796875 + - -4.1796875 + - -3.6328125 + - -1.0761719 + - -3.8164063 + - -1.3251953 + - -3.2695313 + - 0.6142578 + - 0.33642578 + - -0.60546875 + - -3.3632813 + - 0.27856445 + - 2.4804688 + - -0.005859375 + - -3.453125 + - -3.1875 + - -0.30273438 + - 0.27001953 + - -0.025390625 + - -5.6132813 + - -2.9941406 + - -5.875 + - 3.1484375 + - 0.44140625 + - -1.6796875 + - -1.0410156 + - -3.4160156 + - 3.5820313 + - -0.81347656 + - 3.03125 + - 2.9101563 + - -5.4765625 + - 0.8930664 + - 1.3232422 + - -0.7001953 + - 4.234375 + - -2.5605469 + - 1.375 + - -0.32641602 + - 0.43847656 + - -1.6894531 + - -3.4863281 + - -0.0013017654 + - 2.3457031 + - -1.5449219 + - 1.9824219 + - -2.0859375 + - 0.011390686 + - -6.4765625 + - -0.7265625 + - 1.3144531 + - 0.72265625 + - 1.9667969 + - 3.2285156 + - 2.4492188 + - 3.2753906 + - -0.6191406 + - -0.20715332 + - -0.6738281 + - -1.6425781 + - -2.0429688 + - 2.75 + - 0.39453125 + - -2.234375 + - 1.2246094 + - 1.4462891 + - -1.1611328 + - -0.14904785 + - -3.4726563 + - -3.0878906 + - -0.2697754 + - 0.72753906 + - -1.2978516 + - 1.9814453 + - 1.6972656 + - 2.2578125 + - 4.6132813 + - 2.875 + - -1.4121094 + - -1.1679688 + - -5.0742188 + - 3.8691406 + - 3.1660156 + - -0.63134766 + - 3.8515625 + - 3.4023438 + - -4.703125 + - 0.8173828 + - 1.71875 + - -3.1015625 + - 1.7080078 + - -2.8554688 + - -0.7597656 + - -0.9326172 + - -0.109191895 + - 2.6972656 + - -0.2130127 + - -1.6132813 + - -4.0234375 + - 0.5908203 + - 1.0527344 + - -0.95751953 + - 1.6660156 + - -5.7226563 + - 3.6679688 + - -0.9609375 + - 1.8105469 + - 1.2666016 + - -2.5253906 + - 4.5742188 + - -2.3535156 + - 1.1855469 + - -1.7353516 + - 0.3647461 + - 0.4621582 + - -0.17773438 + - 2.1914063 + - -0.123046875 + - -1.8798828 + - -2.0722656 + - 2.4160156 + - -0.6821289 + - 0.9145508 + - -0.6699219 + - 3.6347656 + - -0.4506836 + - -2.5234375 + - 0.36083984 + - 3.8867188 + - 1.0419922 + - 0.26171875 + - -3.0488281 + - -1.7773438 + - -3.5644531 + - 8.484375 + - -2.2363281 + - 0.8208008 + - -1.0859375 + - 3.5 + - -1.0898438 + - 0.34301758 + - 3.1035156 + - -2.7539063 + - -0.7392578 + - -0.31958008 + - 1.5429688 + - -4.7421875 + - -1.5078125 + - 4.9453125 + - -2.2304688 + - 4.4765625 + - -0.57910156 + - 0.50097656 + - 0.8066406 + - 3.640625 + - 0.65185547 + - -1.6796875 + - -1.2626953 + - 1.1816406 + - -0.93847656 + - -5.1484375 + - 2.796875 + - -1.8652344 + - -3.5488281 + - -0.9433594 + - 1.9453125 + - 0.96191406 + - 2.0449219 + - -3.4863281 + - -1.5751953 + - 0.7236328 + - -0.9736328 + - -2.9609375 + - -4.0078125 + - 0.32543945 + - -3.0625 + - -1.9082031 + - 0.2536621 + - 1.0478516 + - -0.12597656 + - 2 + - 2.5058594 + - -1.6220703 + - -1.5644531 + - 2.1894531 + - 0.51660156 + - -0.79296875 + - -0.96533203 + - -2.53125 + - -1.0117188 + - 0.8876953 + - -1.3691406 + - -1.8613281 + - -3.0410156 + - -1.7900391 + - 1.9658203 + - -0.9121094 + - -0.27783203 + - 1.84375 + - 0.3996582 + - -1.0654297 + - -2.6601563 + - 2.1464844 + - -1.9316406 + - -2.9375 + - -2.375 + - -3.4160156 + - -2.4570313 + - 0.39501953 + - -1.2490234 + - 0.6035156 + - 4.7578125 + - 6.3125 + - -5.4570313 + - -1.9628906 + - -2.4863281 + - 4.7382813 + - -4.0429688 + - -2.8476563 + - 1.1337891 + - -2.4941406 + - -2.9492188 + - 0.68847656 + - 3.1503906 + - 1.1210938 + - -3.1191406 + - -0.6035156 + - -1.3535156 + - -1.6064453 + - 1.7626953 + - -1.9804688 + - -2.0917969 + - -1.3691406 + - -0.78222656 + - -3.7675781 + - 1.9072266 + - -1.2460938 + - 1.421875 + - -3.3378906 + - -0.48364258 + - 2.4375 + - -3.7910156 + - 9.40625 + - -3.3320313 + - -2.0078125 + - 4.4375 + - -0.16247559 + - 1.2167969 + - -1.5859375 + - -0.02961731 + - -2.2871094 + - 2.2089844 + - 6.4101563 + - -3.5625 + - -2.1816406 + - 5.1523438 + - -1.3691406 + - 1.7929688 + - -0.002603531 + - -2.6015625 + - 2.2851563 + - 3.7988281 + - -3.9414063 + - 1.6425781 + - -4.6875 + - -0.8071289 + - 3.3984375 + - -9.109375 + - -0.5864258 + - 5.3945313 + - -1.7861328 + - -1.1875 + - -0.7871094 + - 4.5507813 + - -3.2207031 + - -4.96875 + - -2.0664063 + - 0.5048828 + - 5.0429688 + - 1.0175781 + - 2.0585938 + - -0.9560547 + - -2.4648438 + - 0.03286743 + - -4.28125 + - -1.1728516 + - -0.59814453 + - 3.75 + - 1.2246094 + - -2.6386719 + - -3.546875 + - 0.17114258 + - -0.09472656 + - 1.046875 + - 1.3876953 + - 0.7265625 + - -0.47998047 + - -4.1953125 + - -1.9609375 + - -1.9501953 + - 1.5605469 + - 0.39990234 + - -0.71533203 + - -0.57470703 + - -3.5820313 + - -4.4570313 + - 2.1445313 + - 0.7578125 + - 0.18676758 + - -4.5039063 + - -0.08135986 + - -0.09631348 + - -1.8847656 + - -1.8984375 + - -0.3400879 + - -0.47998047 + - 3.1347656 + - -4.1328125 + - -0.8232422 + - 0.71777344 + - 2.1777344 + - -0.30322266 + - -1.8798828 + - -2.1523438 + - -0.1282959 + - 0.35302734 + - -5.2109375 + - 1.0439453 + - 3.7890625 + - 4.3203125 + - 0.9946289 + - 1.1191406 + - 0.5551758 + - 4.265625 + - 2.5566406 + - -3.1757813 + - 1.3759766 + - 1.7705078 + - 1.8789063 + - -3.515625 + - -0.57177734 + - 2.5957031 + - 2.7441406 + - 1.4775391 + - -1.7666016 + - 1.953125 + - -1.8046875 + - -0.12524414 + - 3.5 + - 0.18225098 + - -0.95703125 + - 4.3671875 + - -1.4648438 + - -0.9501953 + - -1.2714844 + - -1.8515625 + - -3.8671875 + - 0.9248047 + - 3.5644531 + - -3.2851563 + - -1.8759766 + - 0.5234375 + - 0.77441406 + - 5.0390625 + - 8.03125 + - -3.0878906 + - 0.10675049 + - -1.6738281 + - -1.5683594 + - 0.5629883 + - 0.98876953 + - -0.9711914 + - 3.5039063 + - -3.0117188 + - -4.2851563 + - -0.75097656 + - -2.6523438 + - -1.5585938 + - -0.95214844 + - -1.8955078 + - 2.4238281 + - 4.09375 + - 1.0087891 + - 2.1328125 + - 3.6210938 + - -1.8876953 + - -1.6953125 + - -0.9736328 + - 0.97509766 + - 1.7695313 + - 0.19726563 + - -2.953125 + - 0.07519531 + - -1.6572266 + - -0.55078125 + - -3.4492188 + - 0.86572266 + - -0.40283203 + - 0.51953125 + - -1.6298828 + - 1.9462891 + - -3.2382813 + - -0.4543457 + - 0.08459473 + - -0.3725586 + - 8.359375 + - -1.9736328 + - 3.078125 + - -6.90625 + - 3.5019531 + - 3.078125 + - -2.7441406 + - 1.2988281 + - 1.2304688 + - -0.87109375 + - -2.9941406 + - 0.11242676 + - -1.0742188 + - -1.0800781 + - -2.8847656 + - -0.8496094 + - -1.4003906 + - 4.9375 + - 0.011062622 + - 0.7714844 + - 0.9321289 + - -1.015625 + - 2.1484375 + - -3.4726563 + - 1.3017578 + - -0.2043457 + - 5.09375 + - -3.7441406 + - -3.4375 + - 2.5917969 + - -1.7236328 + - -2.96875 + - 2.671875 + - 0.48486328 + - -0.53515625 + - 1.5644531 + - 3.8925781 + - 1.5 + - -7.15625 + - 4.25 + - 0.5839844 + - -0.67089844 + - 1.4267578 + - -4.046875 + - 0.06085205 + - 1.5019531 + - -1.2285156 + - 3.0351563 + - -8 + - 2.3476563 + - -1.1425781 + - -0.47070313 + - -1.9033203 + - -1.4580078 + - 1.0644531 + - -0.9482422 + - 0.2734375 + - 1.9316406 + - 2.546875 + - 0.7626953 + - 0.62109375 + - -5.0507813 + - 0.8696289 + - 1.1464844 + - -0.50390625 + - 1.9472656 + - 0.26611328 + - -1.3447266 + - -1.2792969 + - -1.2011719 + - 2.8242188 + - 0.17150879 + - 2.7617188 + - 1.6142578 + - -4.9765625 + - 1.6386719 + - -1.9648438 + - -0.50683594 + - 0.005207062 + - 2.0917969 + - -1.3164063 + - -0.09765625 + - 7.171875 + - -1.4003906 + - -0.5078125 + - 4.2070313 + - 0.94628906 + - 0.2685547 + - -1.9238281 + - 2.2226563 + - 7 + - -1.4765625 + - -0.40161133 + - -0.4025879 + - -2.8945313 + - 4.7265625 + - -1.5859375 + - -3.6289063 + - -0.18481445 + - -1.7050781 + - -1.0244141 + - 0.16992188 + - 1.2441406 + - -4.1796875 + - 0.11584473 + - 0.12695313 + - 2.6210938 + - 3.7070313 + - 3.140625 + - 1.1640625 + - 0.17138672 + - 3.2753906 + - 0.6040039 + - -5.0703125 + - 3.1875 + - -3.40625 + - -3.4101563 + - -18.828125 + - -3.3867188 + - 0.34033203 + - 4.5078125 + - -4.2578125 + - 1.8261719 + - -15.546875 + - -6.8320313 + - -0.25146484 + - -1.1142578 + - 1.4101563 + - -2.1464844 + - -0.06311035 + - 5.6132813 + - 0.609375 + - 2.4941406 + - -0.095703125 + - 1.9628906 + - 1.8984375 + - -5.0390625 + - -1.5390625 + - 2.4101563 + - -1.3535156 + - 0.25048828 + - 1.6494141 + - -1.015625 + - 1.8330078 + - 0.032226563 + - -0.41333008 + - 1.9814453 + - -1.1152344 + - -5.0820313 + - 1.7158203 + - -2.3613281 + - 1.0039063 + - 1.1445313 + - 1.1855469 + - -2.3222656 + - 2.7597656 + - -2.234375 + - 0.30615234 + - 5.46875 + - 1.4003906 + - 0.33520508 + - -3.1113281 + - -0.9633789 + - 4.3125 + - -1.6455078 + - -1.6640625 + - 2.0117188 + - 2.4179688 + - 2.7929688 + - -1.6152344 + - -3.4414063 + - 0.44848633 + - -4.8984375 + - 1.0996094 + - 2.5820313 + - -3.7226563 + - -0.3215332 + - 0.93066406 + - -0.83447266 + - -0.38891602 + - 4.9296875 + - 2.3300781 + - 1.1542969 + - -2.9375 + - 0.4338379 + - 4.8984375 + - -0.52441406 + - -1.5908203 + - 2.5117188 + - -2.2929688 + - -0.87890625 + - -0.81347656 + - 1.4589844 + - -2.6425781 + - 0.38598633 + - 1.1855469 + - -2.0429688 + - 1.2470703 + - 4.2695313 + - 0.028320313 + - 0.12109375 + - -1.5 + - -4.3828125 + - 0.85791016 + - -2.6386719 + - 1.0341797 + - 0.2199707 + - -1.5253906 + - 1.3408203 + - -3.5625 + - -6.9882813 + - 0.3203125 + - -5.7578125 + - -0.9042969 + - 1.4853516 + - 1.3212891 + - -2.4160156 + - 1.0097656 + - -4.296875 + - -2.8925781 + - -3.3789063 + - -0.86572266 + - -1.8447266 + - -0.057922363 + - 4.3164063 + - -0.41357422 + - 2.2128906 + - -1.5957031 + - -3.0332031 + - -0.6298828 + - -1.1777344 + - -1.6542969 + - -0.5727539 + - 1.0410156 + - -2.8066406 + - 1.28125 + - -0.25708008 + - 2.5664063 + - -0.70214844 + - 2.6191406 + - -4.8320313 + - -2.2207031 + - 1.0322266 + - -4.5859375 + - -3.4707031 + - -0.82421875 + - 5.265625 + - 7.21875 + - -0.6113281 + - 0.14709473 + - 4.6757813 + - 3.2539063 + - -1.8515625 + - -0.8154297 + - -3.2285156 + - 1.9921875 + - 2.2148438 + - 0.71191406 + - -1.3535156 + - -1.4267578 + - 0.17541504 + - -3.3007813 + - -3.7207031 + - 1.2480469 + - -0.7211914 + - -1.2402344 + - -1.46875 + - -2.3671875 + - 1.3730469 + - 1.1972656 + - -1.9931641 + - 0.008460999 + - -2.7753906 + - -0.9765625 + - 1.4550781 + - 0.67089844 + - -2.78125 + - -3.9765625 + - -0.6464844 + - 0.97314453 + - 5.7226563 + - -1.7617188 + - 0.43798828 + - 2.4648438 + - 14.609375 + - -0.89160156 + - -3.5488281 + - 1.40625 + - -0.9633789 + - 4.6914063 + - -1.7617188 + - -9.1640625 + - 2.9785156 + - -1.6113281 + - 6.59375 + - 1.1025391 + - 0.38330078 + - 0.045898438 + - 1.7861328 + - 3.0253906 + - 1.6845703 + - -4.0664063 + - -0.6582031 + - -3.8476563 + - 1.6376953 + - -0.35473633 + - 1.7167969 + - -2.7832031 + - -1.6972656 + - 2.6484375 + - 0.05532837 + - -3.84375 + - -1.9736328 + - -1.2441406 + - -0.29760742 + - -0.20874023 + - 2.203125 + - -1.1289063 + - -1.96875 + - -1.7617188 + - -0.79589844 + - 2.0644531 + - -0.5283203 + - 0.4560547 + - -3.6113281 + - 4.2109375 + - 0.63623047 + - -3.1875 + - 1.65625 + - -2.8632813 + - -0.3671875 + - 2.3632813 + - -3.359375 + - 4.921875 + - 3.6289063 + - -0.55371094 + - 4.6875 + - -0.86621094 + - -1.6542969 + - 2.203125 + - 2.4003906 + - 2.4804688 + - -3.4003906 + - 2.6289063 + - -3.3457031 + - 4.8164063 + - 1.4804688 + - -1.8515625 + - -1.4667969 + - 2.953125 + - 0.6767578 + - -1.7666016 + - -2.9804688 + - -2.3554688 + - -0.016921997 + - 0.037261963 + - 1.6191406 + - 0.22387695 + - -1.9355469 + - -5.296875 + - 4.078125 + - -0.28320313 + - -2.9921875 + - -0.9472656 + - -0.5205078 + - 0.09436035 + - -0.024734497 + - -2.2226563 + - 0.18859863 + - 1.2792969 + - -1.7587891 + - 3.96875 + - -1.8046875 + - 1.1855469 + - 1.0712891 + - -3.03125 + - 1.1933594 + - -0.15588379 + - 1.9921875 + - 0.24865723 + - -1.7714844 + - 4.5234375 + - -2.078125 + - 1.8681641 + - 0.98046875 + - -0.33520508 + - -3.5195313 + - 4.7617188 + - 1.1386719 + - 0.24902344 + - -0.84277344 + - 0.40625 + - 3.7910156 + - -1.0361328 + - -2.6679688 + - -2.609375 + - -3.3378906 + - -0.018875122 + - -2.0644531 + - 1.3408203 + - 0.50146484 + - -1.4648438 + - -0.016921997 + - -3.7734375 + - 4.8984375 + - 22.46875 + - -2.5898438 + - 3.4765625 + - -0.9609375 + - 0.2861328 + - 0.2746582 + - 1.0527344 + - -3.6113281 + - 2.140625 + - -0.7060547 + - -2.6640625 + - 0.59277344 + - -2.5039063 + - -2.0117188 + - 0.6923828 + - 2.953125 + - -7.484375 + - 0.6113281 + - -0.24182129 + - 10.84375 + - -4.5 + - 2.25 + - 1.5820313 + - -0.46020508 + - 1.2763672 + - -1.4472656 + - -0.5859375 + - -2.4902344 + - 0.30664063 + - -0.7626953 + - -23.875 + - 0.13769531 + - -1.609375 + - 1.1171875 + - -2.3710938 + - -1.8945313 + - 1.0908203 + - 2.4921875 + - -3.21875 + - 0.11340332 + - -0.6767578 + - -0.44580078 + - -2.875 + - -1.1230469 + - -1.984375 + - -0.86376953 + - -3.296875 + - -0.4555664 + - -0.8203125 + - -0.15454102 + - -3.6738281 + - 2.9804688 + - 0.12854004 + - -1.1914063 + - 4.0234375 + - -1.8564453 + - -0.83984375 + - -1.3613281 + - 4.6640625 + - -1.8671875 + - 0.28735352 + - 2.7363281 + - -6.1015625 + - 0.7290039 + - -1.3056641 + - 3.7695313 + - -1.1601563 + - 1.0625 + - -3.78125 + - 2.2773438 + - 0.2277832 + - -0.37817383 + - -5.8515625 + - 3.671875 + - -1.3378906 + - -2.1328125 + - 2.2304688 + - 1.4345703 + - 1.7617188 + - 3.8515625 + - 1.5800781 + - -0.875 + - -2.1171875 + - 2.2539063 + - 4.5703125 + - 1.1855469 + - -1.3242188 + - -2.28125 + - -1.7871094 + - -0.83691406 + - -1.1425781 + - 0.06542969 + - 2.5722656 + - 3.4179688 + - 0.3774414 + - 3.0566406 + - 4.8046875 + - 3.234375 + - -0.27661133 + - -0.28564453 + - 0.32421875 + - -2.1894531 + - -0.26611328 + - -1.7158203 + - -0.8017578 + - 0.16564941 + - -3.03125 + - 0.86035156 + - -4.609375 + - -0.38916016 + - -3.0253906 + - -3.7070313 + - 1.2519531 + - 0.6308594 + - 2.625 + - -1.171875 + - 1.8955078 + - 4.3671875 + - 0.7158203 + - 0.41308594 + - -3.3222656 + - 3.0195313 + - 2.3242188 + - -1.4941406 + - -1.5791016 + - 5.890625 + - 0.2578125 + - 3.5039063 + - -1.0683594 + - -0.35864258 + - 1.4765625 + - 0.49047852 + - 3.7050781 + - 0.25341797 + - 0.31298828 + - -0.7685547 + - -3.1914063 + - -8.0859375 + - 1.5517578 + - -0.95751953 + - 2.3789063 + - 2.1582031 + - 0.8828125 + - 0.17248535 + - 2.7675781 + - 0.2130127 + - 0.421875 + - 1.1416016 + - -0.037750244 + - 3.7109375 + - 2.0234375 + - -0.0234375 + - -0.38476563 + - 0.5810547 + - -3.2597656 + - 7.3515625 + - 1.3300781 + - 2.2382813 + - 8.9453125 + - 14.390625 + - -0.80566406 + - -2.8847656 + - -0.19458008 + - -1.0244141 + - -0.7836914 + - 2.0332031 + - -0.25024414 + - 1.1953125 + - 0.16796875 + - -2.890625 + - 0.45751953 + - 2.0722656 + - 1.1640625 + - 0.4345703 + - 1.5634766 + - -0.96972656 + - 2.1953125 + - -1.9414063 + - -2.859375 + - -4.1640625 + - -1.1455078 + - 1.7265625 + - -0.72753906 + - -1.5800781 + - -4.5078125 + - -0.3244629 + - 0.98828125 + - 0.46923828 + - -1.0166016 + - -0.921875 + - -1.7265625 + - 3.3476563 + - -1.6611328 + - 1.7001953 + - 3.6132813 + - -0.921875 + - 0.4807129 + - -1.1152344 + - -1.2421875 + - 5.4375 + - -0.59765625 + - 0.88134766 + - -2.1542969 + - -0.44482422 + - -2.8945313 + - 4.2382813 + - -0.16369629 + - -3.4921875 + - -0.6894531 + - 3.8164063 + - -0.084472656 + - -0.40820313 + - 2.1269531 + - 1.9228516 + - 0.33813477 + - -3.0234375 + - -1.9277344 + - 0.22521973 + - 1.9921875 + - -1.0722656 + - 4.4375 + - 1.8457031 + - 3.5722656 + - 2.5078125 + - -2.7578125 + - 1.578125 + - -2.203125 + - 1.3535156 + - -0.59228516 + - -2.2070313 + - -1.0908203 + - 0.69628906 + - -0.20605469 + - 1.6328125 + - 2.4882813 + - -0.27734375 + - 0.00894928 + - 1.8417969 + - 0.70947266 + - 19.9375 + - -5.421875 + - -0.47705078 + - -4.2617188 + - -0.38085938 + - -0.26123047 + - 3.9101563 + - -0.67578125 + - -5.5078125 + - 3.8789063 + - 2.0234375 + - -0.032958984 + - 3.9257813 + - 3.5195313 + - 1.5126953 + - -0.68847656 + - 1.3222656 + - -5.328125 + - 3.4375 + - 1.8378906 + - -2.4726563 + - -0.5859375 + - -5.9882813 + - 2.4960938 + - -1.7119141 + - 0.8515625 + - -2.0839844 + - -0.019195557 + - 3.28125 + - -4.8828125 + - -1.3984375 + - -0.5126953 + - 0.5415039 + - 1.3134766 + - 3.7304688 + - 3.6660156 + - 5.8046875 + - 2.1132813 + - 2.4023438 + - 1.6210938 + - -3.3398438 + - -3.9472656 + - -1.1796875 + - 3.84375 + - 0.10559082 + - -1.4814453 + - -0.6899414 + - 4.0078125 + - 3.6445313 + - 2.0800781 + - -1.0830078 + - -2.6660156 + - 0.17626953 + - 15.890625 + - -3.5195313 + - -0.6542969 + - 1.1113281 + - -1.2714844 + - 0.5058594 + - 0.9790039 + - 2.1953125 + - -0.5185547 + - -0.015296936 + - -4.8710938 + - 0.45214844 + - -2.0976563 + - -1.7587891 + - -2.125 + - 1.3242188 + - -4.9453125 + - 0.9404297 + - 4.203125 + - -0.4453125 + - -2.0117188 + - 0.36254883 + - -2.5371094 + - -2.7109375 + - -0.4736328 + - 2.5546875 + - -3.6171875 + - 0.15441895 + - 0.32421875 + - 2.2421875 + - -0.05859375 + - -3.4414063 + - -2.7285156 + - -1.0400391 + - -1.2080078 + - -3.3789063 + - 0.6201172 + - -1.7148438 + - 0.9399414 + - 1.8457031 + - -1.9355469 + - 3.90625 + - -4.4609375 + - -2.8554688 + - -2.0859375 + - 1.0449219 + - 1.4804688 + - -0.51953125 + - -1.2929688 + - -0.90527344 + - 0.8515625 + - 1.4267578 + - -3.1972656 + - -1.7519531 + - 2.1191406 + - -2.0507813 + - 3.3066406 + - -0.96972656 + - -1.0117188 + - 3.6445313 + - 1.2128906 + - 0.75097656 + - -1.8925781 + - -4.4296875 + - 0.74072266 + - -2.7304688 + - 0.15820313 + - 2.0390625 + - 1.1806641 + - 0.02407837 + - 0.5703125 + - 0.74072266 + - -0.08947754 + - -0.68359375 + - -1.7851563 + - 1.2402344 + - 3.0722656 + - -3.7363281 + - 3.4804688 + - 1.5947266 + - -0.026687622 + - 1.8457031 + - 0.85595703 + - -8.34375 + - -4.5585938 + - -3.8925781 + - 0.21704102 + - -1.9277344 + - -0.074035645 + - -3.1953125 + - 3.359375 + - -2.5019531 + - 2.3535156 + - 5.03125 + - 7.1015625 + - -1.28125 + - 2.2109375 + - -1.2626953 + - 4.90625 + - -2.3300781 + - -0.8876953 + - 3.109375 + - -2.2070313 + - 1.9785156 + - 0.4543457 + - 0.93359375 + - -4.9882813 + - 2.4570313 + - -3.2910156 + - 0.19396973 + - 1.6191406 + - 1.2207031 + - -0.625 + - 0.5185547 + - 0.04751587 + - -2.078125 + - 4.3671875 + - 0.640625 + - 1.1728516 + - -0.67871094 + - -2.7265625 + - 1.984375 + - 2.21875 + - 4.2890625 + - 0.5439453 + - 0.80371094 + - 0.15490723 + - 3.796875 + - -1.3603516 + - -1.71875 + - -1.0683594 + - 0.6743164 + - 2.1289063 + - 3.1289063 + - -0.6176758 + - 3.4003906 + - 0.15136719 + - -2.7050781 + - 0.34594727 + - 2.5898438 + - 0.5234375 + - 5.5625 + - 0.91015625 + - 1.4609375 + - 14.859375 + - -1.3017578 + - 1.3212891 + - -5.2421875 + - -0.5214844 + - -2.3046875 + - 1.4150391 + - -1.203125 + - 3.953125 + - -2.0097656 + - -2.6992188 + - -0.8046875 + - 0.28833008 + - 2.7597656 + - 0.049804688 + - 0.91308594 + - -5.5703125 + - 0.25390625 + - 0.22265625 + - 0.024734497 + - -0.67626953 + - 1.3320313 + - -1.0410156 + - -3.640625 + - -0.25341797 + - 1.3417969 + - -1.5166016 + - -4.3671875 + - -2.4472656 + - 0.5439453 + - -1.8212891 + - -2.5585938 + - 0.5361328 + - -1.5664063 + - -1.0214844 + - 0.5654297 + - 2.5019531 + - 0.17297363 + - 4.5625 + - 0.49658203 + - 3.0566406 + - -4.6679688 + - 3.8378906 + - 0.25195313 + - -0.8876953 + - 8.140625 + - -1.640625 + - 0.22387695 + - -0.65722656 + - -5.0351563 + - 1.9902344 + - 1.2021484 + - -1.2587891 + - 4.3320313 + - 4.015625 + - -2.5078125 + - 0.609375 + - -3.09375 + - 0.4572754 + - -0.23364258 + - 0.1171875 + - 0.32739258 + - -0.19165039 + - -0.090148926 + - -1.8798828 + - 1.4228516 + - 2.6015625 + - -6.5703125 + - 2.609375 + - 1.6796875 + - 0.5102539 + - -0.8652344 + - 5.8476563 + - 1.5175781 + - 2.625 + - -0.23364258 + - -3.2832031 + - -1.5703125 + - 2.1601563 + - 2.2910156 + - 1.8681641 + - -0.49804688 + - 3.2441406 + - -0.22753906 + - -1.3798828 + - -0.14465332 + - -2.7597656 + - 2.3730469 + - -1.8300781 + - 1.2392578 + - -3.3203125 + - -2.5234375 + - 1.4462891 + - 2.6601563 + - -4.4882813 + - 2.1523438 + - -3.96875 + - 4.1875 + - 1.296875 + - -0.87109375 + - 4.6132813 + - -2.2578125 + - -2.4394531 + - 4.5039063 + - 1.5625 + - 4.5234375 + - 1.3134766 + - 0.890625 + - 0.9296875 + - 3.125 + - 35.3125 + - 14.140625 + - -9.8046875 + - 0.80566406 + - 0.46679688 + - 0.2388916 + - -1.8359375 + - -3.5703125 + - 1.5048828 + - 1.1679688 + - 1.9238281 + - -1.9316406 + - 0.390625 + - 1.7314453 + - -5.75 + - 0.51953125 + - -0.0259552 + - 0.54003906 + - -3.21875 + - 2.3359375 + - 0.29492188 + - 1.3408203 + - -1.4785156 + - -0.18762207 + - -0.43286133 + - -0.8017578 + - 1.234375 + - -0.73095703 + - -7.3320313 + - 1.9111328 + - 0.08721924 + - -0.56152344 + - 0.66552734 + - 1.2216797 + - 1.6660156 + - -3.3242188 + - 0.15881348 + - 5.359375 + - -1.8066406 + - 0.46606445 + - 1.8408203 + - 1.3925781 + - -1.0996094 + - 6.0195313 + - -1.1767578 + - 0.33618164 + - -1.9609375 + - 0.6040039 + - 1.3525391 + - 0.8286133 + - 2.8378906 + - 4.71875 + - -0.98339844 + - 0.24768066 + - 2.6523438 + - 1.0644531 + - -0.2685547 + - 0.8671875 + - -0.013015747 + - -2.2851563 + - 2.7597656 + - 4.7695313 + - 1.984375 + - -1.7236328 + - -0.20532227 + - -1.1162109 + - 2.0976563 + - -0.56933594 + - -6.0820313 + - 0.03515625 + - -1.5283203 + - -0.24816895 + - -2.9453125 + - -1.2636719 + - -0.31640625 + - -0.9946289 + - -0.3227539 + - -0.3232422 + - 5.5195313 + - 1.3876953 + - -1.6103516 + - 1.1777344 + - 0.8798828 + - 3.0117188 + - 1.7539063 + - 3.1132813 + - 0.38916016 + - 1.0009766 + - -0.27954102 + - -0.52734375 + - -1.2441406 + - 1.7978516 + - -0.52734375 + - -1.4316406 + - 4.7734375 + - 1.0517578 + - -0.8417969 + - 0.37353516 + - -1.390625 + - 0.013504028 + - -1.3125 + - -1.3105469 + - 0.3564453 + - 2.1289063 + - -0.7817383 + - 2.1816406 + - 0.61816406 + - -1.8378906 + - 2.3085938 + - 2.7304688 + - -2.4121094 + - 3.546875 + - -1.6015625 + - 5.25 + - 1.9033203 + - 1.71875 + - -3.9765625 + - -1.1386719 + - 2.6113281 + - 0.66503906 + - -3.75 + - -1.7431641 + - -0.765625 + - 2.6972656 + - 3.9335938 + - 2.4726563 + - -4.3320313 + - 2.8984375 + - -1.078125 + - -0.80126953 + - -0.14318848 + - -2.6601563 + - -0.91064453 + - 1.7587891 + - 2.2011719 + - -0.89697266 + - -1.9863281 + - -1.7695313 + - 2.6445313 + - -0.3449707 + - -0.8852539 + - 2.5625 + - 3.5722656 + - -1.4150391 + - 0.81152344 + - -0.9423828 + - 1.53125 + - -3.6367188 + - -4.6640625 + - -4.0390625 + - -1.5390625 + - -0.7294922 + - -2.1933594 + - 1.3330078 + - -0.35986328 + - 0.27075195 + - -1.8251953 + - -1.9804688 + - -1.609375 + - 2.4960938 + - -0.062408447 + - -2.3222656 + - 2.921875 + - 2.0546875 + - -3.0273438 + - 0.9316406 + - 0.48950195 + - 1.6035156 + - -0.19384766 + - -4.3203125 + - 0.21594238 + - 0.65722656 + - -2.4511719 + - -2.4238281 + - 9.5078125 + - 0.79296875 + - 3.9570313 + - 1.9072266 + - -2.578125 + - -2.5 + - 2.2050781 + - -1.2763672 + - -0.19104004 + - 1.3164063 + - 1.421875 + - 1.8671875 + - 0.62402344 + - 1.4189453 + - 2.0761719 + - -4.0859375 + - 1.6621094 + - 4.0234375 + - 0.7451172 + - 1.3007813 + - -1.7988281 + - -2.0234375 + - 0.93603516 + - 1.6611328 + - 1.7460938 + - -3.5039063 + - -1.8339844 + - 0.15356445 + - 1.8222656 + - -0.3371582 + - -1.3486328 + - -6.3789063 + - 0.18481445 + - -0.3762207 + - -1.1855469 + - -2.1796875 + - 1.3945313 + - -1.2001953 + - 0.9951172 + - 0.8515625 + - -1.3046875 + - 1.8066406 + - -4.6328125 + - -3.4648438 + - 2.0019531 + - -0.92089844 + - 1.7695313 + - 0.84228516 + - -2.453125 + - 0.89746094 + - 3.015625 + - 2.4082031 + - 3.3359375 + - 2.0429688 + - 3.359375 + - 0.98828125 + - -0.5395508 + - 0.7734375 + - -0.69921875 + - -0.022125244 + - -1.6035156 + - -0.92089844 + - -3.9453125 + - 3.2265625 + - 2.0742188 + - -1.7558594 + - 1.2539063 + - -1.7109375 + - -8.46875 + - 1 + - -0.0859375 + - -0.49853516 + - -0.5776367 + - 5.2109375 + - 0.15356445 + - -1.2011719 + - 0.51464844 + - 2.9941406 + - 3.5019531 + - 2.7988281 + - 1.4394531 + - -3.5 + - 3.3242188 + - 2.9238281 + - -3.0585938 + - 0.61035156 + - -2.3632813 + - -0.014320374 + - -3.9335938 + - -0.12188721 + - -3.6894531 + - -3.5351563 + - -3.5097656 + - 0.7763672 + - -3.6132813 + - -0.8251953 + - 4.8164063 + - -2.1816406 + - 0.08496094 + - -1.7275391 + - -2.546875 + - 1.9179688 + - -0.07159424 + - 0.5600586 + - 0.26953125 + - 0.8930664 + - 1.5214844 + - -0.3852539 + - 0.3918457 + - 1.9765625 + - -1.1972656 + - 10.28125 + - 0.10675049 + - 1.5996094 + - -5.140625 + - 1.5917969 + - 1.3613281 + - -1.1572266 + - -2.6503906 + - -0.92041016 + - 0.5595703 + - 5.9570313 + - 2.8691406 + - -0.47265625 + - -0.8173828 + - 2.4121094 + - -0.7080078 + - -1.546875 + - -1.1708984 + - 3.6347656 + - -2.0546875 + - 2.40625 + - -1.9707031 + - 3.3222656 + - -0.9892578 + - -2.9726563 + - 0.78759766 + - -3.1445313 + - 2.5390625 + - -0.1640625 + - -4.8203125 + - -1.359375 + - -2.4140625 + - 2.3359375 + - 1.0957031 + - 1.09375 + - 3.4804688 + - 0.09698486 + - 2.84375 + - -1.0722656 + - -2.6835938 + - -2.4023438 + - 0.3305664 + - -4.7421875 + - 7.9765625 + - 1.1757813 + - 2.3632813 + - 0.9433594 + - 0.9375 + - -2.1933594 + - 0.8671875 + - -0.35546875 + - -1.7910156 + - -4.7421875 + - -1.6884766 + - 2.75 + - -1.2597656 + - 1.5048828 + - -0.9902344 + - -3.4726563 + - 2.3359375 + - 1.4394531 + - -3.65625 + - 0.037109375 + - 1.6533203 + - 1.5869141 + - -3.453125 + - 1.9628906 + - -3.1289063 + - 0.921875 + - 1.0673828 + - 0.7294922 + - -2.640625 + - 1.59375 + - -3.2617188 + - -0.11260986 + - -0.56640625 + - -2.5410156 + - -1.296875 + - 2.8691406 + - 1.8642578 + - 0.81640625 + - 2.1640625 + - 1.4238281 + - 1.0595703 + - 2.5351563 + - 1.7939453 + - -0.1899414 + - -0.11529541 + - -0.007648468 + - -1.6503906 + - 2.78125 + - -2.3671875 + - -2.2753906 + - 1.2001953 + - 6.1796875 + - -0.62939453 + - -0.3984375 + - 0.7734375 + - 1.0205078 + - -1.7363281 + - -1.2089844 + - -0.32470703 + - 1.5488281 + - 1.8359375 + - -0.09472656 + - 3.4472656 + - -1.796875 + - -0.21679688 + - -1.1171875 + - 4.1171875 + - -4.84375 + - -1.0039063 + - 1.3798828 + - 2.1679688 + - 5.96875 + - -0.007160187 + - -0.7524414 + - 1.1494141 + - -1.4423828 + - 1.3359375 + - -1.6533203 + - -1.8291016 + - -2.3164063 + - 2.4257813 + - -3.3164063 + - 0.5654297 + - -0.17504883 + - -3.1523438 + - 3.0625 + - -1.0107422 + - 0.78759766 + - -2.0078125 + - 0.5644531 + - -3.609375 + - -3.875 + - -0.26171875 + - 4.7421875 + - -2.390625 + - 0.8071289 + - 2.5175781 + - 2.7539063 + - -0.8203125 + - -0.49731445 + - 0.005531311 + - -2.4589844 + - -0.3383789 + - 0.4633789 + - -1.3798828 + - -2.9238281 + - -1.0244141 + - -0.5551758 + - 1.4628906 + - 1.6816406 + - -7.8007813 + - -4.0703125 + - 18.453125 + - -1.7832031 + - -2.6523438 + - 0.90478516 + - 1.1425781 + - 1.1152344 + - 2.2109375 + - 2.9648438 + - 0.5527344 + - -0.3161621 + - 1.8134766 + - 0.8046875 + - 0.30908203 + - -3.5117188 + - 0.13476563 + - -3.0253906 + - -2.6484375 + - -1.6220703 + - 4.3789063 + - -0.81689453 + - -2.5 + - -3.0664063 + - -4.0078125 + - 0.69140625 + - -0.9267578 + - 3.2617188 + - 1.1308594 + - 0.01399231 + - 1.7246094 + - 0.4326172 + - 2.9375 + - -0.28857422 + - 6.5820313 + - 3.9335938 + - 0.7285156 + - -0.53808594 + - 0.20117188 + - 2.3007813 + - 4.6914063 + - -1.5195313 + - -0.71484375 + - 0.98046875 + - 1.3720703 + - -2.484375 + - 2.3574219 + - -2.6015625 + - 1.2705078 + - 2.6816406 + - 0.4543457 + - 0.53222656 + - 0.7138672 + - 0.2709961 + - -1.7832031 + - -1.7080078 + - 0.13085938 + - -4.7617188 + - -0.35498047 + - -1.5439453 + - 2.1484375 + - -3.4003906 + - -3.0546875 + - 0.06964111 + - -0.3400879 + - 3.3007813 + - -2.4648438 + - 0.42578125 + - 2.4003906 + - 3.015625 + - -2.0273438 + - 3.03125 + - -4.875 + - -3.0742188 + - 0.037750244 + - -1.5507813 + - 2.0078125 + - 8.1796875 + - 0.9716797 + - 4.4101563 + - -6.3320313 + - 0.41015625 + - -1.1025391 + - 3.03125 + - 0.037109375 + - -0.12988281 + - 0.2265625 + - -5.8671875 + - -0.8408203 + - -0.2854004 + - 2.4570313 + - -1.3232422 + - -1.3886719 + - 1.3066406 + - -2.6894531 + - -2.40625 + - -3.0625 + - 2.8867188 + - 3.0722656 + - -1.0683594 + - 5.109375 + - -3.4726563 + - -1.0136719 + - 0.5371094 + - 0.97265625 + - 2.5136719 + - 1.265625 + - 0.55908203 + - -0.33984375 + - -0.796875 + - 0.83691406 + - 0.42236328 + - 5.5390625 + - 1.5234375 + - 1.609375 + - 1.1035156 + - 3.9726563 + - 0.56689453 + - 0.7675781 + - 0.8461914 + - 1.125 + - -0.07092285 + - 2.8300781 + - 0.44262695 + - 4.7226563 + - -1.2949219 + - -1.296875 + - -3.4394531 + - 0.82910156 + - -0.0390625 + - -0.35302734 + - -0.41064453 + - 2 + - -0.5859375 + - -5.6640625 + - -0.95166016 + - 0.6816406 + - 2.5839844 + - 2.2539063 + - 1.7753906 + - -0.2446289 + - 3.1757813 + - 2.1015625 + - 2.6113281 + - 0.2355957 + - 2.0449219 + - 2.7207031 + - -2.1035156 + - -7.1914063 + - -2.6035156 + - 1.9921875 + - -3.4628906 + - -1.4902344 + - -0.55566406 + - 2.8378906 + - 3.9375 + - 3.6445313 + - -0.11584473 + - 0.31054688 + - 1.0019531 + - -0.61328125 + - -0.2763672 + - 3.5175781 + - 3.4804688 + - -3.5957031 + - 0.012039185 + - -0.38110352 + - 3.6601563 + - 0.25683594 + - -0.40551758 + - -0.64160156 + - 0.25732422 + - 0.79003906 + - -0.89697266 + - -2.1835938 + - -1.0742188 + - -1.6757813 + - -1.7851563 + - -2.0585938 + - 2.5898438 + - -1.0957031 + - 0.6035156 + - 2.265625 + - -3.1445313 + - -0.5493164 + - 1.2929688 + - -1.7363281 + - -2.3945313 + - -1.0546875 + - -2.1835938 + - 3.8320313 + - 3.1191406 + - 2.3144531 + - -6.7578125 + - -1.0976563 + - 0.35668945 + - -5.2851563 + - 1.7636719 + - -2.6367188 + - 0.97509766 + - 0.6538086 + - -8.5703125 + - 1 + - 0.4169922 + - 0.2602539 + - -2.1210938 + - -1.5859375 + - -1.46875 + - 0.5834961 + - 0.28320313 + - -0.33911133 + - -25.625 + - -1.5126953 + - -5.8125 + - 2.9765625 + - 0.24145508 + - 2.3144531 + - 3.0878906 + - -3.5878906 + - -5.1640625 + - 0.020828247 + - 0.49243164 + - -1.0859375 + - -1.9501953 + - 5.7734375 + - -0.13366699 + - 5.1953125 + - 0.08850098 + - 4.9921875 + - -0.98339844 + - 1.5410156 + - -0.08721924 + - -0.72509766 + - 1.2910156 + - 3.8125 + - -1.3193359 + - -3.4960938 + - -0.44189453 + - -0.16748047 + - 3.4414063 + - -0.5678711 + - 0.37939453 + - -0.43286133 + - 2.3046875 + - 0.40356445 + - -6.2226563 + - 4.4296875 + - -2.4609375 + - -1.8955078 + - -4.2421875 + - -1.4931641 + - -0.85791016 + - 1.5517578 + - 2.6621094 + - -0.15686035 + - -3.5273438 + - 3.125 + - 2.96875 + - -1.0556641 + - 0.40283203 + - -5.1601563 + - 3.0507813 + - -0.55029297 + - -2.0722656 + - -3.703125 + - 1.7236328 + - 3.7421875 + - -1.4472656 + - 2.5976563 + - 1.6269531 + - 0.29492188 + - 0.12524414 + - -2.1269531 + - 1.8564453 + - -1.2783203 + - 0.90527344 + - 0.0960083 + - 0.92041016 + - -3.8691406 + - 2.2910156 + - -1.1074219 + - -2.6953125 + - 1.5048828 + - 1.3212891 + - 1.3105469 + - -0.69921875 + - 1.109375 + - -0.84765625 + - -2.1894531 + - 1.7773438 + - 0.46289063 + - 1.0683594 + - 1.5205078 + - 0.45947266 + - 0.6953125 + - 2.515625 + - 1.7626953 + - -0.017410278 + - 0.37109375 + - 2.5585938 + - 0.52685547 + - -0.4777832 + - 2.1425781 + - -0.33813477 + - 6.3203125 + - -0.26220703 + - 2.9394531 + - -0.91015625 + - 0.6923828 + - 1.2431641 + - -0.40356445 + - 1.5996094 + - -1.4775391 + - 3.7519531 + - -1.3554688 + - 1.9160156 + - -1.5986328 + - -3.5078125 + - 5.140625 + - -1.1523438 + - 5.8007813 + - -1.2900391 + - 7.9765625 + - -1.7509766 + - 0.32861328 + - -2.2382813 + - 0.93652344 + - -0.7392578 + - 2.2539063 + - -1.0869141 + - -0.8466797 + - 2.7597656 + - 1.7753906 + - 4.6328125 + - -0.29882813 + - -0.6533203 + - 0.57910156 + - -0.515625 + - -3.8828125 + - -1.7470703 + - 0.18225098 + - -3.9160156 + - -1.1816406 + - 2.4863281 + - 3.9570313 + - -0.8852539 + - -2.1601563 + - -28.90625 + - 0.2919922 + - 2.2734375 + - -0.76660156 + - 0.6015625 + - 3.8164063 + - -0.01789856 + - 1.8408203 + - 1.7519531 + - 2.5898438 + - -0.31176758 + - -0.4230957 + - -1.1376953 + - -0.7158203 + - -2.2890625 + - -0.734375 + - 0.34375 + - 1.4375 + - 1.8173828 + - -2.7070313 + - 2.7675781 + - 8.484375 + - 3.6015625 + - -2.203125 + - 0.8564453 + - 0.796875 + - -0.41333008 + - 0.9296875 + - 1.9941406 + - -3.4882813 + - 0.7446289 + - 0.020996094 + - -0.27001953 + - -0.5830078 + - 2.6367188 + - -3.4160156 + - -3.4082031 + - -0.86816406 + - -0.6953125 + - -1.28125 + - 5.4765625 + - 0.37890625 + - -0.4609375 + - 3.0097656 + - -2.2636719 + - 3.6289063 + - 0.0012741089 + - 3.1953125 + - 1.0205078 + - -2.0507813 + - -0.6533203 + - 4.0703125 + - -0.9589844 + - 2.4824219 + - 1.3720703 + - 0.19848633 + - -1.6601563 + - 2.2304688 + - -0.88378906 + - -3.2988281 + - 1.7441406 + - -1.4970703 + - -0.6040039 + - -2.4921875 + - -4.8007813 + - 0.8598633 + - -4.3984375 + - 1.9423828 + - 4.296875 + - -8.7109375 + - 1.3457031 + - -0.068359375 + - -1.9345703 + - -4.8671875 + - 3.1914063 + - 1.0673828 + - -1.9160156 + - 2.15625 + - -1.0566406 + - 2.7050781 + - 1.0644531 + - 0.044921875 + - 1.9609375 + - 0.53759766 + - 1.7822266 + - -1.8515625 + - -0.28759766 + - -1.8173828 + - -0.82910156 + - 0.34765625 + - -2.0625 + - -1.6425781 + - 0.8466797 + - 0.7636719 + - 3.6132813 + - 2.0976563 + - 0.7114258 + - -0.21289063 + - 2.4335938 + - 0.03579712 + - 3.9882813 + - -0.88671875 + - -4.7070313 + - -1.7285156 + - 1.5078125 + - 0.094055176 + - -0.012367249 + - 3.2851563 + - 4.1523438 + - 1.1933594 + - -1.453125 + - 3.5820313 + - 0.89697266 + - 2.5136719 + - -2.203125 + - 0.107421875 + - 1.2734375 + - 4.0390625 + - -0.3244629 + - -0.6425781 + - 3.8125 + - -3.5703125 + - -4.6640625 + - -0.10461426 + - 0.107055664 + - -3.3007813 + - -4.375 + - 1.1699219 + - -0.87597656 + - 2.4726563 + - 3.265625 + - 0.8408203 + - 2.9882813 + - -0.35546875 + - 1.6015625 + - -1.0097656 + - -2.5429688 + - 0.014320374 + - 0.7524414 + - -1.5390625 + - 1.0507813 + - 3.59375 + - -0.16918945 + - 0.25976563 + - 2.7695313 + - 0.48168945 + - 3.7539063 + - -2.1289063 + - -1.890625 + - 0.53808594 + - 3.9726563 + - 4.609375 + - -0.17053223 + - 3.21875 + - -1.828125 + - 1.2353516 + - -2.8007813 + - 0.14550781 + - 0.9404297 + - 0.9580078 + - -0.76660156 + - 2.3359375 + - 2.0234375 + - 3.0253906 + - 2.5703125 + - -3.4179688 + - 4.515625 + - -3.578125 + - 1.1767578 + - -0.31396484 + - -0.3088379 + - -1.5947266 + - 0.2421875 + - -0.4482422 + - -3.765625 + - 0.39746094 + - 2.2148438 + - -0.29541016 + - -0.5517578 + - 2.65625 + - 0.48657227 + - -0.29711914 + - -2.671875 + - 1.4628906 + - 1.0449219 + - 4.421875 + - -1.2089844 + - 2.4667969 + - -3.2109375 + - -0.8457031 + - -0.15783691 + - -0.5551758 + - -0.73291016 + - 5.1835938 + - 0.078125 + - -1.5830078 + - -0.33081055 + - 0.07092285 + - -1.8925781 + - 0.57128906 + - 0.515625 + - -1.1679688 + - -1.2685547 + - -3.4785156 + - -0.05206299 + - -0.38623047 + - -0.98828125 + - -0.30981445 + - 0.98535156 + - -2.3984375 + - -1.1425781 + - -7.2890625 + - -4.9921875 + - 3.40625 + - -2.6191406 + - -1.9726563 + - 1.875 + - -0.65283203 + - 3.1640625 + - -3.1445313 + - -2.3847656 + - -5.6875 + - -1.5703125 + - -4.234375 + - 1.3476563 + - -0.11682129 + - 1.765625 + - 1.984375 + - -2.078125 + - 1.0410156 + - -1.4189453 + - -2.9609375 + - 0.45947266 + - -0.41918945 + - -1.3798828 + - 2.2890625 + - -0.97265625 + - 0.35766602 + - 4.2890625 + - -1.2666016 + - 4.546875 +- - 3.2363281 + - -1.1582031 + - 1.0810547 + - -2.0292969 + - 1.609375 + - -1.0048828 + - 0.43676758 + - -0.8769531 + - 0.79785156 + - -0.27612305 + - 0.4963379 + - -0.82128906 + - 0.16906738 + - -0.734375 + - -0.34936523 + - 0.03515625 + - 0.34375 + - 1.3769531 + - 1.5234375 + - -1.875 + - -1.4082031 + - 1.6289063 + - -1.1650391 + - 0.65234375 + - 1.796875 + - 1.984375 + - -0.4350586 + - 1.4003906 + - -0.34985352 + - -2.5253906 + - 2.5351563 + - 0.32348633 + - 2.3007813 + - 1.5195313 + - -0.28295898 + - 1.1650391 + - -3.4472656 + - 0.07421875 + - -5.28125 + - -0.8310547 + - 0.7524414 + - -2.4257813 + - -0.91845703 + - -0.9814453 + - -1.7285156 + - 2.0761719 + - 0.23657227 + - -3.9003906 + - -1.4052734 + - 0.8310547 + - 3.9140625 + - -0.43408203 + - -3.0429688 + - -100.5625 + - -3.0703125 + - -0.93652344 + - 2.71875 + - -1.0527344 + - -1.3789063 + - -7.3671875 + - -2.3789063 + - 0.58251953 + - 0.8388672 + - 0.13110352 + - 2.4003906 + - 0.07421875 + - -2.5488281 + - 0.5126953 + - 2.0644531 + - -1.5556641 + - -4.6679688 + - 0.055236816 + - -2.9921875 + - -0.9038086 + - -1.2294922 + - -0.3984375 + - 2.9863281 + - 3.1328125 + - -0.13867188 + - -0.36523438 + - -0.63916016 + - -0.6064453 + - -1.5869141 + - -0.3425293 + - -2.0234375 + - 0.5336914 + - -1.8027344 + - -0.15185547 + - 2.2578125 + - 0.86376953 + - -1.234375 + - 5.9453125 + - 2.7089844 + - -19.703125 + - -2.8125 + - -2.7832031 + - -4.4375 + - 0.35595703 + - 1.5751953 + - -4.09375 + - 1.6884766 + - -1.3564453 + - -3.8652344 + - -0.61035156 + - 0.0055770874 + - -2.7949219 + - 0.08062744 + - -1.3369141 + - -1.5839844 + - -0.056915283 + - 0.04058838 + - 0.4296875 + - 0.47753906 + - -1.5585938 + - -0.055511475 + - 3.03125 + - 2.8515625 + - 0.70947266 + - -0.18884277 + - 0.29467773 + - 2.2421875 + - 0.59472656 + - 0.15393066 + - -2.4863281 + - -2.1992188 + - -0.27172852 + - 2.40625 + - -0.73095703 + - 0.32299805 + - 1.59375 + - 2.3808594 + - 0.17297363 + - -3.2519531 + - 1.1630859 + - 1.234375 + - 2.40625 + - -0.3088379 + - 0.78564453 + - -1.2050781 + - -1.4824219 + - 1.5166016 + - -0.4206543 + - 1.3535156 + - -2.7734375 + - 1.1757813 + - -2.8027344 + - -1.7998047 + - -0.9379883 + - -2.5703125 + - 4.5820313 + - 0.78564453 + - -1.9257813 + - -1.0478516 + - 0.03515625 + - 0.5151367 + - -2.7832031 + - 0.90722656 + - -0.5102539 + - -3.0390625 + - -3.1289063 + - -1.2509766 + - -2.6191406 + - -0.5546875 + - -1.1376953 + - 0.51416016 + - 1.3994141 + - 3.3613281 + - -1.1591797 + - -0.7583008 + - -0.46289063 + - -2.6386719 + - -1.9306641 + - -0.43896484 + - -2.9863281 + - -0.09875488 + - 0.25195313 + - -1.3115234 + - 2.09375 + - -4.265625 + - -2.2519531 + - 1.7910156 + - 0.8022461 + - -1.8603516 + - -1.8544922 + - 0.13891602 + - 5.1054688 + - -3.4863281 + - -0.85253906 + - -1.1806641 + - 0.07336426 + - -1.9082031 + - -3.7753906 + - -0.5541992 + - 0.640625 + - -2.2460938 + - 1.4951172 + - 3.6328125 + - -2.1640625 + - -1.4921875 + - 0.13476563 + - 0.44189453 + - -2.359375 + - 1.9189453 + - 0.7114258 + - 7.9375 + - 3.2929688 + - 4.2617188 + - -2.8378906 + - -0.3474121 + - -2.2304688 + - -2.0644531 + - -0.7504883 + - -2.9101563 + - -0.859375 + - 0.8330078 + - 3.9570313 + - -0.0036258698 + - -2.5214844 + - 3.0898438 + - -0.70458984 + - -3.8535156 + - 0.6298828 + - -0.32739258 + - 3.1289063 + - -0.08618164 + - -1.21875 + - 0.09649658 + - 0.7675781 + - 0.39672852 + - -3.1464844 + - 0.7763672 + - -0.7680664 + - -1.0068359 + - -0.88671875 + - -0.2064209 + - 1.5820313 + - 0.7441406 + - 2.3671875 + - 2.8554688 + - 1.6601563 + - 6.0390625 + - -0.35351563 + - -3.4589844 + - 0.23046875 + - -2.2324219 + - -1.7626953 + - 3.2714844 + - 2.5566406 + - -0.61572266 + - 0.20751953 + - 1.2539063 + - 0.4423828 + - -2.1269531 + - 0.5131836 + - 0.62353516 + - -0.6958008 + - -0.33032227 + - -2.28125 + - 0.032348633 + - 0.3408203 + - 1.4726563 + - 1.8486328 + - 1.890625 + - 1.8886719 + - -0.37426758 + - 2.4140625 + - -2.3027344 + - 3.9121094 + - 0.85546875 + - -4.6953125 + - 0.32983398 + - 0.8154297 + - 3.2304688 + - 0.8305664 + - -0.42773438 + - -1.1630859 + - -3.9277344 + - 1.3681641 + - 0.18469238 + - 1.0292969 + - -2.1328125 + - -2.6738281 + - 1.3876953 + - 0.1361084 + - 0.99902344 + - -0.77783203 + - -0.064697266 + - 1.828125 + - 0.65771484 + - 0.03390503 + - 1.7265625 + - 1.2138672 + - 10.0703125 + - 0.064697266 + - 0.6723633 + - -0.4819336 + - 1.8457031 + - -1.4023438 + - 2.2148438 + - -0.5493164 + - -0.07574463 + - -0.20422363 + - 2.7597656 + - 3.3242188 + - -1.6425781 + - 1.5322266 + - 2.4785156 + - 1.4394531 + - -0.09094238 + - -1.203125 + - -1.6650391 + - -0.10546875 + - -0.8964844 + - 0.072509766 + - 1.1875 + - -2.4375 + - 0.08258057 + - -0.14453125 + - -3.1816406 + - 1.2851563 + - 1.8339844 + - 1.2412109 + - -3.8457031 + - 2.5703125 + - -1.4052734 + - -0.78564453 + - -1.3427734 + - -1.5039063 + - 2.3652344 + - -3.5820313 + - -4.078125 + - 1.7050781 + - 1.5644531 + - 0.7709961 + - 2.34375 + - -0.11657715 + - 2.7832031 + - -0.49926758 + - 0.08984375 + - 0.105285645 + - 2.7597656 + - -0.4482422 + - 2.1015625 + - 1.5488281 + - 1.9433594 + - 1.1533203 + - -0.21252441 + - 2.6777344 + - -5.0664063 + - -0.8847656 + - 2.1464844 + - -1.265625 + - 0.3330078 + - 0.5102539 + - -2.1738281 + - -0.7841797 + - -4.1015625 + - -1.609375 + - -1.6220703 + - -1.4111328 + - -1.4921875 + - 1.7324219 + - 4.359375 + - -1.3857422 + - 2.9726563 + - -2.90625 + - 6.1757813 + - 1.6982422 + - 1.4638672 + - -2.6894531 + - 0.7714844 + - -1.5244141 + - -2.125 + - 3.5058594 + - -0.3996582 + - 3.5996094 + - -1.4482422 + - 0.3935547 + - 0.7109375 + - 2.4746094 + - -1.3896484 + - -1.2880859 + - -1.9433594 + - -0.859375 + - -0.703125 + - 1.8554688 + - 1.8632813 + - -4.2226563 + - -8.125 + - -2.1074219 + - 0.453125 + - -0.09375 + - -2.6660156 + - -0.95751953 + - 0.047698975 + - -0.29663086 + - 2.6464844 + - 2.1074219 + - -2.1464844 + - 1.5498047 + - -2.3339844 + - 1.5898438 + - -0.5654297 + - -4.3476563 + - -0.1673584 + - 1.7988281 + - 2.0488281 + - -2.1660156 + - -14.390625 + - -0.12243652 + - -2.2089844 + - -1.6064453 + - 3.1171875 + - -1.1591797 + - 1.4433594 + - -0.19689941 + - -3.6835938 + - -1.4238281 + - -3.6152344 + - 5.109375 + - -0.5004883 + - -0.4736328 + - 2.7988281 + - -0.32592773 + - -0.75927734 + - 1.0458984 + - 0.1619873 + - -2.0371094 + - 2.2246094 + - -1.4375 + - -1.921875 + - -1.7138672 + - -3.8613281 + - 0.85009766 + - -0.37939453 + - -1.8525391 + - 0.5839844 + - -1.9013672 + - 0.7519531 + - 1.6748047 + - -1.3095703 + - -1.5087891 + - -0.6269531 + - -1.6445313 + - -2.2011719 + - -0.9091797 + - 0.06640625 + - 2.7050781 + - -2.1679688 + - -3.5800781 + - -0.009483337 + - 1.5244141 + - -0.58935547 + - -2.0390625 + - -0.47583008 + - 5.609375 + - 4.625 + - -0.033477783 + - 0.07110596 + - 3.2851563 + - -0.44482422 + - -2.8945313 + - -1.7675781 + - 2.7714844 + - -0.9301758 + - -0.84521484 + - -0.9785156 + - 0.27197266 + - 0.33666992 + - -2.3515625 + - 4.9375 + - 2.3125 + - 0.29882813 + - 1.015625 + - 0.35131836 + - 0.43896484 + - 0.8076172 + - -0.91064453 + - -0.6064453 + - 3.8203125 + - 0.5683594 + - 0.55908203 + - 0.9736328 + - -1.9970703 + - -0.3269043 + - 1.2158203 + - -6.0039063 + - 0.13977051 + - 3.71875 + - -0.5605469 + - 0.46313477 + - 1.5683594 + - -0.7011719 + - -0.46362305 + - -2.6328125 + - -1.3330078 + - 2.4570313 + - -2.0488281 + - -2.9238281 + - 5.375 + - 0.21679688 + - -5.9726563 + - 2.0390625 + - 0.055786133 + - 1.3359375 + - 3.8378906 + - -0.6225586 + - -0.6113281 + - -1.5830078 + - 2.8535156 + - 3.6679688 + - -2.5703125 + - -1.5019531 + - 0.69091797 + - -2.0332031 + - 1.6210938 + - -0.3408203 + - -0.5522461 + - -1.4355469 + - -0.5078125 + - 0.5957031 + - 1.5869141 + - 3.6757813 + - -0.018692017 + - 0.55566406 + - 1.4609375 + - 0.20336914 + - -1.3769531 + - 1.6767578 + - 2.1894531 + - 0.85253906 + - 0.4519043 + - -0.00390625 + - -1.8789063 + - 3.5800781 + - 0.16516113 + - -4.5117188 + - -0.12890625 + - -0.3557129 + - -1.6269531 + - -1.9589844 + - -1.0107422 + - 3.1054688 + - -0.8457031 + - -4.8476563 + - -2.3652344 + - -1.3818359 + - 0.20703125 + - 1.9863281 + - 1.4814453 + - 0.6333008 + - 1.9667969 + - -17.671875 + - -1.453125 + - -1.0478516 + - -2.0019531 + - -1.3818359 + - 0.61279297 + - 0.20227051 + - 0.0055770874 + - 2.3476563 + - -3.4804688 + - -1.0546875 + - -2.2363281 + - 1.2685547 + - -1.0302734 + - 0.87597656 + - -2.4453125 + - -1.4394531 + - -2.3496094 + - -2.2890625 + - -0.8925781 + - -1.9296875 + - 0.9921875 + - 0.2939453 + - -1.2851563 + - 1.1201172 + - 0.578125 + - 0.30908203 + - 0.7246094 + - -3.2089844 + - 0.65478516 + - 2.5683594 + - -3.2148438 + - -2.9394531 + - 1.6816406 + - 1.6416016 + - -2.3417969 + - -3.5 + - -1.1904297 + - 1.4462891 + - -3.1875 + - -1.890625 + - -0.1015625 + - -1.9082031 + - 1.4306641 + - 5.1757813 + - 3.9101563 + - 1.0263672 + - 3.2402344 + - -0.8222656 + - -0.68603516 + - 0.055786133 + - -2.2578125 + - -2.3261719 + - 0.15234375 + - -3.6972656 + - 0.5625 + - -4.3789063 + - 0.9506836 + - 2.5957031 + - -1.7587891 + - -1.9824219 + - 1.9609375 + - -0.60595703 + - -0.2524414 + - -1.5576172 + - 1.8701172 + - -2.1386719 + - 0.00390625 + - 1.4619141 + - 1.8613281 + - 0.00027894974 + - 0.44140625 + - -1.6054688 + - 3.4902344 + - 0.036834717 + - 1.4169922 + - 0.7788086 + - -0.12384033 + - 1.7070313 + - -0.52197266 + - -3.2265625 + - -2.6875 + - 0.61572266 + - 2.6113281 + - -2.8164063 + - -0.83251953 + - -0.25439453 + - 0.037384033 + - -2.2226563 + - -2.5703125 + - -0.08013916 + - 2.7851563 + - 4.390625 + - -1.0810547 + - 0.59375 + - -4.6757813 + - 7.9140625 + - -3.1503906 + - 0.73339844 + - 3.3554688 + - -1.6220703 + - -2.59375 + - 0.984375 + - -1.6298828 + - -0.5546875 + - 2.6933594 + - 3.8125 + - -0.45922852 + - 1.4638672 + - 1.0556641 + - 1.6621094 + - 3.1113281 + - -0.55126953 + - 2.4003906 + - 1.8222656 + - -2.0507813 + - 0.22314453 + - 0.98535156 + - -0.5253906 + - -1.0029297 + - 0.6152344 + - 0.6113281 + - -0.71191406 + - -2.9492188 + - -0.19580078 + - -0.98828125 + - -0.1899414 + - 0.044067383 + - 1.5214844 + - 1.734375 + - 1.0146484 + - -1.4179688 + - 7.7578125 + - 3.3652344 + - 7.0976563 + - 1.4726563 + - -5.7226563 + - -5.890625 + - -0.3828125 + - -1.3154297 + - -0.31958008 + - -1.5888672 + - 0.1907959 + - -0.23181152 + - -1.046875 + - 1.6132813 + - -1.9482422 + - 2.6699219 + - 3.2246094 + - 3.6679688 + - -0.9091797 + - -2.5136719 + - 0.5102539 + - 24.09375 + - 1.2988281 + - 0.88183594 + - 0.09313965 + - -3.0195313 + - 1.8251953 + - 0.71484375 + - 0.77197266 + - -2.15625 + - 1.1113281 + - 3 + - 2.96875 + - -0.28686523 + - -0.0496521 + - 0.5957031 + - 4.7929688 + - 1.4414063 + - 3.0625 + - -5.0664063 + - -0.17687988 + - -1.8623047 + - -1.8876953 + - -3.6367188 + - 0.9038086 + - -0.4519043 + - 1.453125 + - -0.27124023 + - -1.8652344 + - 2.1582031 + - 0.65771484 + - -3.4160156 + - -5.7304688 + - -0.22070313 + - -3.03125 + - -0.9975586 + - 1.8378906 + - -1.4101563 + - 1.4414063 + - 3.9804688 + - -1.9648438 + - -1.5292969 + - -1.8769531 + - 2.2949219 + - -0.23254395 + - -0.5600586 + - 1.2783203 + - 0.60791016 + - 1.453125 + - 0.8408203 + - -0.73535156 + - -0.99658203 + - -3.1132813 + - 2.9472656 + - -0.5136719 + - 0.32617188 + - -2.6640625 + - -1.5917969 + - 1.0527344 + - 0.119384766 + - -1.2695313 + - -1.6621094 + - 2.1621094 + - -1.7226563 + - -1.7275391 + - -0.45898438 + - -0.26733398 + - 2.6152344 + - 0.4230957 + - -1.1201172 + - -0.47021484 + - 4.1289063 + - 1.4775391 + - -0.26342773 + - 2.9726563 + - -2.859375 + - 2.3222656 + - 0.52197266 + - -1.1865234 + - -3.2050781 + - -1.1943359 + - 2.2285156 + - -2.5 + - 5.8789063 + - -0.001953125 + - 2.4101563 + - -0.78027344 + - -1.4560547 + - 0.8540039 + - 2.6914063 + - 0.49853516 + - -1.1474609 + - -0.55566406 + - 0.46972656 + - 1.1582031 + - -3.6191406 + - 2.3203125 + - -4.75 + - -4.75 + - -3.7871094 + - 1.0068359 + - 3.9179688 + - 1.4345703 + - -1.3925781 + - 0.171875 + - 2.4257813 + - 1.21875 + - -2.6074219 + - 1.1171875 + - -1.5332031 + - -4.0273438 + - -0.3540039 + - 5.6328125 + - 0.23010254 + - 2.109375 + - 1.9853516 + - -0.9951172 + - 2.140625 + - -0.2705078 + - -2.8164063 + - -0.19946289 + - 4.5820313 + - -2.5664063 + - -0.3581543 + - 2.8847656 + - -1.4316406 + - 0.06585693 + - 1.0810547 + - -1.1972656 + - -9.3359375 + - 1.4482422 + - -47.25 + - -1.2919922 + - -0.6015625 + - -2.0625 + - -3.9179688 + - -0.47729492 + - 0.296875 + - 1.0654297 + - 1.6640625 + - 1.0595703 + - 0.18188477 + - -1.796875 + - 4.6875 + - -0.5253906 + - -2.0019531 + - 1.5869141 + - 1.1044922 + - -0.7211914 + - 16.984375 + - 0.42285156 + - -0.9765625 + - -1.2626953 + - -0.9379883 + - -0.57958984 + - 0.4038086 + - 2.8007813 + - 0.87353516 + - -1.625 + - -0.4267578 + - -2.6699219 + - -0.9609375 + - -2.4199219 + - 0.1784668 + - 0.49438477 + - -0.88183594 + - 2.4472656 + - 1.0351563 + - 0.8046875 + - 1.4453125 + - 0.5073242 + - 3.921875 + - -0.3798828 + - 1.046875 + - 0.2524414 + - -3.1367188 + - 2.5292969 + - 0.12658691 + - -1.2939453 + - -0.52246094 + - -2.9902344 + - 0.3515625 + - -1.6132813 + - -0.08203125 + - -0.66015625 + - -0.059143066 + - 0.21252441 + - 1.9482422 + - -4.1484375 + - -2.4863281 + - 0.35864258 + - 0.18481445 + - -1.0009766 + - -2.59375 + - 1.2685547 + - 6.6015625 + - -0.65283203 + - -0.7451172 + - 4.7226563 + - -2.2519531 + - 2.3105469 + - -2.0625 + - -0.16796875 + - 0.17907715 + - -2.3144531 + - 2.8964844 + - -4.5703125 + - 3.5996094 + - -1.0625 + - 5.2304688 + - 0.46972656 + - 0.31811523 + - -3.0722656 + - 1.9150391 + - 0.18713379 + - 1.9267578 + - 2.9316406 + - -1.0644531 + - -0.28515625 + - 0.26489258 + - -0.71972656 + - 2.5703125 + - -1.4707031 + - -1.5351563 + - -2.7070313 + - 1.2441406 + - -0.47607422 + - -0.3474121 + - -0.8457031 + - -3.4179688 + - -1.0927734 + - -2.1328125 + - -5.7382813 + - -1.1689453 + - 0.2512207 + - 1.3505859 + - 3.4101563 + - 3.4472656 + - 0.40112305 + - 0.56689453 + - 0.064697266 + - 0.7753906 + - 0.9980469 + - -1.6445313 + - 2.921875 + - 0.97314453 + - 1.3320313 + - -2.6816406 + - 2.3125 + - -2.0449219 + - 2.2089844 + - 1.6376953 + - 0.4819336 + - -1.6738281 + - -1.7792969 + - 0.17663574 + - 0.31298828 + - 4.0273438 + - -0.7270508 + - 3.1933594 + - 2.3964844 + - 2.65625 + - 1.4794922 + - -0.0524292 + - 1.9814453 + - 0.39282227 + - 0.23828125 + - 2.7226563 + - -0.80126953 + - -2.8105469 + - 0.1665039 + - -2.1660156 + - -2.0292969 + - -2.4453125 + - -3.0078125 + - 1.9033203 + - 2.8339844 + - 2.7753906 + - -2.4765625 + - 0.8408203 + - -3.203125 + - 2.265625 + - -1.7246094 + - 4.75 + - 4.6875 + - 0.59472656 + - -0.53466797 + - 1.7792969 + - 0.2956543 + - 2.3515625 + - -4.1757813 + - 3.9179688 + - -1.46875 + - -4.9453125 + - -1.9033203 + - -1.0390625 + - -0.34399414 + - -2.9414063 + - -15.546875 + - 2.0390625 + - -1.2695313 + - 4.1445313 + - 1.2197266 + - 3.3535156 + - 1.3818359 + - 1.5996094 + - -0.45141602 + - -0.6635742 + - 1.65625 + - -2.0996094 + - 2.4941406 + - 1.4921875 + - 2.0800781 + - -3.2675781 + - 0.96191406 + - -0.0072517395 + - -0.21252441 + - 1.2314453 + - 2.2519531 + - -1.0253906 + - 0.35327148 + - -0.015625 + - 1.5966797 + - -4.4726563 + - 0.20471191 + - -1.7744141 + - -16.671875 + - 0.61865234 + - 0.1204834 + - 2.9863281 + - -4.984375 + - -1.5673828 + - 0.2685547 + - 1.1904297 + - -5.015625 + - -2.6191406 + - -2.6132813 + - 3.6992188 + - -0.53271484 + - -0.45141602 + - -2.3652344 + - 0.70166016 + - -6.203125 + - -1.1904297 + - -0.35180664 + - 0.74072266 + - 1.1875 + - -0.9941406 + - -0.24536133 + - -2.4628906 + - -0.63623047 + - 2.921875 + - -3.5 + - -0.0418396 + - -0.52783203 + - 1.5361328 + - 3.4628906 + - -1.8183594 + - 0.32592773 + - -1.4794922 + - -0.74853516 + - 2.2285156 + - -0.75097656 + - 0.43237305 + - -18.859375 + - -0.33251953 + - -1.9013672 + - 2.4355469 + - -4.1875 + - 2.4121094 + - 0.5698242 + - 1.2294922 + - 1.6337891 + - -0.6972656 + - 1.4189453 + - -1.1513672 + - 2.2636719 + - -1.9921875 + - 0.50927734 + - -0.11621094 + - 0.58740234 + - 0.045196533 + - 1.4101563 + - -4.8007813 + - -1.421875 + - 2.3144531 + - -2.7324219 + - -0.19055176 + - 2.9023438 + - -1.4501953 + - 3.1484375 + - -2.5957031 + - -1.5234375 + - 2.0722656 + - 1.359375 + - 3.15625 + - -2.1503906 + - -1.5009766 + - -1.6464844 + - -0.4116211 + - -0.60595703 + - -1.6875 + - 1.4931641 + - 1.8671875 + - 3.7695313 + - 1.6650391 + - 2.296875 + - 3.6601563 + - -2.0839844 + - 0.4116211 + - -2.2988281 + - -1.4267578 + - -6.0625 + - 1.0380859 + - 2.4628906 + - 0.46191406 + - 0.2548828 + - 0.19689941 + - -2.0976563 + - 0.6020508 + - 0.14929199 + - 8.09375 + - -0.37939453 + - -1.6357422 + - -1.1328125 + - 1.1572266 + - 1.5166016 + - 1.8105469 + - -1.7607422 + - -1.9306641 + - 0.43115234 + - 2.6933594 + - 0.68603516 + - 3.0800781 + - -3.4238281 + - -4.5898438 + - 0.8173828 + - 0.81689453 + - 1.5869141 + - 0.9785156 + - 0.3359375 + - -0.2454834 + - 4.140625 + - 0.45922852 + - 0.1227417 + - -2.3183594 + - 1.6416016 + - -0.86376953 + - 1.2724609 + - -3.3242188 + - -0.48486328 + - 1.7539063 + - -2.6875 + - 1.2851563 + - 3.9628906 + - 2.2578125 + - -0.9003906 + - -0.890625 + - 1.5214844 + - 1.3681641 + - 0.6738281 + - 2.875 + - 4.9257813 + - -0.41552734 + - 1.0478516 + - -0.67822266 + - 0.17907715 + - 0.7519531 + - 2.2324219 + - 1.2285156 + - 1.1103516 + - 0.13671875 + - -4.5898438 + - -0.58251953 + - 3.1289063 + - -2.9101563 + - -0.5 + - -3.109375 + - -0.7890625 + - 2.46875 + - 6.3671875 + - 1.0234375 + - -1.5839844 + - 1.7226563 + - 2.2578125 + - -0.53271484 + - -1.3720703 + - 1.2597656 + - -5.4179688 + - 1.2451172 + - 2.6855469 + - 5.4140625 + - -0.4560547 + - 0.5136719 + - -1.0898438 + - -0.8725586 + - -2.5917969 + - -3.6132813 + - 3.6015625 + - -0.8730469 + - 0.97802734 + - 5.375 + - -2.1015625 + - -1.2539063 + - -2.5039063 + - -0.38916016 + - -0.047546387 + - 0.2939453 + - -1.1806641 + - -0.13952637 + - 3.3027344 + - -0.9951172 + - 0.3881836 + - 1.9726563 + - 0.578125 + - -0.53564453 + - -0.30908203 + - 3.3164063 + - -0.27539063 + - 0.8676758 + - 1.8466797 + - 2.5957031 + - 0.625 + - -0.63427734 + - -3.7246094 + - -3.3027344 + - 0.061645508 + - 3.0683594 + - -0.9375 + - 2.4726563 + - -0.6616211 + - 1.5009766 + - -0.15673828 + - -3.625 + - 0.9790039 + - 0.10180664 + - -0.1430664 + - -1.1445313 + - -2.4355469 + - 6.703125 + - -2.4082031 + - 0.82666016 + - -1.2753906 + - 2.6503906 + - 0.7402344 + - -0.68408203 + - -2.0527344 + - 0.01701355 + - -3.9707031 + - 0.9741211 + - 0.3684082 + - 1.9746094 + - 1.2275391 + - 11.5703125 + - -1.9726563 + - -1.2568359 + - 1.5556641 + - 0.38720703 + - 6.0625 + - 4.03125 + - 0.3269043 + - -1.5058594 + - -0.7089844 + - 0.52783203 + - 8.3125 + - 0.38867188 + - -0.64453125 + - 0.23876953 + - -1.2001953 + - 0.69921875 + - -3.109375 + - -2.7402344 + - -2.3964844 + - -3.6738281 + - 1.8652344 + - -3.6816406 + - -1.0703125 + - 1.0126953 + - 0.83251953 + - -4.9414063 + - -0.2487793 + - 0.36669922 + - 1.9873047 + - -0.4453125 + - -1.421875 + - 1.3291016 + - -1.1318359 + - -1.125 + - 2.25 + - 0.49023438 + - 1.9892578 + - 4.171875 + - -1.8466797 + - 1.5117188 + - 0.41845703 + - -4.1914063 + - -1.8828125 + - -0.3010254 + - -1.7539063 + - 3.1015625 + - -1.0146484 + - 0.4970703 + - 3.1601563 + - 0.080078125 + - 3.5722656 + - -0.74072266 + - 3.1738281 + - -1.8457031 + - 3.15625 + - -0.88671875 + - -3.90625 + - -2.7324219 + - -3.7539063 + - 1.6591797 + - 1.1328125 + - -0.9873047 + - -0.70703125 + - -0.78564453 + - -0.30078125 + - -2.2480469 + - -1.0400391 + - 1.1386719 + - 1.0878906 + - -0.74658203 + - 2.7128906 + - -9.265625 + - 3.6757813 + - 3.4140625 + - -0.7910156 + - 0.8730469 + - -2.4628906 + - -0.8623047 + - 0.82128906 + - -0.09765625 + - 1.9785156 + - 0.9145508 + - -0.8256836 + - 3.8378906 + - 0.45043945 + - -1.5556641 + - -2.703125 + - -0.60546875 + - 1.1132813 + - -0.43652344 + - -2.0175781 + - -0.31958008 + - -0.07867432 + - -1.5126953 + - 3.2539063 + - 0.37036133 + - -6.2109375 + - 1.9072266 + - 4.3515625 + - -0.01171875 + - 0.04852295 + - 0.296875 + - 0.8154297 + - 1.7441406 + - 2.4199219 + - 3.375 + - 0.42578125 + - 0.5605469 + - -0.43188477 + - -0.09667969 + - 1.4482422 + - 2.7324219 + - -0.17468262 + - -3.9589844 + - 10.7734375 + - 2.2988281 + - -3.1738281 + - -71 + - 0.8598633 + - -1.671875 + - -0.8847656 + - 2.8320313 + - 4.7929688 + - 1.6953125 + - 0.8984375 + - -0.09063721 + - -2.2050781 + - -2.765625 + - 1.6904297 + - -0.7163086 + - 2.3457031 + - 0.35083008 + - -5.0625 + - -2.6972656 + - -3.0078125 + - -0.32592773 + - 1.7851563 + - 2.4550781 + - 0.5205078 + - 1.1357422 + - -0.9584961 + - -1.6064453 + - -2.7480469 + - -1.6689453 + - -3.2753906 + - 1.0966797 + - -1.7207031 + - 1.1298828 + - -4.6367188 + - 0.08984375 + - -1.109375 + - -3.8867188 + - 1.0859375 + - 1.0166016 + - -0.043792725 + - 1.3095703 + - -2.6269531 + - -0.30297852 + - -1.3212891 + - 4.2148438 + - 1.796875 + - 1.2851563 + - -2.6074219 + - 2.0527344 + - 1.4707031 + - 2.9453125 + - 0.33374023 + - 1.2978516 + - -0.5600586 + - 1.0791016 + - 9.7578125 + - -4.8945313 + - 1.8242188 + - 0.14147949 + - 0.9223633 + - 0.3815918 + - -2.0175781 + - 0.9194336 + - 2.046875 + - 0.3852539 + - -3.15625 + - -0.7392578 + - 0.11602783 + - -4.640625 + - 0.7426758 + - -0.93603516 + - 0.4621582 + - -2.9628906 + - 2.0625 + - 2.890625 + - 0.58935547 + - 1.4394531 + - 0.2878418 + - -2.2128906 + - -0.7866211 + - 0.54345703 + - 1.0351563 + - -0.11187744 + - 0.4152832 + - -1.7988281 + - -1.1962891 + - 0.7685547 + - -2.7597656 + - 2.4375 + - 3.6503906 + - -0.6088867 + - -1.0214844 + - -1.2431641 + - 2.0878906 + - -0.15905762 + - 2.8632813 + - 2.4941406 + - 7.8046875 + - 1.8417969 + - 3.0839844 + - -1.7001953 + - 0.81103516 + - 1.5585938 + - -0.31445313 + - 0.3947754 + - 1.9375 + - -0.9941406 + - 0.13220215 + - -0.83740234 + - -2.9550781 + - 0.67822266 + - -1.1914063 + - 5.3007813 + - 16.75 + - 1.0976563 + - -0.65185547 + - -3.8984375 + - 1.375 + - -0.75 + - 1.6728516 + - 2.3945313 + - -0.31225586 + - -0.9316406 + - 3.2753906 + - 0.94970703 + - 1.359375 + - -1.875 + - 2.1777344 + - 2.2441406 + - -4.0898438 + - 1.3691406 + - 0.30395508 + - 2.1152344 + - 0.1126709 + - -1.7089844 + - 1.3037109 + - -0.82666016 + - 3.9414063 + - 1.4775391 + - -1.4306641 + - 3.2910156 + - 1.3632813 + - -1.796875 + - -3.2226563 + - 1.6689453 + - -0.072509766 + - -2.9960938 + - 0.76416016 + - 0.1616211 + - -2.6503906 + - 0.085510254 + - 1.9941406 + - 0.55908203 + - 0.34423828 + - 3.0351563 + - 1.4033203 + - -0.54785156 + - 0.37817383 + - 3.5644531 + - -0.7607422 + - 2.7578125 + - 0.76660156 + - 3.2304688 + - 2.390625 + - -2.2675781 + - -1.4804688 + - 2.2480469 + - 6.3867188 + - -2.7519531 + - -0.3305664 + - 3.0195313 + - -4.2539063 + - 0.103515625 + - -0.5175781 + - -2.2578125 + - 0.27441406 + - 0.76660156 + - 2.3105469 + - 1.1015625 + - 0.081726074 + - -0.16015625 + - -0.0078125 + - -1.9619141 + - -0.63720703 + - -2.21875 + - 0.4033203 + - 1.1953125 + - 0.39013672 + - -2.21875 + - -1.65625 + - -2.0566406 + - -1.6669922 + - -10.375 + - 0.6894531 + - 0.6230469 + - -0.0446167 + - -0.6328125 + - -1.4785156 + - -3.3125 + - 1.4169922 + - -0.5205078 + - 1.609375 + - 3.4453125 + - 1.1767578 + - 2.6171875 + - 5.765625 + - -1.453125 + - 1.8847656 + - -3.3789063 + - -3.6875 + - -2.703125 + - 1.6894531 + - 0.23828125 + - -2.6445313 + - 2.9140625 + - -2.3457031 + - -0.65478516 + - 0.69970703 + - 1.2314453 + - 5.4804688 + - -0.18164063 + - 0.48754883 + - 3.3339844 + - 4.1132813 + - -3.0664063 + - -5.390625 + - -0.29589844 + - 0.8984375 + - 1.0292969 + - 2.5839844 + - -0.093444824 + - -1.4394531 + - 2.6972656 + - 2.3828125 + - -0.29467773 + - -1.8320313 + - -1.3818359 + - 2.1191406 + - 0.82128906 + - 3.8769531 + - 1.8378906 + - -0.46313477 + - 3.375 + - 1.1123047 + - 1.0087891 + - 2.1347656 + - -3.4277344 + - -2.8945313 + - -2.65625 + - 2.4277344 + - 2.7734375 + - -1.9775391 + - -3.71875 + - -3.6953125 + - -1.5332031 + - -4.8945313 + - 0.98828125 + - -1.0302734 + - 2.1640625 + - 0.5756836 + - -2.96875 + - -4.15625 + - -0.06274414 + - 0.03515625 + - 3.4160156 + - 0.92285156 + - -0.64697266 + - -1.0117188 + - 20.421875 + - 1.1201172 + - 0.58251953 + - 2.1933594 + - 8.015625 + - -0.35546875 + - -0.2253418 + - 0.3088379 + - 0.7392578 + - -3.4335938 + - -0.8833008 + - 4.125 + - -2.3203125 + - 4.7304688 + - 0.66845703 + - 0.73535156 + - -0.64697266 + - 0.68310547 + - -2.9316406 + - -2.5644531 + - 5.1523438 + - -0.84277344 + - 0.48046875 + - 3.7089844 + - 0.16040039 + - -3.9765625 + - 1.3769531 + - 2.2441406 + - 0.9951172 + - 0.20532227 + - 0.63134766 + - 0.3720703 + - 3.1738281 + - 0.61279297 + - -4.0507813 + - 0.96191406 + - -0.62353516 + - -0.9472656 + - -1.0126953 + - -4.5390625 + - 5.3164063 + - 2.5136719 + - -6.2109375 + - -1.0478516 + - 1.4082031 + - 2.2832031 + - -1.5019531 + - 1.1425781 + - 1.7949219 + - -2.5058594 + - 3.6738281 + - 0.515625 + - 2.3613281 + - 0.29858398 + - 6.1289063 + - 1.1318359 + - 0.29174805 + - 1.046875 + - -2.0136719 + - -3.8242188 + - 4.546875 + - 3.0429688 + - 2.7207031 + - 0.028457642 + - 0.33691406 + - 0.15515137 + - 2.9394531 + - -3.4550781 + - 0.39282227 + - 0.38305664 + - -4.5078125 + - -1.8945313 + - 1.9765625 + - 2.75 + - -4.6992188 + - -2.0136719 + - -1.1396484 + - -3.2890625 + - -1.2226563 + - -2.7890625 + - 1.3349609 + - 1.0654297 + - 0.18237305 + - -3.5683594 + - -0.7392578 + - 2.5644531 + - 1.5683594 + - -1.3681641 + - -2.8691406 + - 1.3779297 + - -1.5214844 + - -0.83691406 + - -4.0742188 + - -2.375 + - -4.5429688 + - 2.6953125 + - 0.6816406 + - -3.203125 + - -2.5175781 + - -2.1894531 + - 1.2763672 + - 0.5151367 + - -0.6088867 + - 4.1289063 + - -3.0625 + - 0.6694336 + - -0.07446289 + - -1.6347656 + - 4.0546875 + - -3.6660156 + - 1.1875 + - -2.1308594 + - 2.0566406 + - -0.37890625 + - -4.78125 + - -1.0332031 + - 3.9765625 + - 0.3557129 + - 1.2753906 + - -2.8867188 + - 2.3613281 + - -6.140625 + - 1.2578125 + - 0.69873047 + - -0.89160156 + - 3.6640625 + - 3.5039063 + - 1.4873047 + - 2.4082031 + - -0.64160156 + - 0.66015625 + - -2.4589844 + - -3.3144531 + - -2.1328125 + - 2.8867188 + - 0.7421875 + - -1.4570313 + - 1.7060547 + - 1.0664063 + - -0.52685547 + - 2.5371094 + - -1.890625 + - -1.6679688 + - 1.2255859 + - -0.51953125 + - -1.5722656 + - 1.5800781 + - 0.42919922 + - 0.4934082 + - 3.7558594 + - 2.6347656 + - 0.0892334 + - -1.2910156 + - -5.2148438 + - 3.09375 + - 1.4492188 + - -2.1113281 + - 2.4453125 + - 1.5205078 + - -3.7050781 + - 2.1386719 + - 1.9863281 + - -1.7480469 + - 2.6875 + - -2.9941406 + - -1.9804688 + - -1.8417969 + - 0.51708984 + - 1.8808594 + - 0.34106445 + - -1.5683594 + - -5.5898438 + - -0.23840332 + - -1.6435547 + - -0.86816406 + - -1.3125 + - -5.1445313 + - 3.1347656 + - 0.6113281 + - -2.2421875 + - 1.0253906 + - -1.7421875 + - 3.6621094 + - -2.1660156 + - 2.3730469 + - -1.4462891 + - 0.33862305 + - -0.83984375 + - -0.49267578 + - 1.8681641 + - -0.2175293 + - -0.25854492 + - -3.2089844 + - 0.10430908 + - -1.5869141 + - 1.0126953 + - 1.2773438 + - 3.75 + - -1.6982422 + - -2.1621094 + - -0.034454346 + - 3.90625 + - 2.0703125 + - -1.0029297 + - -3.7441406 + - -1.1357422 + - -2.8867188 + - 8.7734375 + - -1.75 + - -0.11102295 + - -1.7871094 + - 4.3984375 + - 1.2919922 + - 1.1982422 + - 0.79785156 + - -1.3037109 + - 0.2175293 + - -0.7133789 + - 2.1738281 + - -5.390625 + - -2.6777344 + - 5.7382813 + - -4.1210938 + - 3.6914063 + - -1.0966797 + - 0.49926758 + - 0.63720703 + - 3.8164063 + - 0.39770508 + - -1.3974609 + - -0.011154175 + - 0.9560547 + - 2.171875 + - -4.8320313 + - 1.7783203 + - 0.55126953 + - -3.1738281 + - -1.4326172 + - -0.23596191 + - -1.140625 + - -0.22290039 + - -1.1679688 + - 0.34204102 + - 1.5605469 + - -0.85595703 + - -2.0996094 + - -3.8925781 + - 0.55126953 + - -1.4453125 + - -1.6191406 + - 0.23510742 + - 2.6875 + - 0.5488281 + - 2.5390625 + - -0.30566406 + - -0.31054688 + - -1.75 + - 3.4765625 + - 2.8691406 + - -1.8105469 + - -0.67822266 + - -3.6894531 + - -2.2324219 + - 1.7548828 + - 0.15344238 + - -2.2128906 + - -2.3222656 + - -0.578125 + - 1.2382813 + - -0.4765625 + - 0.88134766 + - 2.4453125 + - -0.92285156 + - -3.0878906 + - -2.65625 + - 0.1439209 + - -2.96875 + - -1.8652344 + - -1.0390625 + - -2.1757813 + - -2.8847656 + - -0.6171875 + - -0.8310547 + - -1.3662109 + - 5.4140625 + - 4.6992188 + - -4.21875 + - -0.35668945 + - -1.2822266 + - 1.4794922 + - -2.3300781 + - -2.2949219 + - 3.5800781 + - -1.3066406 + - -2.5527344 + - 1.4326172 + - 2.2753906 + - -2.203125 + - -3.6445313 + - -0.66503906 + - -1.7519531 + - -1.0224609 + - 0.15905762 + - -0.32299805 + - -0.7036133 + - -1.9609375 + - -1.0732422 + - -1.2900391 + - -0.7626953 + - -2.0644531 + - -2.2519531 + - -0.75390625 + - -0.3725586 + - 3.9863281 + - -2.7480469 + - 3.9023438 + - -1.9814453 + - -0.93847656 + - 6.5117188 + - 0.60546875 + - -0.82666016 + - -1.3544922 + - 0.6323242 + - -2.96875 + - 3.3164063 + - 6.4257813 + - -2.3164063 + - -0.70703125 + - 5.7226563 + - 0.9033203 + - 1.3867188 + - 0.39868164 + - -1.9765625 + - 1.0751953 + - 0.51123047 + - -2.9804688 + - 1.3408203 + - -0.8623047 + - -0.3305664 + - 2.6601563 + - -7.1601563 + - 0.71728516 + - 4.21875 + - -2.4765625 + - -0.79003906 + - -2.1503906 + - 4.2460938 + - -5.1679688 + - -2.3320313 + - -0.23156738 + - 1.5947266 + - 2.4082031 + - -0.6894531 + - 1.6523438 + - -2.3300781 + - -2.6777344 + - 2.3339844 + - -0.69189453 + - 0.39379883 + - -2.3339844 + - 3.765625 + - 0.6713867 + - -1.71875 + - -2.4199219 + - -1.2382813 + - -0.22509766 + - 0.57373047 + - -0.34472656 + - 0.5488281 + - 2.0214844 + - -2.5917969 + - -0.09649658 + - -2.7949219 + - 0.71972656 + - 0.95751953 + - 1.1845703 + - -1.2763672 + - -2.2324219 + - -3.1464844 + - 1.2744141 + - 0.5834961 + - 1.15625 + - -0.36157227 + - -2.1542969 + - -2.1152344 + - 1.2978516 + - -3.0253906 + - -2.5078125 + - -1.9648438 + - 3.6992188 + - -3.4804688 + - -1.9482422 + - -0.6015625 + - 2.3535156 + - -1.609375 + - 0.017578125 + - -1.0625 + - -0.9248047 + - -0.30395508 + - -4.1132813 + - 0.8129883 + - 1.6357422 + - 4.8632813 + - -1.6777344 + - 1.4501953 + - -0.2841797 + - 6.375 + - 1.9326172 + - -0.73095703 + - 1.4150391 + - 1.7363281 + - -0.64941406 + - -1.9150391 + - -1.2910156 + - 1.2724609 + - 1.7753906 + - 3.4375 + - -1.9316406 + - 2.3691406 + - -0.04574585 + - -0.054595947 + - 2.40625 + - -0.54248047 + - -0.9785156 + - 1.7080078 + - -1.4541016 + - -2.8515625 + - 0.9140625 + - 0.92041016 + - -3.3164063 + - -0.5415039 + - 1.859375 + - -1.9082031 + - -1.2275391 + - -0.16516113 + - -0.29711914 + - 4.4257813 + - 6.828125 + - -1.8183594 + - -0.18664551 + - -3.7402344 + - -2.1445313 + - 0.515625 + - 1.0849609 + - -2.375 + - 1.8476563 + - -3.6679688 + - -2.8671875 + - -0.51171875 + - -2.3496094 + - -0.9980469 + - -2.3925781 + - -0.021759033 + - 1.8232422 + - 1.421875 + - -0.38916016 + - 1.7294922 + - 2.8515625 + - -0.71875 + - -2.0195313 + - 1.3427734 + - 2.3515625 + - 0.8647461 + - -1.6259766 + - -0.9580078 + - 0.50634766 + - 0.05996704 + - -0.2841797 + - -3.6992188 + - -1.28125 + - -1.3017578 + - 1.7587891 + - -0.9296875 + - 0.9707031 + - 0.14562988 + - 2.8203125 + - -0.19946289 + - -1.4619141 + - 8.03125 + - -2.1171875 + - 3.65625 + - -4.03125 + - 3.6367188 + - 4.2148438 + - -4.0703125 + - 1.1347656 + - 1.7832031 + - -0.21923828 + - -1.1455078 + - -0.35864258 + - -0.16906738 + - 1.8251953 + - -1.71875 + - -1.2568359 + - -1.7851563 + - 3.9589844 + - -0.72753906 + - 1.2275391 + - 0.44628906 + - -1.2568359 + - 0.9194336 + - -0.515625 + - -0.5131836 + - -1.1142578 + - 3.3339844 + - 0.8959961 + - -2.1777344 + - 1.6064453 + - -0.6953125 + - -2.7265625 + - 0.44482422 + - -2.1367188 + - -0.85253906 + - 2.6328125 + - 2.1464844 + - 2.1816406 + - -8.9609375 + - 4.40625 + - -0.578125 + - 0.32617188 + - 0.48632813 + - -3.5039063 + - 1.9033203 + - 0.44970703 + - -1.4980469 + - 1.4433594 + - -4.6289063 + - 0.4033203 + - -0.2097168 + - -0.4741211 + - 0.07739258 + - 0.23547363 + - 1.1494141 + - -0.3383789 + - -0.7475586 + - 0.73291016 + - 2.0761719 + - -2.421875 + - 1.4589844 + - -2.5488281 + - 1.5820313 + - 2.3574219 + - 0.77978516 + - 1.0751953 + - 1.9609375 + - -0.33642578 + - 0.08258057 + - -1.2607422 + - 4.4570313 + - 1.421875 + - 2.5390625 + - 1.0185547 + - -4.046875 + - 0.6635742 + - -0.4050293 + - -0.3876953 + - -0.26391602 + - 1.1337891 + - -0.93896484 + - 1.3505859 + - 6.3554688 + - 1.0771484 + - -8.7421875 + - 1.2646484 + - 1.3359375 + - -0.11853027 + - -0.98535156 + - 2.9433594 + - 6.1757813 + - -1.8076172 + - -0.09399414 + - -0.6176758 + - -1.4550781 + - 1.4707031 + - -0.77441406 + - 0.2220459 + - -0.23046875 + - -2.4199219 + - -0.43237305 + - -0.49902344 + - 4.078125 + - -1.9355469 + - -1.4414063 + - 0.12658691 + - 1.7949219 + - 3.6269531 + - 2.203125 + - 1.0576172 + - 0.4970703 + - 2.703125 + - 0.66748047 + - -24.875 + - 1.6738281 + - -4.6367188 + - -1.8183594 + - -15.671875 + - -1.2578125 + - -0.6875 + - 3.0644531 + - -3.7109375 + - 2.6074219 + - -7.5507813 + - -7.9296875 + - 0.8076172 + - -0.953125 + - 2.0195313 + - -1.1660156 + - 0.38110352 + - 4.4414063 + - -0.9458008 + - 1.5400391 + - 1.0097656 + - 2.0351563 + - 1.9921875 + - -2.9023438 + - -2.4785156 + - 3.6640625 + - -2.578125 + - 1.8388672 + - 1.6982422 + - -5.0117188 + - 1.9042969 + - -0.31152344 + - -0.0836792 + - 2.3574219 + - 0.6328125 + - -1.6601563 + - 1.71875 + - -1.8515625 + - 0.73095703 + - -0.04421997 + - 0.4597168 + - 0.034576416 + - 3.46875 + - 1.4013672 + - 0.056915283 + - 3.71875 + - 2.7539063 + - 1.515625 + - -1.0654297 + - -1.0966797 + - 1.7587891 + - -1.0693359 + - -2.015625 + - 2.0742188 + - 1.3916016 + - 3.1171875 + - -1.6464844 + - -4.7148438 + - 0.67529297 + - -2.6191406 + - 0.16125488 + - 2.4453125 + - -3.1289063 + - -0.6386719 + - -0.37548828 + - -0.41308594 + - -0.12719727 + - 4.5664063 + - 2.8710938 + - 1.4658203 + - -4.6757813 + - -0.140625 + - 3.0175781 + - 0.5756836 + - -0.4440918 + - 1.3955078 + - 0.27856445 + - -0.7294922 + - -1.0048828 + - 2.1171875 + - -3.4804688 + - -0.22387695 + - 1.3056641 + - -0.33764648 + - 0.57910156 + - 4.0429688 + - -0.57177734 + - 0.72314453 + - -1.4560547 + - -3.84375 + - 0.8569336 + - -1.7167969 + - 0.9316406 + - -1.5507813 + - -2.4707031 + - 0.9458008 + - -3.0820313 + - -8.6328125 + - 0.87353516 + - -3.7128906 + - 0.2854004 + - 2.3984375 + - 1.1992188 + - -3.4628906 + - 0.6176758 + - -3.5625 + - -1.8496094 + - -5.140625 + - -0.8227539 + - 0.005859375 + - -0.0052986145 + - 3.953125 + - -0.890625 + - 1.4560547 + - -3.1464844 + - -2.7402344 + - -1.1064453 + - 0.2019043 + - -0.8989258 + - -3.078125 + - 0.8232422 + - -2.5 + - -0.43896484 + - -0.1282959 + - 1.2353516 + - -0.3251953 + - 0.5102539 + - -3.4140625 + - -1.6064453 + - 0.57910156 + - -5.2148438 + - -2.2265625 + - 2.5878906 + - 5.3945313 + - 5.4765625 + - -0.2890625 + - 0.234375 + - 4.4335938 + - 3.2617188 + - -1.6669922 + - -0.90234375 + - -2.3027344 + - 0.3310547 + - 2.8554688 + - -1.0009766 + - -0.7446289 + - -0.61035156 + - -0.75390625 + - -2.0234375 + - -2.2988281 + - 2.4609375 + - -1.8125 + - 1.2353516 + - -0.21203613 + - -2.3457031 + - -0.0234375 + - 0.78027344 + - 1.3662109 + - -0.5136719 + - -0.7988281 + - 0.52685547 + - 2.2109375 + - -0.9453125 + - -1.5009766 + - -4.6523438 + - -0.0446167 + - 0.20629883 + - 3.40625 + - -0.46484375 + - 0.18688965 + - 2.3476563 + - 23.5 + - -0.89501953 + - -3.078125 + - 4.3554688 + - 0.5859375 + - 4.0507813 + - -2.0214844 + - -13.3359375 + - 1.4970703 + - -1.0517578 + - 4.7578125 + - 0.66796875 + - 0.11383057 + - 1.2236328 + - 0.84375 + - 2.2851563 + - 1.4814453 + - -4.9257813 + - 0.3095703 + - -4.7148438 + - 1.0253906 + - -3.7539063 + - 0.3647461 + - -0.20080566 + - -1.4785156 + - 3.5820313 + - -0.93603516 + - -2.2539063 + - 0.28979492 + - 3.0644531 + - -0.5317383 + - -0.69189453 + - 1.3955078 + - -1.6269531 + - -1.3457031 + - -2.0546875 + - -0.33032227 + - -0.26245117 + - -0.96191406 + - 0.11212158 + - -2.59375 + - 2.2695313 + - -1.0654297 + - -1.7246094 + - 1.9658203 + - -0.79833984 + - 0.2915039 + - 1.7851563 + - -3.4238281 + - 3.5742188 + - 1.0439453 + - -1.3769531 + - 5.90625 + - -2.6601563 + - -2.3691406 + - 0.82666016 + - 0.78759766 + - 2.9375 + - -2.3515625 + - 1.5 + - -2.4375 + - 3.8339844 + - 0.71240234 + - -1.1992188 + - -0.064697266 + - 6.109375 + - 3.3691406 + - -0.4128418 + - -1.7158203 + - -0.36547852 + - -1.1796875 + - -0.25268555 + - -0.30004883 + - -0.19189453 + - -2.7128906 + - -5.9140625 + - 6.5351563 + - 0.93652344 + - -2.375 + - -1.8955078 + - 1.6201172 + - 0.37719727 + - -0.3203125 + - -0.21618652 + - 0.5834961 + - 1.2314453 + - 0.7866211 + - 1.6142578 + - -3.2421875 + - 0.8457031 + - 1.3232422 + - -1.9501953 + - 0.4663086 + - 0.171875 + - 5.1757813 + - 2.1445313 + - -1.6201172 + - 4.75 + - -1.0703125 + - 2.4765625 + - 4.703125 + - -0.546875 + - -1.9902344 + - 5.75 + - 0.78759766 + - 0.38598633 + - -1.2539063 + - -0.17272949 + - 2.4550781 + - 1.6503906 + - -1.2587891 + - -1.6191406 + - -1.8496094 + - -0.71777344 + - -0.42578125 + - 0.38891602 + - 0.73339844 + - 0.124572754 + - 0.29614258 + - -2.078125 + - 2.2597656 + - 23.0625 + - -3.9101563 + - 2.9414063 + - -0.17468262 + - 0.92871094 + - 2.359375 + - 0.18408203 + - -2.0410156 + - 0.2841797 + - -0.84375 + - -1.4482422 + - 1.9472656 + - -2.3066406 + - -1.7001953 + - -0.2607422 + - 0.31054688 + - -5.1601563 + - 1.984375 + - 2.1582031 + - 14.546875 + - -2.6972656 + - 1.4003906 + - -0.11602783 + - -1.4023438 + - 0.2097168 + - -0.65283203 + - 0.63623047 + - 0.6635742 + - -0.21679688 + - -1.2744141 + - -26 + - -0.5024414 + - 0.55078125 + - 1.0732422 + - -2.9140625 + - -0.4934082 + - -0.6484375 + - 0.9169922 + - -2.46875 + - 0.9277344 + - 0.59472656 + - -3.8222656 + - -1.3505859 + - -0.8232422 + - -0.15454102 + - -1.0322266 + - -1.2919922 + - -2.9804688 + - 0.62353516 + - -0.2298584 + - -2.3261719 + - 0.8232422 + - 2.6308594 + - 0.26000977 + - 3.421875 + - -1.4072266 + - 3.1738281 + - -0.5625 + - 7.6953125 + - -1.9335938 + - 2.5839844 + - 4.0078125 + - -6.6484375 + - 2.421875 + - -2.1796875 + - 4.359375 + - -0.8208008 + - -0.51123047 + - -1.7314453 + - 0.5083008 + - 0.62841797 + - 0.9926758 + - -5.5351563 + - 2.9492188 + - -0.17919922 + - -2.4003906 + - 0.0287323 + - 2.7089844 + - 2.53125 + - 2.6328125 + - 2.5039063 + - -1.953125 + - -1.2744141 + - 1.8378906 + - 4.15625 + - 1.4326172 + - -1.4902344 + - -3.828125 + - -0.64501953 + - -4.1679688 + - -1.1298828 + - 2.1113281 + - 2.2246094 + - 3.640625 + - -1.1396484 + - 4.890625 + - 4.9960938 + - 2.046875 + - -0.7363281 + - -1.0830078 + - 0.77001953 + - -1.2724609 + - 1.3398438 + - -1.2626953 + - 1.3603516 + - -1.4814453 + - -2.6640625 + - 0.6230469 + - -3.5585938 + - -0.33764648 + - -3.3710938 + - -3.9375 + - -0.76416016 + - 0.515625 + - 3.0039063 + - -1.4169922 + - -0.14941406 + - 2.9160156 + - 0.7988281 + - 0.52783203 + - -2.7890625 + - 3.3554688 + - 2.0605469 + - -1.4150391 + - -3.3203125 + - 3.6054688 + - -0.5683594 + - 3.9394531 + - -2.7871094 + - -0.92089844 + - -1.0517578 + - 0.8227539 + - 3.4941406 + - 2.4726563 + - -0.17443848 + - 0.9404297 + - -3.7363281 + - -6.046875 + - -0.46191406 + - -1.4882813 + - 2.6621094 + - 2.6914063 + - 0.81933594 + - 1.0390625 + - 2.1582031 + - 0.5991211 + - -0.0715332 + - 2.3574219 + - -1.8457031 + - 2.953125 + - 1 + - -0.45532227 + - -0.33251953 + - -0.8066406 + - -0.6645508 + - 12.1953125 + - 0.5239258 + - 2.53125 + - 5.7851563 + - 7.796875 + - -1.2158203 + - 0.42822266 + - -1.0888672 + - 1.4638672 + - -2.6542969 + - -1.7939453 + - 1.3466797 + - 0.6689453 + - 0.30126953 + - -2.5625 + - -0.71875 + - 1.0185547 + - 1.890625 + - 1.9335938 + - 0.34350586 + - -0.17382813 + - -0.18469238 + - -0.78125 + - -1.9404297 + - -2.1035156 + - -1.4277344 + - 1.2451172 + - -0.46313477 + - -2.4238281 + - -3.4238281 + - 2.7890625 + - 2.1503906 + - 1.9921875 + - 1.015625 + - 0.2241211 + - -0.98291016 + - 1.9423828 + - -1.75 + - 0.74072266 + - 1.8212891 + - -1.4931641 + - 1.2539063 + - -1.7744141 + - -0.55615234 + - 3.9394531 + - -0.7192383 + - 1.7138672 + - -2.6484375 + - -1.0947266 + - -2.9023438 + - 3.21875 + - 1.0126953 + - -2.4042969 + - -1.1142578 + - 4.1015625 + - 1.8300781 + - 1.0361328 + - 1.5976563 + - 4.1875 + - 0.8457031 + - -1.8183594 + - -1.6669922 + - 1.4794922 + - 1.5244141 + - 1.203125 + - 4.1875 + - 2.5175781 + - 2.2617188 + - 1.9628906 + - -1.4160156 + - -0.6542969 + - -1.8525391 + - 1.2382813 + - 0.2019043 + - -0.050201416 + - -1.1044922 + - 0.3461914 + - 1.390625 + - 0.10290527 + - 3.0859375 + - -0.97753906 + - 0.08258057 + - 0.86376953 + - -0.26757813 + - 23.46875 + - -3.4707031 + - -1.1474609 + - -4.2460938 + - -0.22851563 + - 0.73583984 + - 2.34375 + - -0.092041016 + - -4.7851563 + - 1.6845703 + - 2.5976563 + - -1.359375 + - 3.3945313 + - 2.5351563 + - 1.9492188 + - 0.52001953 + - 1.6367188 + - -3.0742188 + - 1.7148438 + - 0.96191406 + - -2.2128906 + - 1.7011719 + - -3.6757813 + - 1.7763672 + - 0.0758667 + - 0.82177734 + - -2.2089844 + - 0.11645508 + - 2.3359375 + - -3.7753906 + - -0.76953125 + - 1.3154297 + - 2.078125 + - 2.1328125 + - 2.4160156 + - -1.5634766 + - 6.2851563 + - -0.03125 + - 0.32592773 + - -0.65625 + - -4.3359375 + - -3.5664063 + - 0.5019531 + - 4.9257813 + - 0.38012695 + - 0.20166016 + - -1.5683594 + - 1.7353516 + - 2.8164063 + - 3.9121094 + - -0.57470703 + - -1.8261719 + - 0.39379883 + - 8.6640625 + - -3.2226563 + - -1.2158203 + - 0.6328125 + - -1.2607422 + - 1.1367188 + - 0.51123047 + - 1.3037109 + - -0.11773682 + - -0.11462402 + - -4.2421875 + - -3.546875 + - -2.6640625 + - -3.1269531 + - -2.9941406 + - 0.49536133 + - -2.1972656 + - -1.2841797 + - 3.2851563 + - -0.7211914 + - -1.8222656 + - 0.68310547 + - -3.3378906 + - -4.3945313 + - -0.29614258 + - 2.0722656 + - -2.6777344 + - -0.19885254 + - 1.1748047 + - 2.1855469 + - 1.2265625 + - -1.1201172 + - -3.0878906 + - -1.4257813 + - -0.8696289 + - -2.9550781 + - 0.012275696 + - -0.5029297 + - -0.26831055 + - 4.1679688 + - -1.1015625 + - 2.6386719 + - -3.3066406 + - -2.3125 + - -1.2939453 + - -0.6850586 + - 1.2021484 + - -1.3095703 + - 1.4707031 + - 1.0224609 + - 0.8652344 + - 0.40429688 + - -1.2783203 + - -1.6054688 + - 1.5166016 + - -1.4238281 + - 1.6367188 + - 0.48046875 + - -0.32885742 + - 2.7402344 + - 0.9326172 + - 0.21398926 + - 1.2578125 + - -3.8359375 + - -2.6425781 + - -3.2421875 + - -1.3925781 + - 0.29956055 + - -0.22302246 + - 0.52734375 + - 1.0439453 + - 1.1669922 + - 1.2773438 + - -1.2041016 + - -2.421875 + - 1.2001953 + - 2.1035156 + - -2.71875 + - 2.1171875 + - 0.453125 + - 0.3317871 + - 1.2675781 + - 0.6713867 + - -5.578125 + - -3.3398438 + - -1.0908203 + - 1.5175781 + - 0.0262146 + - -2.25 + - -0.95703125 + - 4.9179688 + - -0.171875 + - 1.3681641 + - 6.5859375 + - 2.5625 + - -2.6875 + - 0.84033203 + - -0.055236816 + - 6.015625 + - -4.9648438 + - -2.1777344 + - 0.98876953 + - -2.1269531 + - -0.57470703 + - -2.3886719 + - 1.8857422 + - -3.3496094 + - 3.1972656 + - -1.1943359 + - 0.71972656 + - 0.15234375 + - -0.51708984 + - -1.1992188 + - 0.9658203 + - -0.23144531 + - -1.9414063 + - 5.9726563 + - 0.78759766 + - 2.4453125 + - -0.31518555 + - -4.4648438 + - 2.4316406 + - 0.24658203 + - 1.3349609 + - -0.71484375 + - -1.3564453 + - -0.7675781 + - 1.1240234 + - -2.0175781 + - -3.0800781 + - -0.032348633 + - 0.69873047 + - 1.7294922 + - 2.8203125 + - -2.3183594 + - 1.2373047 + - 0.30688477 + - -2.703125 + - 0.3466797 + - 3.5585938 + - 1.3242188 + - 5.7539063 + - 0.24804688 + - 0.0625 + - 16.203125 + - -0.41845703 + - 2.3027344 + - -3.5488281 + - -0.90771484 + - -0.89697266 + - 0.5410156 + - 1.4794922 + - 4.1484375 + - -0.92089844 + - -3.5253906 + - -1.8222656 + - 0.8720703 + - 1.9169922 + - 1.0517578 + - -1.1318359 + - 4.453125 + - -0.26391602 + - -0.66796875 + - 0.24523926 + - -1.6455078 + - 0.3034668 + - -1.5175781 + - -2.2949219 + - -1.6777344 + - 2.3652344 + - -0.2253418 + - -3.9960938 + - -3.1015625 + - 0.74316406 + - -0.99609375 + - -0.87890625 + - -1.8613281 + - -1.890625 + - 0.1751709 + - -0.083984375 + - 3.0117188 + - 0.75634766 + - 2.7890625 + - 0.2861328 + - 1.9648438 + - -4.5898438 + - 0.88720703 + - 0.65283203 + - -0.06890869 + - 4.2070313 + - -1.3691406 + - -1.3691406 + - -2.0625 + - -5.4882813 + - 2.1308594 + - 1.9013672 + - -0.30786133 + - 2.8808594 + - 4.703125 + - -1.6386719 + - -0.17785645 + - -3.8339844 + - -0.13439941 + - -1.8310547 + - -0.77441406 + - -1.1064453 + - 1.7431641 + - -2.7011719 + - -0.38720703 + - 1.0185547 + - 1.9091797 + - -4.953125 + - 3.3925781 + - 0.92626953 + - -0.5727539 + - -1.6923828 + - 4.6914063 + - 0.94384766 + - 1.1826172 + - 1.0126953 + - -1.9609375 + - -2.4472656 + - 1.6650391 + - 1.3632813 + - 2.3925781 + - 0.17211914 + - 4.7539063 + - -1.6230469 + - -1.1386719 + - 0.9663086 + - -1.5556641 + - -0.7675781 + - -1.5439453 + - 0.62353516 + - -4.34375 + - -0.8286133 + - 1.6669922 + - 1.9033203 + - -2.3789063 + - 2.5566406 + - -3.9316406 + - 2.6816406 + - 0.78759766 + - -0.73876953 + - 4.6054688 + - -0.89160156 + - -2.6074219 + - 1.9169922 + - 2.4316406 + - 3.3085938 + - 1.7695313 + - -1.0097656 + - -0.22338867 + - 0.45361328 + - 33.40625 + - 13.4765625 + - -9.1796875 + - 2.265625 + - -1.0507813 + - 1.4277344 + - -2.734375 + - -4.1757813 + - -0.36376953 + - -0.20703125 + - 1.9589844 + - 0.51464844 + - -0.34057617 + - 1.5166016 + - -2.7890625 + - 1.9707031 + - -1.0009766 + - 0.91259766 + - -2.6933594 + - 0.7138672 + - 1.8779297 + - 3.4140625 + - -1.3193359 + - -1.1445313 + - -0.2253418 + - -2.1523438 + - 0.08703613 + - -0.4038086 + - -4.6054688 + - 0.75097656 + - -0.119384766 + - -0.16101074 + - 1.4169922 + - 2.4785156 + - 1.6337891 + - -4.3789063 + - -1.8554688 + - 2.0644531 + - -2.1699219 + - 1.2451172 + - 2.2324219 + - 1.5371094 + - -0.27978516 + - 4.2304688 + - -1.2050781 + - 0.29345703 + - -3.4941406 + - 2.1425781 + - 1.3066406 + - 0.5107422 + - 2.2910156 + - 8.7265625 + - -0.5673828 + - -1.4306641 + - 1.7226563 + - -0.9453125 + - -0.84521484 + - 0.05606079 + - 1.4580078 + - 0.2175293 + - 2.9785156 + - 2.3984375 + - 1.2050781 + - -3.9238281 + - -1.7402344 + - -1.1376953 + - 1.9384766 + - -0.83203125 + - -2.6855469 + - 0.2565918 + - -2.9277344 + - -0.20385742 + - -1.5039063 + - -2.265625 + - 0.92822266 + - -2.6640625 + - -0.18579102 + - 1.3486328 + - 5.4453125 + - 0.41503906 + - -1.7626953 + - -1.4189453 + - 1.6337891 + - 1.8632813 + - 1.6875 + - 2.3808594 + - 1.1025391 + - 0.22314453 + - 1.9453125 + - -1.5341797 + - 1.3691406 + - 0.5053711 + - -0.8886719 + - -0.99902344 + - 3.6582031 + - 1.2080078 + - -1.3974609 + - 4.03125 + - -1.9023438 + - 0.5214844 + - -3.4609375 + - -1.0595703 + - 0.75097656 + - 1.15625 + - 0.11743164 + - 0.4892578 + - 0.32250977 + - -2.3222656 + - -0.081970215 + - 1.4853516 + - -3.2910156 + - 3.6777344 + - -0.69384766 + - 4.28125 + - 1.8076172 + - 2.8300781 + - -2.9140625 + - -1.3212891 + - 3.5175781 + - 0.42773438 + - -2.3886719 + - -1.8847656 + - 0.8803711 + - 1.109375 + - 3.6132813 + - 1.3603516 + - -3.2714844 + - 2.0566406 + - 2.4140625 + - 0.1307373 + - -0.87890625 + - -1.2529297 + - -1.1123047 + - 1.2490234 + - 0.28198242 + - 0.3125 + - -0.18469238 + - -3.4375 + - 1.5390625 + - -1.3007813 + - -0.4399414 + - 1.9648438 + - 1.7783203 + - -2.1347656 + - -0.296875 + - -0.17236328 + - 2.0097656 + - -1.2041016 + - -0.14453125 + - -4.1132813 + - 1.1660156 + - 1.3193359 + - -1.4667969 + - -1.4375 + - 0.4111328 + - -0.91552734 + - -1.1474609 + - 0.41748047 + - 0.4025879 + - 2.1621094 + - 0.09051514 + - -2.5625 + - 2.7890625 + - 1.7763672 + - -0.9404297 + - 0.4248047 + - 0.32739258 + - 2.3457031 + - -0.119506836 + - -2.5625 + - -0.5102539 + - -0.26660156 + - -2.6132813 + - -1.3476563 + - 0.5800781 + - 0.7158203 + - 1.4140625 + - 1.9658203 + - -1.1708984 + - -1.7529297 + - -0.59765625 + - 0.38500977 + - -0.5258789 + - 0.9008789 + - 1.5195313 + - -1.5722656 + - -0.06945801 + - 1.7695313 + - 1.7246094 + - -1.2783203 + - 2.3789063 + - 2.3203125 + - 1.78125 + - 0.7128906 + - -2.4902344 + - -1.8623047 + - 2.984375 + - 1.1738281 + - 0.92285156 + - -3.3925781 + - -2.7636719 + - -1.4267578 + - -2.8496094 + - -0.41601563 + - 0.39208984 + - -12.4453125 + - -0.31689453 + - -0.46142578 + - 0.21984863 + - -0.89160156 + - 0.5493164 + - -1.2490234 + - 1.6689453 + - 0.4597168 + - -1.7109375 + - 2.34375 + - -5.3710938 + - 0.48706055 + - 0.3251953 + - -1.1757813 + - 1.375 + - 1.5214844 + - -2.0566406 + - -0.022598267 + - 3.4277344 + - 0.61816406 + - 1.828125 + - -0.5341797 + - 9.390625 + - 1.4433594 + - -2.1386719 + - 0.72509766 + - -0.5239258 + - 0.89208984 + - -0.89160156 + - -0.083618164 + - -2.6601563 + - 6.7539063 + - 0.6816406 + - -1.7734375 + - 0.74072266 + - 1.0400391 + - -6.0976563 + - 0.71777344 + - 0.2915039 + - 1.3701172 + - 0.43798828 + - 6.2929688 + - -0.5932617 + - -2.7695313 + - 1.8964844 + - 2.2207031 + - 2.4609375 + - 2.1035156 + - 1.1425781 + - -2.8378906 + - 1.5439453 + - 1.7998047 + - -3.1582031 + - -1.0820313 + - -0.32714844 + - -0.43115234 + - -3.2050781 + - -1.8183594 + - -3.2753906 + - -0.1986084 + - -3.8652344 + - 2.4101563 + - -1.6953125 + - -1.7978516 + - 3.5683594 + - -2.4199219 + - 0.19494629 + - -1.6347656 + - -1.6376953 + - 2.0566406 + - -0.3552246 + - -1.3388672 + - 1.7587891 + - 1.6367188 + - -0.61572266 + - 0.6455078 + - 0.6113281 + - 2.1738281 + - 0.86376953 + - 3.7558594 + - 0.019104004 + - -0.2692871 + - -1.7851563 + - 2.6640625 + - 0.18725586 + - -2.0234375 + - -1.2880859 + - -1.5732422 + - -0.09063721 + - 5.2382813 + - 4.703125 + - -1.1416016 + - 1.9345703 + - 2.3378906 + - -0.7207031 + - -1.2539063 + - -0.4033203 + - 2.0351563 + - -1.9433594 + - 2.2792969 + - -3.4765625 + - 2.8359375 + - 0.7871094 + - -3.9589844 + - -0.11071777 + - -2.6660156 + - 3.2460938 + - 0.30151367 + - -5.5117188 + - -0.2685547 + - -1.7626953 + - 1.6542969 + - 0.42626953 + - 0.66503906 + - 3.4492188 + - 0.47387695 + - 1.28125 + - -0.3215332 + - -3.09375 + - -1.6669922 + - -0.59765625 + - -3.7890625 + - 8.9296875 + - 1.1962891 + - 1.4658203 + - -0.5292969 + - 0.5283203 + - -1.4980469 + - 0.4362793 + - 1.1601563 + - -1.2988281 + - -5.4726563 + - -3.3964844 + - 4.6328125 + - -4.1757813 + - 1.8066406 + - -1.8466797 + - -2.8164063 + - 1.296875 + - 0.8886719 + - -0.58203125 + - 0.27270508 + - 1.25 + - 1.1113281 + - -3.1777344 + - 0.07476807 + - -4.0429688 + - 1.7041016 + - -1.5908203 + - 1.2070313 + - -3.5976563 + - 0.81103516 + - -1.4306641 + - 0.9394531 + - -2.4980469 + - -1.0517578 + - 0.07281494 + - 2.2519531 + - 3.2441406 + - 0.49902344 + - 1.6640625 + - -1.6152344 + - 2.421875 + - 1.2851563 + - -0.71875 + - -1.1757813 + - -2.6894531 + - -0.24438477 + - 0.5205078 + - 2.5664063 + - -2.8769531 + - -0.093566895 + - -0.00390625 + - 4.234375 + - -0.012275696 + - -2.2246094 + - 0.36572266 + - 1.9814453 + - -2.2167969 + - -2.3164063 + - -0.9794922 + - 1.2119141 + - 1.9492188 + - -0.5366211 + - 0.7207031 + - -1.4638672 + - -0.29589844 + - 0.8256836 + - 3.0742188 + - -2.9179688 + - -2.7089844 + - 1.5957031 + - 1.8466797 + - 5.8125 + - 2.6308594 + - -1.5351563 + - 1.4619141 + - -0.5991211 + - 1.0800781 + - -1.6582031 + - -2.0136719 + - -0.91308594 + - 1.2207031 + - -1.9169922 + - 1.1708984 + - -1.0449219 + - 3.5253906 + - 4.34375 + - -0.51708984 + - 0.18188477 + - -0.23486328 + - -1.4326172 + - -3.3300781 + - -2.8691406 + - -0.890625 + - 1.3818359 + - -1.0712891 + - 0.85791016 + - 2.171875 + - 1.5488281 + - 1.4101563 + - -0.41503906 + - 0.8691406 + - -4.9179688 + - -0.90283203 + - -8.3046875 + - -1.7314453 + - -2.0175781 + - -2.2753906 + - -2.9023438 + - -0.96533203 + - 2.8378906 + - -6.7421875 + - -4.4335938 + - 24.671875 + - -1.7314453 + - -1.6464844 + - -0.65722656 + - -0.1796875 + - 0.51416016 + - 2.3203125 + - 3.0976563 + - -2.1542969 + - 1.1396484 + - 1.6914063 + - -0.0390625 + - 0.88378906 + - -1.4277344 + - 0.4267578 + - 0.08758545 + - -3.4179688 + - 0.72802734 + - 4.8867188 + - -0.75634766 + - -0.5488281 + - -1.4765625 + - -2.4765625 + - 0.65625 + - -0.3408203 + - 3.7578125 + - 0.36083984 + - -2.0878906 + - 2.2285156 + - -0.27612305 + - 1.5869141 + - -2.5488281 + - 0.7753906 + - 0.4025879 + - 1.2587891 + - -0.55908203 + - 1.6416016 + - 2.9863281 + - 4.1796875 + - 0.13830566 + - -0.85595703 + - -0.55566406 + - 2.0410156 + - -3.8964844 + - 0.77978516 + - -0.2824707 + - 3.2734375 + - 1.1845703 + - -2.0351563 + - 0.7270508 + - 2.3515625 + - 0.83691406 + - -3.1015625 + - -1.3193359 + - -2.0195313 + - -1.6425781 + - -2.9023438 + - -0.42871094 + - 2.3789063 + - -3.4550781 + - -2.8339844 + - 1.1816406 + - -0.5722656 + - 2.453125 + - -2.5 + - -0.10070801 + - -1.1962891 + - -0.010597229 + - -2.734375 + - 1.5898438 + - -4.609375 + - -4.359375 + - -0.1171875 + - -1.5556641 + - 1.4550781 + - 8.6328125 + - 0.89501953 + - 3.6816406 + - -4.7578125 + - 1.1894531 + - -0.67626953 + - 1.3095703 + - 0.9038086 + - 0.67626953 + - -0.16235352 + - -4.78125 + - 0.53125 + - 0.7607422 + - 2.5625 + - -0.83447266 + - -2.8378906 + - 0.44628906 + - -0.08538818 + - -0.5522461 + - -2.4765625 + - 1.4394531 + - 2.1074219 + - -2.5625 + - 5.3554688 + - 0.30908203 + - 0.36865234 + - 0.9243164 + - 0.52734375 + - 4.0117188 + - 0.27416992 + - 2.0800781 + - -1.8203125 + - -0.51904297 + - 0.5410156 + - 2.3886719 + - 7.1640625 + - 1.7148438 + - 1.0996094 + - -1.0556641 + - 3.5546875 + - 0.050476074 + - 1.7128906 + - 1.7871094 + - 2.2246094 + - -0.30566406 + - 3.09375 + - -0.69628906 + - 3.6015625 + - -4.4882813 + - -1.4697266 + - -2.0253906 + - 0.94189453 + - 0.001115799 + - 1.3408203 + - -0.42285156 + - 4.0742188 + - -1.9775391 + - -2.1054688 + - -0.84228516 + - 0.016174316 + - 2.9785156 + - 2.40625 + - 0.7363281 + - 1.1787109 + - 3.2851563 + - 4.1992188 + - 0.75634766 + - -0.5756836 + - 1.3769531 + - 2.0800781 + - -4.9882813 + - -4.578125 + - -0.9609375 + - 3.3125 + - -1.5917969 + - -0.75097656 + - -1.9638672 + - 2.8613281 + - 3.2753906 + - 3.265625 + - -0.8544922 + - -0.28344727 + - 1.3613281 + - -1.3515625 + - -0.44604492 + - 2.5839844 + - 2.6875 + - -0.9711914 + - -0.3581543 + - 0.4165039 + - 1.7861328 + - 0.39453125 + - -0.12207031 + - -0.35864258 + - 1.2529297 + - 2.140625 + - 0.9091797 + - -2.1191406 + - -0.3251953 + - -3.6425781 + - -4.8789063 + - -0.092163086 + - 2.5820313 + - -0.86035156 + - -0.36767578 + - 3.125 + - -2.1777344 + - 2.0097656 + - 0.5566406 + - -0.9897461 + - -2.9140625 + - 1.4013672 + - -0.5180664 + - 3.0625 + - 3.3476563 + - 1.2998047 + - -6.8359375 + - -0.47680664 + - -0.41845703 + - -5.390625 + - 2.1210938 + - -2.6621094 + - 2.4355469 + - 1.3867188 + - -6.4453125 + - 1.3076172 + - -0.65478516 + - -2.7988281 + - -2.4296875 + - 1.1220703 + - -0.37597656 + - 2.0761719 + - -0.4309082 + - -0.8129883 + - -33.875 + - -2.53125 + - -2.4140625 + - -0.3881836 + - -1.4277344 + - 2.09375 + - 2.4121094 + - -4.7539063 + - -4.6601563 + - -0.9038086 + - 1.1162109 + - -1.4375 + - -1.0976563 + - 6.7734375 + - 0.4885254 + - 4.7304688 + - -1.6601563 + - 4.3242188 + - -0.25097656 + - -1.4335938 + - 0.11437988 + - -0.45507813 + - 1.0791016 + - 1.8134766 + - -0.4350586 + - -4.0117188 + - -1.2519531 + - 0.053833008 + - 1.8681641 + - -0.36206055 + - 0.5722656 + - -1.265625 + - 0.3642578 + - -0.5629883 + - -3.4941406 + - 4.8632813 + - -3.3046875 + - -0.8071289 + - -2.328125 + - -3.4863281 + - 0.029571533 + - 1.9746094 + - 2.6328125 + - 0.01576233 + - 0.25268555 + - 1.7089844 + - 4.0039063 + - -0.63720703 + - 1.90625 + - -2.8339844 + - 2.6796875 + - -1.0927734 + - 0.26220703 + - -3.9238281 + - 3.0117188 + - 2.6074219 + - -2.9648438 + - 3.4550781 + - 2.6816406 + - 0.6645508 + - -1.0673828 + - -4.0117188 + - 3.0097656 + - 1.3544922 + - 1.5175781 + - -0.3876953 + - 0.039611816 + - -5.0078125 + - 0.8300781 + - 1.3789063 + - -2.2207031 + - 0.77441406 + - 2.6035156 + - 0.40454102 + - -0.56103516 + - 2.2070313 + - -1.4003906 + - -2.6953125 + - 0.8046875 + - 0.42114258 + - -1.2441406 + - 2.0878906 + - 0.47314453 + - 1.0439453 + - 3.0527344 + - 0.85058594 + - -1.2832031 + - 1.1123047 + - 2.0527344 + - 0.74658203 + - -2.3789063 + - 2.7949219 + - -1.0400391 + - 8.5703125 + - -1.4746094 + - 2.03125 + - -0.5991211 + - -0.8847656 + - -0.44628906 + - -0.66796875 + - 2.8222656 + - 0.049102783 + - 3.53125 + - 1.0810547 + - 2.125 + - -2.1464844 + - -2.4277344 + - 3.5800781 + - -0.17236328 + - 5.921875 + - -1.0566406 + - 5.921875 + - -2.0253906 + - -0.95410156 + - -1.4013672 + - 1.5019531 + - 0.3852539 + - 0.79003906 + - -1.5839844 + - 4.1132813 + - 2.96875 + - 2.4902344 + - 4.6875 + - -0.7216797 + - -2.0976563 + - 1.7167969 + - -1.4580078 + - -4.0742188 + - -3.1113281 + - 0.44921875 + - -4.3554688 + - -0.16064453 + - 1.7939453 + - 3.7304688 + - -1.1054688 + - -0.67529297 + - -30.3125 + - -0.85595703 + - -0.027618408 + - -0.6660156 + - 0.7626953 + - 3.5800781 + - 0.79296875 + - 1.8632813 + - 0.12609863 + - 2.0976563 + - 0.012275696 + - -0.1484375 + - -2.9160156 + - -2.2011719 + - 1.3662109 + - -2.3691406 + - 0.55859375 + - 0.073791504 + - -0.63134766 + - -1.5576172 + - 1.4433594 + - 10.890625 + - 3.125 + - -1.265625 + - 1.1884766 + - 0.94140625 + - -0.84814453 + - 2.3105469 + - 0.37841797 + - -2.6035156 + - 1.296875 + - 0.2529297 + - -2.203125 + - 0.34057617 + - 0.38110352 + - -2.0644531 + - -3.2285156 + - 0.17248535 + - -0.55126953 + - -1.90625 + - 5.6289063 + - 1.6572266 + - -1.2236328 + - 3.1679688 + - 1.0341797 + - 1.2763672 + - 0.0011701584 + - 3.1445313 + - 0.6489258 + - -1.7949219 + - 0.19189453 + - 3.5175781 + - -2.3945313 + - 2.4589844 + - -1.5351563 + - -2.0097656 + - -0.9692383 + - 4.3242188 + - 0.4519043 + - -4.0820313 + - 1.6386719 + - -0.49804688 + - -0.6801758 + - -1.8076172 + - -2.5019531 + - 0.077819824 + - -3.75 + - 0.7397461 + - 3.0078125 + - -6.9453125 + - 0.48876953 + - -1.3095703 + - -3.3691406 + - -3.0175781 + - 1.7734375 + - -0.8691406 + - -3.1191406 + - 0.06640625 + - 0.18615723 + - -0.3959961 + - -1.3349609 + - -0.6459961 + - 1.8984375 + - 1.75 + - 6.6757813 + - -1.4882813 + - -0.46704102 + - -1.2744141 + - -1.8183594 + - 2.0644531 + - -1.9638672 + - -0.7011719 + - 2.0664063 + - 0.15258789 + - 3.4492188 + - 0.890625 + - 0.921875 + - -1.0634766 + - 3.0039063 + - -0.6928711 + - 1.6298828 + - 0.5488281 + - -2.703125 + - -1.1425781 + - 0.41503906 + - -0.5839844 + - -0.2109375 + - 4.5625 + - 1.4433594 + - -0.11102295 + - -1.6738281 + - 4.5078125 + - -0.49682617 + - 2.0371094 + - -2.7558594 + - -1.8857422 + - 2.1015625 + - 2.515625 + - -0.82177734 + - 0.87597656 + - 1.6611328 + - -1.1982422 + - -1.96875 + - -1.2451172 + - 0.07476807 + - -0.46923828 + - -4.9023438 + - 0.047424316 + - -1.0195313 + - 3.3046875 + - 0.25048828 + - 0.66015625 + - -0.43066406 + - -0.13110352 + - 1.1132813 + - -0.35327148 + - -0.6738281 + - -0.47021484 + - -1.140625 + - -4.4179688 + - 0.7680664 + - 4.2070313 + - 0.112854004 + - 1.3613281 + - 1.8691406 + - 0.6191406 + - 3.9082031 + - -1.546875 + - 0.0418396 + - 2.265625 + - 2.2480469 + - 2.8027344 + - -1.9775391 + - 1.8564453 + - -1.6796875 + - 1.6044922 + - -2.3691406 + - 0.18969727 + - 1.0859375 + - 2.8300781 + - -0.6640625 + - 2.6914063 + - 2.7753906 + - 1.3164063 + - 2.5449219 + - -2.40625 + - 4.4960938 + - -2.4257813 + - -0.54003906 + - 1.7001953 + - -0.63427734 + - -2.5 + - 1.7324219 + - 0.1015625 + - -2.2871094 + - -1.5751953 + - -1.5019531 + - -1.6982422 + - -2.8789063 + - 3.1425781 + - 1.8701172 + - 1.7558594 + - -2.7441406 + - -0.32348633 + - -0.13171387 + - 2.4902344 + - 0.3330078 + - 2.4199219 + - -3.0214844 + - -0.18884277 + - 0.44799805 + - 1.0439453 + - 0.17492676 + - 4.0351563 + - -0.08843994 + - 1.4238281 + - -0.7919922 + - -1.9882813 + - -0.9272461 + - 1.3662109 + - 1.046875 + - 0.63427734 + - 1.2451172 + - -3.4550781 + - 0.17297363 + - 1.7441406 + - 0.62353516 + - -0.3647461 + - 1.515625 + - -1.1552734 + - -2.4160156 + - -5.5429688 + - -4.09375 + - 6.078125 + - -1.3701172 + - -0.91015625 + - 1.1992188 + - -1.7529297 + - 2.0800781 + - -1.6416016 + - -2.3925781 + - -3.8867188 + - -2.203125 + - -2.6425781 + - 0.7397461 + - 0.2734375 + - 1.4511719 + - -0.7939453 + - -1.1513672 + - 0.75683594 + - 0.1204834 + - -3.5039063 + - -1.7607422 + - -1.4775391 + - 3.1015625 + - 2.0839844 + - 6.2929688 + - -0.44384766 + - 2.5175781 + - -1.7080078 + - 1.8369141 diff --git a/backends/candle/tests/snapshots/test_flash_mistral__mistral_single.snap b/backends/candle/tests/snapshots/test_flash_mistral__mistral_single.snap new file mode 100644 index 00000000..b238aa6a --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_mistral__mistral_single.snap @@ -0,0 +1,4101 @@ +--- +source: backends/candle/tests/test_flash_mistral.rs +assertion_line: 48 +expression: embeddings_single +--- +- - 3.2363281 + - -1.1582031 + - 1.0810547 + - -2.0234375 + - 1.6054688 + - -1.0048828 + - 0.4362793 + - -0.87646484 + - 0.7988281 + - -0.2722168 + - 0.49365234 + - -0.8203125 + - 0.17041016 + - -0.73291016 + - -0.34936523 + - 0.03543091 + - 0.34277344 + - 1.3779297 + - 1.5234375 + - -1.8720703 + - -1.4052734 + - 1.6289063 + - -1.1650391 + - 0.6503906 + - 1.7939453 + - 1.9814453 + - -0.43286133 + - 1.3994141 + - -0.3486328 + - -2.5253906 + - 2.5390625 + - 0.32348633 + - 2.2988281 + - 1.5175781 + - -0.28735352 + - 1.1669922 + - -3.4550781 + - 0.07141113 + - -5.2773438 + - -0.8330078 + - 0.75683594 + - -2.4296875 + - -0.9194336 + - -0.98095703 + - -1.7236328 + - 2.0722656 + - 0.234375 + - -3.9003906 + - -1.4003906 + - 0.8334961 + - 3.9121094 + - -0.4350586 + - -3.0488281 + - -100.5625 + - -3.0742188 + - -0.93408203 + - 2.7128906 + - -1.0556641 + - -1.3759766 + - -7.3671875 + - -2.3769531 + - 0.57910156 + - 0.83740234 + - 0.13171387 + - 2.4042969 + - 0.07281494 + - -2.5449219 + - 0.5151367 + - 2.0644531 + - -1.5566406 + - -4.6640625 + - 0.051605225 + - -2.9902344 + - -0.9008789 + - -1.2304688 + - -0.40454102 + - 2.9863281 + - 3.1367188 + - -0.13916016 + - -0.36206055 + - -0.640625 + - -0.6069336 + - -1.5878906 + - -0.34594727 + - -2.0214844 + - 0.5366211 + - -1.8007813 + - -0.15222168 + - 2.2597656 + - 0.86816406 + - -1.2304688 + - 5.9375 + - 2.7089844 + - -19.703125 + - -2.8144531 + - -2.7832031 + - -4.4414063 + - 0.36035156 + - 1.5751953 + - -4.09375 + - 1.6904297 + - -1.3564453 + - -3.8652344 + - -0.61035156 + - 0.006626129 + - -2.7910156 + - 0.07922363 + - -1.3349609 + - -1.5810547 + - -0.059143066 + - 0.03945923 + - 0.43066406 + - 0.47851563 + - -1.5595703 + - -0.055236816 + - 3.03125 + - 2.8515625 + - 0.70703125 + - -0.18713379 + - 0.296875 + - 2.2421875 + - 0.5942383 + - 0.15258789 + - -2.4863281 + - -2.2011719 + - -0.26879883 + - 2.4003906 + - -0.7294922 + - 0.32739258 + - 1.5878906 + - 2.3789063 + - 0.171875 + - -3.2539063 + - 1.1572266 + - 1.2333984 + - 2.4101563 + - -0.30664063 + - 0.7890625 + - -1.2041016 + - -1.484375 + - 1.5195313 + - -0.41796875 + - 1.3525391 + - -2.7753906 + - 1.1738281 + - -2.8027344 + - -1.7988281 + - -0.93603516 + - -2.5703125 + - 4.578125 + - 0.7866211 + - -1.9257813 + - -1.0458984 + - 0.037109375 + - 0.5161133 + - -2.7832031 + - 0.90527344 + - -0.5083008 + - -3.0410156 + - -3.1289063 + - -1.2539063 + - -2.6191406 + - -0.5517578 + - -1.140625 + - 0.5136719 + - 1.4003906 + - 3.3613281 + - -1.1591797 + - -0.7578125 + - -0.4633789 + - -2.6328125 + - -1.9306641 + - -0.4375 + - -2.9804688 + - -0.09539795 + - 0.25195313 + - -1.3125 + - 2.09375 + - -4.265625 + - -2.2539063 + - 1.7919922 + - 0.8027344 + - -1.8613281 + - -1.8544922 + - 0.13720703 + - 5.1015625 + - -3.4863281 + - -0.8515625 + - -1.1826172 + - 0.073913574 + - -1.9101563 + - -3.7773438 + - -0.5566406 + - 0.6411133 + - -2.2441406 + - 1.4951172 + - 3.6308594 + - -2.1640625 + - -1.4902344 + - 0.13244629 + - 0.4428711 + - -2.3515625 + - 1.9189453 + - 0.7084961 + - 7.9296875 + - 3.2929688 + - 4.2617188 + - -2.84375 + - -0.34692383 + - -2.2246094 + - -2.0625 + - -0.74853516 + - -2.90625 + - -0.8613281 + - 0.83447266 + - 3.9550781 + - -0.0033473969 + - -2.5214844 + - 3.0957031 + - -0.7055664 + - -3.8515625 + - 0.63378906 + - -0.32470703 + - 3.125 + - -0.085510254 + - -1.2158203 + - 0.09539795 + - 0.765625 + - 0.3972168 + - -3.1484375 + - 0.77734375 + - -0.76708984 + - -1.0068359 + - -0.88720703 + - -0.203125 + - 1.5800781 + - 0.74072266 + - 2.3691406 + - 2.8554688 + - 1.6591797 + - 6.0390625 + - -0.35083008 + - -3.4589844 + - 0.22875977 + - -2.2265625 + - -1.7607422 + - 3.2695313 + - 2.5605469 + - -0.6118164 + - 0.20898438 + - 1.2519531 + - 0.4440918 + - -2.1269531 + - 0.515625 + - 0.625 + - -0.69921875 + - -0.33081055 + - -2.28125 + - 0.03012085 + - 0.34375 + - 1.4726563 + - 1.8476563 + - 1.8925781 + - 1.890625 + - -0.3762207 + - 2.4140625 + - -2.2988281 + - 3.9140625 + - 0.85595703 + - -4.6953125 + - 0.32910156 + - 0.8154297 + - 3.2382813 + - 0.82910156 + - -0.42822266 + - -1.1640625 + - -3.9316406 + - 1.3710938 + - 0.18383789 + - 1.0302734 + - -2.1308594 + - -2.6738281 + - 1.3876953 + - 0.13671875 + - 1 + - -0.7792969 + - -0.064697266 + - 1.8291016 + - 0.65722656 + - 0.03186035 + - 1.7236328 + - 1.2119141 + - 10.078125 + - 0.06500244 + - 0.6723633 + - -0.4814453 + - 1.8417969 + - -1.4003906 + - 2.2128906 + - -0.5473633 + - -0.07757568 + - -0.20861816 + - 2.7636719 + - 3.3300781 + - -1.640625 + - 1.5292969 + - 2.4765625 + - 1.4394531 + - -0.09094238 + - -1.203125 + - -1.6669922 + - -0.10656738 + - -0.8984375 + - 0.07366943 + - 1.1894531 + - -2.4375 + - 0.08148193 + - -0.140625 + - -3.1875 + - 1.2861328 + - 1.8310547 + - 1.2421875 + - -3.8359375 + - 2.5703125 + - -1.4082031 + - -0.7836914 + - -1.3457031 + - -1.5019531 + - 2.3652344 + - -3.5800781 + - -4.078125 + - 1.7050781 + - 1.5644531 + - 0.7675781 + - 2.3378906 + - -0.11633301 + - 2.78125 + - -0.4987793 + - 0.0914917 + - 0.10571289 + - 2.7597656 + - -0.4482422 + - 2.1015625 + - 1.5498047 + - 1.9423828 + - 1.1533203 + - -0.21398926 + - 2.6796875 + - -5.0664063 + - -0.8828125 + - 2.1503906 + - -1.2607422 + - 0.3330078 + - 0.5073242 + - -2.1738281 + - -0.7817383 + - -4.09375 + - -1.6074219 + - -1.6220703 + - -1.4130859 + - -1.4902344 + - 1.7304688 + - 4.359375 + - -1.3847656 + - 2.96875 + - -2.9003906 + - 6.1679688 + - 1.703125 + - 1.4638672 + - -2.6914063 + - 0.77001953 + - -1.5253906 + - -2.1230469 + - 3.5039063 + - -0.40283203 + - 3.5976563 + - -1.4462891 + - 0.39208984 + - 0.70947266 + - 2.4726563 + - -1.3896484 + - -1.2861328 + - -1.9472656 + - -0.86035156 + - -0.7050781 + - 1.8564453 + - 1.8613281 + - -4.2226563 + - -8.125 + - -2.109375 + - 0.45532227 + - -0.09313965 + - -2.6660156 + - -0.9580078 + - 0.046875 + - -0.29736328 + - 2.6464844 + - 2.1054688 + - -2.1464844 + - 1.5488281 + - -2.3359375 + - 1.5898438 + - -0.5644531 + - -4.34375 + - -0.17236328 + - 1.7988281 + - 2.046875 + - -2.1660156 + - -14.390625 + - -0.1204834 + - -2.2128906 + - -1.6064453 + - 3.1152344 + - -1.1582031 + - 1.4433594 + - -0.19799805 + - -3.6875 + - -1.4189453 + - -3.6191406 + - 5.109375 + - -0.5004883 + - -0.4711914 + - 2.7988281 + - -0.33129883 + - -0.76171875 + - 1.0517578 + - 0.16320801 + - -2.0371094 + - 2.2246094 + - -1.4384766 + - -1.9189453 + - -1.7138672 + - -3.8613281 + - 0.84814453 + - -0.37939453 + - -1.8515625 + - 0.58203125 + - -1.9013672 + - 0.75097656 + - 1.6738281 + - -1.3115234 + - -1.5058594 + - -0.6225586 + - -1.6416016 + - -2.203125 + - -0.9116211 + - 0.06585693 + - 2.7050781 + - -2.1699219 + - -3.5800781 + - -0.0075302124 + - 1.5263672 + - -0.5859375 + - -2.0429688 + - -0.47314453 + - 5.609375 + - 4.625 + - -0.036254883 + - 0.06878662 + - 3.2851563 + - -0.44848633 + - -2.8945313 + - -1.7666016 + - 2.7695313 + - -0.9326172 + - -0.84472656 + - -0.9819336 + - 0.27319336 + - 0.33789063 + - -2.3496094 + - 4.9335938 + - 2.3125 + - 0.296875 + - 1.015625 + - 0.34985352 + - 0.4375 + - 0.8125 + - -0.91259766 + - -0.60546875 + - 3.8242188 + - 0.56884766 + - 0.5625 + - 0.9741211 + - -1.9951172 + - -0.32543945 + - 1.2128906 + - -6.0039063 + - 0.13793945 + - 3.71875 + - -0.5605469 + - 0.46289063 + - 1.5683594 + - -0.7011719 + - -0.4658203 + - -2.6289063 + - -1.3330078 + - 2.4589844 + - -2.0410156 + - -2.9179688 + - 5.3789063 + - 0.21728516 + - -5.9609375 + - 2.0371094 + - 0.051330566 + - 1.3349609 + - 3.8339844 + - -0.62158203 + - -0.61035156 + - -1.5869141 + - 2.8496094 + - 3.6738281 + - -2.5761719 + - -1.5 + - 0.6928711 + - -2.0371094 + - 1.6220703 + - -0.34204102 + - -0.5527344 + - -1.4384766 + - -0.5102539 + - 0.5991211 + - 1.5878906 + - 3.6777344 + - -0.01701355 + - 0.55566406 + - 1.4580078 + - 0.20336914 + - -1.375 + - 1.6777344 + - 2.1894531 + - 0.85302734 + - 0.45385742 + - -0.0055770874 + - -1.8759766 + - 3.5820313 + - 0.16687012 + - -4.5078125 + - -0.12371826 + - -0.3569336 + - -1.6259766 + - -1.9589844 + - -1.0117188 + - 3.1054688 + - -0.84765625 + - -4.8398438 + - -2.3632813 + - -1.3837891 + - 0.20227051 + - 1.984375 + - 1.4824219 + - 0.63720703 + - 1.9658203 + - -17.703125 + - -1.4570313 + - -1.0488281 + - -2 + - -1.3818359 + - 0.6147461 + - 0.203125 + - 0.0036258698 + - 2.34375 + - -3.4863281 + - -1.0546875 + - -2.2402344 + - 1.2724609 + - -1.0302734 + - 0.8774414 + - -2.4511719 + - -1.4433594 + - -2.3476563 + - -2.2890625 + - -0.8935547 + - -1.9257813 + - 0.9921875 + - 0.2890625 + - -1.2851563 + - 1.1181641 + - 0.57421875 + - 0.31811523 + - 0.72314453 + - -3.2070313 + - 0.65966797 + - 2.5644531 + - -3.21875 + - -2.9375 + - 1.6806641 + - 1.6425781 + - -2.3378906 + - -3.4960938 + - -1.1923828 + - 1.4433594 + - -3.1875 + - -1.8876953 + - -0.10430908 + - -1.9082031 + - 1.4277344 + - 5.1757813 + - 3.9101563 + - 1.0273438 + - 3.2441406 + - -0.8261719 + - -0.68408203 + - 0.056915283 + - -2.2558594 + - -2.3261719 + - 0.15344238 + - -3.6953125 + - 0.5649414 + - -4.3789063 + - 0.9536133 + - 2.5917969 + - -1.7558594 + - -1.9824219 + - 1.9570313 + - -0.6069336 + - -0.25170898 + - -1.5556641 + - 1.8720703 + - -2.140625 + - 0.001115799 + - 1.4619141 + - 1.8613281 + - 0.002231598 + - 0.44140625 + - -1.609375 + - 3.4902344 + - 0.036834717 + - 1.4189453 + - 0.78222656 + - -0.125 + - 1.7041016 + - -0.5253906 + - -3.2265625 + - -2.6875 + - 0.61328125 + - 2.6132813 + - -2.8164063 + - -0.8310547 + - -0.25170898 + - 0.034576416 + - -2.2246094 + - -2.5664063 + - -0.08154297 + - 2.7851563 + - 4.390625 + - -1.0859375 + - 0.5961914 + - -4.6757813 + - 7.9101563 + - -3.1484375 + - 0.7319336 + - 3.3535156 + - -1.6201172 + - -2.59375 + - 0.98291016 + - -1.6289063 + - -0.5541992 + - 2.6914063 + - 3.8085938 + - -0.45996094 + - 1.4609375 + - 1.0556641 + - 1.6582031 + - 3.1054688 + - -0.5498047 + - 2.4003906 + - 1.8154297 + - -2.0449219 + - 0.22497559 + - 0.9868164 + - -0.52490234 + - -1.0039063 + - 0.6166992 + - 0.609375 + - -0.7138672 + - -2.9492188 + - -0.19580078 + - -0.9863281 + - -0.18981934 + - 0.0446167 + - 1.5244141 + - 1.7304688 + - 1.015625 + - -1.4150391 + - 7.7539063 + - 3.3671875 + - 7.0976563 + - 1.4716797 + - -5.71875 + - -5.8828125 + - -0.3815918 + - -1.3154297 + - -0.3232422 + - -1.5888672 + - 0.18579102 + - -0.23291016 + - -1.0429688 + - 1.6132813 + - -1.9462891 + - 2.6738281 + - 3.2207031 + - 3.6679688 + - -0.9086914 + - -2.5136719 + - 0.5102539 + - 24.09375 + - 1.2988281 + - 0.88183594 + - 0.09259033 + - -3.0175781 + - 1.8251953 + - 0.71240234 + - 0.7685547 + - -2.15625 + - 1.1123047 + - 3.0058594 + - 2.9707031 + - -0.28710938 + - -0.04937744 + - 0.5996094 + - 4.7890625 + - 1.4404297 + - 3.0644531 + - -5.0585938 + - -0.171875 + - -1.8632813 + - -1.8867188 + - -3.6425781 + - 0.9008789 + - -0.4501953 + - 1.4492188 + - -0.27001953 + - -1.8603516 + - 2.15625 + - 0.66259766 + - -3.4140625 + - -5.734375 + - -0.2175293 + - -3.0253906 + - -0.99658203 + - 1.8369141 + - -1.4111328 + - 1.4414063 + - 3.9785156 + - -1.9648438 + - -1.5273438 + - -1.875 + - 2.2949219 + - -0.2331543 + - -0.55810547 + - 1.2763672 + - 0.61083984 + - 1.4492188 + - 0.84228516 + - -0.7363281 + - -0.9975586 + - -3.1113281 + - 2.9492188 + - -0.51416016 + - 0.32739258 + - -2.6601563 + - -1.5888672 + - 1.0517578 + - 0.116882324 + - -1.2705078 + - -1.6640625 + - 2.1640625 + - -1.7226563 + - -1.7275391 + - -0.45581055 + - -0.26733398 + - 2.6152344 + - 0.42016602 + - -1.1191406 + - -0.46948242 + - 4.125 + - 1.4794922 + - -0.26660156 + - 2.9726563 + - -2.859375 + - 2.3183594 + - 0.52001953 + - -1.1894531 + - -3.203125 + - -1.1923828 + - 2.2304688 + - -2.4980469 + - 5.8789063 + - -0.002231598 + - 2.4101563 + - -0.78125 + - -1.4570313 + - 0.85595703 + - 2.6875 + - 0.5 + - -1.1445313 + - -0.55908203 + - 0.46972656 + - 1.1552734 + - -3.6191406 + - 2.3222656 + - -4.75 + - -4.75 + - -3.7851563 + - 1.0068359 + - 3.9140625 + - 1.4355469 + - -1.3916016 + - 0.17407227 + - 2.4257813 + - 1.2197266 + - -2.609375 + - 1.1171875 + - -1.5351563 + - -4.0273438 + - -0.3540039 + - 5.6328125 + - 0.22961426 + - 2.1113281 + - 1.9863281 + - -0.9980469 + - 2.140625 + - -0.2734375 + - -2.8144531 + - -0.19921875 + - 4.5820313 + - -2.5644531 + - -0.36279297 + - 2.8847656 + - -1.4326172 + - 0.06750488 + - 1.0771484 + - -1.1982422 + - -9.3359375 + - 1.4482422 + - -47.28125 + - -1.2910156 + - -0.60595703 + - -2.0683594 + - -3.9179688 + - -0.47753906 + - 0.29614258 + - 1.0644531 + - 1.6621094 + - 1.0615234 + - 0.18664551 + - -1.7929688 + - 4.6835938 + - -0.5258789 + - -2.0019531 + - 1.5908203 + - 1.1064453 + - -0.72509766 + - 16.984375 + - 0.42407227 + - -0.97509766 + - -1.2607422 + - -0.94140625 + - -0.58251953 + - 0.40063477 + - 2.8007813 + - 0.87109375 + - -1.6220703 + - -0.42578125 + - -2.6699219 + - -0.9589844 + - -2.4199219 + - 0.1784668 + - 0.50146484 + - -0.8803711 + - 2.4511719 + - 1.0332031 + - 0.80566406 + - 1.4453125 + - 0.50878906 + - 3.9179688 + - -0.37817383 + - 1.0478516 + - 0.25683594 + - -3.1425781 + - 2.5253906 + - 0.12548828 + - -1.2929688 + - -0.5229492 + - -2.9902344 + - 0.3515625 + - -1.6113281 + - -0.08203125 + - -0.65966797 + - -0.06137085 + - 0.20996094 + - 1.9462891 + - -4.1523438 + - -2.4902344 + - 0.3618164 + - 0.18371582 + - -1.0068359 + - -2.59375 + - 1.2685547 + - 6.5976563 + - -0.65185547 + - -0.7446289 + - 4.7265625 + - -2.2558594 + - 2.3105469 + - -2.0644531 + - -0.16882324 + - 0.17822266 + - -2.3066406 + - 2.8925781 + - -4.5742188 + - 3.5976563 + - -1.0625 + - 5.234375 + - 0.47021484 + - 0.3149414 + - -3.0703125 + - 1.9140625 + - 0.18664551 + - 1.9296875 + - 2.9335938 + - -1.0634766 + - -0.28735352 + - 0.26293945 + - -0.7158203 + - 2.5664063 + - -1.4658203 + - -1.5371094 + - -2.7050781 + - 1.2421875 + - -0.47607422 + - -0.35009766 + - -0.84472656 + - -3.4140625 + - -1.09375 + - -2.1328125 + - -5.7382813 + - -1.1669922 + - 0.2524414 + - 1.3486328 + - 3.4140625 + - 3.4492188 + - 0.40039063 + - 0.56640625 + - 0.06439209 + - 0.7709961 + - 0.99365234 + - -1.6416016 + - 2.9238281 + - 0.9736328 + - 1.3349609 + - -2.6855469 + - 2.3144531 + - -2.046875 + - 2.2109375 + - 1.6347656 + - 0.484375 + - -1.6738281 + - -1.7783203 + - 0.17663574 + - 0.31176758 + - 4.0273438 + - -0.72509766 + - 3.1933594 + - 2.3925781 + - 2.6542969 + - 1.484375 + - -0.05355835 + - 1.9794922 + - 0.39257813 + - 0.24121094 + - 2.7246094 + - -0.80126953 + - -2.8066406 + - 0.16589355 + - -2.1699219 + - -2.03125 + - -2.4511719 + - -3.0097656 + - 1.8994141 + - 2.8339844 + - 2.7753906 + - -2.4824219 + - 0.84228516 + - -3.1992188 + - 2.2734375 + - -1.7246094 + - 4.734375 + - 4.6914063 + - 0.59472656 + - -0.5366211 + - 1.7763672 + - 0.2956543 + - 2.3574219 + - -4.1796875 + - 3.9277344 + - -1.46875 + - -4.9414063 + - -1.9033203 + - -1.0361328 + - -0.3449707 + - -2.9414063 + - -15.5703125 + - 2.0390625 + - -1.2744141 + - 4.1445313 + - 1.2207031 + - 3.3535156 + - 1.3818359 + - 1.5976563 + - -0.45166016 + - -0.6635742 + - 1.65625 + - -2.0996094 + - 2.4941406 + - 1.4931641 + - 2.0800781 + - -3.2714844 + - 0.96191406 + - -0.0055770874 + - -0.21203613 + - 1.2304688 + - 2.2519531 + - -1.0205078 + - 0.35668945 + - -0.019805908 + - 1.59375 + - -4.4726563 + - 0.2109375 + - -1.7705078 + - -16.6875 + - 0.61816406 + - 0.119384766 + - 2.9882813 + - -4.9882813 + - -1.5654297 + - 0.2705078 + - 1.1875 + - -5.0273438 + - -2.6191406 + - -2.6113281 + - 3.7070313 + - -0.53222656 + - -0.44799805 + - -2.3652344 + - 0.7050781 + - -6.203125 + - -1.1806641 + - -0.3515625 + - 0.73828125 + - 1.1845703 + - -1 + - -0.24719238 + - -2.4667969 + - -0.6381836 + - 2.9179688 + - -3.5039063 + - -0.040161133 + - -0.52783203 + - 1.5332031 + - 3.4589844 + - -1.8183594 + - 0.32641602 + - -1.4794922 + - -0.75 + - 2.2285156 + - -0.75390625 + - 0.43066406 + - -18.859375 + - -0.33496094 + - -1.8964844 + - 2.4355469 + - -4.1835938 + - 2.4101563 + - 0.5703125 + - 1.2275391 + - 1.6376953 + - -0.6977539 + - 1.4189453 + - -1.1503906 + - 2.2636719 + - -1.9921875 + - 0.5078125 + - -0.11853027 + - 0.58691406 + - 0.04714966 + - 1.4111328 + - -4.8007813 + - -1.421875 + - 2.3105469 + - -2.7324219 + - -0.19165039 + - 2.9023438 + - -1.453125 + - 3.1464844 + - -2.5957031 + - -1.5205078 + - 2.0761719 + - 1.3583984 + - 3.15625 + - -2.1542969 + - -1.4980469 + - -1.6445313 + - -0.41552734 + - -0.60791016 + - -1.6884766 + - 1.4931641 + - 1.8642578 + - 3.7695313 + - 1.6601563 + - 2.2988281 + - 3.6582031 + - -2.0839844 + - 0.41430664 + - -2.2949219 + - -1.4238281 + - -6.0546875 + - 1.0351563 + - 2.46875 + - 0.46142578 + - 0.2512207 + - 0.19921875 + - -2.0976563 + - 0.60302734 + - 0.1508789 + - 8.0703125 + - -0.37890625 + - -1.6367188 + - -1.1289063 + - 1.1582031 + - 1.5166016 + - 1.8085938 + - -1.7597656 + - -1.9277344 + - 0.43237305 + - 2.6953125 + - 0.68310547 + - 3.0742188 + - -3.4238281 + - -4.5898438 + - 0.8183594 + - 0.8173828 + - 1.5820313 + - 0.97314453 + - 0.3359375 + - -0.24768066 + - 4.140625 + - 0.4609375 + - 0.12164307 + - -2.3164063 + - 1.6376953 + - -0.86328125 + - 1.2705078 + - -3.3242188 + - -0.4831543 + - 1.75 + - -2.6875 + - 1.2890625 + - 3.96875 + - 2.2597656 + - -0.89990234 + - -0.88964844 + - 1.5273438 + - 1.3662109 + - 0.67626953 + - 2.8710938 + - 4.9335938 + - -0.4152832 + - 1.0458984 + - -0.6816406 + - 0.17663574 + - 0.75 + - 2.2324219 + - 1.2294922 + - 1.1123047 + - 0.13781738 + - -4.578125 + - -0.58251953 + - 3.1289063 + - -2.9101563 + - -0.50390625 + - -3.1054688 + - -0.7910156 + - 2.46875 + - 6.375 + - 1.0224609 + - -1.5839844 + - 1.7207031 + - 2.2578125 + - -0.5307617 + - -1.3740234 + - 1.2626953 + - -5.4179688 + - 1.2460938 + - 2.6777344 + - 5.4140625 + - -0.45336914 + - 0.5151367 + - -1.0908203 + - -0.8769531 + - -2.59375 + - -3.6132813 + - 3.6015625 + - -0.8696289 + - 0.9765625 + - 5.375 + - -2.1015625 + - -1.2519531 + - -2.5078125 + - -0.39208984 + - -0.044769287 + - 0.2902832 + - -1.1806641 + - -0.1352539 + - 3.3046875 + - -0.9975586 + - 0.38891602 + - 1.9707031 + - 0.58154297 + - -0.54052734 + - -0.30859375 + - 3.3164063 + - -0.28027344 + - 0.87158203 + - 1.84375 + - 2.5957031 + - 0.625 + - -0.63720703 + - -3.7226563 + - -3.2988281 + - 0.060546875 + - 3.0703125 + - -0.93847656 + - 2.4707031 + - -0.65722656 + - 1.5 + - -0.15563965 + - -3.625 + - 0.98095703 + - 0.1015625 + - -0.14416504 + - -1.1445313 + - -2.4316406 + - 6.703125 + - -2.4082031 + - 0.82910156 + - -1.2744141 + - 2.6484375 + - 0.7402344 + - -0.6870117 + - -2.0546875 + - 0.016738892 + - -3.9648438 + - 0.97753906 + - 0.3684082 + - 1.9726563 + - 1.2236328 + - 11.5703125 + - -1.9707031 + - -1.2548828 + - 1.5488281 + - 0.38598633 + - 6.0546875 + - 4.0273438 + - 0.3269043 + - -1.5107422 + - -0.71191406 + - 0.52734375 + - 8.3046875 + - 0.3881836 + - -0.64404297 + - 0.2421875 + - -1.1992188 + - 0.69873047 + - -3.1113281 + - -2.7441406 + - -2.3984375 + - -3.6738281 + - 1.8623047 + - -3.6796875 + - -1.0703125 + - 1.0117188 + - 0.83203125 + - -4.9375 + - -0.24768066 + - 0.37231445 + - 1.9902344 + - -0.44458008 + - -1.4228516 + - 1.3271484 + - -1.1367188 + - -1.125 + - 2.2480469 + - 0.48657227 + - 1.9863281 + - 4.1679688 + - -1.84375 + - 1.5097656 + - 0.41918945 + - -4.1914063 + - -1.8837891 + - -0.30249023 + - -1.7529297 + - 3.1015625 + - -1.015625 + - 0.49438477 + - 3.1601563 + - 0.076171875 + - 3.5742188 + - -0.7426758 + - 3.171875 + - -1.8476563 + - 3.15625 + - -0.8876953 + - -3.9023438 + - -2.7324219 + - -3.7519531 + - 1.6601563 + - 1.1337891 + - -0.98876953 + - -0.70947266 + - -0.7890625 + - -0.30151367 + - -2.2441406 + - -1.0410156 + - 1.1416016 + - 1.0859375 + - -0.74365234 + - 2.7128906 + - -9.2578125 + - 3.6777344 + - 3.4101563 + - -0.7944336 + - 0.8720703 + - -2.4628906 + - -0.8623047 + - 0.82177734 + - -0.097351074 + - 1.9794922 + - 0.9145508 + - -0.82421875 + - 3.8378906 + - 0.4519043 + - -1.5556641 + - -2.7050781 + - -0.60253906 + - 1.1113281 + - -0.43481445 + - -2.0175781 + - -0.31811523 + - -0.0758667 + - -1.5087891 + - 3.2519531 + - 0.3737793 + - -6.2070313 + - 1.9091797 + - 4.3554688 + - -0.013671875 + - 0.04714966 + - 0.29467773 + - 0.8154297 + - 1.7441406 + - 2.4199219 + - 3.375 + - 0.42578125 + - 0.55810547 + - -0.4350586 + - -0.10180664 + - 1.4433594 + - 2.7324219 + - -0.17236328 + - -3.9609375 + - 10.78125 + - 2.2988281 + - -3.1757813 + - -71.0625 + - 0.85791016 + - -1.6738281 + - -0.8847656 + - 2.8320313 + - 4.7890625 + - 1.6933594 + - 0.89697266 + - -0.09313965 + - -2.2050781 + - -2.7636719 + - 1.6953125 + - -0.71533203 + - 2.3476563 + - 0.35327148 + - -5.0625 + - -2.6953125 + - -3.0058594 + - -0.32592773 + - 1.7832031 + - 2.4550781 + - 0.5229492 + - 1.1347656 + - -0.9584961 + - -1.6064453 + - -2.7519531 + - -1.6699219 + - -3.28125 + - 1.0976563 + - -1.7207031 + - 1.1289063 + - -4.6367188 + - 0.08868408 + - -1.1123047 + - -3.8847656 + - 1.0830078 + - 1.0185547 + - -0.043792725 + - 1.3076172 + - -2.6289063 + - -0.30395508 + - -1.3193359 + - 4.21875 + - 1.7939453 + - 1.2841797 + - -2.6074219 + - 2.0527344 + - 1.4726563 + - 2.9414063 + - 0.3347168 + - 1.2998047 + - -0.56591797 + - 1.0771484 + - 9.7265625 + - -4.9023438 + - 1.8222656 + - 0.13598633 + - 0.9267578 + - 0.3774414 + - -2.0136719 + - 0.92089844 + - 2.0449219 + - 0.38598633 + - -3.1523438 + - -0.7363281 + - 0.11602783 + - -4.6367188 + - 0.7373047 + - -0.9375 + - 0.46191406 + - -2.9609375 + - 2.0625 + - 2.8964844 + - 0.58447266 + - 1.4394531 + - 0.29077148 + - -2.2109375 + - -0.7861328 + - 0.54296875 + - 1.0341797 + - -0.111328125 + - 0.41235352 + - -1.7998047 + - -1.1992188 + - 0.7680664 + - -2.7578125 + - 2.4277344 + - 3.6503906 + - -0.6069336 + - -1.0185547 + - -1.2431641 + - 2.0898438 + - -0.15917969 + - 2.8671875 + - 2.4902344 + - 7.8007813 + - 1.8486328 + - 3.0820313 + - -1.703125 + - 0.8125 + - 1.5527344 + - -0.3125 + - 0.39379883 + - 1.9355469 + - -0.99658203 + - 0.13000488 + - -0.84033203 + - -2.9570313 + - 0.6801758 + - -1.1962891 + - 5.3007813 + - 16.75 + - 1.0966797 + - -0.65185547 + - -3.8945313 + - 1.375 + - -0.7519531 + - 1.6757813 + - 2.3925781 + - -0.3112793 + - -0.93359375 + - 3.2714844 + - 0.94921875 + - 1.359375 + - -1.8720703 + - 2.1757813 + - 2.2402344 + - -4.09375 + - 1.3691406 + - 0.3017578 + - 2.1171875 + - 0.10992432 + - -1.7070313 + - 1.2988281 + - -0.8232422 + - 3.9394531 + - 1.4765625 + - -1.4296875 + - 3.2890625 + - 1.3623047 + - -1.7988281 + - -3.2207031 + - 1.6689453 + - -0.06915283 + - -3 + - 0.7626953 + - 0.15979004 + - -2.6484375 + - 0.08618164 + - 1.9960938 + - 0.55322266 + - 0.3449707 + - 3.0351563 + - 1.4033203 + - -0.54345703 + - 0.3737793 + - 3.5664063 + - -0.76220703 + - 2.7558594 + - 0.7607422 + - 3.2363281 + - 2.3925781 + - -2.2617188 + - -1.4804688 + - 2.25 + - 6.3828125 + - -2.75 + - -0.32836914 + - 3.0234375 + - -4.2539063 + - 0.107666016 + - -0.51660156 + - -2.2578125 + - 0.2763672 + - 0.7685547 + - 2.3105469 + - 1.0986328 + - 0.08648682 + - -0.15844727 + - -0.0027885437 + - -1.9550781 + - -0.63671875 + - -2.2246094 + - 0.40283203 + - 1.1972656 + - 0.39086914 + - -2.2207031 + - -1.6533203 + - -2.0566406 + - -1.6660156 + - -10.375 + - 0.69091797 + - 0.6245117 + - -0.04574585 + - -0.63378906 + - -1.4775391 + - -3.3144531 + - 1.4140625 + - -0.5234375 + - 1.6064453 + - 3.4453125 + - 1.1767578 + - 2.6191406 + - 5.765625 + - -1.4560547 + - 1.8808594 + - -3.375 + - -3.6914063 + - -2.7050781 + - 1.6914063 + - 0.24243164 + - -2.6425781 + - 2.9160156 + - -2.34375 + - -0.6567383 + - 0.69628906 + - 1.2294922 + - 5.4804688 + - -0.18408203 + - 0.48876953 + - 3.3378906 + - 4.1132813 + - -3.0703125 + - -5.390625 + - -0.29760742 + - 0.8984375 + - 1.0292969 + - 2.5839844 + - -0.08984375 + - -1.4404297 + - 2.7011719 + - 2.3789063 + - -0.2915039 + - -1.8369141 + - -1.3837891 + - 2.1191406 + - 0.8208008 + - 3.875 + - 1.8369141 + - -0.4584961 + - 3.375 + - 1.1132813 + - 1.0107422 + - 2.1347656 + - -3.4238281 + - -2.9003906 + - -2.6542969 + - 2.4277344 + - 2.7695313 + - -1.9716797 + - -3.71875 + - -3.6953125 + - -1.53125 + - -4.890625 + - 0.98535156 + - -1.0332031 + - 2.1660156 + - 0.57177734 + - -2.96875 + - -4.15625 + - -0.06359863 + - 0.03375244 + - 3.421875 + - 0.9238281 + - -0.6503906 + - -1.0087891 + - 20.421875 + - 1.1191406 + - 0.57958984 + - 2.1933594 + - 8.015625 + - -0.359375 + - -0.22424316 + - 0.3095703 + - 0.73583984 + - -3.4316406 + - -0.8833008 + - 4.125 + - -2.3203125 + - 4.7304688 + - 0.6694336 + - 0.73828125 + - -0.64697266 + - 0.6850586 + - -2.9277344 + - -2.5664063 + - 5.1523438 + - -0.84033203 + - 0.48242188 + - 3.7050781 + - 0.15368652 + - -3.9765625 + - 1.375 + - 2.2460938 + - 0.9941406 + - 0.20471191 + - 0.63378906 + - 0.37158203 + - 3.1679688 + - 0.61279297 + - -4.0507813 + - 0.9628906 + - -0.625 + - -0.94433594 + - -1.0126953 + - -4.5390625 + - 5.3125 + - 2.5136719 + - -6.203125 + - -1.0429688 + - 1.4091797 + - 2.28125 + - -1.4980469 + - 1.140625 + - 1.7939453 + - -2.5078125 + - 3.671875 + - 0.52001953 + - 2.359375 + - 0.30126953 + - 6.125 + - 1.1328125 + - 0.2890625 + - 1.0439453 + - -2.0097656 + - -3.8300781 + - 4.5507813 + - 3.0390625 + - 2.7226563 + - 0.027053833 + - 0.33325195 + - 0.15283203 + - 2.9375 + - -3.4550781 + - 0.39501953 + - 0.38476563 + - -4.5078125 + - -1.8955078 + - 1.9746094 + - 2.75 + - -4.6992188 + - -2.0097656 + - -1.140625 + - -3.2929688 + - -1.2207031 + - -2.7890625 + - 1.3349609 + - 1.0644531 + - 0.18103027 + - -3.5664063 + - -0.7441406 + - 2.5605469 + - 1.5654297 + - -1.3662109 + - -2.8671875 + - 1.3818359 + - -1.5234375 + - -0.8388672 + - -4.0742188 + - -2.3789063 + - -4.5390625 + - 2.6972656 + - 0.6796875 + - -3.2050781 + - -2.5175781 + - -2.1894531 + - 1.2724609 + - 0.51416016 + - -0.60595703 + - 4.125 + - -3.0625 + - 0.67041016 + - -0.07757568 + - -1.6328125 + - 4.0585938 + - -3.6660156 + - 1.1875 + - -2.1308594 + - 2.0605469 + - -0.37939453 + - -4.78125 + - -1.0390625 + - 3.9726563 + - 0.35839844 + - 1.2685547 + - -2.8925781 + - 2.3574219 + - -6.140625 + - 1.2578125 + - 0.69873047 + - -0.88964844 + - 3.6660156 + - 3.4941406 + - 1.4863281 + - 2.40625 + - -0.640625 + - 0.66015625 + - -2.4589844 + - -3.3125 + - -2.1347656 + - 2.8867188 + - 0.7397461 + - -1.4589844 + - 1.7070313 + - 1.0664063 + - -0.52783203 + - 2.5449219 + - -1.8867188 + - -1.6669922 + - 1.2216797 + - -0.51660156 + - -1.5722656 + - 1.5830078 + - 0.42919922 + - 0.49487305 + - 3.7519531 + - 2.6386719 + - 0.0892334 + - -1.2861328 + - -5.2070313 + - 3.09375 + - 1.4482422 + - -2.1132813 + - 2.4472656 + - 1.5185547 + - -3.7050781 + - 2.1367188 + - 1.9863281 + - -1.7519531 + - 2.6875 + - -3 + - -1.9804688 + - -1.8457031 + - 0.51708984 + - 1.8808594 + - 0.33813477 + - -1.5712891 + - -5.5898438 + - -0.23986816 + - -1.6425781 + - -0.8676758 + - -1.3125 + - -5.1445313 + - 3.1328125 + - 0.61816406 + - -2.2441406 + - 1.0234375 + - -1.7402344 + - 3.6640625 + - -2.1699219 + - 2.3691406 + - -1.4482422 + - 0.34106445 + - -0.8408203 + - -0.49316406 + - 1.8691406 + - -0.21594238 + - -0.25708008 + - -3.2109375 + - 0.10406494 + - -1.5878906 + - 1.0107422 + - 1.2763672 + - 3.7441406 + - -1.6972656 + - -2.15625 + - -0.032348633 + - 3.90625 + - 2.0722656 + - -1.0029297 + - -3.7441406 + - -1.1396484 + - -2.8867188 + - 8.7734375 + - -1.75 + - -0.109375 + - -1.7861328 + - 4.3945313 + - 1.2861328 + - 1.1962891 + - 0.7944336 + - -1.3017578 + - 0.21643066 + - -0.7138672 + - 2.1738281 + - -5.390625 + - -2.6757813 + - 5.7382813 + - -4.125 + - 3.6875 + - -1.0947266 + - 0.5 + - 0.6381836 + - 3.8164063 + - 0.3984375 + - -1.3984375 + - -0.0078125 + - 0.95410156 + - 2.171875 + - -4.828125 + - 1.7792969 + - 0.54833984 + - -3.1738281 + - -1.4355469 + - -0.23962402 + - -1.1396484 + - -0.22302246 + - -1.1669922 + - 0.3425293 + - 1.5595703 + - -0.8535156 + - -2.1015625 + - -3.8867188 + - 0.54833984 + - -1.4433594 + - -1.6181641 + - 0.23596191 + - 2.6875 + - 0.5493164 + - 2.5390625 + - -0.3046875 + - -0.31103516 + - -1.7480469 + - 3.4765625 + - 2.8671875 + - -1.8125 + - -0.6796875 + - -3.6894531 + - -2.2324219 + - 1.75 + - 0.15234375 + - -2.2128906 + - -2.3203125 + - -0.578125 + - 1.2363281 + - -0.47875977 + - 0.8803711 + - 2.4414063 + - -0.9194336 + - -3.0878906 + - -2.6503906 + - 0.14672852 + - -2.9726563 + - -1.8681641 + - -1.0400391 + - -2.1738281 + - -2.8847656 + - -0.61816406 + - -0.8330078 + - -1.3642578 + - 5.4140625 + - 4.6953125 + - -4.2148438 + - -0.3569336 + - -1.28125 + - 1.4785156 + - -2.328125 + - -2.2949219 + - 3.5800781 + - -1.3017578 + - -2.5488281 + - 1.4306641 + - 2.2753906 + - -2.2050781 + - -3.6425781 + - -0.66845703 + - -1.7558594 + - -1.0195313 + - 0.15844727 + - -0.32080078 + - -0.70654297 + - -1.9628906 + - -1.0722656 + - -1.2929688 + - -0.76416016 + - -2.0664063 + - -2.2539063 + - -0.7558594 + - -0.37158203 + - 3.9863281 + - -2.7519531 + - 3.9023438 + - -1.9804688 + - -0.9316406 + - 6.5078125 + - 0.60253906 + - -0.82910156 + - -1.3535156 + - 0.6323242 + - -2.9726563 + - 3.3203125 + - 6.421875 + - -2.3164063 + - -0.7084961 + - 5.7226563 + - 0.90283203 + - 1.3837891 + - 0.3955078 + - -1.9765625 + - 1.0742188 + - 0.50878906 + - -2.9804688 + - 1.3427734 + - -0.8613281 + - -0.33447266 + - 2.6582031 + - -7.1601563 + - 0.71777344 + - 4.2148438 + - -2.4765625 + - -0.7910156 + - -2.1523438 + - 4.2460938 + - -5.1679688 + - -2.3320313 + - -0.23095703 + - 1.5947266 + - 2.4082031 + - -0.68847656 + - 1.6523438 + - -2.328125 + - -2.6777344 + - 2.3359375 + - -0.6948242 + - 0.39648438 + - -2.3339844 + - 3.7714844 + - 0.66845703 + - -1.71875 + - -2.4238281 + - -1.2421875 + - -0.2253418 + - 0.5722656 + - -0.34692383 + - 0.54541016 + - 2.0175781 + - -2.5878906 + - -0.09539795 + - -2.7949219 + - 0.7241211 + - 0.953125 + - 1.1865234 + - -1.2783203 + - -2.234375 + - -3.1484375 + - 1.2773438 + - 0.5834961 + - 1.1572266 + - -0.35473633 + - -2.15625 + - -2.1152344 + - 1.2978516 + - -3.0273438 + - -2.5136719 + - -1.9619141 + - 3.6992188 + - -3.4785156 + - -1.9482422 + - -0.60253906 + - 2.3535156 + - -1.6074219 + - 0.014503479 + - -1.0634766 + - -0.9248047 + - -0.30688477 + - -4.1210938 + - 0.8144531 + - 1.6376953 + - 4.859375 + - -1.6796875 + - 1.4482422 + - -0.28686523 + - 6.375 + - 1.9296875 + - -0.7294922 + - 1.4150391 + - 1.7324219 + - -0.64990234 + - -1.9150391 + - -1.2890625 + - 1.2744141 + - 1.7753906 + - 3.4375 + - -1.9316406 + - 2.3730469 + - -0.04574585 + - -0.055236816 + - 2.40625 + - -0.5361328 + - -0.97753906 + - 1.7050781 + - -1.4550781 + - -2.8496094 + - 0.9140625 + - 0.92285156 + - -3.3085938 + - -0.5410156 + - 1.8603516 + - -1.9072266 + - -1.2226563 + - -0.16955566 + - -0.29467773 + - 4.4257813 + - 6.8242188 + - -1.8144531 + - -0.18603516 + - -3.7402344 + - -2.1425781 + - 0.51416016 + - 1.0888672 + - -2.375 + - 1.8486328 + - -3.671875 + - -2.8691406 + - -0.50878906 + - -2.3476563 + - -0.9975586 + - -2.390625 + - -0.022872925 + - 1.8251953 + - 1.421875 + - -0.38720703 + - 1.7363281 + - 2.8496094 + - -0.7216797 + - -2.0195313 + - 1.3427734 + - 2.3515625 + - 0.8642578 + - -1.6220703 + - -0.9550781 + - 0.5053711 + - 0.060821533 + - -0.28515625 + - -3.6992188 + - -1.28125 + - -1.2978516 + - 1.7617188 + - -0.9326172 + - 0.96533203 + - 0.1439209 + - 2.8222656 + - -0.20129395 + - -1.4619141 + - 8.03125 + - -2.1132813 + - 3.6503906 + - -4.0273438 + - 3.6367188 + - 4.21875 + - -4.0664063 + - 1.1337891 + - 1.7832031 + - -0.22033691 + - -1.1425781 + - -0.35546875 + - -0.17297363 + - 1.8232422 + - -1.7207031 + - -1.2578125 + - -1.7851563 + - 3.9609375 + - -0.72802734 + - 1.2285156 + - 0.44677734 + - -1.2597656 + - 0.921875 + - -0.5136719 + - -0.51171875 + - -1.1142578 + - 3.3339844 + - 0.89208984 + - -2.1738281 + - 1.609375 + - -0.69873047 + - -2.7265625 + - 0.4440918 + - -2.1386719 + - -0.85253906 + - 2.6328125 + - 2.1425781 + - 2.1855469 + - -8.9609375 + - 4.40625 + - -0.5805664 + - 0.3293457 + - 0.48657227 + - -3.5019531 + - 1.9033203 + - 0.44970703 + - -1.5009766 + - 1.4414063 + - -4.625 + - 0.40112305 + - -0.21362305 + - -0.4753418 + - 0.07678223 + - 0.234375 + - 1.1494141 + - -0.34545898 + - -0.74853516 + - 0.7314453 + - 2.0800781 + - -2.4199219 + - 1.4638672 + - -2.5507813 + - 1.5810547 + - 2.359375 + - 0.77978516 + - 1.078125 + - 1.9570313 + - -0.3322754 + - 0.08258057 + - -1.2578125 + - 4.4570313 + - 1.421875 + - 2.5390625 + - 1.0166016 + - -4.0390625 + - 0.66503906 + - -0.40161133 + - -0.38891602 + - -0.26391602 + - 1.1357422 + - -0.9375 + - 1.3476563 + - 6.3554688 + - 1.0732422 + - -8.7421875 + - 1.2675781 + - 1.3388672 + - -0.11828613 + - -0.9863281 + - 2.9414063 + - 6.1757813 + - -1.8085938 + - -0.09820557 + - -0.61816406 + - -1.453125 + - 1.4726563 + - -0.7734375 + - 0.21923828 + - -0.22814941 + - -2.4238281 + - -0.43408203 + - -0.5 + - 4.0820313 + - -1.9326172 + - -1.4404297 + - 0.12634277 + - 1.7939453 + - 3.6191406 + - 2.1953125 + - 1.0546875 + - 0.49658203 + - 2.7050781 + - 0.66796875 + - -24.84375 + - 1.6748047 + - -4.6367188 + - -1.8183594 + - -15.671875 + - -1.2568359 + - -0.6870117 + - 3.0644531 + - -3.7128906 + - 2.609375 + - -7.5625 + - -7.9375 + - 0.80908203 + - -0.95410156 + - 2.0214844 + - -1.1650391 + - 0.3779297 + - 4.4375 + - -0.9453125 + - 1.5361328 + - 1.0087891 + - 2.0332031 + - 1.9931641 + - -2.9023438 + - -2.4765625 + - 3.6621094 + - -2.5761719 + - 1.8408203 + - 1.6982422 + - -5.0117188 + - 1.9042969 + - -0.31225586 + - -0.08258057 + - 2.3535156 + - 0.6352539 + - -1.6601563 + - 1.7197266 + - -1.8496094 + - 0.73046875 + - -0.04547119 + - 0.45996094 + - 0.036834717 + - 3.46875 + - 1.4023438 + - 0.061920166 + - 3.7128906 + - 2.75 + - 1.5185547 + - -1.0664063 + - -1.0947266 + - 1.7597656 + - -1.0664063 + - -2.015625 + - 2.078125 + - 1.390625 + - 3.1171875 + - -1.6494141 + - -4.7148438 + - 0.67285156 + - -2.6191406 + - 0.16210938 + - 2.4414063 + - -3.1289063 + - -0.6411133 + - -0.37329102 + - -0.4140625 + - -0.13000488 + - 4.5664063 + - 2.875 + - 1.4648438 + - -4.6757813 + - -0.13916016 + - 3.0117188 + - 0.57666016 + - -0.4453125 + - 1.3945313 + - 0.28149414 + - -0.7294922 + - -1.0039063 + - 2.1191406 + - -3.484375 + - -0.22729492 + - 1.3056641 + - -0.33862305 + - 0.5800781 + - 4.0390625 + - -0.5722656 + - 0.7241211 + - -1.4550781 + - -3.84375 + - 0.85791016 + - -1.71875 + - 0.92822266 + - -1.546875 + - -2.46875 + - 0.94970703 + - -3.0800781 + - -8.6328125 + - 0.8774414 + - -3.7089844 + - 0.2854004 + - 2.4003906 + - 1.1992188 + - -3.4628906 + - 0.6152344 + - -3.5566406 + - -1.8525391 + - -5.1367188 + - -0.82128906 + - 0.005718231 + - -0.0025100708 + - 3.9492188 + - -0.89208984 + - 1.4550781 + - -3.1503906 + - -2.7421875 + - -1.1074219 + - 0.19470215 + - -0.9003906 + - -3.0742188 + - 0.81884766 + - -2.4941406 + - -0.4404297 + - -0.12817383 + - 1.2353516 + - -0.32226563 + - 0.5078125 + - -3.4140625 + - -1.6044922 + - 0.5761719 + - -5.2070313 + - -2.2285156 + - 2.5839844 + - 5.3945313 + - 5.4726563 + - -0.2890625 + - 0.23120117 + - 4.4335938 + - 3.2597656 + - -1.6689453 + - -0.9008789 + - -2.3066406 + - 0.3330078 + - 2.8515625 + - -1.0039063 + - -0.74609375 + - -0.6118164 + - -0.7519531 + - -2.0234375 + - -2.296875 + - 2.4609375 + - -1.8095703 + - 1.2333984 + - -0.20812988 + - -2.3496094 + - -0.021194458 + - 0.78271484 + - 1.359375 + - -0.5175781 + - -0.7998047 + - 0.5258789 + - 2.2089844 + - -0.94970703 + - -1.5 + - -4.6523438 + - -0.04547119 + - 0.20422363 + - 3.4082031 + - -0.46362305 + - 0.18469238 + - 2.3476563 + - 23.5 + - -0.8959961 + - -3.0800781 + - 4.359375 + - 0.5830078 + - 4.0507813 + - -2.0234375 + - -13.3203125 + - 1.4960938 + - -1.0517578 + - 4.7539063 + - 0.66845703 + - 0.11383057 + - 1.2207031 + - 0.8408203 + - 2.2832031 + - 1.4814453 + - -4.9179688 + - 0.30908203 + - -4.7148438 + - 1.0234375 + - -3.7539063 + - 0.36450195 + - -0.19970703 + - -1.4775391 + - 3.5820313 + - -0.9350586 + - -2.2519531 + - 0.29345703 + - 3.0703125 + - -0.5292969 + - -0.6928711 + - 1.3974609 + - -1.6289063 + - -1.3476563 + - -2.0527344 + - -0.32861328 + - -0.2668457 + - -0.95947266 + - 0.1149292 + - -2.5957031 + - 2.2675781 + - -1.0664063 + - -1.7275391 + - 1.9658203 + - -0.79833984 + - 0.29541016 + - 1.7871094 + - -3.4179688 + - 3.5722656 + - 1.0419922 + - -1.3701172 + - 5.9101563 + - -2.6601563 + - -2.3671875 + - 0.8227539 + - 0.7866211 + - 2.9375 + - -2.3496094 + - 1.5 + - -2.4375 + - 3.8300781 + - 0.7109375 + - -1.203125 + - -0.06329346 + - 6.1054688 + - 3.3710938 + - -0.41015625 + - -1.71875 + - -0.3671875 + - -1.1767578 + - -0.25268555 + - -0.30078125 + - -0.1940918 + - -2.7109375 + - -5.9179688 + - 6.5351563 + - 0.9375 + - -2.3789063 + - -1.8955078 + - 1.6210938 + - 0.37548828 + - -0.31518555 + - -0.21875 + - 0.5830078 + - 1.2382813 + - 0.7890625 + - 1.6132813 + - -3.2402344 + - 0.8442383 + - 1.3203125 + - -1.9482422 + - 0.46557617 + - 0.17077637 + - 5.1757813 + - 2.1425781 + - -1.6201172 + - 4.75 + - -1.0703125 + - 2.4785156 + - 4.703125 + - -0.54296875 + - -1.9921875 + - 5.75 + - 0.78759766 + - 0.38354492 + - -1.2578125 + - -0.17211914 + - 2.4511719 + - 1.6533203 + - -1.2587891 + - -1.6181641 + - -1.8476563 + - -0.71875 + - -0.42626953 + - 0.3869629 + - 0.7348633 + - 0.12426758 + - 0.29516602 + - -2.078125 + - 2.2558594 + - 23.0625 + - -3.9101563 + - 2.9472656 + - -0.171875 + - 0.9301758 + - 2.3613281 + - 0.18798828 + - -2.0449219 + - 0.28344727 + - -0.8486328 + - -1.4492188 + - 1.9501953 + - -2.3046875 + - -1.6992188 + - -0.25854492 + - 0.31225586 + - -5.1601563 + - 1.9814453 + - 2.15625 + - 14.546875 + - -2.7011719 + - 1.4033203 + - -0.11602783 + - -1.4033203 + - 0.2109375 + - -0.6464844 + - 0.63916016 + - 0.6640625 + - -0.21984863 + - -1.2744141 + - -26 + - -0.5029297 + - 0.55078125 + - 1.0742188 + - -2.9101563 + - -0.4951172 + - -0.6484375 + - 0.9194336 + - -2.46875 + - 0.9267578 + - 0.5957031 + - -3.828125 + - -1.3505859 + - -0.8256836 + - -0.15515137 + - -1.0332031 + - -1.2939453 + - -2.9804688 + - 0.6225586 + - -0.23510742 + - -2.3261719 + - 0.8261719 + - 2.6347656 + - 0.2565918 + - 3.4257813 + - -1.4033203 + - 3.1738281 + - -0.5678711 + - 7.6953125 + - -1.9326172 + - 2.5859375 + - 4.0039063 + - -6.6484375 + - 2.4199219 + - -2.1757813 + - 4.3632813 + - -0.8208008 + - -0.5097656 + - -1.734375 + - 0.50439453 + - 0.62841797 + - 0.9951172 + - -5.5351563 + - 2.953125 + - -0.18005371 + - -2.4003906 + - 0.027893066 + - 2.7128906 + - 2.5332031 + - 2.6386719 + - 2.5058594 + - -1.9511719 + - -1.2734375 + - 1.8320313 + - 4.15625 + - 1.4335938 + - -1.4951172 + - -3.8300781 + - -0.64501953 + - -4.1640625 + - -1.1318359 + - 2.1132813 + - 2.2207031 + - 3.6367188 + - -1.140625 + - 4.890625 + - 4.9960938 + - 2.046875 + - -0.734375 + - -1.0810547 + - 0.76953125 + - -1.2734375 + - 1.3349609 + - -1.2626953 + - 1.3642578 + - -1.4804688 + - -2.6601563 + - 0.62158203 + - -3.5585938 + - -0.33520508 + - -3.3691406 + - -3.9375 + - -0.76464844 + - 0.5126953 + - 3.0058594 + - -1.4169922 + - -0.14758301 + - 2.9179688 + - 0.7988281 + - 0.52978516 + - -2.7910156 + - 3.359375 + - 2.0585938 + - -1.4140625 + - -3.3203125 + - 3.6015625 + - -0.56884766 + - 3.9375 + - -2.7890625 + - -0.921875 + - -1.0517578 + - 0.8203125 + - 3.4902344 + - 2.4726563 + - -0.17346191 + - 0.94189453 + - -3.7363281 + - -6.0507813 + - -0.46191406 + - -1.4873047 + - 2.65625 + - 2.6914063 + - 0.81689453 + - 1.0429688 + - 2.1601563 + - 0.59814453 + - -0.07366943 + - 2.3574219 + - -1.8486328 + - 2.9550781 + - 0.99902344 + - -0.4560547 + - -0.3359375 + - -0.8046875 + - -0.6621094 + - 12.1953125 + - 0.52441406 + - 2.53125 + - 5.7734375 + - 7.8046875 + - -1.21875 + - 0.42993164 + - -1.0869141 + - 1.4628906 + - -2.6542969 + - -1.7949219 + - 1.34375 + - 0.66845703 + - 0.29956055 + - -2.5566406 + - -0.7207031 + - 1.0195313 + - 1.8886719 + - 1.9316406 + - 0.34399414 + - -0.17321777 + - -0.1821289 + - -0.7832031 + - -1.9394531 + - -2.1015625 + - -1.4257813 + - 1.2460938 + - -0.46191406 + - -2.4238281 + - -3.4238281 + - 2.7890625 + - 2.1503906 + - 1.9941406 + - 1.0136719 + - 0.22485352 + - -0.98291016 + - 1.9404297 + - -1.7470703 + - 0.74072266 + - 1.8251953 + - -1.4882813 + - 1.2548828 + - -1.7763672 + - -0.55859375 + - 3.9375 + - -0.7192383 + - 1.7089844 + - -2.6484375 + - -1.0927734 + - -2.9003906 + - 3.2207031 + - 1.0126953 + - -2.4003906 + - -1.1132813 + - 4.1015625 + - 1.8291016 + - 1.0341797 + - 1.5966797 + - 4.1914063 + - 0.8461914 + - -1.8164063 + - -1.6669922 + - 1.4746094 + - 1.5244141 + - 1.2060547 + - 4.1875 + - 2.5195313 + - 2.265625 + - 1.9580078 + - -1.4179688 + - -0.6538086 + - -1.8564453 + - 1.2441406 + - 0.19885254 + - -0.050201416 + - -1.1044922 + - 0.34765625 + - 1.390625 + - 0.10595703 + - 3.0839844 + - -0.97753906 + - 0.080322266 + - 0.86376953 + - -0.27001953 + - 23.46875 + - -3.4648438 + - -1.1455078 + - -4.2460938 + - -0.22766113 + - 0.7368164 + - 2.34375 + - -0.09429932 + - -4.7851563 + - 1.6826172 + - 2.5976563 + - -1.3603516 + - 3.3925781 + - 2.5390625 + - 1.9511719 + - 0.51953125 + - 1.6357422 + - -3.0820313 + - 1.7158203 + - 0.9614258 + - -2.2148438 + - 1.7001953 + - -3.6777344 + - 1.7763672 + - 0.0758667 + - 0.8208008 + - -2.2089844 + - 0.12011719 + - 2.3339844 + - -3.7714844 + - -0.77197266 + - 1.3144531 + - 2.078125 + - 2.1347656 + - 2.4082031 + - -1.5664063 + - 6.2851563 + - -0.035705566 + - 0.3269043 + - -0.6582031 + - -4.3398438 + - -3.5703125 + - 0.5024414 + - 4.9257813 + - 0.38110352 + - 0.20275879 + - -1.5664063 + - 1.7324219 + - 2.8144531 + - 3.9101563 + - -0.5703125 + - -1.8300781 + - 0.39135742 + - 8.6640625 + - -3.2226563 + - -1.21875 + - 0.6303711 + - -1.2597656 + - 1.1396484 + - 0.5097656 + - 1.3017578 + - -0.11853027 + - -0.11633301 + - -4.2382813 + - -3.5429688 + - -2.6660156 + - -3.125 + - -2.9941406 + - 0.49731445 + - -2.203125 + - -1.2890625 + - 3.2851563 + - -0.7158203 + - -1.8212891 + - 0.6801758 + - -3.3378906 + - -4.4023438 + - -0.29785156 + - 2.0722656 + - -2.6738281 + - -0.19897461 + - 1.1738281 + - 2.1875 + - 1.2285156 + - -1.1191406 + - -3.0839844 + - -1.4257813 + - -0.87158203 + - -2.9550781 + - 0.016738892 + - -0.5004883 + - -0.26733398 + - 4.171875 + - -1.1015625 + - 2.6386719 + - -3.3027344 + - -2.3066406 + - -1.2890625 + - -0.68310547 + - 1.1992188 + - -1.3095703 + - 1.4726563 + - 1.0214844 + - 0.8647461 + - 0.40307617 + - -1.2763672 + - -1.6074219 + - 1.5175781 + - -1.4238281 + - 1.6337891 + - 0.4814453 + - -0.33032227 + - 2.7382813 + - 0.9296875 + - 0.21643066 + - 1.2539063 + - -3.8339844 + - -2.6425781 + - -3.2421875 + - -1.3925781 + - 0.30249023 + - -0.22033691 + - 0.5292969 + - 1.0478516 + - 1.1650391 + - 1.2773438 + - -1.2050781 + - -2.421875 + - 1.1992188 + - 2.1015625 + - -2.7226563 + - 2.1171875 + - 0.45581055 + - 0.33129883 + - 1.2685547 + - 0.67285156 + - -5.5898438 + - -3.34375 + - -1.0898438 + - 1.5175781 + - 0.026779175 + - -2.2480469 + - -0.9560547 + - 4.9257813 + - -0.17370605 + - 1.3681641 + - 6.5820313 + - 2.5605469 + - -2.6855469 + - 0.83984375 + - -0.056915283 + - 6.015625 + - -4.9570313 + - -2.1777344 + - 0.9863281 + - -2.1269531 + - -0.57910156 + - -2.3925781 + - 1.8867188 + - -3.3476563 + - 3.1953125 + - -1.1894531 + - 0.7207031 + - 0.15515137 + - -0.5161133 + - -1.1982422 + - 0.96875 + - -0.23339844 + - -1.9394531 + - 5.9726563 + - 0.79003906 + - 2.4414063 + - -0.31469727 + - -4.46875 + - 2.4296875 + - 0.24865723 + - 1.3359375 + - -0.7138672 + - -1.3564453 + - -0.7661133 + - 1.1220703 + - -2.015625 + - -3.0722656 + - -0.030685425 + - 0.69677734 + - 1.7275391 + - 2.8183594 + - -2.3203125 + - 1.234375 + - 0.3095703 + - -2.7070313 + - 0.34692383 + - 3.5566406 + - 1.3251953 + - 5.75 + - 0.24768066 + - 0.06359863 + - 16.1875 + - -0.41845703 + - 2.3007813 + - -3.5507813 + - -0.90722656 + - -0.89746094 + - 0.5439453 + - 1.4785156 + - 4.1484375 + - -0.9238281 + - -3.5253906 + - -1.8232422 + - 0.87402344 + - 1.9189453 + - 1.0517578 + - -1.1347656 + - 4.4570313 + - -0.26879883 + - -0.66796875 + - 0.24414063 + - -1.6445313 + - 0.30395508 + - -1.5214844 + - -2.2949219 + - -1.6738281 + - 2.3652344 + - -0.22375488 + - -4 + - -3.1015625 + - 0.7397461 + - -0.9951172 + - -0.88134766 + - -1.8613281 + - -1.8925781 + - 0.17687988 + - -0.08227539 + - 3.0117188 + - 0.75683594 + - 2.7890625 + - 0.28637695 + - 1.9667969 + - -4.5898438 + - 0.88378906 + - 0.64941406 + - -0.06854248 + - 4.2070313 + - -1.3662109 + - -1.3671875 + - -2.0664063 + - -5.4882813 + - 2.1308594 + - 1.8994141 + - -0.31152344 + - 2.8789063 + - 4.703125 + - -1.640625 + - -0.17565918 + - -3.8339844 + - -0.13244629 + - -1.8339844 + - -0.77197266 + - -1.1074219 + - 1.7451172 + - -2.703125 + - -0.38671875 + - 1.0224609 + - 1.9111328 + - -4.953125 + - 3.3925781 + - 0.9248047 + - -0.57373047 + - -1.6894531 + - 4.6914063 + - 0.9428711 + - 1.1796875 + - 1.0107422 + - -1.9638672 + - -2.4433594 + - 1.6601563 + - 1.3613281 + - 2.390625 + - 0.17053223 + - 4.7617188 + - -1.6230469 + - -1.1416016 + - 0.96484375 + - -1.5556641 + - -0.76660156 + - -1.5439453 + - 0.62353516 + - -4.3476563 + - -0.82666016 + - 1.6621094 + - 1.9033203 + - -2.375 + - 2.5566406 + - -3.9316406 + - 2.6777344 + - 0.7910156 + - -0.7397461 + - 4.5976563 + - -0.8935547 + - -2.609375 + - 1.921875 + - 2.4296875 + - 3.3144531 + - 1.7685547 + - -1.0107422 + - -0.22399902 + - 0.45361328 + - 33.40625 + - 13.4609375 + - -9.1796875 + - 2.265625 + - -1.0498047 + - 1.4277344 + - -2.7285156 + - -4.171875 + - -0.36083984 + - -0.20532227 + - 1.9619141 + - 0.51708984 + - -0.3388672 + - 1.5126953 + - -2.7910156 + - 1.9707031 + - -1.0048828 + - 0.9091797 + - -2.6953125 + - 0.71533203 + - 1.8789063 + - 3.4160156 + - -1.3212891 + - -1.1416016 + - -0.22705078 + - -2.1503906 + - 0.08703613 + - -0.40356445 + - -4.6054688 + - 0.75439453 + - -0.12780762 + - -0.15905762 + - 1.421875 + - 2.4765625 + - 1.6376953 + - -4.375 + - -1.8544922 + - 2.0644531 + - -2.1660156 + - 1.2460938 + - 2.2285156 + - 1.5400391 + - -0.2800293 + - 4.2265625 + - -1.2050781 + - 0.29296875 + - -3.4941406 + - 2.1425781 + - 1.3056641 + - 0.51171875 + - 2.2910156 + - 8.734375 + - -0.5722656 + - -1.4316406 + - 1.7226563 + - -0.9472656 + - -0.84472656 + - 0.054107666 + - 1.4589844 + - 0.21362305 + - 2.9804688 + - 2.3964844 + - 1.203125 + - -3.9238281 + - -1.7451172 + - -1.1357422 + - 1.9345703 + - -0.8339844 + - -2.6875 + - 0.25439453 + - -2.9238281 + - -0.20739746 + - -1.5019531 + - -2.2675781 + - 0.92626953 + - -2.6699219 + - -0.18823242 + - 1.3486328 + - 5.4453125 + - 0.4140625 + - -1.7626953 + - -1.4208984 + - 1.6337891 + - 1.8632813 + - 1.6884766 + - 2.3789063 + - 1.1064453 + - 0.22314453 + - 1.9423828 + - -1.53125 + - 1.3662109 + - 0.50439453 + - -0.8911133 + - -1.0019531 + - 3.65625 + - 1.2099609 + - -1.3984375 + - 4.0351563 + - -1.9003906 + - 0.5229492 + - -3.4648438 + - -1.0595703 + - 0.75097656 + - 1.15625 + - 0.12231445 + - 0.48754883 + - 0.32348633 + - -2.3203125 + - -0.081970215 + - 1.484375 + - -3.2929688 + - 3.6777344 + - -0.6933594 + - 4.28125 + - 1.8056641 + - 2.8339844 + - -2.9140625 + - -1.3173828 + - 3.515625 + - 0.4248047 + - -2.3886719 + - -1.8857422 + - 0.875 + - 1.1064453 + - 3.609375 + - 1.3613281 + - -3.2714844 + - 2.0546875 + - 2.4140625 + - 0.1270752 + - -0.8769531 + - -1.2519531 + - -1.1103516 + - 1.2451172 + - 0.2758789 + - 0.30737305 + - -0.18188477 + - -3.4394531 + - 1.5400391 + - -1.2939453 + - -0.4375 + - 1.9580078 + - 1.7792969 + - -2.1367188 + - -0.2956543 + - -0.17468262 + - 2.0078125 + - -1.203125 + - -0.140625 + - -4.109375 + - 1.1669922 + - 1.3193359 + - -1.4697266 + - -1.4335938 + - 0.4091797 + - -0.91503906 + - -1.1445313 + - 0.41333008 + - 0.4038086 + - 2.1660156 + - 0.09411621 + - -2.5546875 + - 2.7890625 + - 1.7773438 + - -0.9394531 + - 0.4284668 + - 0.328125 + - 2.3417969 + - -0.12164307 + - -2.5566406 + - -0.50927734 + - -0.265625 + - -2.6074219 + - -1.3457031 + - 0.58691406 + - 0.71728516 + - 1.4130859 + - 1.96875 + - -1.1738281 + - -1.75 + - -0.6010742 + - 0.38598633 + - -0.52441406 + - 0.90283203 + - 1.5185547 + - -1.5732422 + - -0.068359375 + - 1.7675781 + - 1.7275391 + - -1.2802734 + - 2.3789063 + - 2.3203125 + - 1.7792969 + - 0.7207031 + - -2.4882813 + - -1.8632813 + - 2.9804688 + - 1.1787109 + - 0.92089844 + - -3.390625 + - -2.7675781 + - -1.4277344 + - -2.8476563 + - -0.42285156 + - 0.39453125 + - -12.4453125 + - -0.31469727 + - -0.46240234 + - 0.21875 + - -0.88916016 + - 0.5488281 + - -1.2509766 + - 1.6689453 + - 0.45922852 + - -1.7119141 + - 2.3417969 + - -5.375 + - 0.4868164 + - 0.32421875 + - -1.1748047 + - 1.3769531 + - 1.5244141 + - -2.0566406 + - -0.025665283 + - 3.4238281 + - 0.61816406 + - 1.8251953 + - -0.53515625 + - 9.390625 + - 1.4433594 + - -2.1425781 + - 0.7246094 + - -0.52197266 + - 0.8935547 + - -0.88916016 + - -0.08459473 + - -2.6640625 + - 6.75 + - 0.68066406 + - -1.7714844 + - 0.7470703 + - 1.0390625 + - -6.09375 + - 0.71484375 + - 0.29418945 + - 1.3671875 + - 0.44189453 + - 6.2929688 + - -0.5942383 + - -2.7695313 + - 1.8964844 + - 2.2207031 + - 2.4628906 + - 2.109375 + - 1.1445313 + - -2.8378906 + - 1.5419922 + - 1.8007813 + - -3.15625 + - -1.0839844 + - -0.3232422 + - -0.43164063 + - -3.1992188 + - -1.8183594 + - -3.2753906 + - -0.1986084 + - -3.8652344 + - 2.4101563 + - -1.6914063 + - -1.796875 + - 3.5683594 + - -2.4199219 + - 0.18859863 + - -1.6337891 + - -1.6347656 + - 2.0566406 + - -0.3544922 + - -1.3388672 + - 1.7558594 + - 1.6328125 + - -0.6225586 + - 0.6425781 + - 0.61083984 + - 2.1738281 + - 0.8647461 + - 3.7578125 + - 0.01953125 + - -0.26611328 + - -1.7851563 + - 2.6621094 + - 0.1842041 + - -2.0214844 + - -1.2861328 + - -1.5732422 + - -0.09051514 + - 5.2382813 + - 4.703125 + - -1.1425781 + - 1.9355469 + - 2.3378906 + - -0.7207031 + - -1.25 + - -0.4050293 + - 2.0273438 + - -1.9423828 + - 2.2753906 + - -3.4765625 + - 2.8359375 + - 0.7866211 + - -3.9609375 + - -0.10961914 + - -2.6640625 + - 3.25 + - 0.3005371 + - -5.5078125 + - -0.27075195 + - -1.765625 + - 1.6582031 + - 0.4284668 + - 0.68310547 + - 3.4550781 + - 0.47021484 + - 1.2822266 + - -0.31884766 + - -3.0898438 + - -1.6689453 + - -0.5917969 + - -3.7890625 + - 8.9140625 + - 1.1953125 + - 1.4628906 + - -0.5317383 + - 0.52783203 + - -1.5 + - 0.43896484 + - 1.1591797 + - -1.2998047 + - -5.4804688 + - -3.4003906 + - 4.6367188 + - -4.171875 + - 1.8056641 + - -1.84375 + - -2.8164063 + - 1.2988281 + - 0.89208984 + - -0.5800781 + - 0.27661133 + - 1.2519531 + - 1.1083984 + - -3.1777344 + - 0.07696533 + - -4.0429688 + - 1.703125 + - -1.59375 + - 1.2041016 + - -3.5976563 + - 0.8105469 + - -1.4296875 + - 0.93847656 + - -2.5 + - -1.0498047 + - 0.07159424 + - 2.2539063 + - 3.2402344 + - 0.5004883 + - 1.6611328 + - -1.6152344 + - 2.4199219 + - 1.2880859 + - -0.7167969 + - -1.1738281 + - -2.6914063 + - -0.23876953 + - 0.51708984 + - 2.5664063 + - -2.8828125 + - -0.09454346 + - -0.0020923615 + - 4.2304688 + - -0.010597229 + - -2.2207031 + - 0.36743164 + - 1.984375 + - -2.21875 + - -2.3183594 + - -0.9819336 + - 1.2138672 + - 1.9511719 + - -0.53466797 + - 0.7192383 + - -1.4638672 + - -0.29736328 + - 0.82910156 + - 3.0742188 + - -2.9179688 + - -2.7089844 + - 1.5957031 + - 1.8515625 + - 5.8125 + - 2.6269531 + - -1.5332031 + - 1.4589844 + - -0.59716797 + - 1.0800781 + - -1.6582031 + - -2.015625 + - -0.9116211 + - 1.2197266 + - -1.9160156 + - 1.1708984 + - -1.0478516 + - 3.5195313 + - 4.3398438 + - -0.51708984 + - 0.17626953 + - -0.23376465 + - -1.4296875 + - -3.3242188 + - -2.8652344 + - -0.8925781 + - 1.3798828 + - -1.0742188 + - 0.85595703 + - 2.1699219 + - 1.5449219 + - 1.4101563 + - -0.4128418 + - 0.86865234 + - -4.921875 + - -0.9008789 + - -8.3046875 + - -1.734375 + - -2.0214844 + - -2.2714844 + - -2.90625 + - -0.96777344 + - 2.8417969 + - -6.7421875 + - -4.4335938 + - 24.671875 + - -1.7294922 + - -1.6435547 + - -0.6557617 + - -0.17883301 + - 0.50634766 + - 2.3261719 + - 3.0898438 + - -2.15625 + - 1.1416016 + - 1.6894531 + - -0.03488159 + - 0.88378906 + - -1.4248047 + - 0.42895508 + - 0.09020996 + - -3.4160156 + - 0.7285156 + - 4.890625 + - -0.75 + - -0.55126953 + - -1.4794922 + - -2.4765625 + - 0.6567383 + - -0.34155273 + - 3.7578125 + - 0.36376953 + - -2.0878906 + - 2.2304688 + - -0.27441406 + - 1.5878906 + - -2.5488281 + - 0.77246094 + - 0.4033203 + - 1.2587891 + - -0.55615234 + - 1.6416016 + - 2.984375 + - 4.1796875 + - 0.13500977 + - -0.85595703 + - -0.55322266 + - 2.0449219 + - -3.890625 + - 0.7788086 + - -0.2800293 + - 3.2695313 + - 1.1845703 + - -2.0371094 + - 0.7270508 + - 2.3496094 + - 0.83691406 + - -3.1035156 + - -1.3164063 + - -2.0175781 + - -1.6425781 + - -2.9003906 + - -0.42822266 + - 2.3769531 + - -3.4570313 + - -2.8359375 + - 1.1767578 + - -0.5722656 + - 2.4550781 + - -2.5039063 + - -0.0993042 + - -1.1953125 + - -0.012275696 + - -2.7324219 + - 1.5888672 + - -4.6132813 + - -4.3554688 + - -0.115478516 + - -1.5566406 + - 1.4550781 + - 8.6328125 + - 0.89697266 + - 3.6796875 + - -4.7578125 + - 1.1884766 + - -0.67285156 + - 1.3085938 + - 0.9038086 + - 0.6767578 + - -0.16455078 + - -4.7695313 + - 0.5332031 + - 0.76171875 + - 2.5664063 + - -0.84033203 + - -2.8378906 + - 0.4453125 + - -0.084106445 + - -0.55078125 + - -2.4765625 + - 1.4394531 + - 2.109375 + - -2.5664063 + - 5.3554688 + - 0.3088379 + - 0.37426758 + - 0.9243164 + - 0.53271484 + - 4.0078125 + - 0.27270508 + - 2.0820313 + - -1.8183594 + - -0.5209961 + - 0.54345703 + - 2.3847656 + - 7.1640625 + - 1.7158203 + - 1.0996094 + - -1.0556641 + - 3.5527344 + - 0.05078125 + - 1.7119141 + - 1.7900391 + - 2.2285156 + - -0.30566406 + - 3.09375 + - -0.6933594 + - 3.5976563 + - -4.484375 + - -1.4716797 + - -2.0273438 + - 0.9428711 + - 0.004463196 + - 1.3388672 + - -0.42236328 + - 4.0742188 + - -1.9814453 + - -2.109375 + - -0.8417969 + - 0.016311646 + - 2.9804688 + - 2.4042969 + - 0.7421875 + - 1.1767578 + - 3.2851563 + - 4.1992188 + - 0.7553711 + - -0.578125 + - 1.3769531 + - 2.078125 + - -4.9882813 + - -4.578125 + - -0.96484375 + - 3.3046875 + - -1.5917969 + - -0.75097656 + - -1.9638672 + - 2.8613281 + - 3.2753906 + - 3.2617188 + - -0.8564453 + - -0.28076172 + - 1.3603516 + - -1.3505859 + - -0.44799805 + - 2.5859375 + - 2.6894531 + - -0.9707031 + - -0.359375 + - 0.41503906 + - 1.7861328 + - 0.39282227 + - -0.1227417 + - -0.35986328 + - 1.2529297 + - 2.1425781 + - 0.90625 + - -2.1171875 + - -0.32250977 + - -3.6425781 + - -4.8789063 + - -0.09008789 + - 2.5820313 + - -0.8569336 + - -0.3659668 + - 3.1269531 + - -2.1777344 + - 2.0078125 + - 0.55859375 + - -0.9863281 + - -2.9140625 + - 1.4023438 + - -0.52001953 + - 3.0664063 + - 3.3515625 + - 1.2978516 + - -6.8359375 + - -0.47705078 + - -0.4194336 + - -5.390625 + - 2.1230469 + - -2.6640625 + - 2.4316406 + - 1.3896484 + - -6.4453125 + - 1.3085938 + - -0.65478516 + - -2.8007813 + - -2.4277344 + - 1.1220703 + - -0.37695313 + - 2.0820313 + - -0.42700195 + - -0.81347656 + - -33.90625 + - -2.5253906 + - -2.4140625 + - -0.39160156 + - -1.4277344 + - 2.0917969 + - 2.4101563 + - -4.7539063 + - -4.6601563 + - -0.90478516 + - 1.1181641 + - -1.4375 + - -1.0966797 + - 6.78125 + - 0.48706055 + - 4.7304688 + - -1.6582031 + - 4.3242188 + - -0.24768066 + - -1.4345703 + - 0.11437988 + - -0.453125 + - 1.0810547 + - 1.8134766 + - -0.4345703 + - -4.015625 + - -1.2519531 + - 0.05355835 + - 1.8691406 + - -0.36376953 + - 0.57177734 + - -1.2675781 + - 0.36206055 + - -0.5605469 + - -3.4941406 + - 4.8632813 + - -3.3027344 + - -0.8066406 + - -2.328125 + - -3.4863281 + - 0.029846191 + - 1.9746094 + - 2.6289063 + - 0.015411377 + - 0.25048828 + - 1.7070313 + - 4 + - -0.63671875 + - 1.9033203 + - -2.8378906 + - 2.6796875 + - -1.0927734 + - 0.2626953 + - -3.921875 + - 3.0117188 + - 2.6113281 + - -2.96875 + - 3.4550781 + - 2.6816406 + - 0.6640625 + - -1.0654297 + - -4.015625 + - 3.0058594 + - 1.3544922 + - 1.5175781 + - -0.38891602 + - 0.040161133 + - -5.0078125 + - 0.82666016 + - 1.3818359 + - -2.2207031 + - 0.7763672 + - 2.6074219 + - 0.4038086 + - -0.56103516 + - 2.2050781 + - -1.3994141 + - -2.6972656 + - 0.80566406 + - 0.42236328 + - -1.2441406 + - 2.0898438 + - 0.46972656 + - 1.0478516 + - 3.0527344 + - 0.8486328 + - -1.28125 + - 1.1132813 + - 2.0488281 + - 0.74658203 + - -2.3789063 + - 2.7949219 + - -1.0380859 + - 8.5703125 + - -1.4736328 + - 2.0292969 + - -0.59472656 + - -0.88183594 + - -0.4428711 + - -0.6660156 + - 2.8222656 + - 0.04714966 + - 3.53125 + - 1.0810547 + - 2.1230469 + - -2.1484375 + - -2.4238281 + - 3.5800781 + - -0.16760254 + - 5.9179688 + - -1.0576172 + - 5.9179688 + - -2.0292969 + - -0.9536133 + - -1.4013672 + - 1.5 + - 0.38745117 + - 0.7910156 + - -1.5820313 + - 4.1210938 + - 2.96875 + - 2.4902344 + - 4.6875 + - -0.7207031 + - -2.0996094 + - 1.7158203 + - -1.4609375 + - -4.0703125 + - -3.109375 + - 0.45117188 + - -4.3554688 + - -0.16455078 + - 1.7939453 + - 3.7363281 + - -1.1025391 + - -0.6791992 + - -30.3125 + - -0.8564453 + - -0.026504517 + - -0.66748047 + - 0.76416016 + - 3.5742188 + - 0.79296875 + - 1.8681641 + - 0.12719727 + - 2.0957031 + - 0.010040283 + - -0.14733887 + - -2.9140625 + - -2.2050781 + - 1.3681641 + - -2.3769531 + - 0.5546875 + - 0.07476807 + - -0.63378906 + - -1.5576172 + - 1.4462891 + - 10.890625 + - 3.125 + - -1.2587891 + - 1.1845703 + - 0.9394531 + - -0.8461914 + - 2.3105469 + - 0.3803711 + - -2.6035156 + - 1.2958984 + - 0.2529297 + - -2.2011719 + - 0.34106445 + - 0.37817383 + - -2.0605469 + - -3.2304688 + - 0.1685791 + - -0.5493164 + - -1.9033203 + - 5.6289063 + - 1.6601563 + - -1.2236328 + - 3.1679688 + - 1.0351563 + - 1.2753906 + - 0.0011701584 + - 3.140625 + - 0.6459961 + - -1.7978516 + - 0.19299316 + - 3.5117188 + - -2.3925781 + - 2.4589844 + - -1.5361328 + - -2.0097656 + - -0.9711914 + - 4.3320313 + - 0.4501953 + - -4.078125 + - 1.640625 + - -0.49487305 + - -0.68310547 + - -1.8125 + - -2.5019531 + - 0.07867432 + - -3.75 + - 0.7373047 + - 3.0117188 + - -6.9453125 + - 0.48876953 + - -1.3125 + - -3.3691406 + - -3.015625 + - 1.7744141 + - -0.86816406 + - -3.1210938 + - 0.06555176 + - 0.18383789 + - -0.3972168 + - -1.3349609 + - -0.6455078 + - 1.8955078 + - 1.7519531 + - 6.6796875 + - -1.4863281 + - -0.46948242 + - -1.2734375 + - -1.8232422 + - 2.0605469 + - -1.9619141 + - -0.69970703 + - 2.0683594 + - 0.15258789 + - 3.4492188 + - 0.89160156 + - 0.92285156 + - -1.0654297 + - 3.0019531 + - -0.6899414 + - 1.6308594 + - 0.5473633 + - -2.7011719 + - -1.1396484 + - 0.41479492 + - -0.5834961 + - -0.2142334 + - 4.5625 + - 1.4414063 + - -0.11456299 + - -1.6738281 + - 4.5039063 + - -0.5004883 + - 2.0371094 + - -2.7578125 + - -1.890625 + - 2.1015625 + - 2.5175781 + - -0.82128906 + - 0.8779297 + - 1.6621094 + - -1.1992188 + - -1.9658203 + - -1.2460938 + - 0.078125 + - -0.46875 + - -4.9023438 + - 0.04547119 + - -1.0234375 + - 3.3046875 + - 0.24829102 + - 0.66259766 + - -0.42407227 + - -0.1274414 + - 1.1132813 + - -0.35083008 + - -0.6723633 + - -0.47094727 + - -1.1416016 + - -4.4179688 + - 0.76953125 + - 4.2070313 + - 0.11364746 + - 1.3613281 + - 1.8681641 + - 0.6166992 + - 3.90625 + - -1.5507813 + - 0.046295166 + - 2.2636719 + - 2.2480469 + - 2.8027344 + - -1.9775391 + - 1.8564453 + - -1.6806641 + - 1.6044922 + - -2.3652344 + - 0.18908691 + - 1.0859375 + - 2.8300781 + - -0.6635742 + - 2.6914063 + - 2.7792969 + - 1.3203125 + - 2.5488281 + - -2.40625 + - 4.4882813 + - -2.4199219 + - -0.5385742 + - 1.7001953 + - -0.63720703 + - -2.5058594 + - 1.7324219 + - 0.103759766 + - -2.2871094 + - -1.5810547 + - -1.5009766 + - -1.6982422 + - -2.875 + - 3.1425781 + - 1.8691406 + - 1.7539063 + - -2.7480469 + - -0.32080078 + - -0.13049316 + - 2.4902344 + - 0.33203125 + - 2.4160156 + - -3.0175781 + - -0.18688965 + - 0.44848633 + - 1.0439453 + - 0.171875 + - 4.0351563 + - -0.09259033 + - 1.421875 + - -0.7915039 + - -1.9824219 + - -0.921875 + - 1.3632813 + - 1.0478516 + - 0.6333008 + - 1.2431641 + - -3.453125 + - 0.17626953 + - 1.7451172 + - 0.6254883 + - -0.36523438 + - 1.5126953 + - -1.1552734 + - -2.4199219 + - -5.5390625 + - -4.0976563 + - 6.078125 + - -1.3671875 + - -0.9116211 + - 1.2001953 + - -1.7539063 + - 2.0761719 + - -1.6425781 + - -2.3925781 + - -3.8867188 + - -2.203125 + - -2.640625 + - 0.74072266 + - 0.27661133 + - 1.4482422 + - -0.7949219 + - -1.1552734 + - 0.75683594 + - 0.123291016 + - -3.5039063 + - -1.7607422 + - -1.4736328 + - 3.1015625 + - 2.0839844 + - 6.2890625 + - -0.44213867 + - 2.5195313 + - -1.7119141 + - 1.8369141 diff --git a/backends/candle/tests/test_bert.rs b/backends/candle/tests/test_bert.rs index 45d02577..1bd5017f 100644 --- a/backends/candle/tests/test_bert.rs +++ b/backends/candle/tests/test_bert.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings, SnapshotScores}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer, relative_matcher}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -28,10 +28,10 @@ fn test_mini() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch", embeddings_batch, &matcher); let input_single = batch( @@ -41,7 +41,7 @@ fn test_mini() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); @@ -57,8 +57,8 @@ fn test_mini() -> Result<()> { ); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings = SnapshotScores::from(pooled_embeddings); - let raw_embeddings = SnapshotScores::from(raw_embeddings); + let pooled_embeddings = SnapshotEmbeddings::from(pooled_embeddings); + let raw_embeddings = SnapshotEmbeddings::from(raw_embeddings); assert_eq!(embeddings_batch[0], pooled_embeddings[0]); assert_eq!(raw_embeddings.len(), 8); @@ -91,13 +91,13 @@ fn test_mini_pooled_raw() -> Result<()> { [1, 4, 5].to_vec(), ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings_batch = SnapshotScores::from(pooled_embeddings); + let pooled_embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch_pooled", pooled_embeddings_batch, &matcher); - let raw_embeddings_batch = SnapshotScores::from(raw_embeddings); + let raw_embeddings_batch = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_batch_raw", raw_embeddings_batch, &matcher); // Check that the first token of each raw embeddings member is the same as the cls pooling ones @@ -113,7 +113,7 @@ fn test_mini_pooled_raw() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single_pooled", embeddings_single, &matcher); assert_eq!(pooled_embeddings_batch[0], embeddings_single[0]); @@ -126,7 +126,7 @@ fn test_mini_pooled_raw() -> Result<()> { ); let (_, raw_embeddings) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(raw_embeddings); + let embeddings_single = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_single_raw", embeddings_single, &matcher); assert_eq!(raw_embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_bert.rs b/backends/candle/tests/test_flash_bert.rs index 1888a32b..ea150e7f 100644 --- a/backends/candle/tests/test_flash_bert.rs +++ b/backends/candle/tests/test_flash_bert.rs @@ -2,9 +2,9 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings, SnapshotScores}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer, relative_matcher}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -34,10 +34,10 @@ fn test_flash_mini() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch", embeddings_batch, &matcher); let input_single = batch( @@ -47,7 +47,7 @@ fn test_flash_mini() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); @@ -63,8 +63,8 @@ fn test_flash_mini() -> Result<()> { ); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings = SnapshotScores::from(pooled_embeddings); - let raw_embeddings = SnapshotScores::from(raw_embeddings); + let pooled_embeddings = SnapshotEmbeddings::from(pooled_embeddings); + let raw_embeddings = SnapshotEmbeddings::from(raw_embeddings); assert_eq!(embeddings_batch[0], pooled_embeddings[0]); assert_eq!(raw_embeddings.len(), 8); @@ -101,13 +101,13 @@ fn test_flash_mini_pooled_raw() -> Result<()> { [1, 4, 5].to_vec(), ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings_batch = SnapshotScores::from(pooled_embeddings); + let pooled_embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch_pooled", pooled_embeddings_batch, &matcher); - let raw_embeddings_batch = SnapshotScores::from(raw_embeddings); + let raw_embeddings_batch = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_batch_raw", raw_embeddings_batch, &matcher); // Check that the first token of each raw embeddings member is the same as the cls pooling ones @@ -123,7 +123,7 @@ fn test_flash_mini_pooled_raw() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single_pooled", embeddings_single, &matcher); assert_eq!(pooled_embeddings_batch[0], embeddings_single[0]); @@ -136,7 +136,7 @@ fn test_flash_mini_pooled_raw() -> Result<()> { ); let (_, raw_embeddings) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(raw_embeddings); + let embeddings_single = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_single_raw", embeddings_single, &matcher); assert_eq!(raw_embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_jina.rs b/backends/candle/tests/test_flash_jina.rs index 4a5f8276..255b82a2 100644 --- a/backends/candle/tests/test_flash_jina.rs +++ b/backends/candle/tests/test_flash_jina.rs @@ -1,9 +1,9 @@ #![allow(dead_code, unused_imports)] mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -30,10 +30,10 @@ fn test_flash_jina_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_batch", embeddings_batch, &matcher); let input_single = batch( @@ -43,7 +43,7 @@ fn test_flash_jina_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_jina_code.rs b/backends/candle/tests/test_flash_jina_code.rs index 508bf722..d84848dc 100644 --- a/backends/candle/tests/test_flash_jina_code.rs +++ b/backends/candle/tests/test_flash_jina_code.rs @@ -1,9 +1,9 @@ #![allow(dead_code, unused_imports)] mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -30,10 +30,10 @@ fn test_flash_jina_code_base() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_batch", embeddings_batch, &matcher); let input_single = batch( @@ -43,7 +43,7 @@ fn test_flash_jina_code_base() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_mistral.rs b/backends/candle/tests/test_flash_mistral.rs new file mode 100644 index 00000000..71749c8b --- /dev/null +++ b/backends/candle/tests/test_flash_mistral.rs @@ -0,0 +1,53 @@ +#![allow(dead_code, unused_imports)] +mod common; + +use crate::common::{sort_embeddings, SnapshotEmbeddings}; +use anyhow::Result; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; +use text_embeddings_backend_candle::CandleBackend; +use text_embeddings_backend_core::{Backend, ModelType, Pool}; + +#[test] +#[serial_test::serial] +#[cfg(all(feature = "cuda", feature = "flash-attn"))] +fn test_flash_mistral() -> Result<()> { + let model_root = download_artifacts("Salesforce/SFR-Embedding-2_R", None)?; + let tokenizer = load_tokenizer(&model_root)?; + + let backend = CandleBackend::new( + model_root, + "float16".to_string(), + ModelType::Embedding(Pool::Mean), + )?; + + let input_batch = batch( + vec![ + tokenizer.encode("What is Deep Learning?", true).unwrap(), + tokenizer.encode("Deep Learning is...", true).unwrap(), + tokenizer.encode("What is Deep Learning?", true).unwrap(), + ], + [0, 1, 2].to_vec(), + vec![], + ); + + let matcher = cosine_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); + insta::assert_yaml_snapshot!("mistral_batch", embeddings_batch, &matcher); + + let input_single = batch( + vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], + [0].to_vec(), + vec![], + ); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("mistral_single", embeddings_single, &matcher); + assert_eq!(embeddings_batch[0], embeddings_single[0]); + assert_eq!(embeddings_batch[2], embeddings_single[0]); + + Ok(()) +} diff --git a/backends/candle/tests/test_flash_nomic.rs b/backends/candle/tests/test_flash_nomic.rs index 3e9b6e1d..263bbe43 100644 --- a/backends/candle/tests/test_flash_nomic.rs +++ b/backends/candle/tests/test_flash_nomic.rs @@ -1,9 +1,9 @@ #![allow(dead_code, unused_imports)] mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -30,10 +30,10 @@ fn test_flash_nomic_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_batch", embeddings_batch, &matcher); let input_single = batch( @@ -43,7 +43,7 @@ fn test_flash_nomic_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_jina.rs b/backends/candle/tests/test_jina.rs index 4cd7bba6..4aa30d03 100644 --- a/backends/candle/tests/test_jina.rs +++ b/backends/candle/tests/test_jina.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -27,10 +27,10 @@ fn test_jina_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_batch", embeddings_batch, &matcher); let input_single = batch( @@ -40,7 +40,7 @@ fn test_jina_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_jina_code.rs b/backends/candle/tests/test_jina_code.rs index 70248e1a..6c3b3f20 100644 --- a/backends/candle/tests/test_jina_code.rs +++ b/backends/candle/tests/test_jina_code.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -27,10 +27,10 @@ fn test_jina_code_base() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_batch", embeddings_batch, &matcher); let input_single = batch( @@ -40,7 +40,7 @@ fn test_jina_code_base() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_nomic.rs b/backends/candle/tests/test_nomic.rs index 914be7ea..ce0a4559 100644 --- a/backends/candle/tests/test_nomic.rs +++ b/backends/candle/tests/test_nomic.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -27,10 +27,10 @@ fn test_nomic_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_batch", embeddings_batch, &matcher); let input_single = batch( @@ -40,7 +40,7 @@ fn test_nomic_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/core/src/lib.rs b/backends/core/src/lib.rs index 06cef3ed..932c0083 100644 --- a/backends/core/src/lib.rs +++ b/backends/core/src/lib.rs @@ -63,6 +63,8 @@ pub enum Pool { /// This option is only available if the loaded model is a `ForMaskedLM` Transformer /// model. Splade, + /// Select the last token as embedding + LastToken, } impl fmt::Display for Pool { @@ -71,6 +73,7 @@ impl fmt::Display for Pool { Pool::Cls => write!(f, "cls"), Pool::Mean => write!(f, "mean"), Pool::Splade => write!(f, "splade"), + Pool::LastToken => write!(f, "last_token"), } } } diff --git a/backends/src/lib.rs b/backends/src/lib.rs index 220e05cb..9b5d1762 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -1,5 +1,6 @@ mod dtype; +use std::cmp::{max, min}; use std::path::PathBuf; use std::sync::Arc; use std::thread::JoinHandle; @@ -67,6 +68,62 @@ impl Backend { }) } + #[instrument(skip(self))] + pub async fn warmup( + &self, + max_input_length: usize, + max_batch_tokens: usize, + max_batch_requests: Option, + ) -> Result<(), BackendError> { + let mut input_ids = Vec::with_capacity(max_batch_tokens); + let mut token_type_ids = Vec::with_capacity(max_batch_tokens); + let mut position_ids = Vec::with_capacity(max_batch_tokens); + + let mut cumulative_seq_lengths = vec![0]; + let mut pooled_indices = Vec::new(); + + let mut i = 0_u32; + let mut remaining = max_batch_tokens; + let mut cumulative_length = 0; + let mut max_length = 0; + + while remaining > 0 { + let request_length = min(remaining, max_input_length); + cumulative_length += request_length; + max_length = max(max_length, request_length as u32); + + input_ids.extend(vec![0; request_length]); + token_type_ids.extend(vec![0; request_length]); + position_ids.extend((0..request_length as u32).collect::>()); + + cumulative_seq_lengths.push(cumulative_length as u32); + pooled_indices.push(i); + + i += 1; + remaining = remaining.saturating_sub(max_input_length); + if let Some(max_batch_requests) = &max_batch_requests { + if i as usize == *max_batch_requests { + break; + } + } + } + + let batch = Batch { + input_ids, + token_type_ids, + position_ids, + cumulative_seq_lengths, + max_length, + pooled_indices, + raw_indices: vec![], + }; + + match &self.model_type { + ModelType::Classifier => self.predict(batch).await.map(|_| ()), + ModelType::Embedding(_) => self.embed(batch).await.map(|_| ()), + } + } + #[instrument(skip(self))] pub async fn health(&self) -> Result<(), BackendError> { if *self.health_receiver.borrow() { diff --git a/core/Cargo.toml b/core/Cargo.toml index d2f23eb0..d69871dc 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -9,6 +9,7 @@ homepage.workspace = true async-channel = "^2.3" hf-hub = { workspace = true } metrics = { workspace = true } +serde_json = { workspace = true } text-embeddings-backend = { path = "../backends" } thiserror = { workspace = true } tokenizers = { workspace = true } diff --git a/core/src/download.rs b/core/src/download.rs index 6cc60472..24dc041f 100644 --- a/core/src/download.rs +++ b/core/src/download.rs @@ -19,20 +19,22 @@ pub async fn download_artifacts(api: &ApiRepo) -> Result { tracing::info!("Starting download"); + tracing::info!("Downloading `config.json`"); api.get("config.json").await?; + + tracing::info!("Downloading `tokenizer.json`"); api.get("tokenizer.json").await?; - let model_root = match api.get("model.safetensors").await { + let model_files = match download_safetensors(api).await { Ok(p) => p, Err(_) => { + tracing::warn!("safetensors weights not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); + tracing::info!("Downloading `pytorch_model.bin`"); let p = api.get("pytorch_model.bin").await?; - tracing::warn!("`model.safetensors` not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); - p + vec![p] } - } - .parent() - .unwrap() - .to_path_buf(); + }; + let model_root = model_files[0].parent().unwrap().to_path_buf(); tracing::info!("Model artifacts downloaded in {:?}", start.elapsed()); Ok(model_root) @@ -40,10 +42,50 @@ pub async fn download_artifacts(api: &ApiRepo) -> Result { #[instrument(skip_all)] pub async fn download_pool_config(api: &ApiRepo) -> Result { + tracing::info!("Downloading `1_Pooling/config.json`"); let pool_config_path = api.get("1_Pooling/config.json").await?; Ok(pool_config_path) } +async fn download_safetensors(api: &ApiRepo) -> Result, ApiError> { + // Single file + tracing::info!("Downloading `model.safetensors`"); + match api.get("model.safetensors").await { + Ok(p) => return Ok(vec![p]), + Err(err) => tracing::warn!("Could not download `model.safetensors`: {}", err), + }; + + // Sharded weights + // Download and parse index file + tracing::info!("Downloading `model.safetensors.index.json`"); + let index_file = api.get("model.safetensors.index.json").await?; + let index_file_string: String = + std::fs::read_to_string(index_file).expect("model.safetensors.index.json is corrupted"); + let json: serde_json::Value = serde_json::from_str(&index_file_string) + .expect("model.safetensors.index.json is corrupted"); + + let weight_map = match json.get("weight_map") { + Some(serde_json::Value::Object(map)) => map, + _ => panic!("model.safetensors.index.json is corrupted"), + }; + + let mut safetensors_filenames = std::collections::HashSet::new(); + for value in weight_map.values() { + if let Some(file) = value.as_str() { + safetensors_filenames.insert(file.to_string()); + } + } + + // Download weight files + let mut safetensors_files = Vec::new(); + for n in safetensors_filenames { + tracing::info!("Downloading `{}`", n); + safetensors_files.push(api.get(&n).await?); + } + + Ok(safetensors_files) +} + #[instrument(skip_all)] pub async fn download_st_config(api: &ApiRepo) -> Result { // Try default path diff --git a/core/src/infer.rs b/core/src/infer.rs index 66d04e19..7e6a4629 100644 --- a/core/src/infer.rs +++ b/core/src/infer.rs @@ -494,11 +494,19 @@ async fn batching_task(queue: Queue, notify: Arc, embed_sender: mpsc::Se loop { notify.notified().await; - while let Some(next_batch) = queue.next_batch().await { - embed_sender - .send(next_batch) + { + let mut permit = embed_sender + .reserve() .await .expect("embed receiver was dropped. This is a bug."); + + while let Some(next_batch) = queue.next_batch().await { + permit.send(next_batch); + permit = embed_sender + .reserve() + .await + .expect("embed receiver was dropped. This is a bug."); + } } } } diff --git a/load_tests/load.js b/load_tests/load.js index 86719b25..b3705476 100644 --- a/load_tests/load.js +++ b/load_tests/load.js @@ -27,7 +27,7 @@ export const options = { executor: 'constant-arrival-rate', duration: '30s', preAllocatedVUs: 5000, - rate: 1000, + rate: 10, timeUnit: '1s', gracefulStop: '1s', }, diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index 389e3848..c428e065 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -904,6 +904,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { match &self.info.model_type { ModelType::Classifier(_) => { let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a re-ranker model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) @@ -911,6 +912,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { ModelType::Reranker(_) => Ok(()), ModelType::Embedding(_) => { let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a classifier model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) @@ -1080,6 +1082,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { match &self.info.model_type { ModelType::Classifier(_) => { let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a re-ranker model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) @@ -1087,6 +1090,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { ModelType::Reranker(_) => Ok(()), ModelType::Embedding(_) => { let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a classifier model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) diff --git a/router/src/lib.rs b/router/src/lib.rs index eca9c61f..5c7899ec 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -26,7 +26,7 @@ use std::fs; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::path::Path; use std::time::{Duration, Instant}; -use text_embeddings_backend::DType; +use text_embeddings_backend::{DType, Pool}; use text_embeddings_core::download::{ download_artifacts, download_pool_config, download_st_config, ST_CONFIG_NAMES, }; @@ -207,6 +207,12 @@ pub async fn run( .await .context("Model backend is not healthy")?; + tracing::info!("Warming up model"); + backend + .warmup(max_input_length, max_batch_tokens, max_batch_requests) + .await + .context("Model backend is not healthy")?; + let max_batch_requests = backend .max_batch_size .map(|s| { @@ -336,13 +342,7 @@ fn get_backend_model_type( let config = fs::read_to_string(config_path).context("The `--pooling` arg is not set and we could not find a pooling configuration (`1_Pooling/config.json`) for this model.")?; let config: PoolConfig = serde_json::from_str(&config).context("Failed to parse `1_Pooling/config.json`")?; - if config.pooling_mode_cls_token { - text_embeddings_backend::Pool::Cls - } else if config.pooling_mode_mean_tokens { - text_embeddings_backend::Pool::Mean - } else { - return Err(anyhow!("Pooling config {config:?} is not supported")); - } + Pool::try_from(config)? } }; Ok(text_embeddings_backend::ModelType::Embedding(pool)) @@ -364,8 +364,25 @@ pub struct ModelConfig { pub struct PoolConfig { pooling_mode_cls_token: bool, pooling_mode_mean_tokens: bool, - pooling_mode_max_tokens: bool, - pooling_mode_mean_sqrt_len_tokens: bool, + #[serde(default)] + pooling_mode_lasttoken: bool, +} + +impl TryFrom for Pool { + type Error = anyhow::Error; + + fn try_from(config: PoolConfig) -> std::result::Result { + if config.pooling_mode_cls_token { + return Ok(Pool::Cls); + } + if config.pooling_mode_mean_tokens { + return Ok(Pool::Mean); + } + if config.pooling_mode_lasttoken { + return Ok(Pool::LastToken); + } + Err(anyhow!("Pooling config {config:?} is not supported")) + } } #[derive(Debug, Deserialize)] From 35aefebe320f8e6f60bb2bb9e14d1db3c76a1b8a Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 28 Jun 2024 09:46:07 +0200 Subject: [PATCH 03/36] feat(candle): add flash gte (#310) --- backends/candle/src/lib.rs | 25 +- backends/candle/src/models/bert.rs | 1 + backends/candle/src/models/flash_gte.rs | 460 ++++ backends/candle/src/models/flash_jina.rs | 1 + backends/candle/src/models/flash_jina_code.rs | 1 + backends/candle/src/models/gte.rs | 35 + backends/candle/src/models/jina.rs | 1 + backends/candle/src/models/jina_code.rs | 1 + backends/candle/src/models/mod.rs | 8 + .../snapshots/test_flash_gte__gte_batch.snap | 2309 +++++++++++++++++ .../snapshots/test_flash_gte__gte_single.snap | 773 ++++++ backends/candle/tests/test_flash_gte.rs | 53 + 12 files changed, 3664 insertions(+), 4 deletions(-) create mode 100644 backends/candle/src/models/flash_gte.rs create mode 100644 backends/candle/src/models/gte.rs create mode 100644 backends/candle/tests/snapshots/test_flash_gte__gte_batch.snap create mode 100644 backends/candle/tests/snapshots/test_flash_gte__gte_single.snap create mode 100644 backends/candle/tests/test_flash_gte.rs diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index b9d750dc..5204536b 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -11,13 +11,13 @@ use crate::compute_cap::{ compatible_compute_cap, get_compile_compute_cap, get_runtime_compute_cap, }; use crate::models::{ - BertConfig, BertModel, DistilBertConfig, DistilBertModel, JinaBertModel, JinaCodeBertModel, - MistralConfig, Model, NomicBertModel, NomicConfig, + BertConfig, BertModel, DistilBertConfig, DistilBertModel, GTEConfig, JinaBertModel, + JinaCodeBertModel, MistralConfig, Model, NomicBertModel, NomicConfig, }; #[cfg(feature = "cuda")] use crate::models::{ - FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashJinaCodeBertModel, - FlashMistralModel, FlashNomicBertModel, + FlashBertModel, FlashDistilBertModel, FlashGTEModel, FlashJinaBertModel, + FlashJinaCodeBertModel, FlashMistralModel, FlashNomicBertModel, }; use anyhow::Context; use candle::{DType, Device}; @@ -57,6 +57,8 @@ enum Config { #[serde(rename(deserialize = "nomic_bert"))] NomicBert(NomicConfig), Mistral(MistralConfig), + #[serde(rename = "new")] + Gte(GTEConfig), } pub struct CandleBackend { @@ -215,6 +217,10 @@ impl CandleBackend { "Mistral is only supported on Cuda devices in fp16 with flash attention enabled" .to_string(), )), + (Config::Gte(_), Device::Cpu | Device::Metal(_)) => Err(BackendError::Start( + "GTE is only supported on Cuda devices in fp16 with flash attention enabled" + .to_string(), + )), #[cfg(feature = "cuda")] (Config::Bert(config), Device::Cuda(_)) => { if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) @@ -333,6 +339,17 @@ impl CandleBackend { FlashMistralModel::load(vb, &config, model_type).s()?, )) } + #[cfg(feature = "cuda")] + (Config::Gte(config), Device::Cuda(_)) => { + if dtype != DType::F16 + || !cfg!(feature = "flash-attn") + || get_runtime_compute_cap().unwrap() < 80 + { + return Err(BackendError::Start("GTE is only supported on Cuda devices in fp16 with flash attention v2 enabled".to_string())); + } + tracing::info!("Starting FlashGTE model on {:?}", device); + Ok(Box::new(FlashGTEModel::load(vb, &config, model_type).s()?)) + } }; Ok(Self { diff --git a/backends/candle/src/models/bert.rs b/backends/candle/src/models/bert.rs index 5795fa27..a36a1555 100644 --- a/backends/candle/src/models/bert.rs +++ b/backends/candle/src/models/bert.rs @@ -35,6 +35,7 @@ pub enum PositionEmbeddingType { #[default] Absolute, Alibi, + Rope, } #[derive(Debug)] diff --git a/backends/candle/src/models/flash_gte.rs b/backends/candle/src/models/flash_gte.rs new file mode 100644 index 00000000..62bf65bd --- /dev/null +++ b/backends/candle/src/models/flash_gte.rs @@ -0,0 +1,460 @@ +use crate::flash_attn::flash_attn_varlen; +use crate::layers::{HiddenAct, LayerNorm, Linear}; +use crate::models::{GTEConfig, Model, NTKScaling, PositionEmbeddingType, RopeScaling}; +use candle::{DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{Embedding, Module, VarBuilder}; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +struct GTEAttention { + qkv_linear: Linear, + o_proj: Linear, + + num_attention_heads: usize, + attention_head_size: usize, + + softmax_scale: f32, + + span: tracing::Span, +} + +impl GTEAttention { + pub fn load(vb: VarBuilder, config: >EConfig) -> Result { + let num_attention_heads = config.num_attention_heads; + let attention_head_size = config.hidden_size / config.num_attention_heads; + let hidden_size = config.hidden_size; + + let qkv_weight = vb + .pp("qkv_proj") + .get((hidden_size * 3, hidden_size), "weight")?; + let qkv_bias = vb.pp("qkv_proj").get(hidden_size * 3, "bias")?; + + let qkv_linear = Linear::new(qkv_weight, Some(qkv_bias), None); + + let o_proj_weight = vb.pp("o_proj").get((hidden_size, hidden_size), "weight")?; + let o_proj_bias = vb.pp("o_proj").get(hidden_size, "bias")?; + + let o_proj = Linear::new(o_proj_weight, Some(o_proj_bias), None); + + let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; + + Ok(Self { + qkv_linear, + o_proj, + num_attention_heads, + attention_head_size, + softmax_scale, + span: tracing::span!(tracing::Level::TRACE, "attention"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let qkv = self.qkv_linear.forward(hidden_states)?; + + // Reshape to [tokens, heads, head_size] + let mut new_qkv_shape = qkv.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads * 3); + new_qkv_shape.push(self.attention_head_size); + + let qkv = qkv.reshape(new_qkv_shape)?; + + // Split qkv tensor + let q = qkv.narrow(1, 0, self.num_attention_heads)?; + let k = qkv.narrow(1, self.num_attention_heads, self.num_attention_heads)?; + let v = qkv.narrow(1, self.num_attention_heads * 2, self.num_attention_heads)?; + + candle_rotary::apply_rotary_inplace(&q, &k, &cos, &sin, true)?; + + let attention = flash_attn_varlen( + &q, + &k, + &v, + None, + cu_seqlens, + cu_seqlens, + max_s, + max_s, + self.softmax_scale, + false, + None, + )?; + let attention = attention.flatten_from(candle::D::Minus2)?; + + self.o_proj.forward(&attention) + } +} + +struct GTEMLP { + up_gate_proj: Linear, + down_proj: Linear, + + act: HiddenAct, + intermediate_size: usize, + + span: tracing::Span, +} + +impl GTEMLP { + pub fn load(vb: VarBuilder, config: >EConfig) -> Result { + let intermediate_size = config.intermediate_size; + + let up_gate_proj_weight = vb + .pp("up_gate_proj") + .get((intermediate_size * 2, config.hidden_size), "weight")?; + + let up_gate_proj = Linear::new(up_gate_proj_weight, None, None); + + let down_proj_weight = vb + .pp("down_proj") + .get((config.hidden_size, intermediate_size), "weight")?; + let down_proj_bias = vb.pp("down_proj").get(config.hidden_size, "bias")?; + let down_proj = Linear::new(down_proj_weight, Some(down_proj_bias), None); + + Ok(Self { + up_gate_proj, + down_proj, + intermediate_size, + act: config.hidden_act.clone(), + span: tracing::span!(tracing::Level::TRACE, "mlp"), + }) + } + + pub fn forward(&self, hidden_states: &Tensor) -> Result { + let _enter = self.span.enter(); + + let up_gate_states = self.up_gate_proj.forward(hidden_states)?; + let up_states = up_gate_states.narrow(1, 0, self.intermediate_size)?; + let gate_states = + up_gate_states.narrow(1, self.intermediate_size, self.intermediate_size)?; + + let gate_states = match self.act { + HiddenAct::Gelu => gate_states.gelu(), + HiddenAct::Relu => gate_states.relu(), + HiddenAct::Swiglu => gate_states.silu(), + }?; + let r = self.down_proj.forward(&(gate_states * up_states)?); + r + } +} + +struct GTELayer { + attention: GTEAttention, + mlp: GTEMLP, + attention_layer_norm: LayerNorm, + mlp_layer_norm: LayerNorm, + + span: tracing::Span, +} + +impl GTELayer { + pub fn load(vb: VarBuilder, config: >EConfig) -> Result { + let attention = GTEAttention::load(vb.pp("attention"), config)?; + let mlp = GTEMLP::load(vb.pp("mlp"), config)?; + + let attention_layer_norm = + LayerNorm::load(vb.pp("attn_ln"), config.hidden_size, config.layer_norm_eps)?; + let mlp_layer_norm = + LayerNorm::load(vb.pp("mlp_ln"), config.hidden_size, config.layer_norm_eps)?; + + Ok(Self { + attention, + mlp, + attention_layer_norm, + mlp_layer_norm, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + let attn_output = self + .attention + .forward(&hidden_states, cu_seqlens, cos, sin, max_s)?; + let normed_attn_res_output = self + .attention_layer_norm + .forward(&attn_output, Some(hidden_states))?; + + let mlp_output = self.mlp.forward(&normed_attn_res_output)?; + let normed_mlp_res_output = self + .mlp_layer_norm + .forward(&mlp_output, Some(&normed_attn_res_output))?; + Ok(normed_mlp_res_output) + } +} + +pub struct FlashGTEModel { + word_embeddings: Embedding, + token_type_embeddings: Option, + layers: Vec, + embeddings_norm: LayerNorm, + cos_cache: Tensor, + sin_cache: Tensor, + pool: Pool, + pub device: Device, + + span: tracing::Span, +} + +impl FlashGTEModel { + pub fn load(vb: VarBuilder, config: >EConfig, model_type: ModelType) -> Result { + match vb.device() { + Device::Cuda(_) => {} + _ => candle::bail!("FlashGTE requires Cuda"), + } + + if vb.dtype() != DType::F16 { + candle::bail!("FlashGTE requires DType::F16") + } + + if config.logn_attention_clip1 { + candle::bail!("`logn_attention_clip1` is not supported"); + } + if config.logn_attention_scale { + candle::bail!("`logn_attention_scale` is not supported"); + } + + if config.position_embedding_type != PositionEmbeddingType::Rope { + candle::bail!("Only `PositionEmbeddingType::Rope` is supported"); + } + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for GTE") + } + ModelType::Embedding(pool) => pool, + }; + + let word_embeddings = Embedding::new( + vb.pp("embeddings.word_embeddings") + .get((config.vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ); + + let token_type_embeddings = if config.type_vocab_size > 0 { + Some(Embedding::new( + vb.pp("embeddings.token_type_embeddings") + .get((config.type_vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + )) + } else { + None + }; + + let layers = (0..config.num_hidden_layers) + .map(|index| GTELayer::load(vb.pp(format!("encoder.layer.{index}")), config)) + .collect::>>()?; + + let embeddings_norm = LayerNorm::load( + vb.pp("embeddings.LayerNorm"), + config.hidden_size, + config.layer_norm_eps, + )?; + + let inv_freqs = if let Some(RopeScaling::Ntk(NTKScaling { factor })) = config.rope_scaling { + let inv_freqs = candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta * factor, + vb.device(), + )?; + let s = factor.powf(2.0 / layers[0].attention.attention_head_size as f32) as f64; + inv_freqs / s + } else { + candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta, + vb.device(), + ) + }?; + + let (cos_cache, sin_cache) = + candle_rotary::cos_sin(config.max_position_embeddings, &inv_freqs, vb.dtype())?; + + Ok(Self { + word_embeddings, + token_type_embeddings, + layers, + embeddings_norm, + cos_cache, + sin_cache, + pool, + device: vb.device().clone(), + span: tracing::span!(tracing::Level::TRACE, "model"), + }) + } + + pub fn forward(&self, batch: Batch) -> Result<(Option, Option)> { + let _enter = self.span.enter(); + + let batch_size = batch.cumulative_seq_lengths.len() - 1; + let shape = batch.input_ids.len(); + + // Create Cuda tensors + let input_ids = Tensor::from_vec(batch.input_ids, shape, &self.device)?; + let token_type_ids = Tensor::from_vec(batch.token_type_ids, shape, &self.device)?; + let position_ids = Tensor::from_vec(batch.position_ids, shape, &self.device)?; + let cu_seqlens = Tensor::from_vec( + batch.cumulative_seq_lengths.clone(), + batch_size + 1, + &self.device, + )?; + + let word_embeddings = self.word_embeddings.forward(&input_ids)?; + let token_type_embeddings = self + .token_type_embeddings + .as_ref() + .map(|emb| emb.forward(&token_type_ids)) + .transpose()?; + + let mut hidden_states = self + .embeddings_norm + .forward(&word_embeddings, token_type_embeddings.as_ref())?; + + let cos = self.cos_cache.index_select(&position_ids, 0)?; + let sin = self.sin_cache.index_select(&position_ids, 0)?; + + for layer in &self.layers { + let h = layer.forward( + &hidden_states, + &cu_seqlens, + &cos, + &sin, + batch.max_length as usize, + )?; + hidden_states = h; + } + + let outputs = hidden_states; + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + let pooled_embeddings = if has_pooling_requests { + match self.pool { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) + } + } + // Mean pooling + Pool::Mean => { + if batch_size > 1 { + // for each request that requires pooling + let results: Result> = batch + .pooled_indices + .into_iter() + .map(|i| { + let i = i as usize; + let start = batch.cumulative_seq_lengths[i]; + let len = batch.cumulative_seq_lengths[i + 1] - start; + + // Mean + let embeddings = outputs.narrow(0, start as usize, len as usize)?; + embeddings.sum_keepdim(0)? / (len as f64) + }) + .collect(); + + // Concatenate all results + Some(Tensor::cat(&results?, 0)?) + } else { + Some((outputs.sum_keepdim(0)? / (batch.max_length as f64))?) + } + } + Pool::Splade => { + unreachable!(); + } + } + } else { + None + }; + + let raw_embeddings = if has_raw_requests { + if batch_size > 1 && has_pooling_requests { + // Create indexing vector for the embeddings + let mut final_indices: Vec = Vec::with_capacity(shape); + for i in batch.raw_indices.into_iter() { + let i = i as usize; + // Get start/end token index of this specific member of the batch + let start = batch.cumulative_seq_lengths[i]; + let end = batch.cumulative_seq_lengths[i + 1]; + + for j in start..end { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j); + } + } + + let final_indices_length = final_indices.len(); + let final_indices = + Tensor::from_vec(final_indices, final_indices_length, &self.device)?; + + // Select the tokens with final indices + Some(outputs.index_select(&final_indices, 0)?) + } else { + Some(outputs) + } + } else { + None + }; + + Ok((pooled_embeddings, raw_embeddings)) + } +} + +impl Model for FlashGTEModel { + fn is_padded(&self) -> bool { + false + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} diff --git a/backends/candle/src/models/flash_jina.rs b/backends/candle/src/models/flash_jina.rs index c8efee18..0bab863f 100644 --- a/backends/candle/src/models/flash_jina.rs +++ b/backends/candle/src/models/flash_jina.rs @@ -242,6 +242,7 @@ impl FlashJinaBertModel { ) } PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; match vb.device() { diff --git a/backends/candle/src/models/flash_jina_code.rs b/backends/candle/src/models/flash_jina_code.rs index 06ade2d5..b20438fe 100644 --- a/backends/candle/src/models/flash_jina_code.rs +++ b/backends/candle/src/models/flash_jina_code.rs @@ -295,6 +295,7 @@ impl FlashJinaCodeBertModel { ) } PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; match vb.device() { diff --git a/backends/candle/src/models/gte.rs b/backends/candle/src/models/gte.rs new file mode 100644 index 00000000..e5e75638 --- /dev/null +++ b/backends/candle/src/models/gte.rs @@ -0,0 +1,35 @@ +use crate::layers::HiddenAct; +use crate::models::PositionEmbeddingType; +use serde::Deserialize; + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct NTKScaling { + pub factor: f32, +} + +#[derive(Debug, Clone, PartialEq, Deserialize)] +#[serde(tag = "type", rename_all = "kebab-case")] +pub enum RopeScaling { + Ntk(NTKScaling), +} + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct GTEConfig { + pub vocab_size: usize, + pub hidden_size: usize, + pub num_hidden_layers: usize, + pub num_attention_heads: usize, + pub intermediate_size: usize, + pub hidden_act: HiddenAct, + pub max_position_embeddings: usize, + pub type_vocab_size: usize, + pub layer_norm_type: String, + pub layer_norm_eps: f32, + pub position_embedding_type: PositionEmbeddingType, + pub rope_theta: f32, + pub rope_scaling: Option, + #[serde(default)] + pub logn_attention_scale: bool, + #[serde(default)] + pub logn_attention_clip1: bool, +} diff --git a/backends/candle/src/models/jina.rs b/backends/candle/src/models/jina.rs index 6884fcae..ecee8bfe 100644 --- a/backends/candle/src/models/jina.rs +++ b/backends/candle/src/models/jina.rs @@ -363,6 +363,7 @@ impl JinaBertModel { vb.dtype(), )?), PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; let pool = match model_type { diff --git a/backends/candle/src/models/jina_code.rs b/backends/candle/src/models/jina_code.rs index fd004bc6..5f13fe08 100644 --- a/backends/candle/src/models/jina_code.rs +++ b/backends/candle/src/models/jina_code.rs @@ -352,6 +352,7 @@ impl JinaCodeBertModel { vb.dtype(), )?), PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; let pool = match model_type { diff --git a/backends/candle/src/models/mod.rs b/backends/candle/src/models/mod.rs index 3e4a5785..9f616a2a 100644 --- a/backends/candle/src/models/mod.rs +++ b/backends/candle/src/models/mod.rs @@ -26,12 +26,17 @@ mod flash_nomic; #[cfg(feature = "cuda")] mod flash_distilbert; +#[cfg(feature = "cuda")] +mod flash_gte; #[cfg(feature = "cuda")] mod flash_mistral; +mod gte; pub use bert::{BertConfig, BertModel, PositionEmbeddingType}; use candle::{Result, Tensor}; pub use distilbert::{DistilBertConfig, DistilBertModel}; +#[allow(unused_imports)] +pub use gte::{GTEConfig, NTKScaling, RopeScaling}; pub use jina::JinaBertModel; pub use jina_code::JinaCodeBertModel; pub use mistral::MistralConfig; @@ -56,6 +61,9 @@ pub use flash_distilbert::FlashDistilBertModel; #[cfg(feature = "cuda")] pub use flash_mistral::FlashMistralModel; +#[cfg(feature = "cuda")] +pub use flash_gte::FlashGTEModel; + pub(crate) trait Model { fn is_padded(&self) -> bool; diff --git a/backends/candle/tests/snapshots/test_flash_gte__gte_batch.snap b/backends/candle/tests/snapshots/test_flash_gte__gte_batch.snap new file mode 100644 index 00000000..d8bbd66e --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_gte__gte_batch.snap @@ -0,0 +1,2309 @@ +--- +source: backends/candle/tests/test_flash_gte.rs +assertion_line: 37 +expression: embeddings_batch +--- +- - 0.4428711 + - 0.6118164 + - 0.07043457 + - -0.5917969 + - 0.88183594 + - -0.10839844 + - 0.0881958 + - -0.20483398 + - 1.9345703 + - 0.6230469 + - 0.59521484 + - 0.18737793 + - 0.030548096 + - -0.078308105 + - 0.79589844 + - -0.23474121 + - -0.8720703 + - 1.6923828 + - 0.12597656 + - -1.9267578 + - -0.34472656 + - -1.9326172 + - 0.89990234 + - -0.2006836 + - 0.024230957 + - 0.2878418 + - 0.3642578 + - 0.17956543 + - -0.51123047 + - 0.025817871 + - -0.8964844 + - 0.14147949 + - -0.39257813 + - -0.8486328 + - 0.005218506 + - 0.42358398 + - 0.23181152 + - 1.1630859 + - -1.1455078 + - 0.3388672 + - -2.1484375 + - -1.0146484 + - -0.2841797 + - 0.021499634 + - 0.16235352 + - 0.39453125 + - -0.9511719 + - 0.41064453 + - -0.15563965 + - -0.484375 + - -0.07080078 + - 0.07312012 + - 0.56103516 + - 0.028213501 + - -0.027938843 + - 0.43896484 + - 1.0136719 + - 0.7788086 + - -0.5644531 + - -1.9824219 + - -0.011169434 + - 0.50634766 + - -0.39331055 + - -0.3334961 + - -1.1679688 + - -0.07208252 + - 0.008544922 + - 0.7788086 + - -0.10021973 + - -0.30859375 + - 0.35888672 + - -0.44848633 + - -0.08679199 + - -1.0791016 + - 1.3193359 + - -1.0273438 + - 0.34228516 + - -0.45385742 + - 0.8027344 + - 0.50634766 + - 0.703125 + - -0.96533203 + - -0.042938232 + - -1.0927734 + - 0.35205078 + - -0.56689453 + - -0.5341797 + - 0.23571777 + - -2.0234375 + - -0.26342773 + - 0.1998291 + - 0.7739258 + - 0.17797852 + - 1.2255859 + - 0.9814453 + - -0.2902832 + - 1.2080078 + - 0.50097656 + - 0.2479248 + - -0.2166748 + - 0.29052734 + - -0.5004883 + - 0.26513672 + - 0.5024414 + - -0.042266846 + - -0.013465881 + - -0.6376953 + - 0.64501953 + - -1.7958984 + - 0.25512695 + - -0.20458984 + - -0.12927246 + - 0.19665527 + - 0.8076172 + - -0.96777344 + - 0.26391602 + - -0.5649414 + - -0.58740234 + - -0.15466309 + - 0.7392578 + - 0.5336914 + - 0.60253906 + - 1.1875 + - -0.37719727 + - 0.8198242 + - -0.2401123 + - 0.40527344 + - 0.17114258 + - -0.32128906 + - -0.75439453 + - 0.056488037 + - 0.16491699 + - 0.6899414 + - -0.6171875 + - -0.05316162 + - 0.43017578 + - -0.6074219 + - 0.040374756 + - -0.8618164 + - -0.7192383 + - 0.7402344 + - -0.42138672 + - 0.26831055 + - -1.5429688 + - 0.1706543 + - 1.2158203 + - -0.17077637 + - -0.13964844 + - -0.5449219 + - -0.59033203 + - -0.7783203 + - -0.18786621 + - -0.34838867 + - 0.6230469 + - -0.5878906 + - -0.90234375 + - -0.7324219 + - -0.81933594 + - 0.4819336 + - -1.1591797 + - 1.2109375 + - -1.0517578 + - 0.25219727 + - 1.2841797 + - 0.06347656 + - -0.72021484 + - -0.3671875 + - 0.07330322 + - -0.022644043 + - -0.3713379 + - -0.008430481 + - 0.3564453 + - -0.8354492 + - -0.59521484 + - -0.40405273 + - -0.027923584 + - -0.3100586 + - -1.109375 + - -0.030593872 + - 0.14086914 + - -1.2128906 + - 0.03488159 + - 0.35424805 + - -1.5683594 + - 0.17773438 + - -0.66796875 + - -1.9804688 + - -0.35327148 + - -0.2927246 + - -1.2011719 + - -0.4165039 + - 0.36645508 + - -0.049957275 + - -0.87353516 + - -0.9086914 + - 0.4790039 + - -1.4599609 + - 0.7866211 + - -0.27490234 + - 0.08477783 + - 0.2220459 + - 0.0017213821 + - -1.0927734 + - -0.006439209 + - -0.62060547 + - -0.68115234 + - 0.4572754 + - -0.61572266 + - -0.7871094 + - -1.3847656 + - 1.5566406 + - 0.2680664 + - 0.8466797 + - -0.2578125 + - -0.76416016 + - 0.6484375 + - -0.05279541 + - -0.1307373 + - -0.11853027 + - -0.6357422 + - -0.17700195 + - 0.9472656 + - -0.4958496 + - 0.015464783 + - -0.23168945 + - -1.6748047 + - -0.8911133 + - 0.86865234 + - 1.0722656 + - 0.34228516 + - 0.7182617 + - -0.5488281 + - -0.45166016 + - -0.3022461 + - 0.45336914 + - -0.28808594 + - -0.7626953 + - 0.016067505 + - 0.63183594 + - 0.46923828 + - -0.07373047 + - 1.7832031 + - -0.41796875 + - -0.89453125 + - 0.07757568 + - -0.29589844 + - -1.0673828 + - 1.3320313 + - 1.4160156 + - 0.20703125 + - -0.1060791 + - 0.1508789 + - 0.37231445 + - 0.05053711 + - -0.68896484 + - 0.7397461 + - 0.15771484 + - 0.5595703 + - -0.8198242 + - -0.17712402 + - -0.2479248 + - -0.066345215 + - 0.4194336 + - 1.0517578 + - -1.6650391 + - 0.90283203 + - 0.22937012 + - -0.5908203 + - -0.79785156 + - -0.003993988 + - -0.47314453 + - 0.19116211 + - -0.39038086 + - 0.6333008 + - -0.28686523 + - -0.8720703 + - 0.080200195 + - -1.2587891 + - 0.22790527 + - 0.55126953 + - -0.47485352 + - -0.20471191 + - 0.75390625 + - -1.0488281 + - 0.9902344 + - 1.2275391 + - 0.40966797 + - -0.36791992 + - 0.54833984 + - -0.32788086 + - 0.2208252 + - 1.1289063 + - -0.017410278 + - -0.67089844 + - 0.7236328 + - 0.20788574 + - 0.55566406 + - 0.7104492 + - -0.16589355 + - 0.57958984 + - 1.1494141 + - -0.15930176 + - -0.4963379 + - 0.016326904 + - 1.5634766 + - -0.5029297 + - 1.2011719 + - -1.0029297 + - -0.3557129 + - -0.31079102 + - -0.12670898 + - 0.81933594 + - 0.75683594 + - 1.1630859 + - 1.6669922 + - -0.8022461 + - -0.3034668 + - 0.3798828 + - -0.71484375 + - -0.7470703 + - 1.1904297 + - -0.95654297 + - 0.30297852 + - 0.16992188 + - 0.8173828 + - -0.8798828 + - 1.1376953 + - -0.4543457 + - 0.6142578 + - -0.47680664 + - 1.1181641 + - 0.01398468 + - -0.49560547 + - -0.039031982 + - 0.2878418 + - -0.71533203 + - 0.82128906 + - -0.03768921 + - 0.60546875 + - 0.7578125 + - -0.3322754 + - 0.86376953 + - -0.71435547 + - 0.7597656 + - -1.3496094 + - 0.18652344 + - -0.39990234 + - 0.31103516 + - 0.16809082 + - 1.2626953 + - -0.42919922 + - 0.2434082 + - 0.83935547 + - -1.3994141 + - 0.34472656 + - -0.68603516 + - -0.28759766 + - 0.4663086 + - 0.6816406 + - -0.48120117 + - -0.11029053 + - -0.48339844 + - 0.1706543 + - 0.29614258 + - -0.7290039 + - -0.87158203 + - 0.8457031 + - 0.57128906 + - 0.1640625 + - -0.1739502 + - -0.16394043 + - 0.8652344 + - -0.38671875 + - 0.5625 + - -0.30493164 + - 1.8251953 + - 0.041931152 + - 0.17285156 + - -1.0107422 + - -0.20788574 + - 1.1005859 + - 0.7973633 + - -1.0029297 + - 0.67041016 + - -0.96240234 + - 0.45166016 + - -0.32202148 + - -0.97753906 + - 1.7080078 + - -0.04626465 + - 0.4404297 + - 0.28833008 + - 0.32006836 + - -0.5341797 + - -0.74658203 + - -1.28125 + - -0.2076416 + - -0.57958984 + - 0.88134766 + - -0.21875 + - -0.51171875 + - 0.20214844 + - -0.9536133 + - -0.89160156 + - 0.6279297 + - -0.08929443 + - 1.2490234 + - -0.3083496 + - 0.5253906 + - -1.5771484 + - 0.86572266 + - -0.16223145 + - -0.6455078 + - -0.9008789 + - -0.68896484 + - -0.55566406 + - 0.54785156 + - -0.2052002 + - 1.0820313 + - 0.5390625 + - 0.2454834 + - -0.0053596497 + - 0.09838867 + - -0.08288574 + - 0.6616211 + - -0.06573486 + - -0.8120117 + - -0.08306885 + - 0.12176514 + - -1.4072266 + - 0.6533203 + - 0.49536133 + - 0.48339844 + - -0.6142578 + - 0.06011963 + - 0.4951172 + - -0.33935547 + - -0.85058594 + - -0.8510742 + - 0.10028076 + - 0.64501953 + - 0.62841797 + - 0.79052734 + - -0.8486328 + - -0.76708984 + - 0.38891602 + - 0.5917969 + - -0.06939697 + - -0.13366699 + - -0.8964844 + - -0.76660156 + - 1.3134766 + - 0.98046875 + - 0.37158203 + - 0.04675293 + - -1.2890625 + - 0.17102051 + - -0.16772461 + - -0.10760498 + - -0.111816406 + - 0.20251465 + - -0.65527344 + - 0.2800293 + - -1.8037109 + - 0.15270996 + - 0.25024414 + - 0.6713867 + - 0.67578125 + - -1.0322266 + - -0.4140625 + - -0.59277344 + - 0.028778076 + - -1.3515625 + - 0.12548828 + - 0.87353516 + - 0.87060547 + - -0.18518066 + - 0.7949219 + - -0.7011719 + - -0.28759766 + - 0.39013672 + - 0.43139648 + - -0.053955078 + - -0.60498047 + - 0.6381836 + - 0.20996094 + - 0.09857178 + - -0.7402344 + - 0.24731445 + - -0.41430664 + - -0.49365234 + - -0.7817383 + - -0.35766602 + - -0.53759766 + - -0.13439941 + - 0.03010559 + - 0.47070313 + - 0.16564941 + - 1.0439453 + - 0.7026367 + - 0.3251953 + - 0.021118164 + - -0.25976563 + - 1.4033203 + - 0.3383789 + - -0.0637207 + - 0.8149414 + - -0.7651367 + - -0.5332031 + - -0.19335938 + - 0.19458008 + - -0.61083984 + - 0.07684326 + - -0.6982422 + - -0.38989258 + - 0.37841797 + - 0.5966797 + - -1.9882813 + - -0.36767578 + - -2.0214844 + - 0.9682617 + - 0.46826172 + - -0.49829102 + - -0.20861816 + - -0.15332031 + - -0.13891602 + - 1.8779297 + - -0.18640137 + - 0.38134766 + - -0.1373291 + - -0.29492188 + - 0.42871094 + - -0.24523926 + - 0.16320801 + - 0.8408203 + - -0.34985352 + - 0.5307617 + - -0.14685059 + - 0.7729492 + - -0.11444092 + - -0.23522949 + - 1.2089844 + - -1.5595703 + - 0.09820557 + - -1.3476563 + - 0.6196289 + - -1.1464844 + - -0.47045898 + - -0.10656738 + - -1.3115234 + - 0.4309082 + - 0.054748535 + - 0.80078125 + - 0.43359375 + - -0.22290039 + - 0.55908203 + - -8.1484375 + - -0.7236328 + - -0.4831543 + - -0.21447754 + - 0.51904297 + - 0.5449219 + - 0.8520508 + - -0.8852539 + - 0.36865234 + - -0.1694336 + - -0.32250977 + - 0.12176514 + - 0.92578125 + - 0.38891602 + - 0.79296875 + - 0.46875 + - 0.9213867 + - 0.9970703 + - -0.32739258 + - 1.2900391 + - -0.1517334 + - 0.18640137 + - -0.6113281 + - 0.060821533 + - 0.3527832 + - -0.7915039 + - -0.3942871 + - 1.2158203 + - -0.8051758 + - 0.13598633 + - 0.21057129 + - -0.66552734 + - 1.5957031 + - 0.44262695 + - -0.24023438 + - -0.3984375 + - -1.0517578 + - -0.36499023 + - -0.5966797 + - 0.60546875 + - 1.2324219 + - 0.21520996 + - -0.18481445 + - -0.0066490173 + - -0.08239746 + - 0.7993164 + - -0.81884766 + - -1.6660156 + - -1.2861328 + - -0.8535156 + - 0.15856934 + - 0.6230469 + - 0.60595703 + - 0.5234375 + - -0.93603516 + - 0.7529297 + - 0.06738281 + - -0.002035141 + - -0.92285156 + - -0.25512695 + - -0.50878906 + - -0.7944336 + - -0.44970703 + - -0.64501953 + - 0.8569336 + - 0.12030029 + - -0.08343506 + - -0.5126953 + - 0.16540527 + - 1.6054688 + - -0.3947754 + - 0.34350586 + - -0.43066406 + - -0.04083252 + - 0.2956543 + - -0.5175781 + - 0.6567383 + - 0.57470703 + - 0.6694336 + - 0.13891602 + - 0.9790039 + - 0.16503906 + - -0.12017822 + - -0.8745117 + - 0.057861328 + - 0.24194336 + - -0.012207031 + - 0.40722656 + - -0.34936523 + - -0.1998291 + - 0.41210938 + - -0.17858887 + - -0.011474609 + - 0.10394287 + - -0.1048584 + - 0.037384033 + - 1.1806641 + - -0.68896484 + - 0.7397461 + - -0.7661133 + - -0.3540039 + - 0.6098633 + - -0.93066406 + - -0.49047852 + - -0.29418945 + - -1.4736328 + - -1.0498047 + - -1.2509766 + - -0.546875 + - -1.4882813 + - 0.4802246 + - -0.79052734 + - -0.24499512 + - -0.5517578 + - -0.08282471 + - -0.47705078 + - 0.18701172 + - 0.47827148 + - -0.21008301 + - -0.83154297 + - -0.106933594 + - 0.041656494 + - -0.09887695 + - 0.58447266 + - -0.80859375 + - -1.1503906 + - 0.19140625 + - 0.50146484 + - -0.8930664 + - -0.037750244 + - -0.4411621 + - 0.50439453 + - 1.484375 + - -0.8754883 + - -0.3227539 + - -0.98583984 + - -0.09124756 + - 0.48510742 + - -0.2775879 + - 0.80371094 + - -0.5683594 + - -0.25732422 + - 0.7504883 + - -0.37426758 + - 0.2199707 + - 0.37426758 + - -0.03375244 + - -0.40771484 + - -0.18078613 + - -0.48095703 + - -1.5078125 + - -0.6743164 + - 0.82177734 + - 0.25073242 + - -0.8261719 + - 0.33862305 + - -1.2646484 + - 0.8666992 + - -0.27392578 + - -0.34399414 + - -0.42333984 + - -0.4116211 + - 0.8027344 + - 1.1503906 + - -1.2041016 + - 0.35620117 + - -0.00016129017 + - -1.953125 + - -0.6035156 + - 0.58154297 + - 0.08703613 + - 0.48266602 + - -0.35180664 + - -0.11047363 + - 0.65966797 + - -1.4921875 + - -0.14086914 + - -0.2130127 + - 1.0244141 + - -1.4472656 + - 0.56152344 + - 1.734375 + - 0.09698486 + - -0.5415039 + - -0.1340332 + - 0.7583008 + - -0.2722168 + - 1.0488281 + - 1.0498047 + - 0.23254395 + - -0.15222168 + - 0.18005371 + - 0.097839355 + - -1.6386719 + - -0.6035156 + - -0.91748047 + - -0.93847656 + - 1.0576172 + - 0.703125 + - 0.70410156 + - 0.8198242 + - -2.25 + - -0.6357422 + - 0.35058594 + - 0.75146484 + - -0.12322998 + - -1.0859375 + - 0.50634766 + - -0.67822266 + - 0.7495117 + - -0.27685547 + - -0.13537598 +- - 0.039520264 + - 0.4255371 + - 0.19506836 + - -0.4951172 + - 0.5908203 + - -0.17102051 + - 1.3964844 + - 0.14685059 + - 1.8730469 + - 0.5810547 + - 0.7573242 + - 0.2841797 + - 0.027160645 + - -0.61328125 + - 0.24157715 + - -0.13586426 + - -0.44848633 + - 1.1748047 + - 0.5546875 + - -1.8710938 + - -0.08605957 + - -1.2617188 + - 0.7163086 + - -0.32055664 + - 0.11517334 + - 0.99658203 + - 0.09411621 + - 0.4724121 + - 0.20117188 + - 0.50439453 + - -0.07611084 + - -0.026397705 + - -0.5605469 + - -0.12670898 + - -0.7915039 + - 0.19970703 + - 0.97265625 + - 0.7597656 + - -1.6689453 + - -0.16137695 + - -1.5742188 + - -0.8232422 + - 0.3774414 + - -0.105651855 + - -0.026626587 + - 0.5175781 + - -1.21875 + - -0.67089844 + - -0.28198242 + - -0.20910645 + - 0.19665527 + - 0.64990234 + - 1.0576172 + - 0.24536133 + - 0.33862305 + - 0.76708984 + - 0.8564453 + - 0.20861816 + - -0.99853516 + - -1.0507813 + - -0.011680603 + - 0.5522461 + - -0.47558594 + - -0.8598633 + - -0.93847656 + - -0.46899414 + - 0.21325684 + - 1.4003906 + - 0.67089844 + - -0.48999023 + - -0.20861816 + - -0.53515625 + - 0.2241211 + - -1.1054688 + - 0.73339844 + - -1.2802734 + - 0.2442627 + - -0.0713501 + - 1.09375 + - 0.68408203 + - 0.94873047 + - -0.51904297 + - -0.14282227 + - -0.6435547 + - 0.32421875 + - 0.28881836 + - -0.0848999 + - -0.12792969 + - -1.9990234 + - 0.039886475 + - 0.6035156 + - -0.10223389 + - -0.095581055 + - 0.9741211 + - 0.025161743 + - -0.34033203 + - 1.1289063 + - 1.0546875 + - 0.19396973 + - -0.041290283 + - 0.9580078 + - -0.37304688 + - 0.20910645 + - 0.3161621 + - 0.44311523 + - 0.088012695 + - -1.1035156 + - 0.9350586 + - -1.3847656 + - 0.3918457 + - -0.14111328 + - -0.58251953 + - -0.43579102 + - 0.79589844 + - -0.6230469 + - 0.63427734 + - -0.6152344 + - -1.3935547 + - 0.3203125 + - 1.1542969 + - -0.022766113 + - 0.81933594 + - 0.59814453 + - -0.23718262 + - 0.8051758 + - -0.68115234 + - 0.25463867 + - -0.118896484 + - -0.15356445 + - 0.12756348 + - -0.32617188 + - -0.27734375 + - 0.95410156 + - -1.3583984 + - -0.55322266 + - -0.19372559 + - -1.0253906 + - 0.14758301 + - -1.6992188 + - -0.3317871 + - 0.5078125 + - -0.3552246 + - 0.037506104 + - -1.3037109 + - 0.016326904 + - 1.2617188 + - -0.4633789 + - 0.34521484 + - -0.8574219 + - -0.9423828 + - -0.55029297 + - 0.28564453 + - -0.1239624 + - 0.111572266 + - -0.40600586 + - -1.0878906 + - -0.5410156 + - 0.74658203 + - 0.06738281 + - -1.5810547 + - 1.1582031 + - -0.84765625 + - -0.10479736 + - 1.1591797 + - 0.08850098 + - -0.49902344 + - -0.071777344 + - 1.0751953 + - 0.6298828 + - 0.0947876 + - -0.36889648 + - 0.18457031 + - -0.5332031 + - -0.8461914 + - 0.5776367 + - -0.47265625 + - -0.53515625 + - -0.21533203 + - 0.31445313 + - 0.50878906 + - -0.80078125 + - -0.09869385 + - -0.46484375 + - 0.23132324 + - -0.1071167 + - -0.9375 + - -0.94433594 + - 0.22302246 + - -1.3183594 + - -1.2880859 + - -1.0263672 + - 0.7392578 + - -1.0771484 + - -0.06707764 + - -1.1992188 + - 0.09863281 + - -1.1689453 + - 0.703125 + - -0.51171875 + - -0.036346436 + - -0.6064453 + - 0.17321777 + - -0.26416016 + - 0.31811523 + - -1.2773438 + - 0.012527466 + - 1.4785156 + - -0.10699463 + - -0.35961914 + - -0.28881836 + - 1.0390625 + - 0.37646484 + - 0.97998047 + - -0.31567383 + - -0.72509766 + - 1.1767578 + - -0.35302734 + - -0.15820313 + - -0.08886719 + - 0.6435547 + - 0.03665161 + - 1.578125 + - -0.359375 + - -0.60791016 + - -0.048919678 + - -0.7290039 + - -0.1685791 + - 0.65283203 + - 1.0820313 + - -0.26586914 + - 0.11590576 + - -0.5361328 + - -0.81347656 + - -1.0986328 + - 1.3056641 + - -0.33984375 + - -0.23547363 + - -0.0713501 + - 0.83984375 + - 0.5654297 + - -0.74609375 + - 1.4326172 + - -0.80078125 + - -0.6508789 + - 0.42749023 + - 0.036346436 + - -0.02998352 + - 0.7915039 + - 1.0439453 + - 0.66748047 + - 0.57128906 + - 0.33276367 + - -0.31152344 + - 0.028060913 + - 0.037902832 + - 0.6381836 + - 0.06414795 + - 0.19274902 + - -0.68847656 + - 0.11767578 + - -0.4963379 + - 0.12487793 + - 0.041503906 + - 0.31567383 + - -1.3642578 + - 0.6875 + - 0.8310547 + - -0.37670898 + - -0.9199219 + - 0.039245605 + - 0.0040512085 + - -0.068603516 + - -0.011726379 + - 0.7993164 + - -0.16674805 + - -0.45703125 + - -0.71191406 + - -1.1611328 + - -0.06738281 + - 1.1181641 + - -0.44482422 + - 0.3383789 + - 0.39501953 + - -0.28930664 + - 1.0507813 + - 0.26464844 + - 0.8310547 + - -0.8935547 + - 0.15002441 + - -0.8461914 + - 0.7841797 + - 1.3574219 + - 0.05038452 + - 0.3569336 + - -0.8769531 + - -0.27441406 + - 0.28857422 + - 0.1459961 + - 0.0003156662 + - 0.043121338 + - 0.65771484 + - 0.08758545 + - -0.0033512115 + - -0.1875 + - 0.7397461 + - -0.5463867 + - 0.46826172 + - -1.1835938 + - -0.23535156 + - -0.3701172 + - -0.16711426 + - 0.5722656 + - 0.38354492 + - 1.0068359 + - 0.8955078 + - 0.17358398 + - 0.08251953 + - -0.33251953 + - -0.06994629 + - -0.6298828 + - 0.96435547 + - -0.8149414 + - 0.6376953 + - 0.38549805 + - 1.0146484 + - -1.4296875 + - 0.2109375 + - -0.46557617 + - 0.5151367 + - -0.47729492 + - 0.91748047 + - 0.058654785 + - 0.62939453 + - 0.18261719 + - 0.08685303 + - -1.2226563 + - 0.36083984 + - -0.60791016 + - 0.53808594 + - -0.042816162 + - -1.0537109 + - 1.5537109 + - -0.35009766 + - 0.9067383 + - -0.74902344 + - 0.3059082 + - -0.4177246 + - 0.23950195 + - -0.19958496 + - 0.9589844 + - -0.26416016 + - 0.17883301 + - 0.028823853 + - -0.20239258 + - 0.6230469 + - -1.2568359 + - 0.73046875 + - 1.1914063 + - 0.38842773 + - -0.49365234 + - -0.33691406 + - 0.085754395 + - 0.21142578 + - -0.096069336 + - 0.30981445 + - -1.4892578 + - 0.6958008 + - 0.16235352 + - 0.15075684 + - -0.15576172 + - -0.73828125 + - 0.97802734 + - -0.22546387 + - 0.79296875 + - -0.40625 + - 1.8994141 + - 0.053527832 + - 0.02268982 + - -0.7207031 + - -0.63134766 + - -0.07324219 + - 0.08795166 + - 0.22595215 + - 0.035247803 + - -0.83203125 + - -0.08026123 + - 0.07891846 + - -1.4433594 + - 1.2402344 + - 0.7402344 + - 0.2479248 + - -0.25732422 + - 0.29418945 + - -0.88916016 + - -0.35229492 + - -0.65771484 + - 0.048614502 + - -0.1295166 + - 0.1381836 + - -0.60253906 + - -0.5102539 + - -0.39868164 + - -1.6806641 + - -0.6455078 + - 0.24414063 + - -0.19958496 + - 0.62353516 + - -0.86035156 + - 0.10614014 + - -1.0644531 + - 0.84033203 + - -0.48266602 + - -0.30493164 + - -0.3864746 + - -0.052856445 + - -1.2080078 + - -0.43115234 + - 0.12310791 + - 0.80859375 + - 0.21838379 + - -0.027175903 + - -0.10418701 + - -0.44189453 + - -0.051757813 + - 0.6767578 + - -0.7939453 + - -0.703125 + - -0.6723633 + - -0.1743164 + - -1.3681641 + - -0.36376953 + - -0.85546875 + - 1.3095703 + - 0.22692871 + - 0.27783203 + - -0.018127441 + - -0.671875 + - -0.921875 + - -0.2841797 + - -0.45874023 + - -0.20581055 + - -0.3786621 + - 1.0615234 + - -0.8754883 + - -1.0185547 + - 0.13696289 + - 0.15734863 + - 0.57714844 + - -0.234375 + - -1.0605469 + - -0.54052734 + - 0.9375 + - 1.0097656 + - -0.8676758 + - 0.09088135 + - -0.88671875 + - 0.5229492 + - 0.08917236 + - -0.12042236 + - -0.8720703 + - 1.0849609 + - -0.46362305 + - 0.6347656 + - -1.7353516 + - -0.42382813 + - -0.017181396 + - 0.40551758 + - -0.07434082 + - -0.120910645 + - -0.10473633 + - 0.29589844 + - 0.6972656 + - -1.015625 + - 0.5371094 + - -0.51171875 + - 1.1914063 + - -0.113342285 + - 1.3095703 + - -0.8334961 + - 0.39233398 + - -0.09277344 + - 0.21032715 + - 0.24316406 + - 0.15551758 + - 0.15319824 + - -0.6533203 + - -0.3918457 + - -0.83984375 + - 0.15820313 + - -0.3544922 + - -0.19848633 + - 0.074401855 + - -0.23913574 + - -0.36791992 + - -0.5986328 + - 0.2980957 + - -0.1463623 + - -0.43823242 + - 0.9272461 + - 0.24169922 + - 0.1842041 + - -0.38793945 + - -0.54589844 + - 0.67333984 + - -0.20532227 + - 0.7084961 + - 0.19482422 + - 0.3100586 + - -0.18029785 + - 0.83691406 + - 0.09051514 + - -0.14501953 + - 0.08215332 + - 0.016418457 + - 0.2763672 + - 0.5053711 + - -0.6357422 + - -2.8535156 + - 0.09869385 + - -1.2763672 + - 0.7895508 + - 0.32861328 + - -0.58691406 + - 0.05392456 + - -0.49316406 + - 0.03439331 + - 1.3232422 + - -0.3791504 + - -0.009689331 + - 0.12915039 + - 0.39648438 + - 0.40820313 + - -0.5541992 + - 0.07409668 + - 0.16479492 + - -0.008087158 + - 0.17626953 + - -0.22290039 + - 0.93310547 + - -0.03164673 + - 0.010131836 + - 0.97998047 + - 0.16027832 + - 0.5805664 + - -0.96191406 + - 0.39916992 + - -0.23803711 + - -0.7949219 + - 0.16552734 + - -1.9003906 + - -0.5800781 + - -0.39697266 + - 0.10223389 + - 0.18554688 + - -0.7553711 + - 1.5869141 + - -10.421875 + - -0.06225586 + - 0.010032654 + - -0.56103516 + - 0.6611328 + - 0.43969727 + - 0.3322754 + - -1.2880859 + - 0.35083008 + - -0.030227661 + - -0.38964844 + - -0.19934082 + - 0.2993164 + - -0.23413086 + - 0.7788086 + - 0.2434082 + - 0.8574219 + - 0.5605469 + - -0.60253906 + - 0.74560547 + - -0.092163086 + - 0.1550293 + - 0.0060577393 + - -0.27563477 + - 0.30200195 + - -0.7753906 + - 0.16113281 + - 0.47851563 + - 0.20031738 + - -0.032348633 + - 0.6723633 + - -0.9267578 + - 1.2167969 + - 0.08666992 + - -0.0042877197 + - -0.46826172 + - 0.49487305 + - -0.037994385 + - -0.12225342 + - 0.16149902 + - 0.6699219 + - 0.11102295 + - -0.09790039 + - -0.4350586 + - -0.4189453 + - 0.36376953 + - -0.27807617 + - -1.6953125 + - -0.7861328 + - -0.042816162 + - 0.43481445 + - 0.5102539 + - 0.037719727 + - -0.6269531 + - -0.8925781 + - -0.3461914 + - 0.28271484 + - -0.3173828 + - -0.8359375 + - 0.81884766 + - -0.025634766 + - -1.0087891 + - 0.051361084 + - -0.5576172 + - 0.4494629 + - 0.15014648 + - -0.30273438 + - -0.47631836 + - 0.49731445 + - 1.28125 + - -0.33496094 + - 0.46240234 + - 0.44091797 + - 1.1992188 + - -0.6147461 + - -0.2121582 + - 0.13452148 + - 1.1835938 + - 0.27856445 + - 0.026153564 + - 1.4316406 + - -0.08312988 + - -0.25976563 + - 0.1541748 + - -0.49804688 + - -0.0099487305 + - -0.23522949 + - 0.31103516 + - 0.08532715 + - -0.3959961 + - 0.2553711 + - 0.14807129 + - -0.049591064 + - -0.50097656 + - -0.10668945 + - -0.34399414 + - 0.54541016 + - -0.94628906 + - 0.29467773 + - -0.59472656 + - 0.1361084 + - 0.06640625 + - -0.030883789 + - -0.55908203 + - -0.41186523 + - -0.95947266 + - -1.0517578 + - 0.14428711 + - -0.16186523 + - -1.5146484 + - 0.19555664 + - -0.5473633 + - -0.073913574 + - -0.24536133 + - -0.47998047 + - -1.0888672 + - -0.021987915 + - -0.5107422 + - -0.4970703 + - -0.78027344 + - -0.3671875 + - 0.46923828 + - 0.011650085 + - 0.09283447 + - -0.8222656 + - -0.7807617 + - 1.0908203 + - -0.5229492 + - -0.75927734 + - -0.47705078 + - -0.4206543 + - 0.39086914 + - 1.2792969 + - 0.5048828 + - -0.09899902 + - -0.6352539 + - -0.00077199936 + - 0.80078125 + - -0.8129883 + - 0.95166016 + - -0.70996094 + - -0.37841797 + - 0.17565918 + - 0.20361328 + - -0.037200928 + - 0.057159424 + - -0.03933716 + - 0.16137695 + - -0.14086914 + - -1.0478516 + - -1.3056641 + - -0.80126953 + - 1.4951172 + - 0.74902344 + - -0.73583984 + - -0.38842773 + - -1.3876953 + - 0.7602539 + - -0.45458984 + - 0.105163574 + - 0.92871094 + - -0.5180664 + - 0.62939453 + - 1.828125 + - 0.13671875 + - -0.5917969 + - 0.17919922 + - -0.79248047 + - -0.29663086 + - 0.5097656 + - 0.33911133 + - 0.3540039 + - -0.50341797 + - 0.1182251 + - -0.15393066 + - -1.3339844 + - -0.28442383 + - 0.59716797 + - 0.8642578 + - -1.6845703 + - 0.15039063 + - 1.9853516 + - 0.30371094 + - 0.041412354 + - 0.29492188 + - 0.30395508 + - -0.5595703 + - 0.56396484 + - 1.0253906 + - -0.6640625 + - -0.031311035 + - -0.15283203 + - -0.055267334 + - -0.4880371 + - -0.19238281 + - -0.5 + - -0.7084961 + - 0.42822266 + - 0.1541748 + - -0.014923096 + - 1.0146484 + - -1.2333984 + - -0.13317871 + - 0.6503906 + - 0.8798828 + - 0.14440918 + - -0.7792969 + - 0.2890625 + - 0.35961914 + - -0.072509766 + - -0.14611816 + - -0.041137695 +- - 0.4428711 + - 0.6118164 + - 0.07043457 + - -0.5917969 + - 0.88183594 + - -0.10839844 + - 0.0881958 + - -0.20483398 + - 1.9345703 + - 0.6230469 + - 0.59521484 + - 0.18737793 + - 0.030548096 + - -0.078308105 + - 0.79589844 + - -0.23474121 + - -0.8720703 + - 1.6923828 + - 0.12597656 + - -1.9267578 + - -0.34472656 + - -1.9326172 + - 0.89990234 + - -0.2006836 + - 0.024230957 + - 0.2878418 + - 0.3642578 + - 0.17956543 + - -0.51123047 + - 0.025817871 + - -0.8964844 + - 0.14147949 + - -0.39257813 + - -0.8486328 + - 0.005218506 + - 0.42358398 + - 0.23181152 + - 1.1630859 + - -1.1455078 + - 0.3388672 + - -2.1484375 + - -1.0146484 + - -0.2841797 + - 0.021499634 + - 0.16235352 + - 0.39453125 + - -0.9511719 + - 0.41064453 + - -0.15563965 + - -0.484375 + - -0.07080078 + - 0.07312012 + - 0.56103516 + - 0.028213501 + - -0.027938843 + - 0.43896484 + - 1.0136719 + - 0.7788086 + - -0.5644531 + - -1.9824219 + - -0.011169434 + - 0.50634766 + - -0.39331055 + - -0.3334961 + - -1.1679688 + - -0.07208252 + - 0.008544922 + - 0.7788086 + - -0.10021973 + - -0.30859375 + - 0.35888672 + - -0.44848633 + - -0.08679199 + - -1.0791016 + - 1.3193359 + - -1.0273438 + - 0.34228516 + - -0.45385742 + - 0.8027344 + - 0.50634766 + - 0.703125 + - -0.96533203 + - -0.042938232 + - -1.0927734 + - 0.35205078 + - -0.56689453 + - -0.5341797 + - 0.23571777 + - -2.0234375 + - -0.26342773 + - 0.1998291 + - 0.7739258 + - 0.17797852 + - 1.2255859 + - 0.9814453 + - -0.2902832 + - 1.2080078 + - 0.50097656 + - 0.2479248 + - -0.2166748 + - 0.29052734 + - -0.5004883 + - 0.26513672 + - 0.5024414 + - -0.042266846 + - -0.013465881 + - -0.6376953 + - 0.64501953 + - -1.7958984 + - 0.25512695 + - -0.20458984 + - -0.12927246 + - 0.19665527 + - 0.8076172 + - -0.96777344 + - 0.26391602 + - -0.5649414 + - -0.58740234 + - -0.15466309 + - 0.7392578 + - 0.5336914 + - 0.60253906 + - 1.1875 + - -0.37719727 + - 0.8198242 + - -0.2401123 + - 0.40527344 + - 0.17114258 + - -0.32128906 + - -0.75439453 + - 0.056488037 + - 0.16491699 + - 0.6899414 + - -0.6171875 + - -0.05316162 + - 0.43017578 + - -0.6074219 + - 0.040374756 + - -0.8618164 + - -0.7192383 + - 0.7402344 + - -0.42138672 + - 0.26831055 + - -1.5429688 + - 0.1706543 + - 1.2158203 + - -0.17077637 + - -0.13964844 + - -0.5449219 + - -0.59033203 + - -0.7783203 + - -0.18786621 + - -0.34838867 + - 0.6230469 + - -0.5878906 + - -0.90234375 + - -0.7324219 + - -0.81933594 + - 0.4819336 + - -1.1591797 + - 1.2109375 + - -1.0517578 + - 0.25219727 + - 1.2841797 + - 0.06347656 + - -0.72021484 + - -0.3671875 + - 0.07330322 + - -0.022644043 + - -0.3713379 + - -0.008430481 + - 0.3564453 + - -0.8354492 + - -0.59521484 + - -0.40405273 + - -0.027923584 + - -0.3100586 + - -1.109375 + - -0.030593872 + - 0.14086914 + - -1.2128906 + - 0.03488159 + - 0.35424805 + - -1.5683594 + - 0.17773438 + - -0.66796875 + - -1.9804688 + - -0.35327148 + - -0.2927246 + - -1.2011719 + - -0.4165039 + - 0.36645508 + - -0.049957275 + - -0.87353516 + - -0.9086914 + - 0.4790039 + - -1.4599609 + - 0.7866211 + - -0.27490234 + - 0.08477783 + - 0.2220459 + - 0.0017213821 + - -1.0927734 + - -0.006439209 + - -0.62060547 + - -0.68115234 + - 0.4572754 + - -0.61572266 + - -0.7871094 + - -1.3847656 + - 1.5566406 + - 0.2680664 + - 0.8466797 + - -0.2578125 + - -0.76416016 + - 0.6484375 + - -0.05279541 + - -0.1307373 + - -0.11853027 + - -0.6357422 + - -0.17700195 + - 0.9472656 + - -0.4958496 + - 0.015464783 + - -0.23168945 + - -1.6748047 + - -0.8911133 + - 0.86865234 + - 1.0722656 + - 0.34228516 + - 0.7182617 + - -0.5488281 + - -0.45166016 + - -0.3022461 + - 0.45336914 + - -0.28808594 + - -0.7626953 + - 0.016067505 + - 0.63183594 + - 0.46923828 + - -0.07373047 + - 1.7832031 + - -0.41796875 + - -0.89453125 + - 0.07757568 + - -0.29589844 + - -1.0673828 + - 1.3320313 + - 1.4160156 + - 0.20703125 + - -0.1060791 + - 0.1508789 + - 0.37231445 + - 0.05053711 + - -0.68896484 + - 0.7397461 + - 0.15771484 + - 0.5595703 + - -0.8198242 + - -0.17712402 + - -0.2479248 + - -0.066345215 + - 0.4194336 + - 1.0517578 + - -1.6650391 + - 0.90283203 + - 0.22937012 + - -0.5908203 + - -0.79785156 + - -0.003993988 + - -0.47314453 + - 0.19116211 + - -0.39038086 + - 0.6333008 + - -0.28686523 + - -0.8720703 + - 0.080200195 + - -1.2587891 + - 0.22790527 + - 0.55126953 + - -0.47485352 + - -0.20471191 + - 0.75390625 + - -1.0488281 + - 0.9902344 + - 1.2275391 + - 0.40966797 + - -0.36791992 + - 0.54833984 + - -0.32788086 + - 0.2208252 + - 1.1289063 + - -0.017410278 + - -0.67089844 + - 0.7236328 + - 0.20788574 + - 0.55566406 + - 0.7104492 + - -0.16589355 + - 0.57958984 + - 1.1494141 + - -0.15930176 + - -0.4963379 + - 0.016326904 + - 1.5634766 + - -0.5029297 + - 1.2011719 + - -1.0029297 + - -0.3557129 + - -0.31079102 + - -0.12670898 + - 0.81933594 + - 0.75683594 + - 1.1630859 + - 1.6669922 + - -0.8022461 + - -0.3034668 + - 0.3798828 + - -0.71484375 + - -0.7470703 + - 1.1904297 + - -0.95654297 + - 0.30297852 + - 0.16992188 + - 0.8173828 + - -0.8798828 + - 1.1376953 + - -0.4543457 + - 0.6142578 + - -0.47680664 + - 1.1181641 + - 0.01398468 + - -0.49560547 + - -0.039031982 + - 0.2878418 + - -0.71533203 + - 0.82128906 + - -0.03768921 + - 0.60546875 + - 0.7578125 + - -0.3322754 + - 0.86376953 + - -0.71435547 + - 0.7597656 + - -1.3496094 + - 0.18652344 + - -0.39990234 + - 0.31103516 + - 0.16809082 + - 1.2626953 + - -0.42919922 + - 0.2434082 + - 0.83935547 + - -1.3994141 + - 0.34472656 + - -0.68603516 + - -0.28759766 + - 0.4663086 + - 0.6816406 + - -0.48120117 + - -0.11029053 + - -0.48339844 + - 0.1706543 + - 0.29614258 + - -0.7290039 + - -0.87158203 + - 0.8457031 + - 0.57128906 + - 0.1640625 + - -0.1739502 + - -0.16394043 + - 0.8652344 + - -0.38671875 + - 0.5625 + - -0.30493164 + - 1.8251953 + - 0.041931152 + - 0.17285156 + - -1.0107422 + - -0.20788574 + - 1.1005859 + - 0.7973633 + - -1.0029297 + - 0.67041016 + - -0.96240234 + - 0.45166016 + - -0.32202148 + - -0.97753906 + - 1.7080078 + - -0.04626465 + - 0.4404297 + - 0.28833008 + - 0.32006836 + - -0.5341797 + - -0.74658203 + - -1.28125 + - -0.2076416 + - -0.57958984 + - 0.88134766 + - -0.21875 + - -0.51171875 + - 0.20214844 + - -0.9536133 + - -0.89160156 + - 0.6279297 + - -0.08929443 + - 1.2490234 + - -0.3083496 + - 0.5253906 + - -1.5771484 + - 0.86572266 + - -0.16223145 + - -0.6455078 + - -0.9008789 + - -0.68896484 + - -0.55566406 + - 0.54785156 + - -0.2052002 + - 1.0820313 + - 0.5390625 + - 0.2454834 + - -0.0053596497 + - 0.09838867 + - -0.08288574 + - 0.6616211 + - -0.06573486 + - -0.8120117 + - -0.08306885 + - 0.12176514 + - -1.4072266 + - 0.6533203 + - 0.49536133 + - 0.48339844 + - -0.6142578 + - 0.06011963 + - 0.4951172 + - -0.33935547 + - -0.85058594 + - -0.8510742 + - 0.10028076 + - 0.64501953 + - 0.62841797 + - 0.79052734 + - -0.8486328 + - -0.76708984 + - 0.38891602 + - 0.5917969 + - -0.06939697 + - -0.13366699 + - -0.8964844 + - -0.76660156 + - 1.3134766 + - 0.98046875 + - 0.37158203 + - 0.04675293 + - -1.2890625 + - 0.17102051 + - -0.16772461 + - -0.10760498 + - -0.111816406 + - 0.20251465 + - -0.65527344 + - 0.2800293 + - -1.8037109 + - 0.15270996 + - 0.25024414 + - 0.6713867 + - 0.67578125 + - -1.0322266 + - -0.4140625 + - -0.59277344 + - 0.028778076 + - -1.3515625 + - 0.12548828 + - 0.87353516 + - 0.87060547 + - -0.18518066 + - 0.7949219 + - -0.7011719 + - -0.28759766 + - 0.39013672 + - 0.43139648 + - -0.053955078 + - -0.60498047 + - 0.6381836 + - 0.20996094 + - 0.09857178 + - -0.7402344 + - 0.24731445 + - -0.41430664 + - -0.49365234 + - -0.7817383 + - -0.35766602 + - -0.53759766 + - -0.13439941 + - 0.03010559 + - 0.47070313 + - 0.16564941 + - 1.0439453 + - 0.7026367 + - 0.3251953 + - 0.021118164 + - -0.25976563 + - 1.4033203 + - 0.3383789 + - -0.0637207 + - 0.8149414 + - -0.7651367 + - -0.5332031 + - -0.19335938 + - 0.19458008 + - -0.61083984 + - 0.07684326 + - -0.6982422 + - -0.38989258 + - 0.37841797 + - 0.5966797 + - -1.9882813 + - -0.36767578 + - -2.0214844 + - 0.9682617 + - 0.46826172 + - -0.49829102 + - -0.20861816 + - -0.15332031 + - -0.13891602 + - 1.8779297 + - -0.18640137 + - 0.38134766 + - -0.1373291 + - -0.29492188 + - 0.42871094 + - -0.24523926 + - 0.16320801 + - 0.8408203 + - -0.34985352 + - 0.5307617 + - -0.14685059 + - 0.7729492 + - -0.11444092 + - -0.23522949 + - 1.2089844 + - -1.5595703 + - 0.09820557 + - -1.3476563 + - 0.6196289 + - -1.1464844 + - -0.47045898 + - -0.10656738 + - -1.3115234 + - 0.4309082 + - 0.054748535 + - 0.80078125 + - 0.43359375 + - -0.22290039 + - 0.55908203 + - -8.1484375 + - -0.7236328 + - -0.4831543 + - -0.21447754 + - 0.51904297 + - 0.5449219 + - 0.8520508 + - -0.8852539 + - 0.36865234 + - -0.1694336 + - -0.32250977 + - 0.12176514 + - 0.92578125 + - 0.38891602 + - 0.79296875 + - 0.46875 + - 0.9213867 + - 0.9970703 + - -0.32739258 + - 1.2900391 + - -0.1517334 + - 0.18640137 + - -0.6113281 + - 0.060821533 + - 0.3527832 + - -0.7915039 + - -0.3942871 + - 1.2158203 + - -0.8051758 + - 0.13598633 + - 0.21057129 + - -0.66552734 + - 1.5957031 + - 0.44262695 + - -0.24023438 + - -0.3984375 + - -1.0517578 + - -0.36499023 + - -0.5966797 + - 0.60546875 + - 1.2324219 + - 0.21520996 + - -0.18481445 + - -0.0066490173 + - -0.08239746 + - 0.7993164 + - -0.81884766 + - -1.6660156 + - -1.2861328 + - -0.8535156 + - 0.15856934 + - 0.6230469 + - 0.60595703 + - 0.5234375 + - -0.93603516 + - 0.7529297 + - 0.06738281 + - -0.002035141 + - -0.92285156 + - -0.25512695 + - -0.50878906 + - -0.7944336 + - -0.44970703 + - -0.64501953 + - 0.8569336 + - 0.12030029 + - -0.08343506 + - -0.5126953 + - 0.16540527 + - 1.6054688 + - -0.3947754 + - 0.34350586 + - -0.43066406 + - -0.04083252 + - 0.2956543 + - -0.5175781 + - 0.6567383 + - 0.57470703 + - 0.6694336 + - 0.13891602 + - 0.9790039 + - 0.16503906 + - -0.12017822 + - -0.8745117 + - 0.057861328 + - 0.24194336 + - -0.012207031 + - 0.40722656 + - -0.34936523 + - -0.1998291 + - 0.41210938 + - -0.17858887 + - -0.011474609 + - 0.10394287 + - -0.1048584 + - 0.037384033 + - 1.1806641 + - -0.68896484 + - 0.7397461 + - -0.7661133 + - -0.3540039 + - 0.6098633 + - -0.93066406 + - -0.49047852 + - -0.29418945 + - -1.4736328 + - -1.0498047 + - -1.2509766 + - -0.546875 + - -1.4882813 + - 0.4802246 + - -0.79052734 + - -0.24499512 + - -0.5517578 + - -0.08282471 + - -0.47705078 + - 0.18701172 + - 0.47827148 + - -0.21008301 + - -0.83154297 + - -0.106933594 + - 0.041656494 + - -0.09887695 + - 0.58447266 + - -0.80859375 + - -1.1503906 + - 0.19140625 + - 0.50146484 + - -0.8930664 + - -0.037750244 + - -0.4411621 + - 0.50439453 + - 1.484375 + - -0.8754883 + - -0.3227539 + - -0.98583984 + - -0.09124756 + - 0.48510742 + - -0.2775879 + - 0.80371094 + - -0.5683594 + - -0.25732422 + - 0.7504883 + - -0.37426758 + - 0.2199707 + - 0.37426758 + - -0.03375244 + - -0.40771484 + - -0.18078613 + - -0.48095703 + - -1.5078125 + - -0.6743164 + - 0.82177734 + - 0.25073242 + - -0.8261719 + - 0.33862305 + - -1.2646484 + - 0.8666992 + - -0.27392578 + - -0.34399414 + - -0.42333984 + - -0.4116211 + - 0.8027344 + - 1.1503906 + - -1.2041016 + - 0.35620117 + - -0.00016129017 + - -1.953125 + - -0.6035156 + - 0.58154297 + - 0.08703613 + - 0.48266602 + - -0.35180664 + - -0.11047363 + - 0.65966797 + - -1.4921875 + - -0.14086914 + - -0.2130127 + - 1.0244141 + - -1.4472656 + - 0.56152344 + - 1.734375 + - 0.09698486 + - -0.5415039 + - -0.1340332 + - 0.7583008 + - -0.2722168 + - 1.0488281 + - 1.0498047 + - 0.23254395 + - -0.15222168 + - 0.18005371 + - 0.097839355 + - -1.6386719 + - -0.6035156 + - -0.91748047 + - -0.93847656 + - 1.0576172 + - 0.703125 + - 0.70410156 + - 0.8198242 + - -2.25 + - -0.6357422 + - 0.35058594 + - 0.75146484 + - -0.12322998 + - -1.0859375 + - 0.50634766 + - -0.67822266 + - 0.7495117 + - -0.27685547 + - -0.13537598 diff --git a/backends/candle/tests/snapshots/test_flash_gte__gte_single.snap b/backends/candle/tests/snapshots/test_flash_gte__gte_single.snap new file mode 100644 index 00000000..96c169b0 --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_gte__gte_single.snap @@ -0,0 +1,773 @@ +--- +source: backends/candle/tests/test_flash_gte.rs +assertion_line: 48 +expression: embeddings_single +--- +- - 0.44262695 + - 0.6113281 + - 0.07098389 + - -0.5908203 + - 0.88134766 + - -0.10870361 + - 0.08959961 + - -0.20568848 + - 1.9335938 + - 0.62353516 + - 0.5957031 + - 0.18664551 + - 0.030349731 + - -0.07714844 + - 0.7963867 + - -0.23425293 + - -0.8720703 + - 1.6923828 + - 0.12585449 + - -1.9277344 + - -0.34448242 + - -1.9326172 + - 0.9003906 + - -0.20056152 + - 0.023971558 + - 0.28833008 + - 0.3647461 + - 0.17883301 + - -0.51123047 + - 0.02519226 + - -0.89453125 + - 0.14074707 + - -0.3918457 + - -0.84814453 + - 0.0044822693 + - 0.42407227 + - 0.23144531 + - 1.1621094 + - -1.1464844 + - 0.33862305 + - -2.1484375 + - -1.0136719 + - -0.2841797 + - 0.02142334 + - 0.16271973 + - 0.3942871 + - -0.9511719 + - 0.4099121 + - -0.15612793 + - -0.484375 + - -0.071777344 + - 0.07232666 + - 0.5595703 + - 0.028564453 + - -0.027267456 + - 0.43798828 + - 1.0136719 + - 0.7792969 + - -0.56396484 + - -1.9824219 + - -0.011451721 + - 0.50683594 + - -0.39331055 + - -0.3334961 + - -1.1679688 + - -0.072387695 + - 0.008460999 + - 0.7788086 + - -0.099609375 + - -0.30981445 + - 0.3581543 + - -0.4482422 + - -0.08532715 + - -1.0791016 + - 1.3193359 + - -1.0273438 + - 0.34350586 + - -0.45288086 + - 0.8022461 + - 0.5048828 + - 0.7026367 + - -0.96533203 + - -0.04159546 + - -1.09375 + - 0.35180664 + - -0.56689453 + - -0.5341797 + - 0.23583984 + - -2.0253906 + - -0.2619629 + - 0.19995117 + - 0.7739258 + - 0.17883301 + - 1.2255859 + - 0.98095703 + - -0.2902832 + - 1.2080078 + - 0.50097656 + - 0.24719238 + - -0.21533203 + - 0.2902832 + - -0.50097656 + - 0.26489258 + - 0.5019531 + - -0.042816162 + - -0.013328552 + - -0.63916016 + - 0.64404297 + - -1.7949219 + - 0.25439453 + - -0.2043457 + - -0.12939453 + - 0.19616699 + - 0.80908203 + - -0.9667969 + - 0.26342773 + - -0.5644531 + - -0.58691406 + - -0.1541748 + - 0.7397461 + - 0.5336914 + - 0.6020508 + - 1.1865234 + - -0.3774414 + - 0.8198242 + - -0.24084473 + - 0.40527344 + - 0.17089844 + - -0.3203125 + - -0.7548828 + - 0.056518555 + - 0.16540527 + - 0.6899414 + - -0.6166992 + - -0.052642822 + - 0.43041992 + - -0.6074219 + - 0.039886475 + - -0.8613281 + - -0.71875 + - 0.7402344 + - -0.42138672 + - 0.26953125 + - -1.5439453 + - 0.17004395 + - 1.2167969 + - -0.17102051 + - -0.13879395 + - -0.5463867 + - -0.59033203 + - -0.7783203 + - -0.1875 + - -0.34838867 + - 0.6230469 + - -0.5888672 + - -0.9038086 + - -0.7319336 + - -0.8183594 + - 0.4807129 + - -1.1611328 + - 1.2109375 + - -1.0537109 + - 0.25268555 + - 1.2851563 + - 0.06317139 + - -0.7207031 + - -0.36694336 + - 0.072265625 + - -0.022918701 + - -0.3708496 + - -0.0073547363 + - 0.35791016 + - -0.8354492 + - -0.5961914 + - -0.40429688 + - -0.027389526 + - -0.31079102 + - -1.1103516 + - -0.030670166 + - 0.14013672 + - -1.2119141 + - 0.035247803 + - 0.3527832 + - -1.5673828 + - 0.1763916 + - -0.66748047 + - -1.9804688 + - -0.35351563 + - -0.29223633 + - -1.2021484 + - -0.41601563 + - 0.36669922 + - -0.051330566 + - -0.87353516 + - -0.9086914 + - 0.4794922 + - -1.4589844 + - 0.7866211 + - -0.27441406 + - 0.084106445 + - 0.22143555 + - 0.0014467239 + - -1.0917969 + - -0.0079574585 + - -0.62060547 + - -0.6816406 + - 0.45751953 + - -0.6166992 + - -0.78759766 + - -1.3847656 + - 1.5576172 + - 0.2697754 + - 0.8461914 + - -0.25756836 + - -0.765625 + - 0.6489258 + - -0.053344727 + - -0.13195801 + - -0.119628906 + - -0.6357422 + - -0.17736816 + - 0.9477539 + - -0.49682617 + - 0.016204834 + - -0.23156738 + - -1.6738281 + - -0.890625 + - 0.8666992 + - 1.0703125 + - 0.3425293 + - 0.71972656 + - -0.5498047 + - -0.45263672 + - -0.30249023 + - 0.45336914 + - -0.28588867 + - -0.7626953 + - 0.017074585 + - 0.6308594 + - 0.47094727 + - -0.07519531 + - 1.7861328 + - -0.41723633 + - -0.8935547 + - 0.077697754 + - -0.29492188 + - -1.0673828 + - 1.3300781 + - 1.4150391 + - 0.20751953 + - -0.10571289 + - 0.15100098 + - 0.37182617 + - 0.05105591 + - -0.6875 + - 0.7392578 + - 0.15649414 + - 0.5600586 + - -0.81884766 + - -0.17700195 + - -0.24841309 + - -0.06628418 + - 0.42016602 + - 1.0527344 + - -1.6660156 + - 0.90283203 + - 0.22888184 + - -0.5917969 + - -0.7973633 + - -0.0041236877 + - -0.4741211 + - 0.19104004 + - -0.390625 + - 0.63427734 + - -0.28710938 + - -0.87158203 + - 0.08068848 + - -1.2587891 + - 0.22729492 + - 0.5517578 + - -0.47558594 + - -0.20385742 + - 0.7553711 + - -1.0498047 + - 0.99121094 + - 1.2275391 + - 0.41015625 + - -0.36791992 + - 0.54833984 + - -0.3269043 + - 0.21972656 + - 1.1298828 + - -0.01737976 + - -0.6699219 + - 0.72265625 + - 0.20800781 + - 0.5566406 + - 0.7109375 + - -0.16577148 + - 0.5805664 + - 1.1494141 + - -0.15942383 + - -0.49658203 + - 0.01625061 + - 1.5625 + - -0.50390625 + - 1.2011719 + - -1.0029297 + - -0.35473633 + - -0.3100586 + - -0.12658691 + - 0.8208008 + - 0.7578125 + - 1.1611328 + - 1.6660156 + - -0.8022461 + - -0.30273438 + - 0.38012695 + - -0.71484375 + - -0.7475586 + - 1.1914063 + - -0.9560547 + - 0.30297852 + - 0.17163086 + - 0.8183594 + - -0.87841797 + - 1.1376953 + - -0.4543457 + - 0.61376953 + - -0.47851563 + - 1.1181641 + - 0.013900757 + - -0.49560547 + - -0.03945923 + - 0.28637695 + - -0.71533203 + - 0.8203125 + - -0.037322998 + - 0.6044922 + - 0.75683594 + - -0.33276367 + - 0.8647461 + - -0.7138672 + - 0.7597656 + - -1.3496094 + - 0.18701172 + - -0.3996582 + - 0.3112793 + - 0.16809082 + - 1.2617188 + - -0.42993164 + - 0.24401855 + - 0.83935547 + - -1.3994141 + - 0.34594727 + - -0.68603516 + - -0.2878418 + - 0.46655273 + - 0.68066406 + - -0.48291016 + - -0.11004639 + - -0.48364258 + - 0.17126465 + - 0.29614258 + - -0.7290039 + - -0.8725586 + - 0.8457031 + - 0.5732422 + - 0.16186523 + - -0.17407227 + - -0.16455078 + - 0.8652344 + - -0.38598633 + - 0.56396484 + - -0.30639648 + - 1.8261719 + - 0.04208374 + - 0.1743164 + - -1.0107422 + - -0.20812988 + - 1.1015625 + - 0.79833984 + - -1.0019531 + - 0.67041016 + - -0.96191406 + - 0.45092773 + - -0.32226563 + - -0.9790039 + - 1.7089844 + - -0.04675293 + - 0.44091797 + - 0.28930664 + - 0.32104492 + - -0.5336914 + - -0.7475586 + - -1.2802734 + - -0.20861816 + - -0.57958984 + - 0.8798828 + - -0.21777344 + - -0.51220703 + - 0.20239258 + - -0.953125 + - -0.8925781 + - 0.62890625 + - -0.08935547 + - 1.2490234 + - -0.30859375 + - 0.52490234 + - -1.5771484 + - 0.8647461 + - -0.16259766 + - -0.64697266 + - -0.9003906 + - -0.68896484 + - -0.55566406 + - 0.54785156 + - -0.20458984 + - 1.0810547 + - 0.5390625 + - 0.24572754 + - -0.0054397583 + - 0.097717285 + - -0.08135986 + - 0.6616211 + - -0.06652832 + - -0.8129883 + - -0.08251953 + - 0.12164307 + - -1.4072266 + - 0.65283203 + - 0.4946289 + - 0.48364258 + - -0.6142578 + - 0.060272217 + - 0.49560547 + - -0.33911133 + - -0.85058594 + - -0.8510742 + - 0.10040283 + - 0.64453125 + - 0.6279297 + - 0.7890625 + - -0.8496094 + - -0.76708984 + - 0.38916016 + - 0.59277344 + - -0.07110596 + - -0.1340332 + - -0.8955078 + - -0.7661133 + - 1.3125 + - 0.98095703 + - 0.3708496 + - 0.046966553 + - -1.2900391 + - 0.17272949 + - -0.1673584 + - -0.1071167 + - -0.11187744 + - 0.20092773 + - -0.65478516 + - 0.27978516 + - -1.8027344 + - 0.15197754 + - 0.25 + - 0.671875 + - 0.6748047 + - -1.0322266 + - -0.41308594 + - -0.5917969 + - 0.028701782 + - -1.3515625 + - 0.12524414 + - 0.87402344 + - 0.8701172 + - -0.18334961 + - 0.79541016 + - -0.7006836 + - -0.28833008 + - 0.39086914 + - 0.43115234 + - -0.05316162 + - -0.60498047 + - 0.6386719 + - 0.21044922 + - 0.09869385 + - -0.7402344 + - 0.24731445 + - -0.4140625 + - -0.49487305 + - -0.78125 + - -0.35864258 + - -0.5366211 + - -0.13464355 + - 0.030441284 + - 0.47045898 + - 0.16552734 + - 1.0458984 + - 0.7026367 + - 0.32470703 + - 0.021697998 + - -0.26098633 + - 1.4023438 + - 0.33789063 + - -0.062469482 + - 0.81396484 + - -0.765625 + - -0.5341797 + - -0.19299316 + - 0.19433594 + - -0.6113281 + - 0.07598877 + - -0.6977539 + - -0.39038086 + - 0.3774414 + - 0.5957031 + - -1.9902344 + - -0.36889648 + - -2.0195313 + - 0.9692383 + - 0.46948242 + - -0.49975586 + - -0.20837402 + - -0.1529541 + - -0.13879395 + - 1.8769531 + - -0.18579102 + - 0.38256836 + - -0.13684082 + - -0.2956543 + - 0.42749023 + - -0.24560547 + - 0.16381836 + - 0.84228516 + - -0.35009766 + - 0.53125 + - -0.14697266 + - 0.7734375 + - -0.114990234 + - -0.23522949 + - 1.2080078 + - -1.5605469 + - 0.098083496 + - -1.3466797 + - 0.62060547 + - -1.1484375 + - -0.4699707 + - -0.106933594 + - -1.3095703 + - 0.43066406 + - 0.05444336 + - 0.80126953 + - 0.4326172 + - -0.22338867 + - 0.55908203 + - -8.1484375 + - -0.7246094 + - -0.48291016 + - -0.21386719 + - 0.51953125 + - 0.5449219 + - 0.8515625 + - -0.88378906 + - 0.36865234 + - -0.16955566 + - -0.3244629 + - 0.12188721 + - 0.92529297 + - 0.38891602 + - 0.7944336 + - 0.46850586 + - 0.921875 + - 0.9980469 + - -0.32739258 + - 1.2910156 + - -0.15161133 + - 0.18591309 + - -0.6123047 + - 0.060546875 + - 0.35327148 + - -0.7915039 + - -0.3947754 + - 1.2158203 + - -0.8046875 + - 0.13659668 + - 0.21166992 + - -0.6669922 + - 1.5957031 + - 0.44262695 + - -0.24145508 + - -0.39770508 + - -1.0517578 + - -0.36450195 + - -0.5961914 + - 0.60498047 + - 1.2314453 + - 0.21472168 + - -0.18359375 + - -0.0063056946 + - -0.08239746 + - 0.80029297 + - -0.8183594 + - -1.6660156 + - -1.2861328 + - -0.85253906 + - 0.15881348 + - 0.6225586 + - 0.60546875 + - 0.5239258 + - -0.9355469 + - 0.7529297 + - 0.06768799 + - -0.0025157928 + - -0.9238281 + - -0.25390625 + - -0.5097656 + - -0.79345703 + - -0.4501953 + - -0.6459961 + - 0.8564453 + - 0.121154785 + - -0.08404541 + - -0.51416016 + - 0.16540527 + - 1.6054688 + - -0.39404297 + - 0.34277344 + - -0.43017578 + - -0.040618896 + - 0.29614258 + - -0.5180664 + - 0.6567383 + - 0.57373047 + - 0.66845703 + - 0.14013672 + - 0.98046875 + - 0.16442871 + - -0.12042236 + - -0.8745117 + - 0.057556152 + - 0.24316406 + - -0.012084961 + - 0.40649414 + - -0.3486328 + - -0.20080566 + - 0.4116211 + - -0.17822266 + - -0.011131287 + - 0.10406494 + - -0.10601807 + - 0.038391113 + - 1.1806641 + - -0.68847656 + - 0.73779297 + - -0.7651367 + - -0.35229492 + - 0.6113281 + - -0.93066406 + - -0.49072266 + - -0.2944336 + - -1.4726563 + - -1.0498047 + - -1.2509766 + - -0.54833984 + - -1.4892578 + - 0.48120117 + - -0.7919922 + - -0.24487305 + - -0.5517578 + - -0.08355713 + - -0.4765625 + - 0.1875 + - 0.4790039 + - -0.21032715 + - -0.8310547 + - -0.10638428 + - 0.042144775 + - -0.098083496 + - 0.5839844 + - -0.80859375 + - -1.1503906 + - 0.19128418 + - 0.5019531 + - -0.8935547 + - -0.037200928 + - -0.4416504 + - 0.50390625 + - 1.4833984 + - -0.87597656 + - -0.32202148 + - -0.9848633 + - -0.09112549 + - 0.48486328 + - -0.2775879 + - 0.8051758 + - -0.56884766 + - -0.2565918 + - 0.75097656 + - -0.37402344 + - 0.21936035 + - 0.37524414 + - -0.03427124 + - -0.40771484 + - -0.18054199 + - -0.48168945 + - -1.5068359 + - -0.67333984 + - 0.82128906 + - 0.25219727 + - -0.82714844 + - 0.33935547 + - -1.2626953 + - 0.86621094 + - -0.27441406 + - -0.34350586 + - -0.42382813 + - -0.41186523 + - 0.80371094 + - 1.1513672 + - -1.2041016 + - 0.3552246 + - -0.00065660477 + - -1.953125 + - -0.60253906 + - 0.58154297 + - 0.086364746 + - 0.48217773 + - -0.35253906 + - -0.11077881 + - 0.66064453 + - -1.4921875 + - -0.14025879 + - -0.21313477 + - 1.0234375 + - -1.4482422 + - 0.56103516 + - 1.734375 + - 0.09710693 + - -0.54003906 + - -0.13305664 + - 0.75878906 + - -0.27246094 + - 1.0488281 + - 1.0507813 + - 0.23254395 + - -0.15209961 + - 0.18017578 + - 0.09790039 + - -1.6376953 + - -0.60253906 + - -0.9165039 + - -0.9379883 + - 1.0585938 + - 0.703125 + - 0.70458984 + - 0.8203125 + - -2.2519531 + - -0.63623047 + - 0.35058594 + - 0.7504883 + - -0.12408447 + - -1.0839844 + - 0.50683594 + - -0.6796875 + - 0.7495117 + - -0.27783203 + - -0.13562012 diff --git a/backends/candle/tests/test_flash_gte.rs b/backends/candle/tests/test_flash_gte.rs new file mode 100644 index 00000000..20b06b2f --- /dev/null +++ b/backends/candle/tests/test_flash_gte.rs @@ -0,0 +1,53 @@ +#![allow(dead_code, unused_imports)] +mod common; + +use crate::common::{sort_embeddings, SnapshotEmbeddings}; +use anyhow::Result; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; +use text_embeddings_backend_candle::CandleBackend; +use text_embeddings_backend_core::{Backend, ModelType, Pool}; + +#[test] +#[serial_test::serial] +#[cfg(all(feature = "cuda", feature = "flash-attn"))] +fn test_flash_gte() -> Result<()> { + let model_root = download_artifacts("Alibaba-NLP/gte-base-en-v1.5", None)?; + let tokenizer = load_tokenizer(&model_root)?; + + let backend = CandleBackend::new( + model_root, + "float16".to_string(), + ModelType::Embedding(Pool::Cls), + )?; + + let input_batch = batch( + vec![ + tokenizer.encode("What is Deep Learning?", true).unwrap(), + tokenizer.encode("Deep Learning is...", true).unwrap(), + tokenizer.encode("What is Deep Learning?", true).unwrap(), + ], + [0, 1, 2].to_vec(), + vec![], + ); + + let matcher = cosine_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); + insta::assert_yaml_snapshot!("gte_batch", embeddings_batch, &matcher); + + let input_single = batch( + vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], + [0].to_vec(), + vec![], + ); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("gte_single", embeddings_single, &matcher); + assert_eq!(embeddings_batch[0], embeddings_single[0]); + assert_eq!(embeddings_batch[2], embeddings_single[0]); + + Ok(()) +} From 03614792a7e428abc23fab32b26503b69280810b Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 28 Jun 2024 12:07:52 +0200 Subject: [PATCH 04/36] feat: add default prompts (#312) --- Cargo.lock | 4 +- core/src/download.rs | 7 + core/src/infer.rs | 17 +- core/src/tokenization.rs | 140 ++++++++- docs/openapi.json | 580 ++++++++++++-------------------------- proto/tei.proto | 4 + router/src/grpc/server.rs | 13 +- router/src/http/server.rs | 84 ++++-- router/src/http/types.rs | 64 ++++- router/src/lib.rs | 50 +++- router/src/main.rs | 29 ++ router/tests/common.rs | 2 + 12 files changed, 545 insertions(+), 449 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 134036f6..7d449f0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2071,9 +2071,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "macro_rules_attribute" diff --git a/core/src/download.rs b/core/src/download.rs index 24dc041f..08220752 100644 --- a/core/src/download.rs +++ b/core/src/download.rs @@ -102,3 +102,10 @@ pub async fn download_st_config(api: &ApiRepo) -> Result { Err(err) } + +#[instrument(skip_all)] +pub async fn download_new_st_config(api: &ApiRepo) -> Result { + tracing::info!("Downloading `config_sentence_transformers.json`"); + let pool_config_path = api.get("config_sentence_transformers.json").await?; + Ok(pool_config_path) +} diff --git a/core/src/infer.rs b/core/src/infer.rs index 7e6a4629..23b343bf 100644 --- a/core/src/infer.rs +++ b/core/src/infer.rs @@ -60,9 +60,10 @@ impl Infer { &self, inputs: I, add_special_tokens: bool, - ) -> Result { + prompt_name: Option, + ) -> Result<(Option, RawEncoding), TextEmbeddingsError> { self.tokenization - .tokenize(inputs.into(), add_special_tokens) + .tokenize(inputs.into(), add_special_tokens, prompt_name) .await .map_err(|err| { let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); @@ -119,6 +120,7 @@ impl Infer { inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, permit: OwnedSemaphorePermit, ) -> Result { let start_time = Instant::now(); @@ -138,6 +140,7 @@ impl Infer { inputs, truncate, truncation_direction, + prompt_name, false, &start_time, permit, @@ -172,6 +175,7 @@ impl Infer { inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, permit: OwnedSemaphorePermit, ) -> Result { let start_time = Instant::now(); @@ -191,6 +195,7 @@ impl Infer { inputs, truncate, truncation_direction, + prompt_name, true, &start_time, permit, @@ -225,6 +230,7 @@ impl Infer { inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, normalize: bool, permit: OwnedSemaphorePermit, ) -> Result { @@ -245,6 +251,7 @@ impl Infer { inputs, truncate, truncation_direction, + prompt_name, true, &start_time, permit, @@ -290,11 +297,13 @@ impl Infer { Ok(response) } + #[allow(clippy::too_many_arguments)] async fn embed + std::fmt::Debug>( &self, inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, pooling: bool, start_time: &Instant, _permit: OwnedSemaphorePermit, @@ -315,7 +324,7 @@ impl Infer { // Tokenization let encoding = self .tokenization - .encode(inputs.into(), truncate, truncation_direction) + .encode(inputs.into(), truncate, truncation_direction, prompt_name) .await .map_err(|err| { let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); @@ -381,7 +390,7 @@ impl Infer { // Tokenization let encoding = self .tokenization - .encode(inputs.into(), truncate, truncation_direction) + .encode(inputs.into(), truncate, truncation_direction, None) .await .map_err(|err| { let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index ae281691..c33bfafc 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -1,5 +1,6 @@ /// Payload tokenization logic use crate::TextEmbeddingsError; +use std::collections::HashMap; use tokenizers::tokenizer::Tokenizer; pub use tokenizers::Encoding as RawEncoding; use tokenizers::{TruncationDirection, TruncationParams, TruncationStrategy}; @@ -19,6 +20,8 @@ impl Tokenization { tokenizer: Tokenizer, max_input_length: usize, position_offset: usize, + default_prompt: Option, + prompts: Option>, ) -> Self { tracing::info!("Starting {workers} tokenization workers"); @@ -29,12 +32,16 @@ impl Tokenization { for _ in 0..workers { let tokenizer_clone = tokenizer.clone(); let receiver_clone = receiver.clone(); + let default_prompt_clone = default_prompt.clone(); + let prompts_clone = prompts.clone(); // Spawn worker std::thread::spawn(move || { tokenizer_worker( tokenizer_clone, max_input_length, position_offset, + default_prompt_clone, + prompts_clone, receiver_clone, ) }); @@ -49,6 +56,7 @@ impl Tokenization { inputs: EncodingInput, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, ) -> Result { // Check if inputs is empty if inputs.is_empty() { @@ -66,6 +74,7 @@ impl Tokenization { inputs, truncate, truncation_direction, + prompt_name, response_sender, Span::current(), )) @@ -82,7 +91,8 @@ impl Tokenization { &self, inputs: EncodingInput, add_special_tokens: bool, - ) -> Result { + prompt_name: Option, + ) -> Result<(Option, RawEncoding), TextEmbeddingsError> { // Check if inputs is empty if inputs.is_empty() { return Err(TextEmbeddingsError::Validation( @@ -98,6 +108,7 @@ impl Tokenization { .send(TokenizerRequest::Tokenize( inputs, add_special_tokens, + prompt_name, response_sender, Span::current(), )) @@ -147,6 +158,8 @@ fn tokenizer_worker( mut tokenizer: Tokenizer, max_input_length: usize, position_offset: usize, + default_prompt: Option, + prompts: Option>, receiver: async_channel::Receiver, ) { // Loop over requests @@ -156,11 +169,17 @@ fn tokenizer_worker( inputs, truncate, truncation_direction, + prompt_name, response_tx, parent_span, ) => { parent_span.in_scope(|| { if !response_tx.is_closed() { + let default_prompt_clone = match prompt_name { + None => default_prompt.clone(), + Some(_) => None, + }; + // It's possible that the user dropped its request resulting in a send error. // We just discard the error let _ = response_tx.send(encode_input( @@ -169,20 +188,37 @@ fn tokenizer_worker( truncation_direction, max_input_length, position_offset, + default_prompt_clone, + prompt_name, + prompts.as_ref(), &mut tokenizer, )); } }) } - TokenizerRequest::Tokenize(inputs, add_special_tokens, response_tx, parent_span) => { + TokenizerRequest::Tokenize( + inputs, + add_special_tokens, + prompt_name, + response_tx, + parent_span, + ) => { parent_span.in_scope(|| { if !response_tx.is_closed() { + let default_prompt_clone = match prompt_name { + None => default_prompt.clone(), + Some(_) => None, + }; + // It's possible that the user dropped its request resulting in a send error. // We just discard the error let _ = response_tx.send(tokenize_input( inputs, add_special_tokens, None, + default_prompt_clone, + prompt_name, + prompts.as_ref(), &mut tokenizer, )); } @@ -212,40 +248,104 @@ fn decode_ids( .decode(&ids, skip_special_tokens)?) } +fn prepare_pre_prompt( + default_prompt: Option, + prompt_name: Option, + prompts: Option<&HashMap>, +) -> Result, TextEmbeddingsError> { + let pre_prompt = if let Some(prompt_name) = prompt_name.as_ref() { + match prompts { + None => { + return Err(TextEmbeddingsError::Validation(format!("`default-prompt-name` is set to `{prompt_name}` but no prompts were found in the Sentence Transformers configuration"))); + } + Some(prompts) if !prompts.contains_key(prompt_name) => { + return Err(TextEmbeddingsError::Validation(format!("`default-prompt-name` is set to `{prompt_name}` but it was not found in the Sentence Transformers prompts. Available prompts: {:?}", prompts.keys()))); + } + Some(prompts) => prompts.get(prompt_name).cloned(), + } + } else { + default_prompt + }; + Ok(pre_prompt) +} + fn tokenize_input( inputs: EncodingInput, add_special_tokens: bool, truncate_params: Option, + default_prompt: Option, + prompt_name: Option, + prompts: Option<&HashMap>, tokenizer: &mut Tokenizer, -) -> Result { +) -> Result<(Option, RawEncoding), TextEmbeddingsError> { + let pre_prompt = prepare_pre_prompt(default_prompt, prompt_name, prompts)?; + let encoding = match inputs { // encode input - EncodingInput::Single(s) => tokenizer - .with_truncation(truncate_params)? - .encode::(s, add_special_tokens)?, - EncodingInput::Dual(s1, s2) => { - tokenizer + EncodingInput::Single(s) => { + let s = if let Some(mut pre_prompt) = pre_prompt { + pre_prompt.push_str(&s); + pre_prompt + } else { + s + }; + + let encoding = tokenizer .with_truncation(truncate_params)? - .encode::<(String, String)>((s1, s2), add_special_tokens)? + .encode::<&str>(&s, add_special_tokens)?; + + (Some(s), encoding) + } + EncodingInput::Dual(s1, s2) => { + if pre_prompt.is_some() { + return Err(TextEmbeddingsError::Validation( + "`prompt_name` cannot be set with dual inputs".to_string(), + )); + } + + ( + None, + tokenizer + .with_truncation(truncate_params)? + .encode::<(String, String)>((s1, s2), add_special_tokens)?, + ) } // input is encoded -> convert to tokenizers Encoding EncodingInput::Ids(ids) => { - let text = tokenizer.decode(&ids, false)?; - tokenizer - .with_truncation(truncate_params)? - .encode::(text, false)? + if let Some(mut pre_prompt) = pre_prompt { + let text = tokenizer.decode(&ids, true)?; + pre_prompt.push_str(&text); + + let encoding = tokenizer + .with_truncation(truncate_params)? + .encode::<&str>(&pre_prompt, true)?; + + (Some(pre_prompt), encoding) + } else { + let text = tokenizer.decode(&ids, false)?; + + let encoding = tokenizer + .with_truncation(truncate_params)? + .encode::<&str>(&text, false)?; + + (Some(text), encoding) + } } }; Ok(encoding) } /// Get input length and optionally truncate it +#[allow(clippy::too_many_arguments)] fn encode_input( inputs: EncodingInput, truncate: bool, truncation_direction: TruncationDirection, max_input_length: usize, position_offset: usize, + default_prompt: Option, + prompt_name: Option, + prompts: Option<&HashMap>, tokenizer: &mut Tokenizer, ) -> Result { // Default truncation params @@ -256,7 +356,15 @@ fn encode_input( stride: 0, }); - let encoding = tokenize_input(inputs, true, truncate_params, tokenizer)?; + let (_, encoding) = tokenize_input( + inputs, + true, + truncate_params, + default_prompt, + prompt_name, + prompts, + tokenizer, + )?; let seq_len = encoding.len(); if seq_len > max_input_length { @@ -315,13 +423,15 @@ enum TokenizerRequest { EncodingInput, bool, TruncationDirection, + Option, oneshot::Sender>, Span, ), Tokenize( EncodingInput, bool, - oneshot::Sender>, + Option, + oneshot::Sender, RawEncoding), TextEmbeddingsError>>, Span, ), Decode( diff --git a/docs/openapi.json b/docs/openapi.json index 7368145e..d2f36301 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "1.2.3" + "version": "1.3.0" }, "paths": { "/decode": { @@ -19,7 +19,6 @@ "Text Embeddings Inference" ], "summary": "Decode input ids", - "description": "Decode input ids", "operationId": "decode", "requestBody": { "content": { @@ -65,7 +64,6 @@ "Text Embeddings Inference" ], "summary": "Get Embeddings. Returns a 424 status code if the model is not an embedding model.", - "description": "Get Embeddings. Returns a 424 status code if the model is not an embedding model.", "operationId": "embed", "requestBody": { "content": { @@ -153,7 +151,7 @@ "Text Embeddings Inference" ], "summary": "Get all Embeddings without Pooling.", - "description": "Get all Embeddings without Pooling.\nReturns a 424 status code if the model is not an embedding model.", + "description": "Returns a 424 status code if the model is not an embedding model.", "operationId": "embed_all", "requestBody": { "content": { @@ -241,7 +239,6 @@ "Text Embeddings Inference" ], "summary": "Get Sparse Embeddings. Returns a 424 status code if the model is not an embedding model with SPLADE pooling.", - "description": "Get Sparse Embeddings. Returns a 424 status code if the model is not an embedding model with SPLADE pooling.", "operationId": "embed_sparse", "requestBody": { "content": { @@ -323,101 +320,12 @@ } } }, - "/embeddings": { - "post": { - "tags": [ - "Text Embeddings Inference" - ], - "summary": "OpenAI compatible route. Returns a 424 status code if the model is not an embedding model.", - "description": "OpenAI compatible route. Returns a 424 status code if the model is not an embedding model.", - "operationId": "openai_embed", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Embeddings", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatResponse" - } - } - } - }, - "413": { - "description": "Batch size error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Batch size error", - "type": "validation" - } - } - } - }, - "422": { - "description": "Tokenization error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Tokenization error", - "type": "tokenizer" - } - } - } - }, - "424": { - "description": "Embedding Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Inference failed", - "type": "backend" - } - } - } - }, - "429": { - "description": "Model is overloaded", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Model is overloaded", - "type": "overloaded" - } - } - } - } - } - } - }, "/health": { "get": { "tags": [ "Text Embeddings Inference" ], "summary": "Health check method", - "description": "Health check method", "operationId": "health", "responses": { "200": { @@ -446,7 +354,6 @@ "Text Embeddings Inference" ], "summary": "Text Embeddings Inference endpoint info", - "description": "Text Embeddings Inference endpoint info", "operationId": "get_model_info", "responses": { "200": { @@ -468,7 +375,6 @@ "Text Embeddings Inference" ], "summary": "Prometheus metrics scrape endpoint", - "description": "Prometheus metrics scrape endpoint", "operationId": "metrics", "responses": { "200": { @@ -490,7 +396,6 @@ "Text Embeddings Inference" ], "summary": "Get Predictions. Returns a 424 status code if the model is not a Sequence Classification model", - "description": "Get Predictions. Returns a 424 status code if the model is not a Sequence Classification model", "operationId": "predict", "requestBody": { "content": { @@ -578,7 +483,7 @@ "Text Embeddings Inference" ], "summary": "Get Ranks. Returns a 424 status code if the model is not a Sequence Classification model with", - "description": "Get Ranks. Returns a 424 status code if the model is not a Sequence Classification model with\na single class.", + "description": "a single class.", "operationId": "rerank", "requestBody": { "content": { @@ -666,7 +571,6 @@ "Text Embeddings Inference" ], "summary": "Tokenize inputs", - "description": "Tokenize inputs", "operationId": "tokenize", "requestBody": { "content": { @@ -706,19 +610,18 @@ } } }, - "/vertex": { + "/v1/embeddings": { "post": { "tags": [ "Text Embeddings Inference" ], - "summary": "Generate embeddings from a Vertex request", - "description": "Generate embeddings from a Vertex request", - "operationId": "vertex_compatibility", + "summary": "OpenAI compatible route. Returns a 424 status code if the model is not an embedding model.", + "operationId": "openai_embed", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/VertexRequest" + "$ref": "#/components/schemas/OpenAICompatRequest" } } }, @@ -726,18 +629,25 @@ }, "responses": { "200": { - "description": "Results" + "description": "Embeddings", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OpenAICompatResponse" + } + } + } }, "413": { "description": "Batch size error", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Batch size error", - "error_type": "validation" + "message": "Batch size error", + "type": "validation" } } } @@ -747,25 +657,25 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Tokenization error", - "error_type": "tokenizer" + "message": "Tokenization error", + "type": "tokenizer" } } } }, "424": { - "description": "Error", + "description": "Embedding Error", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Inference failed", - "error_type": "backend" + "message": "Inference failed", + "type": "backend" } } } @@ -775,11 +685,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Model is overloaded", - "error_type": "overloaded" + "message": "Model is overloaded", + "type": "overloaded" } } } @@ -852,10 +762,26 @@ "inputs": { "$ref": "#/components/schemas/Input" }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -895,10 +821,26 @@ "default": "true", "example": "true" }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -928,10 +870,26 @@ "inputs": { "$ref": "#/components/schemas/Input" }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -944,6 +902,20 @@ } } }, + "Embedding": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "number", + "format": "float" + } + }, + { + "type": "string" + } + ] + }, "EmbeddingModel": { "type": "object", "required": [ @@ -956,6 +928,13 @@ } } }, + "EncodingFormat": { + "type": "string", + "enum": [ + "float", + "base64" + ] + }, "ErrorResponse": { "type": "object", "required": [ @@ -991,10 +970,14 @@ "max_input_length", "max_batch_tokens", "max_client_batch_size", + "auto_truncate", "tokenization_workers", "version" ], "properties": { + "auto_truncate": { + "type": "boolean" + }, "docker_label": { "type": "string", "example": "null", @@ -1065,12 +1048,12 @@ "Input": { "oneOf": [ { - "type": "string" + "$ref": "#/components/schemas/InputType" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/InputType" } } ] @@ -1098,6 +1081,21 @@ } ] }, + "InputType": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "integer", + "format": "int32", + "minimum": 0 + } + } + ] + }, "ModelType": { "oneOf": [ { @@ -1144,16 +1142,7 @@ ], "properties": { "embedding": { - "type": "array", - "items": { - "type": "number", - "format": "float" - }, - "example": [ - 0.0, - 1.0, - 2.0 - ] + "$ref": "#/components/schemas/Embedding" }, "index": { "type": "integer", @@ -1193,6 +1182,14 @@ "input" ], "properties": { + "encoding_format": { + "allOf": [ + { + "$ref": "#/components/schemas/EncodingFormat" + } + ], + "default": "float" + }, "input": { "$ref": "#/components/schemas/Input" }, @@ -1317,7 +1314,16 @@ "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -1416,7 +1422,16 @@ "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -1479,6 +1494,19 @@ } } }, + "TokenizeInput": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, "TokenizeRequest": { "type": "object", "required": [ @@ -1491,7 +1519,14 @@ "example": "true" }, "inputs": { - "$ref": "#/components/schemas/Input" + "$ref": "#/components/schemas/TokenizeInput" + }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true } } }, @@ -1515,273 +1550,12 @@ ] ] }, - "VertexInstance": { - "oneOf": [ - { - "allOf": [ - { - "$ref": "#/components/schemas/EmbedRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "embed" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/EmbedAllRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "embed_all" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/EmbedSparseRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "embed_sparse" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/PredictRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "predict" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/RerankRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "rerank" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/TokenizeRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "tokenize" - ] - } - } - } - ] - } - ], - "discriminator": { - "propertyName": "type" - } - }, - "VertexRequest": { - "type": "object", - "required": [ - "instances" - ], - "properties": { - "instances": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VertexInstance" - } - } - } - }, - "VertexResponse": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VertexResponseInstance" - } - }, - "VertexResponseInstance": { - "oneOf": [ - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/EmbedResponse" - }, - "type": { - "type": "string", - "enum": [ - "embed" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/EmbedAllResponse" - }, - "type": { - "type": "string", - "enum": [ - "embed_all" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/EmbedSparseResponse" - }, - "type": { - "type": "string", - "enum": [ - "embed_sparse" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/PredictResponse" - }, - "type": { - "type": "string", - "enum": [ - "predict" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/RerankResponse" - }, - "type": { - "type": "string", - "enum": [ - "rerank" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/TokenizeResponse" - }, - "type": { - "type": "string", - "enum": [ - "tokenize" - ] - } - } - } - ], - "discriminator": { - "propertyName": "type" - } + "TruncationDirection": { + "type": "string", + "enum": [ + "Left", + "Right" + ] } } }, diff --git a/proto/tei.proto b/proto/tei.proto index 394c0262..aac6c2ba 100644 --- a/proto/tei.proto +++ b/proto/tei.proto @@ -79,6 +79,7 @@ message EmbedRequest { bool truncate = 2; bool normalize = 3; TruncationDirection truncation_direction = 4; + optional string prompt_name = 5; } message EmbedResponse { @@ -90,6 +91,7 @@ message EmbedSparseRequest { string inputs = 1; bool truncate = 2; TruncationDirection truncation_direction = 3; + optional string prompt_name = 4; } message SparseValue { @@ -106,6 +108,7 @@ message EmbedAllRequest { string inputs = 1; bool truncate = 2; TruncationDirection truncation_direction = 3; + optional string prompt_name = 4; } message TokenEmbedding { @@ -175,6 +178,7 @@ message RerankResponse { message EncodeRequest { string inputs = 1; bool add_special_tokens = 2; + optional string prompt_name = 3; } message SimpleToken { diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index c428e065..d3666214 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -87,6 +87,7 @@ impl TextEmbeddingsService { request.inputs, request.truncate, truncation_direction, + request.prompt_name, request.normalize, permit, ) @@ -142,6 +143,7 @@ impl TextEmbeddingsService { request.inputs, request.truncate, truncation_direction, + request.prompt_name, permit, ) .await @@ -207,6 +209,7 @@ impl TextEmbeddingsService { request.inputs, request.truncate, truncation_direction, + request.prompt_name, permit, ) .await @@ -326,11 +329,17 @@ impl TextEmbeddingsService { #[instrument(skip_all)] async fn tokenize_inner(&self, request: EncodeRequest) -> Result { let inputs = request.inputs; - let encoding = self + let (encoded_inputs, encoding) = self .infer - .tokenize(inputs.clone(), request.add_special_tokens) + .tokenize( + inputs.clone(), + request.add_special_tokens, + request.prompt_name, + ) .await .map_err(ErrorResponse::from)?; + let inputs = encoded_inputs.unwrap_or(inputs); + let tokens: Vec = encoding .get_ids() .iter() diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 3e09101d..17baada6 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -5,7 +5,8 @@ use crate::http::types::{ OpenAICompatEmbedding, OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, Sequence, SimpleToken, SparseValue, TokenizeInput, - TokenizeRequest, TokenizeResponse, VertexPrediction, VertexRequest, VertexResponse, + TokenizeRequest, TokenizeResponse, TruncationDirection, VertexPrediction, VertexRequest, + VertexResponse, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -32,7 +33,6 @@ use text_embeddings_core::infer::{ AllEmbeddingsInferResponse, Infer, InferMetadata, PooledEmbeddingsInferResponse, }; use text_embeddings_core::TextEmbeddingsError; -use tokenizers::TruncationDirection; use tokio::sync::OwnedSemaphorePermit; use tower_http::cors::{AllowOrigin, CorsLayer}; use tracing::instrument; @@ -118,7 +118,7 @@ async fn predict( .predict( inputs, truncate, - req.truncation_direction, + req.truncation_direction.into(), req.raw_scores, permit, ) @@ -335,7 +335,7 @@ async fn rerank( .predict( (query, text), truncate, - req.truncation_direction, + req.truncation_direction.into(), req.raw_scores, permit, ) @@ -499,7 +499,8 @@ async fn embed( .embed_pooled( input, truncate, - req.truncation_direction, + req.truncation_direction.into(), + req.prompt_name, req.normalize, permit, ) @@ -560,13 +561,15 @@ async fn embed( compute_chars += input.count_chars(); let local_infer = infer.clone(); + let prompt_name = req.prompt_name.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer .embed_pooled( input, truncate, - req.truncation_direction, + req.truncation_direction.into(), + prompt_name, req.normalize, permit, ) @@ -671,7 +674,13 @@ async fn embed_sparse( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_sparse(input, truncate, req.truncation_direction, permit) + .embed_sparse( + input, + truncate, + req.truncation_direction.into(), + req.prompt_name, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -729,10 +738,17 @@ async fn embed_sparse( compute_chars += input.count_chars(); let local_infer = infer.clone(); + let prompt_name = req.prompt_name.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; let response = local_infer - .embed_sparse(input, truncate, req.truncation_direction, permit) + .embed_sparse( + input, + truncate, + req.truncation_direction.into(), + prompt_name, + permit, + ) .await?; Ok((sparsify(response.results), response.metadata)) }) @@ -827,7 +843,13 @@ async fn embed_all( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_all(input, truncate, req.truncation_direction, permit) + .embed_all( + input, + truncate, + req.truncation_direction.into(), + req.prompt_name, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -885,10 +907,17 @@ async fn embed_all( compute_chars += input.count_chars(); let local_infer = infer.clone(); + let prompt_name = req.prompt_name.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer - .embed_all(input, truncate, req.truncation_direction, permit) + .embed_all( + input, + truncate, + req.truncation_direction.into(), + prompt_name, + permit, + ) .await }) } @@ -997,7 +1026,14 @@ async fn openai_embed( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_pooled(input, truncate, TruncationDirection::Right, true, permit) + .embed_pooled( + input, + truncate, + tokenizers::TruncationDirection::Right, + None, + true, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -1063,7 +1099,14 @@ async fn openai_embed( futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer - .embed_pooled(input, truncate, TruncationDirection::Right, true, permit) + .embed_pooled( + input, + truncate, + tokenizers::TruncationDirection::Right, + None, + true, + permit, + ) .await }) } @@ -1148,11 +1191,16 @@ async fn tokenize( info: Extension, Json(req): Json, ) -> Result, (StatusCode, Json)> { - let tokenize_inner = move |input: String, add_special_tokens: bool, infer: Infer| async move { - let encoding = infer - .tokenize(input.clone(), add_special_tokens) + let tokenize_inner = move |input: String, + add_special_tokens: bool, + prompt_name: Option, + infer: Infer| async move { + let (encoded_input, encoding) = infer + .tokenize(input.clone(), add_special_tokens, prompt_name) .await .map_err(ErrorResponse::from)?; + let input = encoded_input.unwrap_or(input); + let tokens: Vec = encoding .get_ids() .iter() @@ -1187,7 +1235,7 @@ async fn tokenize( let tokens = match req.inputs { TokenizeInput::Single(input) => { - vec![tokenize_inner(input, req.add_special_tokens, infer.0).await?] + vec![tokenize_inner(input, req.add_special_tokens, req.prompt_name, infer.0).await?] } TokenizeInput::Batch(inputs) => { if inputs.is_empty() { @@ -1223,6 +1271,7 @@ async fn tokenize( futures.push(tokenize_inner( input, req.add_special_tokens, + req.prompt_name.clone(), infer.0.clone(), )); } @@ -1434,6 +1483,8 @@ pub async fn run( Info, ModelType, ClassifierModel, + Embedding, + EncodingFormat, EmbeddingModel, PredictRequest, Prediction, @@ -1457,6 +1508,7 @@ pub async fn run( TokenizeInput, TokenizeRequest, TokenizeResponse, + TruncationDirection, SimpleToken, InputType, InputIds, diff --git a/router/src/http/types.rs b/router/src/http/types.rs index a2a773e8..4414ecb4 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -4,7 +4,6 @@ use serde::{de, Deserialize, Deserializer, Serialize}; use serde_json::json; use std::fmt::Formatter; use text_embeddings_core::tokenization::EncodingInput; -use tokenizers::TruncationDirection; use utoipa::openapi::{RefOr, Schema}; use utoipa::ToSchema; @@ -194,6 +193,22 @@ impl<'__s> ToSchema<'__s> for PredictInput { } } +#[derive(Debug, Clone, Copy, PartialEq, Deserialize, ToSchema, Eq, Default)] +pub(crate) enum TruncationDirection { + Left, + #[default] + Right, +} + +impl From for tokenizers::TruncationDirection { + fn from(value: TruncationDirection) -> Self { + match value { + TruncationDirection::Left => Self::Left, + TruncationDirection::Right => Self::Right, + } + } +} + #[derive(Deserialize, ToSchema)] pub(crate) struct PredictRequest { pub inputs: PredictInput, @@ -262,6 +277,7 @@ pub(crate) enum InputType { String(String), Ids(Vec), } + impl InputType { pub(crate) fn count_chars(&self) -> usize { match self { @@ -270,6 +286,7 @@ impl InputType { } } } + impl From for EncodingInput { fn from(value: InputType) -> Self { match value { @@ -278,6 +295,7 @@ impl From for EncodingInput { } } } + #[derive(Deserialize, ToSchema)] #[serde(untagged)] pub(crate) enum Input { @@ -351,6 +369,17 @@ pub(crate) struct EmbedRequest { #[serde(default)] #[schema(default = "right", example = "right")] pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, #[serde(default = "default_normalize")] #[schema(default = "true", example = "true")] pub normalize: bool, @@ -373,6 +402,17 @@ pub(crate) struct EmbedSparseRequest { #[serde(default)] #[schema(default = "right", example = "right")] pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, } #[derive(Serialize, ToSchema)] @@ -393,6 +433,17 @@ pub(crate) struct EmbedAllRequest { #[serde(default)] #[schema(default = "right", example = "right")] pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, } #[derive(Serialize, ToSchema)] @@ -420,6 +471,17 @@ pub(crate) struct TokenizeRequest { #[serde(default = "default_add_special_tokens")] #[schema(default = "true", example = "true")] pub add_special_tokens: bool, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, } fn default_add_special_tokens() -> bool { diff --git a/router/src/lib.rs b/router/src/lib.rs index 5c7899ec..f5fd102c 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -28,7 +28,8 @@ use std::path::Path; use std::time::{Duration, Instant}; use text_embeddings_backend::{DType, Pool}; use text_embeddings_core::download::{ - download_artifacts, download_pool_config, download_st_config, ST_CONFIG_NAMES, + download_artifacts, download_new_st_config, download_pool_config, download_st_config, + ST_CONFIG_NAMES, }; use text_embeddings_core::infer::Infer; use text_embeddings_core::queue::Queue; @@ -52,6 +53,8 @@ pub async fn run( max_batch_requests: Option, max_client_batch_size: usize, auto_truncate: bool, + default_prompt: Option, + default_prompt_name: Option, hf_api_token: Option, hostname: Option, port: u16, @@ -91,6 +94,8 @@ pub async fn run( // Download sentence transformers config let _ = download_st_config(&api_repo).await; + // Download new sentence transformers config + let _ = download_new_st_config(&api_repo).await; // Download model from the Hub download_artifacts(&api_repo) @@ -171,12 +176,38 @@ pub async fn run( let tokenization_workers = tokenization_workers.unwrap_or_else(num_cpus::get_physical); + // Try to load new ST Config + let mut new_st_config: Option = None; + let config_path = model_root.join("config_sentence_transformers.json"); + if let Ok(config) = fs::read_to_string(config_path) { + new_st_config = Some( + serde_json::from_str(&config) + .context("Failed to parse `config_sentence_transformers.json`")?, + ); + } + let prompts = new_st_config.and_then(|c| c.prompts); + let default_prompt = if let Some(default_prompt_name) = default_prompt_name.as_ref() { + match &prompts { + None => { + anyhow::bail!(format!("`default-prompt-name` is set to `{default_prompt_name}` but no prompts were found in the Sentence Transformers configuration")); + } + Some(prompts) if !prompts.contains_key(default_prompt_name) => { + anyhow::bail!(format!("`default-prompt-name` is set to `{default_prompt_name}` but it was not found in the Sentence Transformers prompts. Available prompts: {:?}", prompts.keys())); + } + Some(prompts) => prompts.get(default_prompt_name).cloned(), + } + } else { + default_prompt + }; + // Tokenization logic let tokenization = Tokenization::new( tokenization_workers, tokenizer, max_input_length, position_offset, + default_prompt, + prompts, ); // Get dtype @@ -207,11 +238,13 @@ pub async fn run( .await .context("Model backend is not healthy")?; - tracing::info!("Warming up model"); - backend - .warmup(max_input_length, max_batch_tokens, max_batch_requests) - .await - .context("Model backend is not healthy")?; + if !backend.padded_model { + tracing::info!("Warming up model"); + backend + .warmup(max_input_length, max_batch_tokens, max_batch_requests) + .await + .context("Model backend is not healthy")?; + } let max_batch_requests = backend .max_batch_size @@ -390,6 +423,11 @@ pub struct STConfig { pub max_seq_length: usize, } +#[derive(Debug, Deserialize)] +pub struct NewSTConfig { + pub prompts: Option>, +} + #[derive(Clone, Debug, Serialize)] #[cfg_attr(feature = "http", derive(utoipa::ToSchema))] pub struct EmbeddingModel { diff --git a/router/src/main.rs b/router/src/main.rs index 3c85f5f7..a72caa8b 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -79,6 +79,33 @@ struct Args { #[clap(long, env)] auto_truncate: bool, + /// The name of the prompt that should be used by default for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// + /// For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + /// + /// The argument '--default-prompt-name ' cannot be used with + /// '--default-prompt ` + #[clap(long, env, conflicts_with = "default_prompt")] + default_prompt_name: Option, + + /// The prompt that should be used by default for encoding. If not set, no prompt + /// will be applied. + /// + /// For example if ``default_prompt`` is "query: " then the sentence "What is the capital of + /// France?" will be encoded as "query: What is the capital of France?" because the prompt + /// text will be prepended before any text to encode. + /// + /// The argument '--default-prompt ' cannot be used with + /// '--default-prompt-name ` + #[clap(long, env, conflicts_with = "default_prompt_name")] + default_prompt: Option, + /// Your HuggingFace hub token #[clap(long, env)] #[redact(partial)] @@ -172,6 +199,8 @@ async fn main() -> Result<()> { args.max_batch_requests, args.max_client_batch_size, args.auto_truncate, + args.default_prompt, + args.default_prompt_name, args.hf_api_token, Some(args.hostname), args.port, diff --git a/router/tests/common.rs b/router/tests/common.rs index c8669c12..55fdf5f5 100644 --- a/router/tests/common.rs +++ b/router/tests/common.rs @@ -58,6 +58,8 @@ pub async fn start_server(model_id: String, revision: Option, dtype: DTy false, None, None, + None, + None, 8090, None, None, From 970922eb66b20f34766e9563c0e70899de7c5dd4 Mon Sep 17 00:00:00 2001 From: Kirill Gadjello Date: Fri, 28 Jun 2024 07:13:03 -0300 Subject: [PATCH 05/36] feat: Add optional CORS allow any option value in http server cli (#260) --- router/src/http/server.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 17baada6..35f5c1fb 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1534,11 +1534,15 @@ pub async fn run( // map to go inside the option and then map to parse from String to HeaderValue // Finally, convert to AllowOrigin let allow_origin: Option = cors_allow_origin.map(|cors_allow_origin| { - AllowOrigin::list( - cors_allow_origin - .into_iter() - .map(|origin| origin.parse::().unwrap()), - ) + if cors_allow_origin.iter().any(|origin| origin == "*") { + AllowOrigin::any() + } else { + AllowOrigin::list( + cors_allow_origin + .into_iter() + .map(|origin| origin.parse::().unwrap()), + ) + } }); let prom_handle = prom_builder From 3c2f9ba96c9d821f60cf091d8c7ad8eed59a0c89 Mon Sep 17 00:00:00 2001 From: Kevin Hu Date: Fri, 28 Jun 2024 03:13:44 -0700 Subject: [PATCH 06/36] docs: Update `HUGGING_FACE_HUB_TOKEN` to `HF_API_TOKEN` in README (#263) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e9306fda..d8d5a40c 100644 --- a/README.md +++ b/README.md @@ -288,14 +288,14 @@ at: [https://huggingface.github.io/text-embeddings-inference](https://huggingfac ### Using a private or gated model -You have the option to utilize the `HUGGING_FACE_HUB_TOKEN` environment variable for configuring the token employed by +You have the option to utilize the `HF_API_TOKEN` environment variable for configuring the token employed by `text-embeddings-inference`. This allows you to gain access to protected resources. For example: 1. Go to https://huggingface.co/settings/tokens 2. Copy your cli READ token -3. Export `HUGGING_FACE_HUB_TOKEN=` +3. Export `HF_API_TOKEN=` or with Docker: @@ -304,7 +304,7 @@ model= volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run token= -docker run --gpus all -e HUGGING_FACE_HUB_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model ``` ### Using Re-rankers models From 6c6cd936eb9b79c87fd12034981bf79710d97bb0 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 28 Jun 2024 13:32:02 +0200 Subject: [PATCH 07/36] v1.3.0 (#313) --- Cargo.lock | 14 +-- Cargo.toml | 2 +- README.md | 132 +++++++++++++++++++---------- docs/source/en/cli_arguments.md | 48 +++++++++-- docs/source/en/private_models.md | 6 +- docs/source/en/quick_tour.md | 6 +- docs/source/en/supported_models.md | 34 ++++---- 7 files changed, 163 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d449f0d..8c619481 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.2.3" +version = "1.3.0" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -3911,7 +3911,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.2.3" +version = "1.3.0" dependencies = [ "clap", "text-embeddings-backend-candle", @@ -3923,7 +3923,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.2.3" +version = "1.3.0" dependencies = [ "accelerate-src", "anyhow", @@ -3953,7 +3953,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.2.3" +version = "1.3.0" dependencies = [ "clap", "nohash-hasher", @@ -3962,7 +3962,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.2.3" +version = "1.3.0" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3976,7 +3976,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.2.3" +version = "1.3.0" dependencies = [ "async-channel", "hf-hub", @@ -3991,7 +3991,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.2.3" +version = "1.3.0" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 950c900c..54dd6092 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.2.3" +version = "1.3.0" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" diff --git a/README.md b/README.md index d8d5a40c..2c228618 100644 --- a/README.md +++ b/README.md @@ -63,36 +63,37 @@ Ember, GTE and E5. TEI implements many features such as: #### Text Embeddings -You can use any JinaBERT model with Alibi or absolute positions or any BERT, CamemBERT, RoBERTa, or XLM-RoBERTa model -with absolute positions in `text-embeddings-inference`. +Text Embeddings Inference currently supports Nomic, BERT, CamemBERT, XLM-RoBERTa models with absolute positions, JinaBERT +model with Alibi positions and Mistral, Alibabe GTE models with Rope positions. -**Support for other model types will be added in the future.** +Below are some examples of the currently supported models: -Examples of supported models: +| MTEB Rank | Model Size | Model Type | Model ID | +|-----------|----------------|-------------|--------------------------------------------------------------------------------------------------| +| 1 | 7B (Very Slow) | Mistral | [Salesforce/SFR-Embedding-2_R](https://hf.co/Salesforce/SFR-Embedding-2_R) | +| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](Alibaba-NLP/gte-large-en-v1.5) | +| 20 | 0.3B | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | +| 24 | 0.5B | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | -| MTEB Rank | Model Type | Model ID | -|-----------|-------------|--------------------------------------------------------------------------------------------------| -| 6 | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | -| 10 | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | -You can explore the list of best performing text embeddings -models [here](https://huggingface.co/spaces/mteb/leaderboard). +To explore the list of best performing text embeddings models, visit the +[Massive Text Embedding Benchmark (MTEB) Leaderboard](https://huggingface.co/spaces/mteb/leaderboard). #### Sequence Classification and Re-Ranking -`text-embeddings-inference` v0.4.0 added support for Bert, CamemBERT, RoBERTa and XLM-RoBERTa Sequence Classification models. +Text Embeddings Inference currently supports CamemBERT, and XLM-RoBERTa Sequence Classification models with absolute positions. -Example of supported sequence classification models: +Below are some examples of the currently supported models: -| Task | Model Type | Model ID | -|--------------------|-------------|---------------------------------------------------------------------------------------------| -| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-large](https://huggingface.co/BAAI/bge-reranker-large) | -| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base) | -| Sentiment Analysis | RoBERTa | [SamLowe/roberta-base-go_emotions](https://huggingface.co/SamLowe/roberta-base-go_emotions) | +| Task | Model Type | Model ID | Revision | +|--------------------|-------------|---------------------------------------------------------------------------------------------|-------------| +| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-large](https://huggingface.co/BAAI/bge-reranker-large) | `refs/pr/4` | +| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base) | `refs/pr/5` | +| Sentiment Analysis | RoBERTa | [SamLowe/roberta-base-go_emotions](https://huggingface.co/SamLowe/roberta-base-go_emotions) | | ### Docker @@ -101,7 +102,7 @@ model=BAAI/bge-large-en-v1.5 revision=refs/pr/5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision ``` And then you can make requests like @@ -163,9 +164,11 @@ Options: [env: POOLING=] Possible values: - - cls: Select the CLS token as embedding - - mean: Apply Mean pooling to the model embeddings - - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only available if the loaded model is a `ForMaskedLM` Transformer model + - cls: Select the CLS token as embedding + - mean: Apply Mean pooling to the model embeddings + - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only + available if the loaded model is a `ForMaskedLM` Transformer model + - last-token: Select the last token as embedding --max-concurrent-requests The maximum amount of concurrent requests for this particular deployment. @@ -199,6 +202,37 @@ Options: [env: MAX_CLIENT_BATCH_SIZE=] [default: 32] + --auto-truncate + Automatically truncate inputs that are longer than the maximum supported size + + Unused for gRPC servers + + [env: AUTO_TRUNCATE=] + + --default-prompt-name + The name of the prompt that should be used by default for encoding. If not set, no prompt will be applied. + + Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + + For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, then the + sentence "What is the capital of France?" will be encoded as "query: What is the capital of France?" because + the prompt text will be prepended before any text to encode. + + The argument '--default-prompt-name ' cannot be used with '--default-prompt ` + + [env: DEFAULT_PROMPT_NAME=] + + --default-prompt + The prompt that should be used by default for encoding. If not set, no prompt will be applied. + + For example if ``default_prompt`` is "query: " then the sentence "What is the capital of France?" will be + encoded as "query: What is the capital of France?" because the prompt text will be prepended before any text + to encode. + + The argument '--default-prompt ' cannot be used with '--default-prompt-name ` + + [env: DEFAULT_PROMPT=] + --hf-api-token Your HuggingFace hub token @@ -224,9 +258,10 @@ Options: [default: /tmp/text-embeddings-inference-server] --huggingface-hub-cache - The location of the huggingface hub cache. Used to override the location if you want to provide a mounted disk for instance + The location of the huggingface hub cache. Used to override the location if you want to provide a mounted disk + for instance - [env: HUGGINGFACE_HUB_CACHE=/data] + [env: HUGGINGFACE_HUB_CACHE=] --payload-limit Payload size limit in bytes @@ -239,7 +274,8 @@ Options: --api-key Set an api key for request authorization. - By default the server responds to every request. With an api key set, the requests must have the Authorization header set with the api key as Bearer token. + By default the server responds to every request. With an api key set, the requests must have the Authorization + header set with the api key as Bearer token. [env: API_KEY=] @@ -254,12 +290,14 @@ Options: [env: OTLP_ENDPOINT=] --otlp-service-name - The service name for opentelemetry. + The service name for opentelemetry. e.g. `text-embeddings-inference.server` [env: OTLP_SERVICE_NAME=] [default: text-embeddings-inference.server] --cors-allow-origin + Unused for gRPC servers + [env: CORS_ALLOW_ORIGIN=] ``` @@ -269,13 +307,13 @@ Text Embeddings Inference ships with multiple Docker images that you can use to | Architecture | Image | |-------------------------------------|-------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.2 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.3 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.2 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.2 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.2 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.2 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.2 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.3 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.3 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.3 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.3 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.3 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. @@ -304,7 +342,7 @@ model= volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run token= -docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model ``` ### Using Re-rankers models @@ -322,7 +360,7 @@ model=BAAI/bge-reranker-large revision=refs/pr/4 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision ``` And then you can rank the similarity between a query and a list of texts with: @@ -342,7 +380,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: @@ -362,7 +400,7 @@ You can choose to activate SPLADE pooling for Bert and Distilbert MaskedLM archi model=naver/efficient-splade-VI-BT-large-query volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --pooling splade +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --pooling splade ``` Once you have deployed the model you can use the `/embed_sparse` endpoint to get the sparse embedding: @@ -382,7 +420,8 @@ by setting the address to an OTLP collector with the `--otlp-endpoint` argument. ### gRPC `text-embeddings-inference` offers a gRPC API as an alternative to the default HTTP API for high performance -deployments. The API protobuf definition can be found [here](https://github.com/huggingface/text-embeddings-inference/blob/main/proto/tei.proto). +deployments. The API protobuf definition can be +found [here](https://github.com/huggingface/text-embeddings-inference/blob/main/proto/tei.proto). You can use the gRPC API by adding the `-grpc` tag to any TEI Docker image. For example: @@ -391,7 +430,7 @@ model=BAAI/bge-large-en-v1.5 revision=refs/pr/5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2-grpc --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3-grpc --model-id $model --revision $revision ``` ```shell @@ -438,7 +477,8 @@ sudo apt-get install libssl-dev gcc -y GPUs with Cuda compute capabilities < 7.5 are not supported (V100, Titan V, GTX 1000 series, ...). -Make sure you have Cuda and the nvidia drivers installed. NVIDIA drivers on your device need to be compatible with CUDA version 12.2 or higher. +Make sure you have Cuda and the nvidia drivers installed. NVIDIA drivers on your device need to be compatible with CUDA +version 12.2 or higher. You also need to add the nvidia binaries to your path: ```shell @@ -499,12 +539,18 @@ docker build . -f Dockerfile-cuda --build-arg CUDA_COMPUTE_CAP=$runtime_compute_ ``` ### Apple M1/M2 arm64 architectures + #### DISCLAIMER -As explained here [MPS-Ready, ARM64 Docker Image](https://github.com/pytorch/pytorch/issues/81224), Metal / MPS is not supported via Docker. As such inference will be CPU bound and most likely pretty slow when using this docker image on an M1/M2 ARM CPU. + +As explained here [MPS-Ready, ARM64 Docker Image](https://github.com/pytorch/pytorch/issues/81224), Metal / MPS is not +supported via Docker. As such inference will be CPU bound and most likely pretty slow when using this docker image on an +M1/M2 ARM CPU. + ``` docker build . -f Dockerfile-arm64 --platform=linux/arm64 ``` ## Examples + - [Set up an Inference Endpoint with TEI](https://huggingface.co/learn/cookbook/automatic_embedding_tei_inference_endpoints) - [RAG containers with TEI](https://github.com/plaggy/rag-containers) diff --git a/docs/source/en/cli_arguments.md b/docs/source/en/cli_arguments.md index 5efa63cf..7a070f37 100644 --- a/docs/source/en/cli_arguments.md +++ b/docs/source/en/cli_arguments.md @@ -62,9 +62,11 @@ Options: [env: POOLING=] Possible values: - - cls: Select the CLS token as embedding - - mean: Apply Mean pooling to the model embeddings - - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only available if the loaded model is a `ForMaskedLM` Transformer model + - cls: Select the CLS token as embedding + - mean: Apply Mean pooling to the model embeddings + - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only + available if the loaded model is a `ForMaskedLM` Transformer model + - last-token: Select the last token as embedding --max-concurrent-requests The maximum amount of concurrent requests for this particular deployment. @@ -98,6 +100,37 @@ Options: [env: MAX_CLIENT_BATCH_SIZE=] [default: 32] + --auto-truncate + Automatically truncate inputs that are longer than the maximum supported size + + Unused for gRPC servers + + [env: AUTO_TRUNCATE=] + + --default-prompt-name + The name of the prompt that should be used by default for encoding. If not set, no prompt will be applied. + + Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + + For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, then the + sentence "What is the capital of France?" will be encoded as "query: What is the capital of France?" because + the prompt text will be prepended before any text to encode. + + The argument '--default-prompt-name ' cannot be used with '--default-prompt ` + + [env: DEFAULT_PROMPT_NAME=] + + --default-prompt + The prompt that should be used by default for encoding. If not set, no prompt will be applied. + + For example if ``default_prompt`` is "query: " then the sentence "What is the capital of France?" will be + encoded as "query: What is the capital of France?" because the prompt text will be prepended before any text + to encode. + + The argument '--default-prompt ' cannot be used with '--default-prompt-name ` + + [env: DEFAULT_PROMPT=] + --hf-api-token Your HuggingFace hub token @@ -126,7 +159,7 @@ Options: The location of the huggingface hub cache. Used to override the location if you want to provide a mounted disk for instance - [env: HUGGINGFACE_HUB_CACHE=/data] + [env: HUGGINGFACE_HUB_CACHE=] --payload-limit Payload size limit in bytes @@ -139,7 +172,8 @@ Options: --api-key Set an api key for request authorization. - By default the server responds to every request. With an api key set, the requests must have the Authorization header set with the api key as Bearer token. + By default the server responds to every request. With an api key set, the requests must have the Authorization + header set with the api key as Bearer token. [env: API_KEY=] @@ -154,11 +188,13 @@ Options: [env: OTLP_ENDPOINT=] --otlp-service-name - The service name for opentelemetry. + The service name for opentelemetry. e.g. `text-embeddings-inference.server` [env: OTLP_SERVICE_NAME=] [default: text-embeddings-inference.server] --cors-allow-origin + Unused for gRPC servers + [env: CORS_ALLOW_ORIGIN=] ``` diff --git a/docs/source/en/private_models.md b/docs/source/en/private_models.md index bd9041c7..17012443 100644 --- a/docs/source/en/private_models.md +++ b/docs/source/en/private_models.md @@ -24,10 +24,10 @@ Once you have confirmed that you have access to the model: - Navigate to your account's [Profile | Settings | Access Tokens page](https://huggingface.co/settings/tokens). - Generate and copy a read token. -If you're the CLI, set the `HUGGING_FACE_HUB_TOKEN` environment variable. For example: +If you're the CLI, set the `HF_API_TOKEN` environment variable. For example: ```shell -export HUGGING_FACE_HUB_TOKEN= +export HF_API_TOKEN= ``` Alternatively, you can provide the token when deploying the model with Docker: @@ -37,5 +37,5 @@ model= volume=$PWD/data token= -docker run --gpus all -e HUGGING_FACE_HUB_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model ``` diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index c0fe008c..a481b278 100644 --- a/docs/source/en/quick_tour.md +++ b/docs/source/en/quick_tour.md @@ -34,7 +34,7 @@ model=BAAI/bge-large-en-v1.5 revision=refs/pr/5 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision ``` @@ -69,7 +69,7 @@ model=BAAI/bge-reranker-large revision=refs/pr/4 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision ``` Once you have deployed a model, you can use the `rerank` endpoint to rank the similarity between a query and a list @@ -90,7 +90,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: diff --git a/docs/source/en/supported_models.md b/docs/source/en/supported_models.md index 876e5d06..f638639f 100644 --- a/docs/source/en/supported_models.md +++ b/docs/source/en/supported_models.md @@ -20,19 +20,21 @@ We are continually expanding our support for other model types and plan to inclu ## Supported embeddings models -Text Embeddings Inference currently supports BERT, CamemBERT, XLM-RoBERTa models with absolute positions and JinaBERT -model with Alibi positions. +Text Embeddings Inference currently supports Nomic, BERT, CamemBERT, XLM-RoBERTa models with absolute positions, JinaBERT +model with Alibi positions and Mistral, Alibabe GTE models with Rope positions. Below are some examples of the currently supported models: -| MTEB Rank | Model Type | Model ID | -|-----------|--------------|--------------------------------------------------------------------------------------------------| -| 6 | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | -| 10 | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jniaai/jina-embeddings-v2-base-code) | +| MTEB Rank | Model Size | Model Type | Model ID | +|-----------|----------------|-------------|--------------------------------------------------------------------------------------------------| +| 1 | 7B (Very Slow) | Mistral | [Salesforce/SFR-Embedding-2_R](https://hf.co/Salesforce/SFR-Embedding-2_R) | +| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](Alibaba-NLP/gte-large-en-v1.5) | +| 20 | 0.3B | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | +| 24 | 0.5B | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | To explore the list of best performing text embeddings models, visit the @@ -64,13 +66,13 @@ Find the appropriate Docker image for your hardware in the following table: | Architecture | Image | |-------------------------------------|--------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.2 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.3 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.2 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.2 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.2 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.2 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.2 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.3 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.3 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.3 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.3 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.3 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. From 4b2ab613c3dae0b599d8c3e63da73cb4dd101e34 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 2 Jul 2024 16:39:47 +0200 Subject: [PATCH 08/36] feat(candle): support Qwen2 on Cuda (#316) --- README.md | 24 +- backends/candle/src/lib.rs | 26 +- backends/candle/src/models/flash_bert.rs | 5 +- .../candle/src/models/flash_distilbert.rs | 5 +- backends/candle/src/models/flash_gte.rs | 5 +- backends/candle/src/models/flash_jina.rs | 5 +- backends/candle/src/models/flash_jina_code.rs | 5 +- backends/candle/src/models/flash_mistral.rs | 5 +- backends/candle/src/models/flash_nomic.rs | 5 +- backends/candle/src/models/flash_qwen2.rs | 455 ++ backends/candle/src/models/mod.rs | 8 + backends/candle/src/models/qwen2.rs | 18 + backends/candle/tests/common.rs | 6 +- .../test_flash_qwen2__qwen2_batch.snap | 4613 +++++++++++++++++ .../test_flash_qwen2__qwen2_single.snap | 1541 ++++++ backends/candle/tests/test_flash_qwen2.rs | 77 + docs/source/en/supported_models.md | 2 +- router/src/lib.rs | 26 +- 18 files changed, 6805 insertions(+), 26 deletions(-) create mode 100644 backends/candle/src/models/flash_qwen2.rs create mode 100644 backends/candle/src/models/qwen2.rs create mode 100644 backends/candle/tests/snapshots/test_flash_qwen2__qwen2_batch.snap create mode 100644 backends/candle/tests/snapshots/test_flash_qwen2__qwen2_single.snap create mode 100644 backends/candle/tests/test_flash_qwen2.rs diff --git a/README.md b/README.md index 2c228618..86bb438f 100644 --- a/README.md +++ b/README.md @@ -64,20 +64,22 @@ Ember, GTE and E5. TEI implements many features such as: #### Text Embeddings Text Embeddings Inference currently supports Nomic, BERT, CamemBERT, XLM-RoBERTa models with absolute positions, JinaBERT -model with Alibi positions and Mistral, Alibabe GTE models with Rope positions. +model with Alibi positions and Mistral, Alibaba GTE and Qwen2 models with Rope positions. Below are some examples of the currently supported models: -| MTEB Rank | Model Size | Model Type | Model ID | -|-----------|----------------|-------------|--------------------------------------------------------------------------------------------------| -| 1 | 7B (Very Slow) | Mistral | [Salesforce/SFR-Embedding-2_R](https://hf.co/Salesforce/SFR-Embedding-2_R) | -| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](Alibaba-NLP/gte-large-en-v1.5) | -| 20 | 0.3B | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | -| 24 | 0.5B | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | -| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | -| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | -| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | -| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | +| MTEB Rank | Model Size | Model Type | Model ID | +|-----------|---------------------|-------------|--------------------------------------------------------------------------------------------------| +| 1 | 7B (Very Expensive) | Mistral | [Salesforce/SFR-Embedding-2_R](https://hf.co/Salesforce/SFR-Embedding-2_R) | +| 2 | 7B (Very Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-7B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-7B-instruct) | +| 9 | 1.5B (Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-1.5B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct) | +| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](Alibaba-NLP/gte-large-en-v1.5) | +| 20 | 0.3B | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | +| 24 | 0.5B | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | To explore the list of best performing text embeddings models, visit the diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index 5204536b..acd93750 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -12,12 +12,12 @@ use crate::compute_cap::{ }; use crate::models::{ BertConfig, BertModel, DistilBertConfig, DistilBertModel, GTEConfig, JinaBertModel, - JinaCodeBertModel, MistralConfig, Model, NomicBertModel, NomicConfig, + JinaCodeBertModel, MistralConfig, Model, NomicBertModel, NomicConfig, Qwen2Config, }; #[cfg(feature = "cuda")] use crate::models::{ FlashBertModel, FlashDistilBertModel, FlashGTEModel, FlashJinaBertModel, - FlashJinaCodeBertModel, FlashMistralModel, FlashNomicBertModel, + FlashJinaCodeBertModel, FlashMistralModel, FlashNomicBertModel, FlashQwen2Model, }; use anyhow::Context; use candle::{DType, Device}; @@ -59,6 +59,7 @@ enum Config { Mistral(MistralConfig), #[serde(rename = "new")] Gte(GTEConfig), + Qwen2(Qwen2Config), } pub struct CandleBackend { @@ -221,6 +222,10 @@ impl CandleBackend { "GTE is only supported on Cuda devices in fp16 with flash attention enabled" .to_string(), )), + (Config::Qwen2(_), Device::Cpu | Device::Metal(_)) => Err(BackendError::Start( + "Qwen2 is only supported on Cuda devices in fp16 with flash attention enabled" + .to_string(), + )), #[cfg(feature = "cuda")] (Config::Bert(config), Device::Cuda(_)) => { if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) @@ -342,14 +347,25 @@ impl CandleBackend { #[cfg(feature = "cuda")] (Config::Gte(config), Device::Cuda(_)) => { if dtype != DType::F16 - || !cfg!(feature = "flash-attn") - || get_runtime_compute_cap().unwrap() < 80 + || !cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) { - return Err(BackendError::Start("GTE is only supported on Cuda devices in fp16 with flash attention v2 enabled".to_string())); + return Err(BackendError::Start("GTE is only supported on Cuda devices in fp16 with flash attention enabled".to_string())); } tracing::info!("Starting FlashGTE model on {:?}", device); Ok(Box::new(FlashGTEModel::load(vb, &config, model_type).s()?)) } + #[cfg(feature = "cuda")] + (Config::Qwen2(config), Device::Cuda(_)) => { + if dtype != DType::F16 + || !cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) + { + return Err(BackendError::Start("Qwen2 is only supported on Cuda devices in fp16 with flash attention v2 enabled".to_string())); + } + tracing::info!("Starting FlashQwen2 model on {:?}", device); + Ok(Box::new( + FlashQwen2Model::load(vb, &config, model_type).s()?, + )) + } }; Ok(Self { diff --git a/backends/candle/src/models/flash_bert.rs b/backends/candle/src/models/flash_bert.rs index 8f20f027..8951dcc1 100644 --- a/backends/candle/src/models/flash_bert.rs +++ b/backends/candle/src/models/flash_bert.rs @@ -400,7 +400,10 @@ impl FlashBertModel { // Get token indices form cu_seqlens let mut indices = match self.pool { Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, - Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } _ => unreachable!(), }; diff --git a/backends/candle/src/models/flash_distilbert.rs b/backends/candle/src/models/flash_distilbert.rs index f8dd294b..7f060601 100644 --- a/backends/candle/src/models/flash_distilbert.rs +++ b/backends/candle/src/models/flash_distilbert.rs @@ -266,7 +266,10 @@ impl FlashDistilBertModel { // Get token indices form cu_seqlens let mut indices = match self.pool { Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, - Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } _ => unreachable!(), }; diff --git a/backends/candle/src/models/flash_gte.rs b/backends/candle/src/models/flash_gte.rs index 62bf65bd..f3aec220 100644 --- a/backends/candle/src/models/flash_gte.rs +++ b/backends/candle/src/models/flash_gte.rs @@ -352,7 +352,10 @@ impl FlashGTEModel { // Get token indices form cu_seqlens let mut indices = match self.pool { Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, - Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } _ => unreachable!(), }; diff --git a/backends/candle/src/models/flash_jina.rs b/backends/candle/src/models/flash_jina.rs index 0bab863f..83c5b0a4 100644 --- a/backends/candle/src/models/flash_jina.rs +++ b/backends/candle/src/models/flash_jina.rs @@ -327,7 +327,10 @@ impl FlashJinaBertModel { // Get token indices form cu_seqlens let mut indices = match self.pool { Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, - Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } _ => unreachable!(), }; diff --git a/backends/candle/src/models/flash_jina_code.rs b/backends/candle/src/models/flash_jina_code.rs index b20438fe..56ab1976 100644 --- a/backends/candle/src/models/flash_jina_code.rs +++ b/backends/candle/src/models/flash_jina_code.rs @@ -380,7 +380,10 @@ impl FlashJinaCodeBertModel { // Get token indices form cu_seqlens let mut indices = match self.pool { Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, - Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } _ => unreachable!(), }; diff --git a/backends/candle/src/models/flash_mistral.rs b/backends/candle/src/models/flash_mistral.rs index 53e5d3c4..eb94c913 100644 --- a/backends/candle/src/models/flash_mistral.rs +++ b/backends/candle/src/models/flash_mistral.rs @@ -334,7 +334,10 @@ impl FlashMistralModel { // Get token indices form cu_seqlens let mut indices = match self.pool { Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, - Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } _ => unreachable!(), }; diff --git a/backends/candle/src/models/flash_nomic.rs b/backends/candle/src/models/flash_nomic.rs index 8ad1ab89..7f558b9e 100644 --- a/backends/candle/src/models/flash_nomic.rs +++ b/backends/candle/src/models/flash_nomic.rs @@ -311,7 +311,10 @@ impl FlashNomicBertModel { // Get token indices form cu_seqlens let mut indices = match self.pool { Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, - Pool::LastToken => cu_seqlens.narrow(0, 1, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } _ => unreachable!(), }; diff --git a/backends/candle/src/models/flash_qwen2.rs b/backends/candle/src/models/flash_qwen2.rs new file mode 100644 index 00000000..4dba7868 --- /dev/null +++ b/backends/candle/src/models/flash_qwen2.rs @@ -0,0 +1,455 @@ +use crate::flash_attn::flash_attn_varlen; +use crate::layers::{HiddenAct, Linear, RMSNorm}; +use crate::models::{Model, Qwen2Config}; +use candle::{DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{Embedding, Module, VarBuilder}; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +struct Qwen2Attention { + qkv_linear: Linear, + o_proj: Linear, + + num_attention_heads: usize, + num_key_value_heads: usize, + attention_head_size: usize, + + softmax_scale: f32, + + span: tracing::Span, +} + +impl Qwen2Attention { + pub fn load(vb: VarBuilder, config: &Qwen2Config) -> Result { + if config.use_sliding_window { + candle::bail!("Sliding window is not supported"); + } + + let num_attention_heads = config.num_attention_heads; + let attention_head_size = config.hidden_size / config.num_attention_heads; + let num_key_value_heads = config.num_key_value_heads; + let hidden_size = config.hidden_size; + + let query_weight = vb.pp("q_proj").get((hidden_size, hidden_size), "weight")?; + let query_bias = vb.pp("q_proj").get(hidden_size, "bias")?; + + let key_weight = vb.pp("k_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + let key_bias = vb + .pp("k_proj") + .get(num_key_value_heads * attention_head_size, "bias")?; + + let value_weight = vb.pp("v_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + let value_bias = vb + .pp("v_proj") + .get(num_key_value_heads * attention_head_size, "bias")?; + + let qkv_weight = Tensor::cat(&[&query_weight, &key_weight, &value_weight], 0)?; + let qkv_bias = Tensor::cat(&[&query_bias, &key_bias, &value_bias], 0)?; + let qkv_linear = Linear::new(qkv_weight, Some(qkv_bias), None); + + let o_proj_weight = vb.pp("o_proj").get((hidden_size, hidden_size), "weight")?; + + let o_proj = Linear::new(o_proj_weight, None, None); + + let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; + + Ok(Self { + qkv_linear, + o_proj, + num_attention_heads, + num_key_value_heads, + attention_head_size, + softmax_scale, + span: tracing::span!(tracing::Level::TRACE, "attention"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let qkv = self.qkv_linear.forward(hidden_states)?; + + // Reshape to [tokens, heads, head_size] + let mut new_qkv_shape = qkv.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads + 2 * self.num_key_value_heads); + new_qkv_shape.push(self.attention_head_size); + + let qkv = qkv.reshape(new_qkv_shape)?; + + // Split qkv tensor + let q = qkv.narrow(1, 0, self.num_attention_heads)?; + let k = qkv.narrow(1, self.num_attention_heads, self.num_key_value_heads)?; + let v = qkv.narrow( + 1, + self.num_attention_heads + self.num_key_value_heads, + self.num_key_value_heads, + )?; + + candle_rotary::apply_rotary_inplace(&q, &k, &cos, &sin, true)?; + + let attention = flash_attn_varlen( + &q, + &k, + &v, + None, + cu_seqlens, + cu_seqlens, + max_s, + max_s, + self.softmax_scale, + false, + None, + )?; + let attention = attention.flatten_from(candle::D::Minus2)?; + + self.o_proj.forward(&attention) + } +} + +struct Qwen2MLP { + gate_up_proj: Linear, + down_proj: Linear, + + act: HiddenAct, + intermediate_size: usize, + + span: tracing::Span, +} + +impl Qwen2MLP { + pub fn load(vb: VarBuilder, config: &Qwen2Config) -> Result { + let intermediate_size = config.intermediate_size; + + let gate_proj_weight = vb + .pp("gate_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let up_proj_weight = vb + .pp("up_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let gate_up_proj_weight = Tensor::cat(&[&gate_proj_weight, &up_proj_weight], 0)?; + let gate_up_proj = Linear::new(gate_up_proj_weight, None, None); + + let down_proj_weight = vb + .pp("down_proj") + .get((config.hidden_size, intermediate_size), "weight")?; + let down_proj = Linear::new(down_proj_weight, None, None); + + Ok(Self { + gate_up_proj, + down_proj, + intermediate_size, + act: config.hidden_act.clone(), + span: tracing::span!(tracing::Level::TRACE, "mlp"), + }) + } + + pub fn forward(&self, hidden_states: &Tensor) -> Result { + let _enter = self.span.enter(); + + let gate_up_states = self.gate_up_proj.forward(hidden_states)?; + let gate_states = gate_up_states.narrow(1, 0, self.intermediate_size)?; + let up_states = gate_up_states.narrow(1, self.intermediate_size, self.intermediate_size)?; + + let gate_states = match self.act { + HiddenAct::Gelu => gate_states.gelu(), + HiddenAct::Relu => gate_states.relu(), + HiddenAct::Swiglu => gate_states.silu(), + }?; + let r = self.down_proj.forward(&(gate_states * up_states)?); + r + } +} + +struct Qwen2Layer { + attention: Qwen2Attention, + mlp: Qwen2MLP, + input_layer_norm: RMSNorm, + post_attention_layer_norm: RMSNorm, + + span: tracing::Span, +} + +impl Qwen2Layer { + pub fn load(vb: VarBuilder, config: &Qwen2Config) -> Result { + let attention = Qwen2Attention::load(vb.pp("self_attn"), config)?; + let mlp = Qwen2MLP::load(vb.pp("mlp"), config)?; + + let input_layer_norm = RMSNorm::load( + vb.pp("input_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + let post_attention_layer_norm = RMSNorm::load( + vb.pp("post_attention_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + + Ok(Self { + attention, + mlp, + input_layer_norm, + post_attention_layer_norm, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + residual: Option<&Tensor>, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result<(Tensor, Tensor)> { + let _enter = self.span.enter(); + + let (normed_hidden_states, res) = self.input_layer_norm.forward(hidden_states, residual)?; + let attn_output = + self.attention + .forward(&normed_hidden_states, cu_seqlens, cos, sin, max_s)?; + let (normed_attn_res_output, attn_res) = self + .post_attention_layer_norm + .forward(&attn_output, Some(&res))?; + let mlp_output = self.mlp.forward(&normed_attn_res_output)?; + + Ok((mlp_output, attn_res)) + } +} + +pub struct FlashQwen2Model { + embeddings: Embedding, + layers: Vec, + norm: RMSNorm, + cos_cache: Tensor, + sin_cache: Tensor, + pool: Pool, + pub device: Device, + + span: tracing::Span, +} + +impl FlashQwen2Model { + pub fn load(vb: VarBuilder, config: &Qwen2Config, model_type: ModelType) -> Result { + match vb.device() { + Device::Cuda(_) => {} + _ => candle::bail!("FlashQwen2 requires Cuda"), + } + + if vb.dtype() != DType::F16 { + candle::bail!("FlashQwen2 requires DType::F16") + } + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for Qwen2") + } + ModelType::Embedding(pool) => pool, + }; + + let vb = vb.pp("model"); + + let embeddings = Embedding::new( + vb.pp("embed_tokens") + .get((config.vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ); + + let layers = (0..config.num_hidden_layers) + .map(|index| Qwen2Layer::load(vb.pp(format!("layers.{index}")), config)) + .collect::>>()?; + + let norm = RMSNorm::load(vb.pp("norm"), config.hidden_size, config.rms_norm_eps)?; + + let inv_freqs = candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta, + vb.device(), + )?; + let (cos_cache, sin_cache) = + candle_rotary::cos_sin(config.max_position_embeddings, &inv_freqs, vb.dtype())?; + + Ok(Self { + embeddings, + layers, + norm, + cos_cache, + sin_cache, + pool, + device: vb.device().clone(), + span: tracing::span!(tracing::Level::TRACE, "model"), + }) + } + + pub fn forward(&self, batch: Batch) -> Result<(Option, Option)> { + let _enter = self.span.enter(); + + let batch_size = batch.cumulative_seq_lengths.len() - 1; + let shape = batch.input_ids.len(); + + // Create Cuda tensors + let input_ids = Tensor::from_vec(batch.input_ids, shape, &self.device)?; + let position_ids = Tensor::from_vec(batch.position_ids, shape, &self.device)?; + let cu_seqlens = Tensor::from_vec( + batch.cumulative_seq_lengths.clone(), + batch_size + 1, + &self.device, + )?; + + let mut hidden_states = self.embeddings.forward(&input_ids)?; + + let cos = self.cos_cache.index_select(&position_ids, 0)?; + let sin = self.sin_cache.index_select(&position_ids, 0)?; + + let mut residual = None; + for layer in &self.layers { + let (h, r) = layer.forward( + &hidden_states, + residual.as_ref(), + &cu_seqlens, + &cos, + &sin, + batch.max_length as usize, + )?; + hidden_states = h; + residual = Some(r); + } + + let (outputs, _) = self.norm.forward(&hidden_states, residual.as_ref())?; + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + let pooled_embeddings = if has_pooling_requests { + match self.pool { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) + } + } + // Mean pooling + Pool::Mean => { + if batch_size > 1 { + // for each request that requires pooling + let results: Result> = batch + .pooled_indices + .into_iter() + .map(|i| { + let i = i as usize; + let start = batch.cumulative_seq_lengths[i]; + let len = batch.cumulative_seq_lengths[i + 1] - start; + + // Mean + let embeddings = outputs.narrow(0, start as usize, len as usize)?; + embeddings.sum_keepdim(0)? / (len as f64) + }) + .collect(); + + // Concatenate all results + Some(Tensor::cat(&results?, 0)?) + } else { + Some((outputs.sum_keepdim(0)? / (batch.max_length as f64))?) + } + } + Pool::Splade => { + unreachable!(); + } + } + } else { + None + }; + + let raw_embeddings = if has_raw_requests { + if batch_size > 1 && has_pooling_requests { + // Create indexing vector for the embeddings + let mut final_indices: Vec = Vec::with_capacity(shape); + for i in batch.raw_indices.into_iter() { + let i = i as usize; + // Get start/end token index of this specific member of the batch + let start = batch.cumulative_seq_lengths[i]; + let end = batch.cumulative_seq_lengths[i + 1]; + + for j in start..end { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j); + } + } + + let final_indices_length = final_indices.len(); + let final_indices = + Tensor::from_vec(final_indices, final_indices_length, &self.device)?; + + // Select the tokens with final indices + Some(outputs.index_select(&final_indices, 0)?) + } else { + Some(outputs) + } + } else { + None + }; + + Ok((pooled_embeddings, raw_embeddings)) + } +} + +impl Model for FlashQwen2Model { + fn is_padded(&self) -> bool { + false + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} diff --git a/backends/candle/src/models/mod.rs b/backends/candle/src/models/mod.rs index 9f616a2a..b1e9f937 100644 --- a/backends/candle/src/models/mod.rs +++ b/backends/candle/src/models/mod.rs @@ -30,7 +30,11 @@ mod flash_distilbert; mod flash_gte; #[cfg(feature = "cuda")] mod flash_mistral; + +#[cfg(feature = "cuda")] +mod flash_qwen2; mod gte; +mod qwen2; pub use bert::{BertConfig, BertModel, PositionEmbeddingType}; use candle::{Result, Tensor}; @@ -41,6 +45,7 @@ pub use jina::JinaBertModel; pub use jina_code::JinaCodeBertModel; pub use mistral::MistralConfig; pub use nomic::{NomicBertModel, NomicConfig}; +pub use qwen2::Qwen2Config; use text_embeddings_backend_core::Batch; #[cfg(feature = "cuda")] @@ -64,6 +69,9 @@ pub use flash_mistral::FlashMistralModel; #[cfg(feature = "cuda")] pub use flash_gte::FlashGTEModel; +#[cfg(feature = "cuda")] +pub use flash_qwen2::FlashQwen2Model; + pub(crate) trait Model { fn is_padded(&self) -> bool; diff --git a/backends/candle/src/models/qwen2.rs b/backends/candle/src/models/qwen2.rs new file mode 100644 index 00000000..8d2d1f86 --- /dev/null +++ b/backends/candle/src/models/qwen2.rs @@ -0,0 +1,18 @@ +use crate::layers::HiddenAct; +use serde::Deserialize; + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct Qwen2Config { + pub vocab_size: usize, + pub hidden_size: usize, + pub intermediate_size: usize, + pub num_hidden_layers: usize, + pub num_attention_heads: usize, + pub num_key_value_heads: usize, + pub hidden_act: HiddenAct, + pub max_position_embeddings: usize, + pub rms_norm_eps: f32, + pub rope_theta: f32, + pub sliding_window: usize, + pub use_sliding_window: bool, +} diff --git a/backends/candle/tests/common.rs b/backends/candle/tests/common.rs index a3d74d16..0c069a47 100644 --- a/backends/candle/tests/common.rs +++ b/backends/candle/tests/common.rs @@ -107,7 +107,11 @@ pub fn download_artifacts( model_id: &'static str, revision: Option<&'static str>, ) -> Result { - let builder = ApiBuilder::new().with_progress(false); + let mut builder = ApiBuilder::new().with_progress(false); + + if let Some(cache_dir) = std::env::var_os("HUGGINGFACE_HUB_CACHE") { + builder = builder.with_cache_dir(cache_dir.into()); + } let api = builder.build().unwrap(); let api_repo = if let Some(revision) = revision { diff --git a/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_batch.snap b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_batch.snap new file mode 100644 index 00000000..7a252f73 --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_batch.snap @@ -0,0 +1,4613 @@ +--- +source: backends/candle/tests/test_flash_qwen2.rs +assertion_line: 61 +expression: embeddings_batch +--- +- - -4.9882813 + - 6.7734375 + - -1.6269531 + - -3.21875 + - 7.078125 + - -0.5107422 + - -2.75 + - -1.5371094 + - 4.9257813 + - 0.9790039 + - 6.03125 + - -4.0195313 + - -4.9648438 + - 0.9160156 + - 0.63916016 + - -0.90771484 + - 5.375 + - -0.3293457 + - 2.8535156 + - 2.7773438 + - 0.25170898 + - -4.671875 + - 1.7490234 + - -1.7080078 + - 2.1933594 + - -0.7470703 + - -5.6445313 + - 0.31762695 + - 6.4375 + - 1.9873047 + - -5.265625 + - 0.6816406 + - 0.89404297 + - 12.1640625 + - -3.3867188 + - -5.015625 + - -2.890625 + - 1.3457031 + - -0.47094727 + - -1.1201172 + - 1.2382813 + - -0.6855469 + - -1.5957031 + - -0.39916992 + - 10.4921875 + - 5.3867188 + - -7.9570313 + - -5.6914063 + - 2.9589844 + - -2.2753906 + - 4.1210938 + - -0.3178711 + - -1.15625 + - 5.828125 + - 3.4746094 + - -0.51953125 + - 1.9931641 + - 1.15625 + - -3.9140625 + - -0.30517578 + - 4.390625 + - 0.96191406 + - -5.0078125 + - 5.8242188 + - 1.9091797 + - 2.2949219 + - -3.2460938 + - -3.9570313 + - 5.3789063 + - 6.4648438 + - 6.9375 + - 7.6210938 + - 0.76464844 + - -0.41430664 + - -3.7480469 + - 3.1015625 + - -0.22961426 + - -3.3007813 + - -5.2890625 + - -8.6953125 + - 2.3320313 + - -0.9013672 + - -5.3789063 + - -10.9453125 + - -0.20263672 + - -3.359375 + - -6.1367188 + - 2.6777344 + - -2.7753906 + - 2.0957031 + - -2.3105469 + - -2.7382813 + - -17.140625 + - 5.2070313 + - 3.4707031 + - -2.0371094 + - 0.82421875 + - -3.5566406 + - 2.1445313 + - -4.8164063 + - -1.2802734 + - 0.42407227 + - 0.98095703 + - 1.3271484 + - -1.9667969 + - 0.36328125 + - -3.90625 + - 5.0859375 + - -1.7578125 + - -1.8056641 + - -5.6210938 + - -2.875 + - -2.9453125 + - -1.5351563 + - 3.1445313 + - 3.8066406 + - 0.78759766 + - 2.8574219 + - 3.6015625 + - 10.6171875 + - -0.24499512 + - -0.52734375 + - -0.61816406 + - -2.9453125 + - -1.0263672 + - 3.359375 + - 6.6640625 + - -5.4179688 + - 0.9326172 + - 5.09375 + - -3.796875 + - 2.3691406 + - -3.9375 + - 6.0117188 + - 1.1669922 + - 0.07067871 + - -0.63916016 + - -7.7304688 + - -0.11804199 + - -5.1992188 + - -0.9707031 + - 2.8730469 + - 0.36157227 + - 4.0898438 + - -3.59375 + - -0.14904785 + - 6.3164063 + - 1.0546875 + - 12.78125 + - 5.265625 + - 2.4238281 + - -0.40429688 + - 2.5800781 + - -2.7871094 + - 0.19958496 + - -0.4580078 + - -4.5585938 + - -7.4570313 + - 0.7397461 + - -2.4921875 + - 2.3066406 + - 6.7929688 + - 5.4023438 + - -9.0859375 + - -0.38134766 + - 5.0117188 + - 3.9003906 + - 4.3515625 + - -3.7050781 + - 5.2226563 + - -4.4726563 + - -3.5234375 + - -3.5878906 + - 3.2519531 + - -4.1484375 + - 0.6220703 + - 0.796875 + - -0.8642578 + - -4.4023438 + - 7.171875 + - -2.1464844 + - -5.0898438 + - -3.7910156 + - 9.359375 + - 1.7636719 + - 2.4023438 + - -3.3632813 + - -0.3083496 + - 1.5644531 + - 8.6015625 + - 1.6787109 + - 3.1347656 + - 0.828125 + - -1.140625 + - 7.734375 + - 1.7255859 + - 0.40942383 + - -6.578125 + - 4.8867188 + - 8.0625 + - 3.3789063 + - 4.3359375 + - 1.0917969 + - -7.2265625 + - 11.5078125 + - 7.2929688 + - -0.17590332 + - -12.3046875 + - -1.6904297 + - -1.0439453 + - -6.5117188 + - -1.4707031 + - 3.1171875 + - -6.1835938 + - -0.48608398 + - 0.20043945 + - -2.1621094 + - -14.5859375 + - -2.4316406 + - -7.3242188 + - 2.8027344 + - -19.578125 + - 1.2392578 + - -0.20324707 + - -1.3583984 + - -3.8515625 + - 2.2460938 + - -0.011695862 + - -3.9257813 + - 5.6132813 + - 7.421875 + - -2.6035156 + - 1.0546875 + - -3.15625 + - -0.39282227 + - -1.7597656 + - -10.796875 + - -8.1875 + - -0.53271484 + - 1.5058594 + - 1.9404297 + - -0.18969727 + - 0.14782715 + - 1.4873047 + - -1.9814453 + - 2.9199219 + - -5.5859375 + - 0.45458984 + - -0.087768555 + - -1.2929688 + - -6.359375 + - -3.5957031 + - -3.4257813 + - -1.75 + - 6.2070313 + - 5.6796875 + - 2.3300781 + - 2.0546875 + - -0.85839844 + - 6.0039063 + - 6.4101563 + - 1.9902344 + - 0.55322266 + - -1.5361328 + - 0.30200195 + - 6.3828125 + - 4.6679688 + - 3.1835938 + - -10.171875 + - -1.8203125 + - -4.0351563 + - -5.3164063 + - 0.97802734 + - -3.1679688 + - 8.0703125 + - 0.1373291 + - 1.2431641 + - -0.47998047 + - 3.6601563 + - -6.7265625 + - -1.1728516 + - -1.5908203 + - 0.23620605 + - 5.5898438 + - 4.5234375 + - -5.7226563 + - -4.40625 + - 5.0234375 + - 1.5634766 + - 0.6376953 + - 4.3320313 + - -2.2246094 + - -1.6318359 + - -0.1784668 + - -7 + - -1.6015625 + - 0.10180664 + - 3.1777344 + - 4.5351563 + - 1.7783203 + - 9.765625 + - -0.8173828 + - 1.7431641 + - 0.5605469 + - -1.4628906 + - 5.53125 + - -5.7578125 + - -0.7885742 + - -4.2226563 + - -6.1171875 + - -0.27783203 + - 3.5566406 + - -1.7841797 + - 0.12915039 + - -1.7714844 + - -5.046875 + - -0.14331055 + - 4.3710938 + - -3.421875 + - -1.6601563 + - -2.8886719 + - -4.21875 + - 7.5625 + - -6.5195313 + - -4.1289063 + - 4.3203125 + - 2.7089844 + - -0.018585205 + - 2.265625 + - 2.2285156 + - -2.5683594 + - -5.6679688 + - -4.3085938 + - 0.05795288 + - 5.4296875 + - -1.515625 + - -1.5429688 + - -3.8125 + - 4.3242188 + - -2.0351563 + - 6.0898438 + - -8.421875 + - 1.3779297 + - 5.9804688 + - -2.3671875 + - -1.8222656 + - 0.30078125 + - 3.3515625 + - 5.6367188 + - 0.91796875 + - -4.109375 + - 0.05508423 + - 2.5761719 + - -5.8984375 + - -0.72998047 + - 3.875 + - -0.97998047 + - 9.25 + - 0.640625 + - 5.125 + - -7.7734375 + - -0.4169922 + - 5.8203125 + - 0.023406982 + - -4.9765625 + - 3.3613281 + - 2.6699219 + - 1.2724609 + - 1.9111328 + - -0.86621094 + - 1.2138672 + - -0.8588867 + - 0.053955078 + - 2.6777344 + - 1.3916016 + - -1.3056641 + - 9.7890625 + - -4.0390625 + - 8.625 + - 4.1835938 + - 1.5400391 + - -7.9414063 + - 2.4550781 + - -0.32177734 + - -1.7421875 + - -2.6972656 + - -1.7070313 + - -6.2539063 + - 1.2714844 + - 5.6132813 + - -1.7275391 + - 2.8261719 + - 7.0585938 + - -6.4453125 + - 1.7128906 + - 2.1816406 + - 2.4511719 + - -6.5351563 + - -1.2958984 + - 8.484375 + - 0.90234375 + - -5.25 + - -0.9995117 + - -1.2177734 + - 2.0703125 + - 0.79785156 + - -2.8261719 + - 1.6298828 + - -4.7148438 + - 9.40625 + - -0.09173584 + - 3.0546875 + - 0.1574707 + - 2.953125 + - 3.7773438 + - -3.0742188 + - -8.9375 + - 9.046875 + - 6.8203125 + - -1.7255859 + - 0.2626953 + - -5.984375 + - 2.5605469 + - -1.8837891 + - 2.0429688 + - 1.4042969 + - 1.9941406 + - -1.1591797 + - 2.6152344 + - 4.703125 + - -5.7460938 + - 0.14221191 + - -4.7539063 + - 4.578125 + - 5.7109375 + - -13.2734375 + - 1.0605469 + - 0.42138672 + - -3.5136719 + - 9.265625 + - 12.375 + - -0.6269531 + - -0.1352539 + - 5.5 + - 2.8027344 + - -0.9560547 + - 1.4589844 + - 3.3085938 + - 0.44677734 + - -0.15759277 + - 1.1865234 + - -6.4414063 + - 0.11468506 + - 2.5605469 + - -6.6953125 + - 0.7290039 + - -0.9814453 + - -0.4482422 + - 3.6191406 + - -11.109375 + - -2.4199219 + - -0.37817383 + - -4.4023438 + - 0.5107422 + - -1.9541016 + - -1.9423828 + - 4.6523438 + - 0.53466797 + - -1.1777344 + - -2.8515625 + - 1.3115234 + - 3.4199219 + - 2.6503906 + - -5.1796875 + - 0.5048828 + - -3.7246094 + - 0.83984375 + - -2.8574219 + - 0.23120117 + - 24.703125 + - 0.38232422 + - -3.6171875 + - -1.5263672 + - -1.0390625 + - 4.734375 + - -5.2539063 + - -0.95703125 + - 4.921875 + - -5.5898438 + - -3.3417969 + - -1.3525391 + - -0.8027344 + - 2.8535156 + - 7.7734375 + - 0.6699219 + - 4.7070313 + - -3.3847656 + - -3.4589844 + - -1.9072266 + - 0.2685547 + - 3.4707031 + - -3.1367188 + - -6.328125 + - 2.5371094 + - -1.0742188 + - -6.953125 + - -3.6738281 + - -7.65625 + - 5.046875 + - 2.3125 + - 4.5820313 + - 1.3212891 + - 13.640625 + - -3.5839844 + - 2.8710938 + - -5.4140625 + - -0.63378906 + - -0.013664246 + - 1.6123047 + - 1.6660156 + - 0.81933594 + - 2.390625 + - 0.98779297 + - -0.5605469 + - 6.3632813 + - 1.7509766 + - -9.1328125 + - 4.7109375 + - -7.0703125 + - 1.8564453 + - 7.3007813 + - -1.6103516 + - 0.048553467 + - 0.42163086 + - 2.2148438 + - 5.765625 + - 0.3413086 + - 0.67822266 + - 6.0585938 + - 1.4267578 + - -0.82128906 + - 1.7109375 + - -3.1972656 + - -1.5332031 + - 4.0234375 + - -2.8535156 + - 3.7539063 + - -3.4824219 + - 8.328125 + - 1.3730469 + - -2.9941406 + - -8.578125 + - 5.8046875 + - -2.8417969 + - -5.7773438 + - -1.1640625 + - -0.9033203 + - 4.0039063 + - -0.3083496 + - -3.1113281 + - -1.1943359 + - 7.1796875 + - -3.7792969 + - 7.3203125 + - 2.7539063 + - -1.5244141 + - -1.8544922 + - 2.2890625 + - 1.4609375 + - -9.1171875 + - -3.3105469 + - 4.484375 + - 3.4863281 + - 8.3984375 + - -1.7675781 + - -2.0234375 + - 8.4453125 + - 3.3222656 + - 6.2148438 + - 3.4746094 + - 4.8085938 + - -2.5410156 + - -0.58251953 + - -0.090148926 + - -2.890625 + - -0.17236328 + - -5.3554688 + - -5.8007813 + - -2.40625 + - 2.78125 + - -1.1171875 + - 6.5273438 + - 4.3867188 + - -2.9414063 + - 0.3076172 + - 6.0117188 + - -0.32128906 + - -2.9785156 + - -1.1113281 + - 3.5566406 + - 7.1875 + - 3.7851563 + - -2.5820313 + - 0.12878418 + - 7.1367188 + - 9.9921875 + - -0.06323242 + - 0.703125 + - 0.70166016 + - -0.7714844 + - -2.2695313 + - 0.033081055 + - 0.029953003 + - 6.6523438 + - 2.6367188 + - -3.8769531 + - -4.7773438 + - -5.1367188 + - 4.796875 + - -2.0136719 + - 3.34375 + - -3.4160156 + - -5.078125 + - 0.74902344 + - 2.3574219 + - -1.8564453 + - 1.9130859 + - -3.640625 + - -3.2773438 + - 1.1289063 + - 1.7148438 + - -1.8642578 + - 4.4296875 + - 0.4741211 + - 1.3945313 + - -5.5742188 + - -4.109375 + - -0.8774414 + - -7.5585938 + - -3.9628906 + - 7.3789063 + - -0.8852539 + - -0.62402344 + - -2.0722656 + - -3.5429688 + - 5.9609375 + - 8.21875 + - 3.890625 + - -3.3476563 + - -1.4951172 + - 2.9648438 + - 0.18395996 + - -3.9511719 + - -4.3398438 + - -2.3964844 + - -1.3242188 + - -0.8041992 + - -2.7441406 + - -1.4892578 + - 7.1210938 + - -6.9375 + - -2.296875 + - -2.4550781 + - 6.3242188 + - 1.0410156 + - -4.59375 + - -0.5957031 + - -0.8564453 + - 7.0195313 + - 1.7265625 + - 4.515625 + - 2.6054688 + - 5.5703125 + - -3.0195313 + - -3.1523438 + - 2.2929688 + - -4.4414063 + - 6.46875 + - 4.9375 + - -1.9814453 + - 4.4453125 + - 1.5048828 + - 4.5585938 + - -5.0117188 + - 1.3818359 + - 5.90625 + - -6.7695313 + - -1.9111328 + - -0.071777344 + - 0.9746094 + - -0.8261719 + - -1.3583984 + - 2.1132813 + - -3.2734375 + - 4.6132813 + - 3.1328125 + - 0.60839844 + - 3.640625 + - -4.6992188 + - -2.4726563 + - 1.2744141 + - 2.1425781 + - -0.7441406 + - 0.024169922 + - -2.4355469 + - -3.28125 + - 0.57373047 + - -7.5195313 + - -6.2070313 + - 4.7226563 + - 6.1914063 + - 8.3515625 + - 12.2421875 + - -2.53125 + - -1.2783203 + - -2.5019531 + - 0.6977539 + - 2.1933594 + - -1.5917969 + - 1.9853516 + - 0.14929199 + - -3.9550781 + - -1.8896484 + - 8.78125 + - 0.7001953 + - 7.5625 + - -4.9570313 + - -6.9882813 + - 5.9453125 + - -1.8261719 + - 5.9882813 + - 3.2597656 + - 0.9448242 + - -8.3203125 + - -2.0175781 + - -2.5527344 + - 1.1171875 + - -3.6699219 + - 3.6796875 + - 3.5019531 + - 2.9042969 + - -4.9257813 + - 5.4414063 + - -1.0283203 + - -1.8310547 + - -4.5351563 + - 6.1914063 + - -3.5488281 + - 1.0585938 + - -4.3867188 + - 0.074645996 + - 7.7734375 + - 6.8945313 + - -5.1367188 + - -0.5361328 + - 3.4316406 + - -2.5214844 + - 1.7695313 + - 0.6152344 + - -1.7314453 + - -2.2070313 + - -2.2402344 + - -4.0742188 + - -0.6567383 + - -2.8925781 + - 1.6826172 + - -4.6640625 + - -4.1601563 + - 3.5527344 + - 3.8261719 + - -0.7451172 + - -0.43188477 + - 1.5214844 + - 0.14746094 + - 1.9335938 + - 6.421875 + - -0.24707031 + - 7.6679688 + - -5.765625 + - 7.8671875 + - 0.8486328 + - 2.9960938 + - 1.3359375 + - 3.6855469 + - -3.7617188 + - 3.7382813 + - -6.0234375 + - -6.40625 + - 1.3740234 + - 1.9501953 + - 3.1679688 + - -0.5288086 + - -1.0214844 + - -4.5351563 + - 9.4375 + - -5.8984375 + - 8 + - 3.6210938 + - -15.5859375 + - -2.7734375 + - 1.0527344 + - 3.0488281 + - -7.7148438 + - -4.7148438 + - 1.1132813 + - -0.6948242 + - -5.7929688 + - 3.9042969 + - 10.0625 + - 0.10675049 + - -4.1992188 + - 1.2373047 + - 1.3027344 + - -0.26367188 + - 0.115478516 + - 21.40625 + - 1.1445313 + - -1.7099609 + - -0.13208008 + - 2.6171875 + - -4.9335938 + - 6.8164063 + - 2.7988281 + - -2.1015625 + - -5.8007813 + - -4.8515625 + - 0.9658203 + - 1.8544922 + - 0.90283203 + - -1.2851563 + - 2.1660156 + - -0.25219727 + - 0.020111084 + - -5.4804688 + - -2.8789063 + - 3.1835938 + - -4.2070313 + - -2.7792969 + - -1.0927734 + - 0.67626953 + - -1.7822266 + - 0.8491211 + - -9.9140625 + - -1.6845703 + - -1.7011719 + - 1.8603516 + - 5.21875 + - -0.21923828 + - -0.1303711 + - -3.2890625 + - 3.203125 + - 0.4099121 + - 1.0439453 + - 1.7529297 + - 6.2148438 + - 0.9067383 + - 2.5820313 + - 1.8457031 + - -0.9951172 + - -0.27026367 + - -2.7050781 + - -5.828125 + - -1.5742188 + - 5.6796875 + - -1.8222656 + - 5.390625 + - 4.8125 + - -2.6464844 + - -1.1611328 + - 0.83154297 + - -1.1591797 + - -3.9667969 + - 6.53125 + - 1.890625 + - -3.125 + - 3.7128906 + - -0.37451172 + - -10.171875 + - 0.27197266 + - 4.375 + - 2.171875 + - 4.0820313 + - 0.96191406 + - 6.5742188 + - 1.1435547 + - 3.4101563 + - 14.1484375 + - 2.0058594 + - -6.46875 + - -5.5351563 + - -2.3808594 + - 5.1484375 + - -2.9238281 + - -3.0195313 + - 2.390625 + - -1.4082031 + - 2.9199219 + - -1.7109375 + - 2.4238281 + - 5.2421875 + - -1.5576172 + - 3.0644531 + - 9.1953125 + - -6.7304688 + - 0.80126953 + - -0.8017578 + - -1.3261719 + - 0.9580078 + - 3.1933594 + - 3.2617188 + - -10.828125 + - -5.5234375 + - 4.6445313 + - -2.640625 + - -4.7734375 + - 0.61279297 + - 4.0820313 + - -0.9604492 + - -5.203125 + - 0.64453125 + - -0.8691406 + - -0.31176758 + - -2.9414063 + - -3.9609375 + - -6.171875 + - 0.4567871 + - -0.5551758 + - -4.7070313 + - 4.1835938 + - -2.7480469 + - 2.9570313 + - 0.69677734 + - 3.5410156 + - 3.2050781 + - -1.5 + - -3.6210938 + - -0.8125 + - 0.7993164 + - 0.234375 + - -1.6123047 + - 6.1835938 + - 4.0117188 + - 2.1601563 + - -4.8125 + - 0.29003906 + - 6.5546875 + - -0.56884766 + - -3.1816406 + - 4.7617188 + - -4.2578125 + - -0.0072288513 + - 4.6445313 + - -4.40625 + - -0.7939453 + - -5.5820313 + - -8.15625 + - -6.9921875 + - -4.0664063 + - -0.8754883 + - 0.9082031 + - -7.7304688 + - -1.1416016 + - -3.3574219 + - -7.6796875 + - -1.3916016 + - -3.9472656 + - 5.5429688 + - -2.8222656 + - -5.3554688 + - 0.6171875 + - -0.82177734 + - -0.1071167 + - 2.5546875 + - -4.1914063 + - 0.03567505 + - -1.4912109 + - -18.234375 + - -3.4882813 + - -0.61621094 + - -2.9511719 + - -2.3105469 + - -2.7207031 + - -4.4453125 + - 0.22436523 + - 3.4179688 + - 2.2519531 + - 3.9589844 + - 0.53515625 + - 0.16992188 + - -9.9765625 + - -1.6142578 + - -1.0683594 + - 2.5488281 + - 5.4765625 + - 3.3320313 + - 1.9384766 + - -5.3203125 + - -0.64501953 + - 1.9863281 + - -2.2285156 + - 0.6845703 + - -1.9570313 + - -0.99902344 + - -7.109375 + - 0.2980957 + - -3.0253906 + - 0.4033203 + - -1.8222656 + - 0.4440918 + - 2.0332031 + - -3.109375 + - -4.3320313 + - -9.6640625 + - -3.9921875 + - -0.23498535 + - -8.546875 + - -1.2666016 + - 7.6328125 + - 1.7714844 + - -3.4804688 + - -12.171875 + - -3.0878906 + - -7.7578125 + - -2.0957031 + - 0.08728027 + - 6.3476563 + - 2.7285156 + - -1.2490234 + - -2.7011719 + - 1.4521484 + - 2.7929688 + - 1.5078125 + - -1.7939453 + - -3.4882813 + - -7.3828125 + - -8.0234375 + - -1.2158203 + - -2.7832031 + - 1.6845703 + - -6.6835938 + - -5.9882813 + - -5.0429688 + - -0.43139648 + - -2.5878906 + - -4.0820313 + - -4.4101563 + - -0.0793457 + - -1.3710938 + - 0.28515625 + - -5.1914063 + - -4.4804688 + - -0.12731934 + - 2.2890625 + - -0.1171875 + - -2.6132813 + - -2.9160156 + - -5.3867188 + - 15.71875 + - 4.9179688 + - 2.6601563 + - 0.9135742 + - -7.9453125 + - -11.1875 + - 4.671875 + - 0.26464844 + - -0.44628906 + - -4.6914063 + - 8.9296875 + - -4.0117188 + - -0.059295654 + - 0.6850586 + - 2.0800781 + - -4.9609375 + - 0.091918945 + - 1.5673828 + - 0.88671875 + - -0.11450195 + - -4.34375 + - -0.3581543 + - 0.34960938 + - 3.2792969 + - 0.31469727 + - -1.2236328 + - 3.0585938 + - -2.1601563 + - -8.734375 + - 6.3984375 + - 0.15588379 + - -3.0253906 + - -3.7089844 + - 4.4804688 + - -3.390625 + - -4.046875 + - 0.32348633 + - 1.7861328 + - 5.8554688 + - 4.234375 + - -0.5810547 + - -1.4169922 + - 1.4697266 + - -1.1591797 + - 2.3320313 + - -3.3945313 + - -5.0351563 + - -4.8476563 + - -0.95751953 + - -1.7558594 + - -0.6669922 + - 0.06011963 + - -2.2792969 + - -0.08380127 + - -3.7167969 + - 7.8867188 + - 4.2304688 + - -2.8574219 + - -3.3203125 + - 5.625 + - -2.6347656 + - 2.0019531 + - -0.5317383 + - 1.3701172 + - -0.08496094 + - -3.8242188 + - -3.0117188 + - 4.203125 + - 4.7265625 + - -4.328125 + - 11.1875 + - -1.6337891 + - -0.8666992 + - -5.9023438 + - -5.859375 + - -0.9355469 + - -8.4375 + - -5.46875 + - 1.1240234 + - -2.1289063 + - -7.890625 + - 5.0898438 + - -5.2382813 + - -0.027267456 + - 2.1738281 + - 3.9980469 + - 6.4375 + - 4.203125 + - 5.4414063 + - -2.7070313 + - 0.10546875 + - -2.6132813 + - 5.5234375 + - -1.9365234 + - 3.7636719 + - -2.2285156 + - 1.6455078 + - 2.8125 + - -0.21313477 + - 5.1953125 + - 7.0351563 + - -2.828125 + - 6.2382813 + - -3.6425781 + - 5.7382813 + - -0.30249023 + - -3.5917969 + - -1.5507813 + - 6.0976563 + - -0.92333984 + - 2.9238281 + - -8.75 + - -0.2763672 + - 0.54296875 + - 3.0019531 + - -2.3320313 + - 1.6035156 + - 7.4257813 + - -5.984375 + - -0.48168945 + - 0.1427002 + - 0.8515625 + - -6.4023438 + - -1.2822266 + - -2.8828125 + - -1.2177734 + - 2.5761719 + - -3.8085938 + - 3.5957031 + - 11.265625 + - -9.984375 + - 3.9042969 + - 7.6015625 + - -2.4746094 + - 1.7685547 + - -0.30004883 + - -4.1484375 + - 0.3190918 + - -4.4609375 + - -0.3984375 + - 3.4667969 + - -1.7177734 + - 1.8867188 + - -8.171875 + - 3.046875 + - 6.234375 + - 0.22839355 + - 8.5234375 + - -3.0292969 + - -1.9580078 + - 4.546875 + - 3.2421875 + - 0.69628906 + - -2.8554688 + - 1.2177734 + - -6.3398438 + - 1.2490234 + - 1.2724609 + - -2.9121094 + - 1.3271484 + - -2.3066406 + - 0.703125 + - -6.4804688 + - -4.1015625 + - -2.4296875 + - -0.3515625 + - 1.6445313 + - -6.1914063 + - 4.171875 + - -13.109375 + - -1.1240234 + - 6.53125 + - 3.2871094 + - 4.0664063 + - 2.9746094 + - 2.9785156 + - 7.7773438 + - -2.7148438 + - -3.8300781 + - 6.3632813 + - 3.1503906 + - -8.09375 + - -1.3330078 + - -4.8632813 + - -2.21875 + - -0.6171875 + - -1.8818359 + - 4.5820313 + - -3.9160156 + - -3.078125 + - -1.4169922 + - 20.34375 + - -1.7783203 + - 2.125 + - -2.96875 + - 0.42333984 + - -4.7617188 + - -0.68115234 + - 1.4033203 + - 2.0527344 + - 3.875 + - 1.7890625 + - 0.61572266 + - -2.4238281 + - -0.953125 + - 5.6679688 + - 0.8208008 + - 0.022460938 + - -1.7705078 + - 6.6289063 + - 0.48901367 + - -6.4804688 + - -3.3085938 + - -12.15625 + - -0.35791016 + - -0.8105469 + - -2.0058594 + - 5.0039063 + - -3.0957031 + - 0.19445801 + - 10.140625 + - 4.4453125 + - -3.2050781 + - 1.7548828 + - -8.9921875 + - 1.5078125 + - 6.7304688 + - 9.0390625 + - -2.6171875 + - -5.4492188 + - 4.4492188 + - -0.63623047 + - -5.9296875 + - 0.28222656 + - 4.015625 + - 7.4023438 + - 4.328125 + - -6.84375 + - -2.6796875 + - -4.1992188 + - -2.0078125 + - 1.015625 + - -9.4296875 + - -6.2109375 + - -4.7890625 + - -10.484375 + - -0.08459473 + - 1.7314453 + - -5.8632813 + - 6.8164063 + - -2.2597656 + - -2.8125 + - 5.4101563 + - -2.2597656 + - 7.6367188 + - 0.67333984 + - 0.20532227 + - -12.8359375 + - -0.19580078 + - -1.0927734 + - 4.1835938 + - -2.2226563 + - 3.0800781 + - 3.5605469 + - -7.2460938 + - 0.02708435 + - 1.2529297 + - -9.328125 + - -8.2734375 + - -2.2617188 + - -0.78125 + - 6.7929688 + - -1.9189453 + - -11.796875 + - -0.23071289 + - 3.5976563 + - -2.78125 + - 0.56689453 + - -5.1992188 + - -2.3203125 + - -3.0351563 + - -4.1679688 + - 3.7460938 + - -2.4394531 + - -2.0507813 + - -3.3808594 + - -2.3320313 + - 3.6464844 + - 9.140625 + - -5.2070313 + - 3.0605469 + - 0.37329102 + - -1.1757813 + - -5.2304688 + - 2.1074219 + - -10.1484375 + - 1.8974609 + - 0.28686523 + - 0.6074219 + - 3.9355469 + - 5.15625 + - 0.68310547 + - -10.734375 + - -2.1621094 + - 1.3164063 + - -1.2197266 + - 2.8183594 + - -1.2998047 + - -0.5415039 + - 1.3759766 + - 12.25 + - -1.0390625 + - 4.4960938 + - 7.28125 + - 1.3095703 + - 1.9541016 + - 3.953125 + - 1.5693359 + - 1.5996094 + - -2.046875 + - 1.7978516 + - 4.3515625 + - -7.734375 + - 2.1425781 + - 0.71191406 + - -4.109375 + - 0.81689453 + - 12.375 + - -7.5390625 + - -10.0078125 + - 1.4414063 + - -0.7026367 + - 0.74365234 + - 9.2265625 + - -7.2148438 + - 1.0693359 + - 4.2070313 + - 2.0507813 + - -4.5859375 + - -6.4101563 + - -4.6992188 + - -3.4394531 + - -1.2207031 + - 17.21875 + - 2.9785156 + - 1.2050781 + - 5.796875 + - -4.9648438 + - 2.5605469 + - -2.625 + - -1.5097656 + - -8.375 + - -0.81152344 + - 3.8359375 + - -2.8007813 + - -0.53759766 + - 2.09375 + - 10.5 + - 6.3164063 + - 4.921875 + - 4.0585938 + - -6.2226563 + - -1.1142578 + - 3.1269531 + - -5.7695313 + - 6.15625 + - 2.7421875 + - -0.1463623 + - -6.1523438 + - 0.4934082 + - -5.0664063 + - -4.90625 + - 2.6738281 + - 4.734375 + - 4.1171875 + - -3.7304688 + - 1.7646484 + - 1.0849609 + - -1.8232422 + - -4.1835938 + - 1.6884766 + - 7.5703125 + - 5.0039063 + - 2.1699219 + - -5.6992188 + - -0.73828125 + - 1.7001953 + - -3.1308594 + - -3.1015625 + - -9.46875 + - -3.6074219 + - 6.9882813 + - 1.6279297 + - -2.3378906 + - -6.125 + - 2.8574219 + - 2.4628906 + - -1.3818359 + - 2.9199219 + - 0.46801758 + - 2.4082031 + - -1.7470703 + - -0.8823242 + - -0.16455078 + - 1.5869141 + - 0.17614746 + - -3.265625 + - -0.16381836 + - 5.3359375 + - 5.5703125 + - -5.15625 + - -2.5078125 + - 0.9633789 + - 12.1640625 + - -1.7744141 + - -1.1025391 + - 0.73779297 + - 8.3828125 + - 4.140625 + - -6.90625 + - 1.8007813 + - 6.4179688 + - -4.1328125 + - 0.4506836 + - 2.5058594 + - 6.0742188 + - -1.140625 + - 1.0488281 + - 5.3554688 + - 3.8164063 + - -2.2597656 + - 0.92041016 + - 4.9570313 + - 1.9746094 + - 9.4453125 + - 0.60791016 + - -2.4003906 + - -1.9726563 + - 2.2070313 + - -3.171875 + - -10.796875 + - 0.55810547 + - -6.234375 + - 4.9765625 + - 1.2148438 + - 0.44091797 + - 3.8847656 + - -2.8613281 + - -2.1171875 + - 2.5742188 + - -0.7753906 + - -1.8837891 + - -8.0859375 + - 3.7070313 + - 0.09869385 + - -4.3515625 + - -2.8476563 + - 4.8476563 + - 1.9140625 + - -2.6347656 + - 1.4101563 + - 0.88916016 + - 2.3554688 + - -9.1171875 + - 1.078125 + - 1.3027344 + - -2.2402344 + - 4.8671875 + - -3.1484375 + - -6.3945313 + - -1.2197266 + - 4.7617188 + - 0.3034668 + - -0.44091797 + - 5.7773438 + - -4.1445313 + - -4.4648438 + - -7.8125 + - -3.3515625 +- - -2.6601563 + - 6.1328125 + - 1.4423828 + - -3.2871094 + - 5.0429688 + - -2.6582031 + - -0.17053223 + - -0.06591797 + - 0.16113281 + - 1.5869141 + - 6.71875 + - -4.5 + - -3.9179688 + - -1.1357422 + - -1.4628906 + - -0.0803833 + - 1.6572266 + - -1.1748047 + - -0.22253418 + - 7.5351563 + - -1.2246094 + - -7.7929688 + - -5.9960938 + - -2.1679688 + - -0.036895752 + - -1.4746094 + - -7.046875 + - 1.9560547 + - 5.9023438 + - 3.2734375 + - -5.4648438 + - 2.125 + - 7.3632813 + - 13.5234375 + - -7.1484375 + - -4.1132813 + - -0.8017578 + - -1.9736328 + - -2.0019531 + - -1.5009766 + - 2.8671875 + - 1.2753906 + - -0.5551758 + - -0.10852051 + - 5.8007813 + - 5.4648438 + - -10.828125 + - -5.4492188 + - 0.025390625 + - 2.4375 + - 2.6425781 + - -5.3632813 + - -3.2480469 + - 2.4453125 + - 7.5117188 + - -0.40014648 + - 2.6855469 + - -0.59228516 + - -1.859375 + - -0.8886719 + - 2.8535156 + - -2.9765625 + - -0.14123535 + - 8.5078125 + - 2.8730469 + - 5.7265625 + - -2.1171875 + - -2.2460938 + - 4.6679688 + - 3.4609375 + - 6.203125 + - 1.3486328 + - 4.484375 + - -0.121276855 + - -0.7529297 + - 5.7148438 + - 2.4394531 + - -2.9511719 + - -8.984375 + - -10.390625 + - 1.5205078 + - -0.20666504 + - -7.734375 + - -11.8203125 + - -1.140625 + - -2.7675781 + - -7.3945313 + - 3.6523438 + - -0.55810547 + - -1.9707031 + - 2.1757813 + - -3.0585938 + - -16.484375 + - 4.6289063 + - 6.96875 + - -2.9804688 + - 0.44555664 + - -2.6210938 + - -0.57958984 + - 1.2226563 + - -2.09375 + - 0.953125 + - 2.0136719 + - -0.25390625 + - -1.7011719 + - -1.0419922 + - -15.3515625 + - 3.6621094 + - -0.7661133 + - -5.6953125 + - -7.734375 + - 1.2558594 + - 0.4765625 + - -3.7578125 + - 1.9130859 + - 5.0546875 + - 1.4794922 + - -0.13244629 + - 0.08148193 + - 8.5625 + - 2.1894531 + - -0.39794922 + - 5.1171875 + - -3.6523438 + - -1.8945313 + - 2.9882813 + - 7.1328125 + - -4.328125 + - -5.4726563 + - 4.15625 + - -7.0351563 + - -4.8085938 + - -2.2929688 + - 4.5234375 + - 0.86328125 + - 2.4472656 + - -3.2773438 + - -1.8867188 + - 0.9248047 + - -4.6054688 + - -0.74609375 + - 3.5742188 + - 2.0410156 + - 3.7363281 + - -0.87109375 + - -1.2783203 + - 5.6523438 + - 1.3505859 + - 10.5078125 + - 0.54345703 + - 5.8164063 + - -2.8085938 + - 3.9511719 + - -1.7529297 + - -3.4785156 + - 1.4970703 + - -1.0410156 + - -9.0078125 + - -4.734375 + - -7.4257813 + - 2.2207031 + - 3.0976563 + - 8.34375 + - -5.6835938 + - 2.2109375 + - 4.7890625 + - 13.2890625 + - 5.0898438 + - -4.6132813 + - 4.0429688 + - -1.1464844 + - 1.4775391 + - -3.4023438 + - -2.6445313 + - -2.5273438 + - 2.6835938 + - -0.74658203 + - 3.1464844 + - -9.5234375 + - 10.8984375 + - 1.9990234 + - -6.5859375 + - -6.25 + - 5.6171875 + - -1.9248047 + - 0.8442383 + - -3.28125 + - 1.25 + - 7.7851563 + - 9.0078125 + - 0.5917969 + - 4.765625 + - 0.015930176 + - -2.9296875 + - 4.34375 + - -1.0742188 + - 2.5703125 + - -5.8125 + - 5.7226563 + - 4.546875 + - 1.765625 + - 0.17333984 + - 1.3652344 + - -3.5605469 + - 8.6328125 + - 5.0820313 + - 1.6074219 + - -4.0429688 + - 2.5878906 + - 0.7651367 + - -7.4609375 + - -1.2744141 + - 0.19689941 + - -8.96875 + - -0.3930664 + - -5.4804688 + - -1.7539063 + - -14.65625 + - -1.9550781 + - -6.84375 + - 2.7832031 + - -14.296875 + - -1.4101563 + - 4.2226563 + - 2.2714844 + - -3.6992188 + - -4.2070313 + - 2.03125 + - -2.4453125 + - 1.1230469 + - 7.2539063 + - -0.9663086 + - 0.8432617 + - -2.0117188 + - 0.10241699 + - -1.1904297 + - -4.78125 + - -5.0546875 + - -4.4179688 + - 1.3056641 + - -1.1845703 + - 0.1685791 + - -2.78125 + - -1.0908203 + - -3.7988281 + - 4.4648438 + - 0.07293701 + - 0.1451416 + - 0.16137695 + - 2.9746094 + - -7.1953125 + - -2.6445313 + - -5.6523438 + - -0.88623047 + - 6.4453125 + - 5.453125 + - 1.2021484 + - 3.4453125 + - 0.020889282 + - 6.859375 + - 8.0390625 + - 2.3554688 + - -1.4697266 + - -1.296875 + - 0.10217285 + - 1.1445313 + - -2.1113281 + - 3.9980469 + - -8.8984375 + - -2.8730469 + - 2.0644531 + - -5.3085938 + - 0.5878906 + - -4.7578125 + - 7.9726563 + - -4.5742188 + - 0.18920898 + - -0.13659668 + - 8 + - -7.7929688 + - -0.23095703 + - 0.21203613 + - -0.8671875 + - 7.9101563 + - 7.3359375 + - -10.8359375 + - -1.6132813 + - 7.8710938 + - 7.5234375 + - 5.28125 + - 4.5820313 + - 2.8164063 + - -4.5039063 + - 4.3046875 + - -9.515625 + - -3.0351563 + - 3.8886719 + - 5.3515625 + - 4.4179688 + - 3.125 + - 5.5234375 + - -3.890625 + - 4.8984375 + - -1.1513672 + - 0.91308594 + - 4.7070313 + - -3.3652344 + - 2.4472656 + - -3.03125 + - -4.4101563 + - 2.0136719 + - 1.2832031 + - -5.2734375 + - 2.21875 + - -4.2460938 + - -3.84375 + - 1.0859375 + - 6.65625 + - -3.1855469 + - -1.8798828 + - 0.041168213 + - -3.6855469 + - 0.77490234 + - -2.3007813 + - -4.4257813 + - 2.609375 + - 1.3867188 + - -0.044128418 + - -0.7211914 + - 5.3945313 + - -6.078125 + - -6.4179688 + - -1.9951172 + - 0.359375 + - 7.6796875 + - -0.8066406 + - -1.2041016 + - 3.0761719 + - 0.62646484 + - 5.0273438 + - 3.2441406 + - -5.671875 + - -0.9892578 + - 5.7148438 + - -4.0507813 + - -7.6328125 + - 1.5166016 + - 1.1181641 + - 5.8984375 + - 3.6933594 + - -2.1738281 + - 0.1184082 + - 1.4492188 + - -5.7851563 + - -6.3710938 + - 2.8007813 + - -0.59033203 + - 6.6953125 + - 0.048034668 + - 2.8378906 + - -6.5039063 + - 3.1464844 + - 0.66308594 + - -3.4394531 + - -3.3339844 + - 2.4492188 + - 3.1132813 + - 2.1269531 + - 3.0214844 + - -3.2460938 + - -7.984375 + - -4.1640625 + - -0.45507813 + - -1.5615234 + - 4.6757813 + - 2.546875 + - 5.5820313 + - 0.18457031 + - 4.7148438 + - -2.34375 + - -1.5302734 + - -10.890625 + - 2.1230469 + - 0.78808594 + - -3.1542969 + - -0.5385742 + - -3.1464844 + - -2.4003906 + - -5.1367188 + - -0.85253906 + - 4.953125 + - -0.8486328 + - 6.25 + - -8.46875 + - -0.049713135 + - 5.7382813 + - -0.13757324 + - -10.8984375 + - -1.4873047 + - 6.1523438 + - 5.0664063 + - -2.1640625 + - -3.0039063 + - -0.36743164 + - 2.296875 + - -0.54345703 + - 0.31982422 + - 1.4697266 + - -6.3789063 + - 12.203125 + - 0.6308594 + - 4.2539063 + - 2.4960938 + - 1.5224609 + - 4.9609375 + - -1.6894531 + - -10.15625 + - 3.1660156 + - 2.7207031 + - -0.026367188 + - -2.4804688 + - -6.0820313 + - 2.40625 + - -3.4570313 + - 0.58496094 + - 7.1601563 + - -2.171875 + - 2.6113281 + - 5.234375 + - -1.2363281 + - -5.375 + - -1.2138672 + - -5 + - 6.25 + - 4.0234375 + - -12.5546875 + - 1.2861328 + - 1.6513672 + - -0.002565384 + - 11.203125 + - 4.2734375 + - 5.6171875 + - 2.9765625 + - -0.39501953 + - 1.9853516 + - -5.15625 + - -0.9848633 + - 8.125 + - -0.72314453 + - -4.59375 + - -0.8491211 + - -6.765625 + - -0.7060547 + - 2.4765625 + - 0.0541687 + - -0.6845703 + - 1.9365234 + - 4.9257813 + - -2.25 + - -9.71875 + - -2.3769531 + - 2.9121094 + - -3.6035156 + - 1.8974609 + - 2.1054688 + - -1.0136719 + - 1.0263672 + - -1.2988281 + - -2.7597656 + - -1.0136719 + - 1.8779297 + - 1.5869141 + - 1.0380859 + - -9.1328125 + - -2.4023438 + - -1.7392578 + - -1.6982422 + - -7.0585938 + - 1.7822266 + - 39.8125 + - -5.09375 + - -3.1484375 + - 0.76953125 + - -1.5371094 + - 3.6054688 + - -2.9160156 + - 0.24438477 + - -0.3605957 + - -1.9970703 + - -0.61083984 + - 1.6347656 + - -1.6269531 + - 2.7558594 + - 7.7382813 + - -2.5117188 + - 0.86572266 + - 1.4677734 + - -8.40625 + - 0.6088867 + - 0.55126953 + - 2.0175781 + - -3.5507813 + - -2.453125 + - 9.2421875 + - 0.9399414 + - -10.3359375 + - -0.5683594 + - -3.953125 + - 6.671875 + - 2.6230469 + - 3.90625 + - -0.3112793 + - 13.515625 + - -6 + - 0.34204102 + - -7.2851563 + - -3.1035156 + - 0.515625 + - -5.78125 + - 0.85546875 + - -2.7324219 + - 1.2373047 + - -0.025985718 + - -0.18713379 + - 9.3515625 + - -1.5898438 + - -8.6015625 + - 8.421875 + - -1.6669922 + - 5.375 + - 5.0273438 + - -0.95947266 + - 5.3242188 + - -0.91064453 + - 2.5449219 + - 1.6660156 + - -1.7597656 + - 0.26757813 + - 1.7070313 + - 2.2539063 + - 2.4140625 + - -5.3046875 + - -2.9082031 + - -3.8769531 + - 5.734375 + - -0.52246094 + - 1.4697266 + - -5.3632813 + - 4.3945313 + - 3.7207031 + - -1.7265625 + - -4.9726563 + - 4.9296875 + - -0.62353516 + - -10.2890625 + - -4.0429688 + - 0.35913086 + - 5.1171875 + - -2.7167969 + - -2.7109375 + - 1.6943359 + - 2.5195313 + - -0.8520508 + - 2.1855469 + - 0.50097656 + - 1.7402344 + - 1.2587891 + - 3.2460938 + - 4.0195313 + - -8.9140625 + - -2.4785156 + - 2.0273438 + - 4.8867188 + - 6.4257813 + - 0.8745117 + - -3.9453125 + - 3.3671875 + - 4.0429688 + - 8.625 + - 1.9970703 + - 5.921875 + - -2.6054688 + - 1.6337891 + - -4.0703125 + - -1.4013672 + - 0.79003906 + - -0.86083984 + - -4.6132813 + - 0.5859375 + - 4.0820313 + - -2 + - 4.5820313 + - 2.5175781 + - -1.0537109 + - 0.2220459 + - 8.8125 + - -0.56396484 + - -2.4121094 + - 0.51904297 + - 3.5546875 + - 5.4960938 + - 4 + - -9.0390625 + - 2.2109375 + - 6.921875 + - 12.1328125 + - -2.1503906 + - 3.421875 + - 2.0566406 + - -6.1484375 + - -3.5410156 + - 4.6601563 + - -2.4863281 + - 3.4824219 + - 0.7192383 + - -0.5786133 + - -0.4128418 + - -6.5625 + - 3.3574219 + - -2.8007813 + - 6.2773438 + - -5.625 + - -5.828125 + - -0.121276855 + - 1.8955078 + - 0.29077148 + - 1.4560547 + - 4.578125 + - -4.8515625 + - -2.484375 + - 0.29882813 + - -0.75439453 + - 9.1171875 + - 2.1835938 + - -0.734375 + - -5.28125 + - -2.9121094 + - -2.6679688 + - -4.0742188 + - -0.091796875 + - 3.265625 + - -1.7441406 + - -0.107666016 + - -0.97021484 + - -3.2792969 + - 5.3242188 + - 11.7890625 + - -1.390625 + - -1.453125 + - 1.4892578 + - 3.6269531 + - 2.9707031 + - -5.0039063 + - -0.8676758 + - -3.015625 + - -0.79785156 + - 2.9472656 + - -0.68359375 + - -3.8457031 + - 8.53125 + - -4.4492188 + - 1.7265625 + - -2.8515625 + - 10.6953125 + - 0.6298828 + - -6.3632813 + - 3.7890625 + - 0.02583313 + - 5.625 + - 1.1943359 + - 4.1015625 + - -0.79345703 + - 6.5039063 + - -1.7978516 + - -0.92822266 + - -0.37963867 + - -5.75 + - 4.8164063 + - 0.5751953 + - -2.0644531 + - 6.7578125 + - 3.3007813 + - 2.6074219 + - -1.8779297 + - 1.2832031 + - 3.7246094 + - -5.46875 + - -1.5478516 + - -1.1992188 + - 0.7739258 + - 0.105163574 + - -1.8105469 + - -0.64941406 + - -3.3828125 + - 6.1445313 + - 1.7167969 + - 3.1875 + - -4.1328125 + - -4.625 + - -4.4921875 + - 3.7929688 + - -0.50683594 + - 2.8789063 + - 1.0751953 + - -4.9453125 + - -7.296875 + - -1.0917969 + - -4.7734375 + - -1.640625 + - 1.9980469 + - 8.75 + - 8.7265625 + - 14.8125 + - 2.234375 + - -0.7573242 + - 0.8901367 + - 1.3173828 + - 2.3144531 + - -2.1035156 + - 1.5166016 + - 0.86035156 + - -3.2167969 + - -4.6796875 + - 12.4453125 + - 3.2558594 + - 13.234375 + - -2.7363281 + - -1.7490234 + - 8.5703125 + - -1.1708984 + - 2.7617188 + - 2.6484375 + - -0.42285156 + - 3.1640625 + - -1.3808594 + - -0.55908203 + - 2.0273438 + - -4.2578125 + - 1.7412109 + - -1.9677734 + - 2.8867188 + - -9.578125 + - 5.5546875 + - -0.62109375 + - -7.4648438 + - -1.7392578 + - 5.5351563 + - -3.0996094 + - 0.29907227 + - -1.9863281 + - -3.7441406 + - 2.5019531 + - 6.0117188 + - -3.2832031 + - 1.7216797 + - 2.40625 + - -5.9960938 + - 2.1640625 + - 0.33935547 + - -2.8359375 + - -1.9365234 + - -7.03125 + - -3.9179688 + - 0.18847656 + - -2.8261719 + - -1.8232422 + - -5.953125 + - -4.7617188 + - 3.109375 + - -1.1181641 + - -1.3964844 + - 0.25854492 + - -0.2355957 + - 8.96875 + - 6.265625 + - 5.125 + - 4.9453125 + - 7.1210938 + - 0.37353516 + - 2.5292969 + - -0.16174316 + - -1.0419922 + - -1.9121094 + - 0.56933594 + - -4.5117188 + - 0.48046875 + - -3.2109375 + - -4.7773438 + - 2.4765625 + - 3.4785156 + - 1.6933594 + - 2.1542969 + - 0.36767578 + - -5.1015625 + - 5.4570313 + - -8.4609375 + - 8.9921875 + - 0.23986816 + - -23.265625 + - -1.5517578 + - 0.9589844 + - 1.53125 + - -19.390625 + - -0.5551758 + - -2.2207031 + - 0.55029297 + - -1.5292969 + - 0.6479492 + - 7.5273438 + - -0.5708008 + - -3.3007813 + - 1.0556641 + - 1.1162109 + - 0.17236328 + - -1.8681641 + - 19.296875 + - -0.9951172 + - 0.34594727 + - 1.5986328 + - 1.4570313 + - -2.7304688 + - 6.4101563 + - 5.2773438 + - -0.9682617 + - -3.5585938 + - -5.8320313 + - 0.5102539 + - 1.859375 + - -0.7089844 + - 1.1777344 + - 2.2617188 + - 2.7636719 + - 3.7714844 + - -4.0390625 + - -5.6171875 + - 5.8828125 + - -3.6054688 + - -3.2324219 + - -2.2675781 + - -0.6738281 + - 0.40112305 + - -0.09869385 + - -3.1074219 + - -0.46240234 + - -0.48095703 + - 2.7304688 + - 1.6044922 + - -2.2265625 + - -2.7949219 + - -3.9296875 + - 2.4296875 + - -2.0625 + - 0.37548828 + - -0.33764648 + - 5.0234375 + - 0.34765625 + - 2.265625 + - 1.3535156 + - -3.1386719 + - -1.3925781 + - -4.6796875 + - -6.4101563 + - -6.4921875 + - 7.6367188 + - -2.6816406 + - 4.1367188 + - 5.0078125 + - -2.6152344 + - 0.42163086 + - -0.6689453 + - 3.59375 + - -2.7167969 + - 4.7382813 + - -2.2949219 + - -4.7421875 + - 1.5917969 + - -0.45043945 + - -9.171875 + - 0.073791504 + - 2.8574219 + - 2.5 + - 0.6435547 + - -0.9448242 + - 5.3476563 + - -1.9765625 + - 4.0625 + - 1.6523438 + - -5.359375 + - -12.7578125 + - -1.3681641 + - -5.8828125 + - 1.2304688 + - -4.3789063 + - -4.265625 + - 10.28125 + - -5.4296875 + - 3.1484375 + - -6.71875 + - 4.5078125 + - 7.765625 + - -1.0263672 + - 0.31323242 + - 6.59375 + - -6.703125 + - 1.7832031 + - 1.7119141 + - -2.9882813 + - -0.1149292 + - 3.5136719 + - 5.9101563 + - -11.8828125 + - -3.2910156 + - 1.7861328 + - -3.1464844 + - -1.7050781 + - -2.28125 + - -0.76953125 + - -1.6191406 + - -2.7109375 + - -1.8359375 + - -9.4609375 + - 0.1262207 + - -4.0664063 + - -2.3066406 + - -7.0703125 + - 3.1738281 + - -3.9589844 + - -6.2265625 + - -1.5527344 + - -13.1875 + - 7.2421875 + - -0.0066375732 + - 1.4453125 + - 2.6679688 + - 2.8925781 + - 0.24084473 + - -0.66503906 + - -0.71240234 + - -1.6630859 + - -1.5644531 + - 3.6171875 + - 3.7050781 + - 2.4921875 + - -2.59375 + - -3.7949219 + - 2.2636719 + - -2.6210938 + - -2.5761719 + - 1.2060547 + - 0.30908203 + - -1.0556641 + - 1.5283203 + - 1.6806641 + - -2.3945313 + - -0.33447266 + - -8.3984375 + - -5.7578125 + - -2.9589844 + - -3.5253906 + - -2.6210938 + - -6.2109375 + - -2.1367188 + - -0.83740234 + - -11.296875 + - -0.96875 + - -1.9716797 + - 4.7734375 + - -5.1757813 + - -3.9824219 + - -0.67041016 + - 1.6728516 + - 4.3046875 + - 0.90527344 + - -7.2421875 + - 0.036132813 + - -3.5195313 + - -13.8671875 + - 3.3222656 + - -2.0019531 + - 0.5576172 + - 0.29882813 + - -0.18347168 + - -0.3491211 + - 1.0224609 + - 4.578125 + - 4.4726563 + - 2.5214844 + - 3 + - 3.1679688 + - -5.1835938 + - -1.859375 + - -2.3632813 + - 2.1582031 + - -0.28344727 + - 0.05682373 + - 0.5776367 + - -3.5917969 + - 0.93847656 + - 0.8540039 + - -2.6035156 + - 1.2148438 + - -3.453125 + - -3.9765625 + - 0.35839844 + - 0.89404297 + - -7.96875 + - -6.3007813 + - -1.3164063 + - -3.7949219 + - 0.9560547 + - -0.8100586 + - -4.4414063 + - -9.0390625 + - -8.4453125 + - -1.5175781 + - -6.59375 + - -5.3632813 + - 4.1328125 + - 0.10809326 + - -4.375 + - -11.578125 + - -2.9238281 + - -9.4140625 + - -2.1308594 + - 1.7373047 + - 0.40307617 + - 3.1074219 + - 5.625 + - 0.9135742 + - 1.1972656 + - 1.7744141 + - 0.93603516 + - 0.76123047 + - -2.5605469 + - -2.4824219 + - -5.28125 + - -4.9960938 + - -2.4609375 + - -2.3085938 + - -3.6230469 + - -3.3359375 + - 0.33666992 + - 1.5625 + - -2.6152344 + - -3.1367188 + - 2.0566406 + - -0.2607422 + - -0.42089844 + - 1.6015625 + - -5.046875 + - -4.625 + - 2.0507813 + - 4.96875 + - -5.7070313 + - -0.081604004 + - -5.9609375 + - -7.3867188 + - 8.0234375 + - 11.2578125 + - 4.7890625 + - 1.5742188 + - -1.8105469 + - -0.61865234 + - -2.8242188 + - 1.4355469 + - 0.78125 + - -4.1445313 + - 11.5625 + - -5.6328125 + - -0.08343506 + - 0.6743164 + - -0.26049805 + - -5.1679688 + - 0.0869751 + - -0.36010742 + - 0.25952148 + - -1.2255859 + - 0.41088867 + - 1.3222656 + - -2.6699219 + - -0.19616699 + - 2.7460938 + - -1.5703125 + - -0.5654297 + - -4.265625 + - -2.7421875 + - 5.0195313 + - -3.421875 + - -1.4833984 + - -3.5117188 + - 4.5585938 + - 2.3671875 + - -1.7558594 + - 4.8867188 + - -0.26049805 + - 3.6953125 + - 0.7705078 + - -0.19335938 + - 1.4179688 + - 6.0234375 + - 2.3105469 + - 8.2734375 + - 0.4169922 + - -4.8203125 + - -2.0410156 + - 2.0371094 + - 0.4267578 + - 0.9321289 + - 1.3779297 + - -3.2714844 + - -0.6591797 + - -1.5068359 + - 6.21875 + - 0.39135742 + - 3.2871094 + - -1.5976563 + - 4.46875 + - -1.5048828 + - 1.9814453 + - -0.7651367 + - -1.7587891 + - 3.5175781 + - -3.4199219 + - -3.2207031 + - 7.3789063 + - 1.9667969 + - -1.9277344 + - 6.0234375 + - -1.46875 + - -4.9140625 + - -5.7890625 + - -3.7246094 + - 1.0273438 + - -8.3515625 + - -3.6269531 + - 0.2890625 + - -4.8007813 + - -6.0742188 + - 1.8652344 + - -5.859375 + - -0.1303711 + - 2.6875 + - 9.4921875 + - 3.5761719 + - 1.6201172 + - 7.3710938 + - -2.7460938 + - 1.2705078 + - 0.5307617 + - 7.4375 + - 4.203125 + - -1.6572266 + - -0.66015625 + - 1.6787109 + - 1.0703125 + - -0.025161743 + - 3.4375 + - 4.5429688 + - -4.7851563 + - 3.6210938 + - 0.124572754 + - 14.265625 + - 0.038726807 + - -2.5 + - 0.9296875 + - 0.9111328 + - -0.020980835 + - -3.5566406 + - -7.8984375 + - -0.67578125 + - 0.74316406 + - 2.9394531 + - -4.2695313 + - 4.6679688 + - 3.2148438 + - 0.8149414 + - -2.0859375 + - 1.2001953 + - 6.875 + - -7.359375 + - 0.28637695 + - -0.44140625 + - -2.5585938 + - 6.03125 + - -6.6132813 + - 5.2851563 + - 12.390625 + - -6.203125 + - 2.6601563 + - 2.3554688 + - -3.4375 + - 2.3964844 + - 0.4946289 + - -0.06878662 + - -1.6601563 + - -2.6933594 + - 5.8359375 + - 4.1796875 + - -1.9238281 + - 0.15405273 + - -8.7421875 + - 4.4335938 + - 5.6015625 + - -0.14611816 + - 7.9335938 + - -2.0878906 + - -0.06939697 + - 2.4472656 + - 5.0078125 + - -5.7578125 + - -5.1601563 + - -1.3964844 + - -8.4921875 + - 2.9550781 + - 0.82470703 + - -0.56152344 + - 0.011161804 + - -6.1171875 + - -1.2744141 + - -7.0390625 + - -1.6132813 + - -3.421875 + - 1.4443359 + - 0.36621094 + - 0.10784912 + - 3.0273438 + - -7.2265625 + - -2.1015625 + - 5.8632813 + - -3.7988281 + - 3.5605469 + - 3.7402344 + - 4.9179688 + - 4.3671875 + - -2 + - -1.7324219 + - 4.6171875 + - 7.6757813 + - -1.4951172 + - 0.140625 + - -8.0546875 + - -1.8964844 + - 0.2668457 + - 2.8417969 + - -4.84375 + - 4.1210938 + - 2.515625 + - 2.9414063 + - 28.0625 + - -6.4609375 + - -1.2070313 + - -0.26635742 + - 4.1210938 + - -4.0195313 + - -0.9873047 + - 1.6308594 + - 0.43603516 + - 2.2363281 + - 2.2539063 + - 1.3857422 + - 4.2265625 + - -2.1757813 + - 5.3164063 + - 3.7636719 + - -3.6074219 + - -4.8515625 + - 7.4492188 + - -2.0019531 + - -2.921875 + - -5.3632813 + - -10.65625 + - -1.1523438 + - -2.0136719 + - -3.4921875 + - 3.7089844 + - -1.5585938 + - -1.4443359 + - 5.3828125 + - 3.7558594 + - -2.5097656 + - 1.2724609 + - -10.34375 + - -0.81884766 + - 7.7890625 + - 3.5351563 + - -0.9116211 + - -2.2734375 + - 4.171875 + - -1.5917969 + - -4.5976563 + - -1.7949219 + - 4.1992188 + - -1.2099609 + - 3.4199219 + - -5.9101563 + - -1.9345703 + - -10.2578125 + - -0.40527344 + - -2.3398438 + - -3.6699219 + - -5.4179688 + - -4.9648438 + - -5.6367188 + - -1.8330078 + - 1.6630859 + - -6.359375 + - 6.2851563 + - 1.6992188 + - -1.0722656 + - 5.765625 + - -0.43920898 + - 12.328125 + - 0.0869751 + - 3.8710938 + - -9.390625 + - -0.45825195 + - -1.1894531 + - 3.4160156 + - -3.6367188 + - -0.08227539 + - 3.3320313 + - -5.8828125 + - -5.2382813 + - 3.6289063 + - -9.7421875 + - -15.734375 + - 1.84375 + - -3.28125 + - 6.5703125 + - -1.015625 + - -6.390625 + - -0.7758789 + - -0.5004883 + - 3.4296875 + - -0.6660156 + - 1.7900391 + - -2.53125 + - -3.1582031 + - 2.1074219 + - 0.82373047 + - -4.15625 + - 0.3564453 + - -5.0625 + - 0.46826172 + - -0.20117188 + - 9.4296875 + - -1.3701172 + - 6.21875 + - -1.1826172 + - -0.50927734 + - 0.97509766 + - 1.5351563 + - -9.1015625 + - 1.2363281 + - 1.1484375 + - 4.2460938 + - 4.6484375 + - 5.0078125 + - -1.4257813 + - -8.8046875 + - -2.5878906 + - 3.6601563 + - 0.5317383 + - 0.8198242 + - -2.7597656 + - -0.5253906 + - 2.9589844 + - 10.453125 + - -3.3242188 + - 1.2519531 + - 7.5820313 + - -1.4306641 + - 0.2076416 + - 9.6015625 + - 1.8046875 + - 3.9414063 + - 3.5351563 + - -3.0703125 + - 0.03564453 + - -3.2148438 + - 1.125 + - -1.9433594 + - -4.84375 + - 1.5664063 + - 9.125 + - -3.109375 + - -5.609375 + - 1.5107422 + - 1.7890625 + - 1.6806641 + - 9.0703125 + - -5.46875 + - 0.28930664 + - 1.1523438 + - 2.3300781 + - -2.265625 + - -4.3164063 + - 1.2324219 + - 0.8979492 + - -0.7207031 + - 14.6171875 + - 6.0703125 + - 1.9316406 + - 2.6289063 + - -1.1337891 + - 0.21948242 + - -2.4433594 + - -0.31347656 + - -4.25 + - -3.2949219 + - 5.4609375 + - -3.3808594 + - 1.8662109 + - 1.7060547 + - 5.5273438 + - -0.16638184 + - 2.9453125 + - 1.7265625 + - -11.4921875 + - -0.5644531 + - 4.7539063 + - -4.1992188 + - 1.3359375 + - 3.3535156 + - 0.17980957 + - -2.5195313 + - -0.31640625 + - -2.515625 + - -5.7851563 + - 1.5869141 + - 3.09375 + - 4.25 + - -0.20983887 + - -1.2236328 + - 1.1054688 + - -1.4736328 + - -2.6875 + - 3.3945313 + - 1.2041016 + - 4.8710938 + - 0.4609375 + - -3.3300781 + - 0.5957031 + - 4.734375 + - -1.6015625 + - -2.8535156 + - -6.3476563 + - -3.4667969 + - -0.015586853 + - 2.0605469 + - -7.609375 + - -1.2441406 + - 1.4921875 + - 3.8867188 + - -2.015625 + - 3.8066406 + - 2.0976563 + - 3.3398438 + - -3.6445313 + - 0.39282227 + - 0.13439941 + - 2.8496094 + - 2.1542969 + - -0.36157227 + - 3.0332031 + - 4.4140625 + - 4.8359375 + - -1.9169922 + - -1.2685547 + - -0.16906738 + - 2.2167969 + - -1.4179688 + - -1.7714844 + - 5.78125 + - 8.3359375 + - -3.6367188 + - -6.6015625 + - 2.7207031 + - 4.8085938 + - -1.6699219 + - -0.8544922 + - 2.5 + - 6.7265625 + - -1.78125 + - -2.8378906 + - 2.7578125 + - 3.6367188 + - 0.48828125 + - -2.4121094 + - 4.46875 + - 0.028198242 + - 0.9223633 + - 0.29736328 + - -3.4199219 + - 0.06951904 + - 2.6640625 + - -0.0012645721 + - -1.8964844 + - -0.4909668 + - -2.859375 + - 5.4804688 + - 1.0214844 + - 1.234375 + - 1.5986328 + - -3.7890625 + - -2.46875 + - 2.8691406 + - -2.2089844 + - -1.4101563 + - -8.25 + - -1.3613281 + - 2.7675781 + - -6.8632813 + - -2.1367188 + - 1.6796875 + - 2.0703125 + - -4.4179688 + - 2.9082031 + - -0.06329346 + - 2.3125 + - -7.7890625 + - -3.7441406 + - -0.3395996 + - -0.15661621 + - 8.2109375 + - -2.4023438 + - -5.0976563 + - -2.3925781 + - -1.0058594 + - 3.0703125 + - -0.8886719 + - 5.75 + - -5.0195313 + - -4.2851563 + - 2.0683594 + - -5.28125 +- - -4.9882813 + - 6.7734375 + - -1.6269531 + - -3.21875 + - 7.078125 + - -0.5107422 + - -2.75 + - -1.5371094 + - 4.9257813 + - 0.9790039 + - 6.03125 + - -4.0195313 + - -4.9648438 + - 0.9160156 + - 0.63916016 + - -0.90771484 + - 5.375 + - -0.3293457 + - 2.8535156 + - 2.7773438 + - 0.25170898 + - -4.671875 + - 1.7490234 + - -1.7080078 + - 2.1933594 + - -0.7470703 + - -5.6445313 + - 0.31762695 + - 6.4375 + - 1.9873047 + - -5.265625 + - 0.6816406 + - 0.89404297 + - 12.1640625 + - -3.3867188 + - -5.015625 + - -2.890625 + - 1.3457031 + - -0.47094727 + - -1.1201172 + - 1.2382813 + - -0.6855469 + - -1.5957031 + - -0.39916992 + - 10.4921875 + - 5.3867188 + - -7.9570313 + - -5.6914063 + - 2.9589844 + - -2.2753906 + - 4.1210938 + - -0.3178711 + - -1.15625 + - 5.828125 + - 3.4746094 + - -0.51953125 + - 1.9931641 + - 1.15625 + - -3.9140625 + - -0.30517578 + - 4.390625 + - 0.96191406 + - -5.0078125 + - 5.8242188 + - 1.9091797 + - 2.2949219 + - -3.2460938 + - -3.9570313 + - 5.3789063 + - 6.4648438 + - 6.9375 + - 7.6210938 + - 0.76464844 + - -0.41430664 + - -3.7480469 + - 3.1015625 + - -0.22961426 + - -3.3007813 + - -5.2890625 + - -8.6953125 + - 2.3320313 + - -0.9013672 + - -5.3789063 + - -10.9453125 + - -0.20263672 + - -3.359375 + - -6.1367188 + - 2.6777344 + - -2.7753906 + - 2.0957031 + - -2.3105469 + - -2.7382813 + - -17.140625 + - 5.2070313 + - 3.4707031 + - -2.0371094 + - 0.82421875 + - -3.5566406 + - 2.1445313 + - -4.8164063 + - -1.2802734 + - 0.42407227 + - 0.98095703 + - 1.3271484 + - -1.9667969 + - 0.36328125 + - -3.90625 + - 5.0859375 + - -1.7578125 + - -1.8056641 + - -5.6210938 + - -2.875 + - -2.9453125 + - -1.5351563 + - 3.1445313 + - 3.8066406 + - 0.78759766 + - 2.8574219 + - 3.6015625 + - 10.6171875 + - -0.24499512 + - -0.52734375 + - -0.61816406 + - -2.9453125 + - -1.0263672 + - 3.359375 + - 6.6640625 + - -5.4179688 + - 0.9326172 + - 5.09375 + - -3.796875 + - 2.3691406 + - -3.9375 + - 6.0117188 + - 1.1669922 + - 0.07067871 + - -0.63916016 + - -7.7304688 + - -0.11804199 + - -5.1992188 + - -0.9707031 + - 2.8730469 + - 0.36157227 + - 4.0898438 + - -3.59375 + - -0.14904785 + - 6.3164063 + - 1.0546875 + - 12.78125 + - 5.265625 + - 2.4238281 + - -0.40429688 + - 2.5800781 + - -2.7871094 + - 0.19958496 + - -0.4580078 + - -4.5585938 + - -7.4570313 + - 0.7397461 + - -2.4921875 + - 2.3066406 + - 6.7929688 + - 5.4023438 + - -9.0859375 + - -0.38134766 + - 5.0117188 + - 3.9003906 + - 4.3515625 + - -3.7050781 + - 5.2226563 + - -4.4726563 + - -3.5234375 + - -3.5878906 + - 3.2519531 + - -4.1484375 + - 0.6220703 + - 0.796875 + - -0.8642578 + - -4.4023438 + - 7.171875 + - -2.1464844 + - -5.0898438 + - -3.7910156 + - 9.359375 + - 1.7636719 + - 2.4023438 + - -3.3632813 + - -0.3083496 + - 1.5644531 + - 8.6015625 + - 1.6787109 + - 3.1347656 + - 0.828125 + - -1.140625 + - 7.734375 + - 1.7255859 + - 0.40942383 + - -6.578125 + - 4.8867188 + - 8.0625 + - 3.3789063 + - 4.3359375 + - 1.0917969 + - -7.2265625 + - 11.5078125 + - 7.2929688 + - -0.17590332 + - -12.3046875 + - -1.6904297 + - -1.0439453 + - -6.5117188 + - -1.4707031 + - 3.1171875 + - -6.1835938 + - -0.48608398 + - 0.20043945 + - -2.1621094 + - -14.5859375 + - -2.4316406 + - -7.3242188 + - 2.8027344 + - -19.578125 + - 1.2392578 + - -0.20324707 + - -1.3583984 + - -3.8515625 + - 2.2460938 + - -0.011695862 + - -3.9257813 + - 5.6132813 + - 7.421875 + - -2.6035156 + - 1.0546875 + - -3.15625 + - -0.39282227 + - -1.7597656 + - -10.796875 + - -8.1875 + - -0.53271484 + - 1.5058594 + - 1.9404297 + - -0.18969727 + - 0.14782715 + - 1.4873047 + - -1.9814453 + - 2.9199219 + - -5.5859375 + - 0.45458984 + - -0.087768555 + - -1.2929688 + - -6.359375 + - -3.5957031 + - -3.4257813 + - -1.75 + - 6.2070313 + - 5.6796875 + - 2.3300781 + - 2.0546875 + - -0.85839844 + - 6.0039063 + - 6.4101563 + - 1.9902344 + - 0.55322266 + - -1.5361328 + - 0.30200195 + - 6.3828125 + - 4.6679688 + - 3.1835938 + - -10.171875 + - -1.8203125 + - -4.0351563 + - -5.3164063 + - 0.97802734 + - -3.1679688 + - 8.0703125 + - 0.1373291 + - 1.2431641 + - -0.47998047 + - 3.6601563 + - -6.7265625 + - -1.1728516 + - -1.5908203 + - 0.23620605 + - 5.5898438 + - 4.5234375 + - -5.7226563 + - -4.40625 + - 5.0234375 + - 1.5634766 + - 0.6376953 + - 4.3320313 + - -2.2246094 + - -1.6318359 + - -0.1784668 + - -7 + - -1.6015625 + - 0.10180664 + - 3.1777344 + - 4.5351563 + - 1.7783203 + - 9.765625 + - -0.8173828 + - 1.7431641 + - 0.5605469 + - -1.4628906 + - 5.53125 + - -5.7578125 + - -0.7885742 + - -4.2226563 + - -6.1171875 + - -0.27783203 + - 3.5566406 + - -1.7841797 + - 0.12915039 + - -1.7714844 + - -5.046875 + - -0.14331055 + - 4.3710938 + - -3.421875 + - -1.6601563 + - -2.8886719 + - -4.21875 + - 7.5625 + - -6.5195313 + - -4.1289063 + - 4.3203125 + - 2.7089844 + - -0.018585205 + - 2.265625 + - 2.2285156 + - -2.5683594 + - -5.6679688 + - -4.3085938 + - 0.05795288 + - 5.4296875 + - -1.515625 + - -1.5429688 + - -3.8125 + - 4.3242188 + - -2.0351563 + - 6.0898438 + - -8.421875 + - 1.3779297 + - 5.9804688 + - -2.3671875 + - -1.8222656 + - 0.30078125 + - 3.3515625 + - 5.6367188 + - 0.91796875 + - -4.109375 + - 0.05508423 + - 2.5761719 + - -5.8984375 + - -0.72998047 + - 3.875 + - -0.97998047 + - 9.25 + - 0.640625 + - 5.125 + - -7.7734375 + - -0.4169922 + - 5.8203125 + - 0.023406982 + - -4.9765625 + - 3.3613281 + - 2.6699219 + - 1.2724609 + - 1.9111328 + - -0.86621094 + - 1.2138672 + - -0.8588867 + - 0.053955078 + - 2.6777344 + - 1.3916016 + - -1.3056641 + - 9.7890625 + - -4.0390625 + - 8.625 + - 4.1835938 + - 1.5400391 + - -7.9414063 + - 2.4550781 + - -0.32177734 + - -1.7421875 + - -2.6972656 + - -1.7070313 + - -6.2539063 + - 1.2714844 + - 5.6132813 + - -1.7275391 + - 2.8261719 + - 7.0585938 + - -6.4453125 + - 1.7128906 + - 2.1816406 + - 2.4511719 + - -6.5351563 + - -1.2958984 + - 8.484375 + - 0.90234375 + - -5.25 + - -0.9995117 + - -1.2177734 + - 2.0703125 + - 0.79785156 + - -2.8261719 + - 1.6298828 + - -4.7148438 + - 9.40625 + - -0.09173584 + - 3.0546875 + - 0.1574707 + - 2.953125 + - 3.7773438 + - -3.0742188 + - -8.9375 + - 9.046875 + - 6.8203125 + - -1.7255859 + - 0.2626953 + - -5.984375 + - 2.5605469 + - -1.8837891 + - 2.0429688 + - 1.4042969 + - 1.9941406 + - -1.1591797 + - 2.6152344 + - 4.703125 + - -5.7460938 + - 0.14221191 + - -4.7539063 + - 4.578125 + - 5.7109375 + - -13.2734375 + - 1.0605469 + - 0.42138672 + - -3.5136719 + - 9.265625 + - 12.375 + - -0.6269531 + - -0.1352539 + - 5.5 + - 2.8027344 + - -0.9560547 + - 1.4589844 + - 3.3085938 + - 0.44677734 + - -0.15759277 + - 1.1865234 + - -6.4414063 + - 0.11468506 + - 2.5605469 + - -6.6953125 + - 0.7290039 + - -0.9814453 + - -0.4482422 + - 3.6191406 + - -11.109375 + - -2.4199219 + - -0.37817383 + - -4.4023438 + - 0.5107422 + - -1.9541016 + - -1.9423828 + - 4.6523438 + - 0.53466797 + - -1.1777344 + - -2.8515625 + - 1.3115234 + - 3.4199219 + - 2.6503906 + - -5.1796875 + - 0.5048828 + - -3.7246094 + - 0.83984375 + - -2.8574219 + - 0.23120117 + - 24.703125 + - 0.38232422 + - -3.6171875 + - -1.5263672 + - -1.0390625 + - 4.734375 + - -5.2539063 + - -0.95703125 + - 4.921875 + - -5.5898438 + - -3.3417969 + - -1.3525391 + - -0.8027344 + - 2.8535156 + - 7.7734375 + - 0.6699219 + - 4.7070313 + - -3.3847656 + - -3.4589844 + - -1.9072266 + - 0.2685547 + - 3.4707031 + - -3.1367188 + - -6.328125 + - 2.5371094 + - -1.0742188 + - -6.953125 + - -3.6738281 + - -7.65625 + - 5.046875 + - 2.3125 + - 4.5820313 + - 1.3212891 + - 13.640625 + - -3.5839844 + - 2.8710938 + - -5.4140625 + - -0.63378906 + - -0.013664246 + - 1.6123047 + - 1.6660156 + - 0.81933594 + - 2.390625 + - 0.98779297 + - -0.5605469 + - 6.3632813 + - 1.7509766 + - -9.1328125 + - 4.7109375 + - -7.0703125 + - 1.8564453 + - 7.3007813 + - -1.6103516 + - 0.048553467 + - 0.42163086 + - 2.2148438 + - 5.765625 + - 0.3413086 + - 0.67822266 + - 6.0585938 + - 1.4267578 + - -0.82128906 + - 1.7109375 + - -3.1972656 + - -1.5332031 + - 4.0234375 + - -2.8535156 + - 3.7539063 + - -3.4824219 + - 8.328125 + - 1.3730469 + - -2.9941406 + - -8.578125 + - 5.8046875 + - -2.8417969 + - -5.7773438 + - -1.1640625 + - -0.9033203 + - 4.0039063 + - -0.3083496 + - -3.1113281 + - -1.1943359 + - 7.1796875 + - -3.7792969 + - 7.3203125 + - 2.7539063 + - -1.5244141 + - -1.8544922 + - 2.2890625 + - 1.4609375 + - -9.1171875 + - -3.3105469 + - 4.484375 + - 3.4863281 + - 8.3984375 + - -1.7675781 + - -2.0234375 + - 8.4453125 + - 3.3222656 + - 6.2148438 + - 3.4746094 + - 4.8085938 + - -2.5410156 + - -0.58251953 + - -0.090148926 + - -2.890625 + - -0.17236328 + - -5.3554688 + - -5.8007813 + - -2.40625 + - 2.78125 + - -1.1171875 + - 6.5273438 + - 4.3867188 + - -2.9414063 + - 0.3076172 + - 6.0117188 + - -0.32128906 + - -2.9785156 + - -1.1113281 + - 3.5566406 + - 7.1875 + - 3.7851563 + - -2.5820313 + - 0.12878418 + - 7.1367188 + - 9.9921875 + - -0.06323242 + - 0.703125 + - 0.70166016 + - -0.7714844 + - -2.2695313 + - 0.033081055 + - 0.029953003 + - 6.6523438 + - 2.6367188 + - -3.8769531 + - -4.7773438 + - -5.1367188 + - 4.796875 + - -2.0136719 + - 3.34375 + - -3.4160156 + - -5.078125 + - 0.74902344 + - 2.3574219 + - -1.8564453 + - 1.9130859 + - -3.640625 + - -3.2773438 + - 1.1289063 + - 1.7148438 + - -1.8642578 + - 4.4296875 + - 0.4741211 + - 1.3945313 + - -5.5742188 + - -4.109375 + - -0.8774414 + - -7.5585938 + - -3.9628906 + - 7.3789063 + - -0.8852539 + - -0.62402344 + - -2.0722656 + - -3.5429688 + - 5.9609375 + - 8.21875 + - 3.890625 + - -3.3476563 + - -1.4951172 + - 2.9648438 + - 0.18395996 + - -3.9511719 + - -4.3398438 + - -2.3964844 + - -1.3242188 + - -0.8041992 + - -2.7441406 + - -1.4892578 + - 7.1210938 + - -6.9375 + - -2.296875 + - -2.4550781 + - 6.3242188 + - 1.0410156 + - -4.59375 + - -0.5957031 + - -0.8564453 + - 7.0195313 + - 1.7265625 + - 4.515625 + - 2.6054688 + - 5.5703125 + - -3.0195313 + - -3.1523438 + - 2.2929688 + - -4.4414063 + - 6.46875 + - 4.9375 + - -1.9814453 + - 4.4453125 + - 1.5048828 + - 4.5585938 + - -5.0117188 + - 1.3818359 + - 5.90625 + - -6.7695313 + - -1.9111328 + - -0.071777344 + - 0.9746094 + - -0.8261719 + - -1.3583984 + - 2.1132813 + - -3.2734375 + - 4.6132813 + - 3.1328125 + - 0.60839844 + - 3.640625 + - -4.6992188 + - -2.4726563 + - 1.2744141 + - 2.1425781 + - -0.7441406 + - 0.024169922 + - -2.4355469 + - -3.28125 + - 0.57373047 + - -7.5195313 + - -6.2070313 + - 4.7226563 + - 6.1914063 + - 8.3515625 + - 12.2421875 + - -2.53125 + - -1.2783203 + - -2.5019531 + - 0.6977539 + - 2.1933594 + - -1.5917969 + - 1.9853516 + - 0.14929199 + - -3.9550781 + - -1.8896484 + - 8.78125 + - 0.7001953 + - 7.5625 + - -4.9570313 + - -6.9882813 + - 5.9453125 + - -1.8261719 + - 5.9882813 + - 3.2597656 + - 0.9448242 + - -8.3203125 + - -2.0175781 + - -2.5527344 + - 1.1171875 + - -3.6699219 + - 3.6796875 + - 3.5019531 + - 2.9042969 + - -4.9257813 + - 5.4414063 + - -1.0283203 + - -1.8310547 + - -4.5351563 + - 6.1914063 + - -3.5488281 + - 1.0585938 + - -4.3867188 + - 0.074645996 + - 7.7734375 + - 6.8945313 + - -5.1367188 + - -0.5361328 + - 3.4316406 + - -2.5214844 + - 1.7695313 + - 0.6152344 + - -1.7314453 + - -2.2070313 + - -2.2402344 + - -4.0742188 + - -0.6567383 + - -2.8925781 + - 1.6826172 + - -4.6640625 + - -4.1601563 + - 3.5527344 + - 3.8261719 + - -0.7451172 + - -0.43188477 + - 1.5214844 + - 0.14746094 + - 1.9335938 + - 6.421875 + - -0.24707031 + - 7.6679688 + - -5.765625 + - 7.8671875 + - 0.8486328 + - 2.9960938 + - 1.3359375 + - 3.6855469 + - -3.7617188 + - 3.7382813 + - -6.0234375 + - -6.40625 + - 1.3740234 + - 1.9501953 + - 3.1679688 + - -0.5288086 + - -1.0214844 + - -4.5351563 + - 9.4375 + - -5.8984375 + - 8 + - 3.6210938 + - -15.5859375 + - -2.7734375 + - 1.0527344 + - 3.0488281 + - -7.7148438 + - -4.7148438 + - 1.1132813 + - -0.6948242 + - -5.7929688 + - 3.9042969 + - 10.0625 + - 0.10675049 + - -4.1992188 + - 1.2373047 + - 1.3027344 + - -0.26367188 + - 0.115478516 + - 21.40625 + - 1.1445313 + - -1.7099609 + - -0.13208008 + - 2.6171875 + - -4.9335938 + - 6.8164063 + - 2.7988281 + - -2.1015625 + - -5.8007813 + - -4.8515625 + - 0.9658203 + - 1.8544922 + - 0.90283203 + - -1.2851563 + - 2.1660156 + - -0.25219727 + - 0.020111084 + - -5.4804688 + - -2.8789063 + - 3.1835938 + - -4.2070313 + - -2.7792969 + - -1.0927734 + - 0.67626953 + - -1.7822266 + - 0.8491211 + - -9.9140625 + - -1.6845703 + - -1.7011719 + - 1.8603516 + - 5.21875 + - -0.21923828 + - -0.1303711 + - -3.2890625 + - 3.203125 + - 0.4099121 + - 1.0439453 + - 1.7529297 + - 6.2148438 + - 0.9067383 + - 2.5820313 + - 1.8457031 + - -0.9951172 + - -0.27026367 + - -2.7050781 + - -5.828125 + - -1.5742188 + - 5.6796875 + - -1.8222656 + - 5.390625 + - 4.8125 + - -2.6464844 + - -1.1611328 + - 0.83154297 + - -1.1591797 + - -3.9667969 + - 6.53125 + - 1.890625 + - -3.125 + - 3.7128906 + - -0.37451172 + - -10.171875 + - 0.27197266 + - 4.375 + - 2.171875 + - 4.0820313 + - 0.96191406 + - 6.5742188 + - 1.1435547 + - 3.4101563 + - 14.1484375 + - 2.0058594 + - -6.46875 + - -5.5351563 + - -2.3808594 + - 5.1484375 + - -2.9238281 + - -3.0195313 + - 2.390625 + - -1.4082031 + - 2.9199219 + - -1.7109375 + - 2.4238281 + - 5.2421875 + - -1.5576172 + - 3.0644531 + - 9.1953125 + - -6.7304688 + - 0.80126953 + - -0.8017578 + - -1.3261719 + - 0.9580078 + - 3.1933594 + - 3.2617188 + - -10.828125 + - -5.5234375 + - 4.6445313 + - -2.640625 + - -4.7734375 + - 0.61279297 + - 4.0820313 + - -0.9604492 + - -5.203125 + - 0.64453125 + - -0.8691406 + - -0.31176758 + - -2.9414063 + - -3.9609375 + - -6.171875 + - 0.4567871 + - -0.5551758 + - -4.7070313 + - 4.1835938 + - -2.7480469 + - 2.9570313 + - 0.69677734 + - 3.5410156 + - 3.2050781 + - -1.5 + - -3.6210938 + - -0.8125 + - 0.7993164 + - 0.234375 + - -1.6123047 + - 6.1835938 + - 4.0117188 + - 2.1601563 + - -4.8125 + - 0.29003906 + - 6.5546875 + - -0.56884766 + - -3.1816406 + - 4.7617188 + - -4.2578125 + - -0.0072288513 + - 4.6445313 + - -4.40625 + - -0.7939453 + - -5.5820313 + - -8.15625 + - -6.9921875 + - -4.0664063 + - -0.8754883 + - 0.9082031 + - -7.7304688 + - -1.1416016 + - -3.3574219 + - -7.6796875 + - -1.3916016 + - -3.9472656 + - 5.5429688 + - -2.8222656 + - -5.3554688 + - 0.6171875 + - -0.82177734 + - -0.1071167 + - 2.5546875 + - -4.1914063 + - 0.03567505 + - -1.4912109 + - -18.234375 + - -3.4882813 + - -0.61621094 + - -2.9511719 + - -2.3105469 + - -2.7207031 + - -4.4453125 + - 0.22436523 + - 3.4179688 + - 2.2519531 + - 3.9589844 + - 0.53515625 + - 0.16992188 + - -9.9765625 + - -1.6142578 + - -1.0683594 + - 2.5488281 + - 5.4765625 + - 3.3320313 + - 1.9384766 + - -5.3203125 + - -0.64501953 + - 1.9863281 + - -2.2285156 + - 0.6845703 + - -1.9570313 + - -0.99902344 + - -7.109375 + - 0.2980957 + - -3.0253906 + - 0.4033203 + - -1.8222656 + - 0.4440918 + - 2.0332031 + - -3.109375 + - -4.3320313 + - -9.6640625 + - -3.9921875 + - -0.23498535 + - -8.546875 + - -1.2666016 + - 7.6328125 + - 1.7714844 + - -3.4804688 + - -12.171875 + - -3.0878906 + - -7.7578125 + - -2.0957031 + - 0.08728027 + - 6.3476563 + - 2.7285156 + - -1.2490234 + - -2.7011719 + - 1.4521484 + - 2.7929688 + - 1.5078125 + - -1.7939453 + - -3.4882813 + - -7.3828125 + - -8.0234375 + - -1.2158203 + - -2.7832031 + - 1.6845703 + - -6.6835938 + - -5.9882813 + - -5.0429688 + - -0.43139648 + - -2.5878906 + - -4.0820313 + - -4.4101563 + - -0.0793457 + - -1.3710938 + - 0.28515625 + - -5.1914063 + - -4.4804688 + - -0.12731934 + - 2.2890625 + - -0.1171875 + - -2.6132813 + - -2.9160156 + - -5.3867188 + - 15.71875 + - 4.9179688 + - 2.6601563 + - 0.9135742 + - -7.9453125 + - -11.1875 + - 4.671875 + - 0.26464844 + - -0.44628906 + - -4.6914063 + - 8.9296875 + - -4.0117188 + - -0.059295654 + - 0.6850586 + - 2.0800781 + - -4.9609375 + - 0.091918945 + - 1.5673828 + - 0.88671875 + - -0.11450195 + - -4.34375 + - -0.3581543 + - 0.34960938 + - 3.2792969 + - 0.31469727 + - -1.2236328 + - 3.0585938 + - -2.1601563 + - -8.734375 + - 6.3984375 + - 0.15588379 + - -3.0253906 + - -3.7089844 + - 4.4804688 + - -3.390625 + - -4.046875 + - 0.32348633 + - 1.7861328 + - 5.8554688 + - 4.234375 + - -0.5810547 + - -1.4169922 + - 1.4697266 + - -1.1591797 + - 2.3320313 + - -3.3945313 + - -5.0351563 + - -4.8476563 + - -0.95751953 + - -1.7558594 + - -0.6669922 + - 0.06011963 + - -2.2792969 + - -0.08380127 + - -3.7167969 + - 7.8867188 + - 4.2304688 + - -2.8574219 + - -3.3203125 + - 5.625 + - -2.6347656 + - 2.0019531 + - -0.5317383 + - 1.3701172 + - -0.08496094 + - -3.8242188 + - -3.0117188 + - 4.203125 + - 4.7265625 + - -4.328125 + - 11.1875 + - -1.6337891 + - -0.8666992 + - -5.9023438 + - -5.859375 + - -0.9355469 + - -8.4375 + - -5.46875 + - 1.1240234 + - -2.1289063 + - -7.890625 + - 5.0898438 + - -5.2382813 + - -0.027267456 + - 2.1738281 + - 3.9980469 + - 6.4375 + - 4.203125 + - 5.4414063 + - -2.7070313 + - 0.10546875 + - -2.6132813 + - 5.5234375 + - -1.9365234 + - 3.7636719 + - -2.2285156 + - 1.6455078 + - 2.8125 + - -0.21313477 + - 5.1953125 + - 7.0351563 + - -2.828125 + - 6.2382813 + - -3.6425781 + - 5.7382813 + - -0.30249023 + - -3.5917969 + - -1.5507813 + - 6.0976563 + - -0.92333984 + - 2.9238281 + - -8.75 + - -0.2763672 + - 0.54296875 + - 3.0019531 + - -2.3320313 + - 1.6035156 + - 7.4257813 + - -5.984375 + - -0.48168945 + - 0.1427002 + - 0.8515625 + - -6.4023438 + - -1.2822266 + - -2.8828125 + - -1.2177734 + - 2.5761719 + - -3.8085938 + - 3.5957031 + - 11.265625 + - -9.984375 + - 3.9042969 + - 7.6015625 + - -2.4746094 + - 1.7685547 + - -0.30004883 + - -4.1484375 + - 0.3190918 + - -4.4609375 + - -0.3984375 + - 3.4667969 + - -1.7177734 + - 1.8867188 + - -8.171875 + - 3.046875 + - 6.234375 + - 0.22839355 + - 8.5234375 + - -3.0292969 + - -1.9580078 + - 4.546875 + - 3.2421875 + - 0.69628906 + - -2.8554688 + - 1.2177734 + - -6.3398438 + - 1.2490234 + - 1.2724609 + - -2.9121094 + - 1.3271484 + - -2.3066406 + - 0.703125 + - -6.4804688 + - -4.1015625 + - -2.4296875 + - -0.3515625 + - 1.6445313 + - -6.1914063 + - 4.171875 + - -13.109375 + - -1.1240234 + - 6.53125 + - 3.2871094 + - 4.0664063 + - 2.9746094 + - 2.9785156 + - 7.7773438 + - -2.7148438 + - -3.8300781 + - 6.3632813 + - 3.1503906 + - -8.09375 + - -1.3330078 + - -4.8632813 + - -2.21875 + - -0.6171875 + - -1.8818359 + - 4.5820313 + - -3.9160156 + - -3.078125 + - -1.4169922 + - 20.34375 + - -1.7783203 + - 2.125 + - -2.96875 + - 0.42333984 + - -4.7617188 + - -0.68115234 + - 1.4033203 + - 2.0527344 + - 3.875 + - 1.7890625 + - 0.61572266 + - -2.4238281 + - -0.953125 + - 5.6679688 + - 0.8208008 + - 0.022460938 + - -1.7705078 + - 6.6289063 + - 0.48901367 + - -6.4804688 + - -3.3085938 + - -12.15625 + - -0.35791016 + - -0.8105469 + - -2.0058594 + - 5.0039063 + - -3.0957031 + - 0.19445801 + - 10.140625 + - 4.4453125 + - -3.2050781 + - 1.7548828 + - -8.9921875 + - 1.5078125 + - 6.7304688 + - 9.0390625 + - -2.6171875 + - -5.4492188 + - 4.4492188 + - -0.63623047 + - -5.9296875 + - 0.28222656 + - 4.015625 + - 7.4023438 + - 4.328125 + - -6.84375 + - -2.6796875 + - -4.1992188 + - -2.0078125 + - 1.015625 + - -9.4296875 + - -6.2109375 + - -4.7890625 + - -10.484375 + - -0.08459473 + - 1.7314453 + - -5.8632813 + - 6.8164063 + - -2.2597656 + - -2.8125 + - 5.4101563 + - -2.2597656 + - 7.6367188 + - 0.67333984 + - 0.20532227 + - -12.8359375 + - -0.19580078 + - -1.0927734 + - 4.1835938 + - -2.2226563 + - 3.0800781 + - 3.5605469 + - -7.2460938 + - 0.02708435 + - 1.2529297 + - -9.328125 + - -8.2734375 + - -2.2617188 + - -0.78125 + - 6.7929688 + - -1.9189453 + - -11.796875 + - -0.23071289 + - 3.5976563 + - -2.78125 + - 0.56689453 + - -5.1992188 + - -2.3203125 + - -3.0351563 + - -4.1679688 + - 3.7460938 + - -2.4394531 + - -2.0507813 + - -3.3808594 + - -2.3320313 + - 3.6464844 + - 9.140625 + - -5.2070313 + - 3.0605469 + - 0.37329102 + - -1.1757813 + - -5.2304688 + - 2.1074219 + - -10.1484375 + - 1.8974609 + - 0.28686523 + - 0.6074219 + - 3.9355469 + - 5.15625 + - 0.68310547 + - -10.734375 + - -2.1621094 + - 1.3164063 + - -1.2197266 + - 2.8183594 + - -1.2998047 + - -0.5415039 + - 1.3759766 + - 12.25 + - -1.0390625 + - 4.4960938 + - 7.28125 + - 1.3095703 + - 1.9541016 + - 3.953125 + - 1.5693359 + - 1.5996094 + - -2.046875 + - 1.7978516 + - 4.3515625 + - -7.734375 + - 2.1425781 + - 0.71191406 + - -4.109375 + - 0.81689453 + - 12.375 + - -7.5390625 + - -10.0078125 + - 1.4414063 + - -0.7026367 + - 0.74365234 + - 9.2265625 + - -7.2148438 + - 1.0693359 + - 4.2070313 + - 2.0507813 + - -4.5859375 + - -6.4101563 + - -4.6992188 + - -3.4394531 + - -1.2207031 + - 17.21875 + - 2.9785156 + - 1.2050781 + - 5.796875 + - -4.9648438 + - 2.5605469 + - -2.625 + - -1.5097656 + - -8.375 + - -0.81152344 + - 3.8359375 + - -2.8007813 + - -0.53759766 + - 2.09375 + - 10.5 + - 6.3164063 + - 4.921875 + - 4.0585938 + - -6.2226563 + - -1.1142578 + - 3.1269531 + - -5.7695313 + - 6.15625 + - 2.7421875 + - -0.1463623 + - -6.1523438 + - 0.4934082 + - -5.0664063 + - -4.90625 + - 2.6738281 + - 4.734375 + - 4.1171875 + - -3.7304688 + - 1.7646484 + - 1.0849609 + - -1.8232422 + - -4.1835938 + - 1.6884766 + - 7.5703125 + - 5.0039063 + - 2.1699219 + - -5.6992188 + - -0.73828125 + - 1.7001953 + - -3.1308594 + - -3.1015625 + - -9.46875 + - -3.6074219 + - 6.9882813 + - 1.6279297 + - -2.3378906 + - -6.125 + - 2.8574219 + - 2.4628906 + - -1.3818359 + - 2.9199219 + - 0.46801758 + - 2.4082031 + - -1.7470703 + - -0.8823242 + - -0.16455078 + - 1.5869141 + - 0.17614746 + - -3.265625 + - -0.16381836 + - 5.3359375 + - 5.5703125 + - -5.15625 + - -2.5078125 + - 0.9633789 + - 12.1640625 + - -1.7744141 + - -1.1025391 + - 0.73779297 + - 8.3828125 + - 4.140625 + - -6.90625 + - 1.8007813 + - 6.4179688 + - -4.1328125 + - 0.4506836 + - 2.5058594 + - 6.0742188 + - -1.140625 + - 1.0488281 + - 5.3554688 + - 3.8164063 + - -2.2597656 + - 0.92041016 + - 4.9570313 + - 1.9746094 + - 9.4453125 + - 0.60791016 + - -2.4003906 + - -1.9726563 + - 2.2070313 + - -3.171875 + - -10.796875 + - 0.55810547 + - -6.234375 + - 4.9765625 + - 1.2148438 + - 0.44091797 + - 3.8847656 + - -2.8613281 + - -2.1171875 + - 2.5742188 + - -0.7753906 + - -1.8837891 + - -8.0859375 + - 3.7070313 + - 0.09869385 + - -4.3515625 + - -2.8476563 + - 4.8476563 + - 1.9140625 + - -2.6347656 + - 1.4101563 + - 0.88916016 + - 2.3554688 + - -9.1171875 + - 1.078125 + - 1.3027344 + - -2.2402344 + - 4.8671875 + - -3.1484375 + - -6.3945313 + - -1.2197266 + - 4.7617188 + - 0.3034668 + - -0.44091797 + - 5.7773438 + - -4.1445313 + - -4.4648438 + - -7.8125 + - -3.3515625 diff --git a/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_single.snap b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_single.snap new file mode 100644 index 00000000..362e1ebf --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_single.snap @@ -0,0 +1,1541 @@ +--- +source: backends/candle/tests/test_flash_qwen2.rs +assertion_line: 72 +expression: embeddings_single +--- +- - -4.9960938 + - 6.8007813 + - -1.6386719 + - -3.2109375 + - 7.0507813 + - -0.5097656 + - -2.75 + - -1.5380859 + - 4.9414063 + - 0.96533203 + - 6.015625 + - -3.9980469 + - -4.96875 + - 0.9296875 + - 0.66064453 + - -0.93359375 + - 5.3671875 + - -0.3383789 + - 2.8457031 + - 2.7714844 + - 0.24035645 + - -4.671875 + - 1.7734375 + - -1.7138672 + - 2.2050781 + - -0.7290039 + - -5.6445313 + - 0.32226563 + - 6.4179688 + - 1.9970703 + - -5.2617188 + - 0.6928711 + - 0.91845703 + - 12.171875 + - -3.4003906 + - -5.015625 + - -2.8925781 + - 1.3515625 + - -0.47045898 + - -1.1005859 + - 1.25 + - -0.69433594 + - -1.6308594 + - -0.39135742 + - 10.484375 + - 5.359375 + - -7.9609375 + - -5.6796875 + - 2.953125 + - -2.2792969 + - 4.109375 + - -0.31152344 + - -1.1337891 + - 5.828125 + - 3.4648438 + - -0.5341797 + - 1.9941406 + - 1.1660156 + - -3.9179688 + - -0.30688477 + - 4.3945313 + - 0.94091797 + - -4.984375 + - 5.8085938 + - 1.9296875 + - 2.3066406 + - -3.2460938 + - -3.9511719 + - 5.3828125 + - 6.453125 + - 6.921875 + - 7.625 + - 0.7944336 + - -0.40039063 + - -3.7519531 + - 3.1035156 + - -0.24145508 + - -3.2636719 + - -5.3085938 + - -8.671875 + - 2.328125 + - -0.89697266 + - -5.3554688 + - -10.9140625 + - -0.19873047 + - -3.3789063 + - -6.1328125 + - 2.6660156 + - -2.7675781 + - 2.109375 + - -2.3144531 + - -2.7578125 + - -17.109375 + - 5.1796875 + - 3.4550781 + - -2.0351563 + - 0.81103516 + - -3.5664063 + - 2.1542969 + - -4.78125 + - -1.2695313 + - 0.4140625 + - 0.9916992 + - 1.3408203 + - -1.9746094 + - 0.35302734 + - -3.9082031 + - 5.0859375 + - -1.7539063 + - -1.7861328 + - -5.6210938 + - -2.8828125 + - -2.9453125 + - -1.5458984 + - 3.1503906 + - 3.8007813 + - 0.78271484 + - 2.8496094 + - 3.6035156 + - 10.6171875 + - -0.2565918 + - -0.5229492 + - -0.6142578 + - -2.9453125 + - -1.0302734 + - 3.359375 + - 6.671875 + - -5.4335938 + - 0.94677734 + - 5.0898438 + - -3.7832031 + - 2.3710938 + - -3.9414063 + - 6.0117188 + - 1.1777344 + - 0.06689453 + - -0.63183594 + - -7.75 + - -0.12237549 + - -5.203125 + - -0.9794922 + - 2.8847656 + - 0.37353516 + - 4.09375 + - -3.5800781 + - -0.14013672 + - 6.3320313 + - 1.0683594 + - 12.765625 + - 5.2617188 + - 2.4140625 + - -0.37573242 + - 2.5839844 + - -2.8105469 + - 0.21374512 + - -0.4416504 + - -4.5703125 + - -7.4765625 + - 0.74072266 + - -2.4765625 + - 2.3164063 + - 6.7929688 + - 5.3828125 + - -9.109375 + - -0.38305664 + - 5.0234375 + - 3.9101563 + - 4.3320313 + - -3.7070313 + - 5.2226563 + - -4.4882813 + - -3.5117188 + - -3.5878906 + - 3.2539063 + - -4.1757813 + - 0.62841797 + - 0.7871094 + - -0.86376953 + - -4.3945313 + - 7.140625 + - -2.171875 + - -5.0742188 + - -3.7890625 + - 9.34375 + - 1.7626953 + - 2.3925781 + - -3.3476563 + - -0.3005371 + - 1.5576172 + - 8.59375 + - 1.6884766 + - 3.1152344 + - 0.7973633 + - -1.1503906 + - 7.7421875 + - 1.7197266 + - 0.39697266 + - -6.578125 + - 4.8945313 + - 8.0703125 + - 3.3984375 + - 4.3398438 + - 1.1044922 + - -7.2421875 + - 11.53125 + - 7.3007813 + - -0.16821289 + - -12.28125 + - -1.6777344 + - -1.0253906 + - -6.4960938 + - -1.4628906 + - 3.0859375 + - -6.1796875 + - -0.49194336 + - 0.19616699 + - -2.1660156 + - -14.546875 + - -2.4335938 + - -7.296875 + - 2.8144531 + - -19.578125 + - 1.2509766 + - -0.21643066 + - -1.3544922 + - -3.8457031 + - 2.234375 + - -0.04156494 + - -3.9394531 + - 5.625 + - 7.4335938 + - -2.6210938 + - 1.0830078 + - -3.1738281 + - -0.39697266 + - -1.7597656 + - -10.8359375 + - -8.2109375 + - -0.5527344 + - 1.5097656 + - 1.9316406 + - -0.17895508 + - 0.14587402 + - 1.4873047 + - -1.9521484 + - 2.890625 + - -5.6171875 + - 0.4423828 + - -0.07745361 + - -1.2978516 + - -6.3554688 + - -3.5976563 + - -3.4277344 + - -1.7441406 + - 6.2148438 + - 5.6914063 + - 2.3378906 + - 2.0449219 + - -0.8623047 + - 6.0078125 + - 6.3945313 + - 1.9785156 + - 0.55566406 + - -1.5371094 + - 0.3017578 + - 6.3867188 + - 4.6679688 + - 3.1757813 + - -10.1640625 + - -1.8203125 + - -4.0546875 + - -5.3359375 + - 0.98339844 + - -3.1601563 + - 8.0859375 + - 0.15698242 + - 1.2539063 + - -0.48583984 + - 3.6367188 + - -6.7226563 + - -1.171875 + - -1.5888672 + - 0.23486328 + - 5.59375 + - 4.53125 + - -5.7070313 + - -4.390625 + - 5.0351563 + - 1.5537109 + - 0.6123047 + - 4.3476563 + - -2.2285156 + - -1.6386719 + - -0.1932373 + - -6.9960938 + - -1.6064453 + - 0.08795166 + - 3.1738281 + - 4.5390625 + - 1.7880859 + - 9.7578125 + - -0.82666016 + - 1.7480469 + - 0.56933594 + - -1.4628906 + - 5.5195313 + - -5.7578125 + - -0.81396484 + - -4.2070313 + - -6.0976563 + - -0.29736328 + - 3.5664063 + - -1.7910156 + - 0.1303711 + - -1.7832031 + - -5.0507813 + - -0.1394043 + - 4.3945313 + - -3.4082031 + - -1.6884766 + - -2.8925781 + - -4.1992188 + - 7.5625 + - -6.5195313 + - -4.125 + - 4.3125 + - 2.6972656 + - -0.018585205 + - 2.2734375 + - 2.2402344 + - -2.5351563 + - -5.6796875 + - -4.3085938 + - 0.068481445 + - 5.4335938 + - -1.5068359 + - -1.53125 + - -3.8144531 + - 4.3203125 + - -2.0097656 + - 6.0859375 + - -8.421875 + - 1.3945313 + - 6.0117188 + - -2.3554688 + - -1.8203125 + - 0.296875 + - 3.3613281 + - 5.609375 + - 0.91064453 + - -4.1640625 + - 0.05505371 + - 2.5898438 + - -5.8867188 + - -0.72802734 + - 3.8847656 + - -0.9814453 + - 9.2421875 + - 0.6357422 + - 5.1289063 + - -7.7773438 + - -0.42138672 + - 5.8476563 + - 0.025741577 + - -4.9804688 + - 3.3417969 + - 2.6757813 + - 1.2695313 + - 1.9111328 + - -0.86083984 + - 1.203125 + - -0.8442383 + - 0.06298828 + - 2.6914063 + - 1.3818359 + - -1.3125 + - 9.796875 + - -4.046875 + - 8.6171875 + - 4.1953125 + - 1.5576172 + - -7.9257813 + - 2.4628906 + - -0.3244629 + - -1.7304688 + - -2.7363281 + - -1.6865234 + - -6.2890625 + - 1.2685547 + - 5.6054688 + - -1.7246094 + - 2.8554688 + - 7.0625 + - -6.4296875 + - 1.7138672 + - 2.1933594 + - 2.4492188 + - -6.515625 + - -1.2949219 + - 8.4609375 + - 0.89941406 + - -5.21875 + - -0.97509766 + - -1.2324219 + - 2.0644531 + - 0.8183594 + - -2.8574219 + - 1.6621094 + - -4.703125 + - 9.421875 + - -0.103027344 + - 3.0566406 + - 0.13635254 + - 2.9472656 + - 3.7675781 + - -3.0820313 + - -8.9140625 + - 9.078125 + - 6.8242188 + - -1.7558594 + - 0.25634766 + - -5.9960938 + - 2.5488281 + - -1.8525391 + - 2.0527344 + - 1.4238281 + - 1.9941406 + - -1.1503906 + - 2.5820313 + - 4.703125 + - -5.7421875 + - 0.16186523 + - -4.7421875 + - 4.5625 + - 5.7265625 + - -13.25 + - 1.0585938 + - 0.4350586 + - -3.4902344 + - 9.2734375 + - 12.359375 + - -0.6357422 + - -0.124572754 + - 5.5039063 + - 2.7949219 + - -0.94921875 + - 1.4667969 + - 3.3203125 + - 0.44360352 + - -0.15441895 + - 1.2050781 + - -6.453125 + - 0.10571289 + - 2.578125 + - -6.7109375 + - 0.74609375 + - -0.9873047 + - -0.4951172 + - 3.640625 + - -11.140625 + - -2.4179688 + - -0.40185547 + - -4.40625 + - 0.5078125 + - -1.9570313 + - -1.9472656 + - 4.6640625 + - 0.51660156 + - -1.1796875 + - -2.8574219 + - 1.3056641 + - 3.4199219 + - 2.6523438 + - -5.171875 + - 0.5048828 + - -3.7070313 + - 0.86279297 + - -2.8691406 + - 0.23120117 + - 24.640625 + - 0.3701172 + - -3.6191406 + - -1.5244141 + - -1.0380859 + - 4.71875 + - -5.2773438 + - -0.9580078 + - 4.9179688 + - -5.6054688 + - -3.3203125 + - -1.3261719 + - -0.8261719 + - 2.8613281 + - 7.7460938 + - 0.6645508 + - 4.7226563 + - -3.3789063 + - -3.46875 + - -1.9121094 + - 0.27294922 + - 3.453125 + - -3.1210938 + - -6.3476563 + - 2.5351563 + - -1.0654297 + - -6.9414063 + - -3.6738281 + - -7.6484375 + - 5.046875 + - 2.3300781 + - 4.5820313 + - 1.3105469 + - 13.625 + - -3.5546875 + - 2.8828125 + - -5.3984375 + - -0.63183594 + - -0.016036987 + - 1.6474609 + - 1.6591797 + - 0.8183594 + - 2.4023438 + - 0.9926758 + - -0.55322266 + - 6.375 + - 1.7548828 + - -9.140625 + - 4.703125 + - -7.0976563 + - 1.8603516 + - 7.2851563 + - -1.6132813 + - 0.02911377 + - 0.43164063 + - 2.2402344 + - 5.765625 + - 0.35839844 + - 0.6904297 + - 6.0546875 + - 1.4228516 + - -0.8232422 + - 1.7285156 + - -3.2128906 + - -1.5332031 + - 4.0507813 + - -2.8613281 + - 3.7402344 + - -3.4824219 + - 8.3125 + - 1.390625 + - -2.9746094 + - -8.5703125 + - 5.8164063 + - -2.8300781 + - -5.7617188 + - -1.1474609 + - -0.92578125 + - 4.0117188 + - -0.29614258 + - -3.1054688 + - -1.203125 + - 7.1953125 + - -3.7753906 + - 7.3203125 + - 2.7734375 + - -1.5205078 + - -1.8730469 + - 2.3007813 + - 1.4492188 + - -9.1171875 + - -3.3105469 + - 4.484375 + - 3.5097656 + - 8.40625 + - -1.7578125 + - -2.0429688 + - 8.46875 + - 3.2988281 + - 6.203125 + - 3.4882813 + - 4.8085938 + - -2.5253906 + - -0.5834961 + - -0.06707764 + - -2.8964844 + - -0.16894531 + - -5.3710938 + - -5.8203125 + - -2.390625 + - 2.7773438 + - -1.1132813 + - 6.5390625 + - 4.375 + - -2.921875 + - 0.2998047 + - 6.0078125 + - -0.33642578 + - -2.984375 + - -1.1054688 + - 3.5332031 + - 7.2070313 + - 3.78125 + - -2.5390625 + - 0.12194824 + - 7.1328125 + - 9.9921875 + - -0.084228516 + - 0.6791992 + - 0.66796875 + - -0.76123047 + - -2.2597656 + - 0.029327393 + - 0.017471313 + - 6.6523438 + - 2.6425781 + - -3.8828125 + - -4.7773438 + - -5.15625 + - 4.7851563 + - -2.0273438 + - 3.3554688 + - -3.4199219 + - -5.0625 + - 0.74365234 + - 2.3789063 + - -1.8720703 + - 1.9023438 + - -3.6445313 + - -3.2441406 + - 1.1259766 + - 1.7216797 + - -1.8857422 + - 4.453125 + - 0.49365234 + - 1.4111328 + - -5.5742188 + - -4.1054688 + - -0.8588867 + - -7.6054688 + - -3.9433594 + - 7.3984375 + - -0.8857422 + - -0.62890625 + - -2.0683594 + - -3.5390625 + - 5.9726563 + - 8.2265625 + - 3.9296875 + - -3.3457031 + - -1.5029297 + - 2.9707031 + - 0.16552734 + - -3.9511719 + - -4.3515625 + - -2.3828125 + - -1.3417969 + - -0.8066406 + - -2.7402344 + - -1.4658203 + - 7.125 + - -6.96875 + - -2.3066406 + - -2.4609375 + - 6.3242188 + - 1.0380859 + - -4.59375 + - -0.5942383 + - -0.8486328 + - 7.0351563 + - 1.7070313 + - 4.53125 + - 2.625 + - 5.5390625 + - -3.0136719 + - -3.1464844 + - 2.2832031 + - -4.4453125 + - 6.4765625 + - 4.9648438 + - -1.9853516 + - 4.4453125 + - 1.4960938 + - 4.5625 + - -5.03125 + - 1.3789063 + - 5.8984375 + - -6.7695313 + - -1.9003906 + - -0.059814453 + - 1.0039063 + - -0.8183594 + - -1.3632813 + - 2.109375 + - -3.2890625 + - 4.6015625 + - 3.1347656 + - 0.61572266 + - 3.6699219 + - -4.6914063 + - -2.4804688 + - 1.2744141 + - 2.1523438 + - -0.7558594 + - 0.023544312 + - -2.4082031 + - -3.2578125 + - 0.59716797 + - -7.4960938 + - -6.2070313 + - 4.7460938 + - 6.1914063 + - 8.359375 + - 12.2109375 + - -2.5332031 + - -1.2861328 + - -2.484375 + - 0.7158203 + - 2.1933594 + - -1.5917969 + - 1.9853516 + - 0.1508789 + - -3.9667969 + - -1.875 + - 8.7890625 + - 0.7089844 + - 7.5859375 + - -4.9414063 + - -6.9726563 + - 5.9179688 + - -1.8388672 + - 5.984375 + - 3.2382813 + - 0.93408203 + - -8.3359375 + - -2.0605469 + - -2.5722656 + - 1.1279297 + - -3.6679688 + - 3.6679688 + - 3.4804688 + - 2.9121094 + - -4.90625 + - 5.4453125 + - -1.0234375 + - -1.8085938 + - -4.53125 + - 6.1992188 + - -3.578125 + - 1.0693359 + - -4.3828125 + - 0.09295654 + - 7.7890625 + - 6.9023438 + - -5.1328125 + - -0.515625 + - 3.4316406 + - -2.5097656 + - 1.78125 + - 0.6191406 + - -1.7460938 + - -2.2148438 + - -2.2421875 + - -4.0742188 + - -0.65527344 + - -2.90625 + - 1.6816406 + - -4.6679688 + - -4.140625 + - 3.5644531 + - 3.8457031 + - -0.7373047 + - -0.44580078 + - 1.5253906 + - 0.107666016 + - 1.9316406 + - 6.4101563 + - -0.25610352 + - 7.6679688 + - -5.7929688 + - 7.8945313 + - 0.8520508 + - 3.0117188 + - 1.3261719 + - 3.6914063 + - -3.7578125 + - 3.7519531 + - -6.0507813 + - -6.3945313 + - 1.3876953 + - 1.9541016 + - 3.1757813 + - -0.5571289 + - -1.0400391 + - -4.5351563 + - 9.4453125 + - -5.8710938 + - 8.0078125 + - 3.6621094 + - -15.5859375 + - -2.7792969 + - 1.046875 + - 3.0683594 + - -7.7148438 + - -4.7421875 + - 1.1230469 + - -0.6894531 + - -5.7890625 + - 3.9199219 + - 10.0625 + - 0.101257324 + - -4.1796875 + - 1.2480469 + - 1.3203125 + - -0.27148438 + - 0.115478516 + - 21.40625 + - 1.1445313 + - -1.7050781 + - -0.12695313 + - 2.609375 + - -4.953125 + - 6.8007813 + - 2.8164063 + - -2.109375 + - -5.8085938 + - -4.8476563 + - 0.9741211 + - 1.8603516 + - 0.9091797 + - -1.2900391 + - 2.1367188 + - -0.2775879 + - 0.025131226 + - -5.4648438 + - -2.8417969 + - 3.1738281 + - -4.1875 + - -2.7988281 + - -1.0859375 + - 0.6738281 + - -1.7871094 + - 0.84228516 + - -9.953125 + - -1.6787109 + - -1.6992188 + - 1.8554688 + - 5.2421875 + - -0.24304199 + - -0.12646484 + - -3.2910156 + - 3.203125 + - 0.40673828 + - 1.0351563 + - 1.765625 + - 6.2382813 + - 0.9277344 + - 2.5976563 + - 1.8193359 + - -0.9863281 + - -0.26635742 + - -2.6953125 + - -5.8359375 + - -1.5664063 + - 5.71875 + - -1.8359375 + - 5.3867188 + - 4.8164063 + - -2.6757813 + - -1.171875 + - 0.83496094 + - -1.1396484 + - -3.9433594 + - 6.5351563 + - 1.8955078 + - -3.1074219 + - 3.7167969 + - -0.3630371 + - -10.1875 + - 0.25561523 + - 4.359375 + - 2.1953125 + - 4.0820313 + - 0.9638672 + - 6.5546875 + - 1.1445313 + - 3.4003906 + - 14.1640625 + - 2.0019531 + - -6.4414063 + - -5.53125 + - -2.390625 + - 5.1523438 + - -2.9179688 + - -3.0097656 + - 2.3632813 + - -1.4111328 + - 2.921875 + - -1.7275391 + - 2.4277344 + - 5.2421875 + - -1.5703125 + - 3.0390625 + - 9.203125 + - -6.7304688 + - 0.8095703 + - -0.8105469 + - -1.3173828 + - 0.94873047 + - 3.2070313 + - 3.265625 + - -10.828125 + - -5.5390625 + - 4.640625 + - -2.6425781 + - -4.7734375 + - 0.64453125 + - 4.0859375 + - -0.96777344 + - -5.1992188 + - 0.6503906 + - -0.8745117 + - -0.30981445 + - -2.9609375 + - -3.9453125 + - -6.1523438 + - 0.44311523 + - -0.5488281 + - -4.6992188 + - 4.1601563 + - -2.7402344 + - 2.9355469 + - 0.7158203 + - 3.5253906 + - 3.2011719 + - -1.5136719 + - -3.609375 + - -0.81103516 + - 0.79589844 + - 0.25219727 + - -1.6132813 + - 6.1953125 + - 3.9785156 + - 2.1484375 + - -4.8085938 + - 0.31274414 + - 6.5585938 + - -0.56152344 + - -3.203125 + - 4.7578125 + - -4.2890625 + - 0.0036144257 + - 4.6523438 + - -4.3789063 + - -0.7910156 + - -5.5859375 + - -8.171875 + - -6.9921875 + - -4.0625 + - -0.8754883 + - 0.9135742 + - -7.7265625 + - -1.1416016 + - -3.3457031 + - -7.6601563 + - -1.4003906 + - -3.9570313 + - 5.5585938 + - -2.8339844 + - -5.34375 + - 0.62597656 + - -0.8334961 + - -0.10827637 + - 2.5410156 + - -4.1640625 + - 0.035461426 + - -1.4824219 + - -18.234375 + - -3.5136719 + - -0.61621094 + - -2.9492188 + - -2.3125 + - -2.7324219 + - -4.4375 + - 0.2253418 + - 3.4140625 + - 2.2773438 + - 3.96875 + - 0.52001953 + - 0.16186523 + - -9.984375 + - -1.5878906 + - -1.0664063 + - 2.5273438 + - 5.4726563 + - 3.3398438 + - 1.9677734 + - -5.3046875 + - -0.65478516 + - 1.9716797 + - -2.21875 + - 0.68408203 + - -1.9677734 + - -0.9736328 + - -7.125 + - 0.2919922 + - -3.0234375 + - 0.421875 + - -1.8300781 + - 0.45654297 + - 2.0429688 + - -3.1308594 + - -4.3320313 + - -9.6875 + - -4.0117188 + - -0.2512207 + - -8.546875 + - -1.2548828 + - 7.6445313 + - 1.7714844 + - -3.4707031 + - -12.15625 + - -3.0859375 + - -7.7617188 + - -2.0898438 + - 0.09484863 + - 6.34375 + - 2.7226563 + - -1.2441406 + - -2.7050781 + - 1.4414063 + - 2.7851563 + - 1.5 + - -1.7880859 + - -3.4667969 + - -7.3945313 + - -8.015625 + - -1.2070313 + - -2.78125 + - 1.703125 + - -6.6367188 + - -5.9804688 + - -5.0585938 + - -0.41381836 + - -2.5898438 + - -4.078125 + - -4.4101563 + - -0.11029053 + - -1.3505859 + - 0.2614746 + - -5.1835938 + - -4.4726563 + - -0.12854004 + - 2.2910156 + - -0.09680176 + - -2.6269531 + - -2.9023438 + - -5.421875 + - 15.734375 + - 4.890625 + - 2.6542969 + - 0.8989258 + - -7.96875 + - -11.1640625 + - 4.6835938 + - 0.24902344 + - -0.44335938 + - -4.6757813 + - 8.921875 + - -3.9941406 + - -0.05895996 + - 0.6982422 + - 2.0800781 + - -4.9375 + - 0.091918945 + - 1.5839844 + - 0.8911133 + - -0.09967041 + - -4.3867188 + - -0.35253906 + - 0.36157227 + - 3.2910156 + - 0.29663086 + - -1.2138672 + - 3.0644531 + - -2.1875 + - -8.7578125 + - 6.421875 + - 0.1496582 + - -3.0273438 + - -3.7128906 + - 4.4882813 + - -3.3886719 + - -4.0507813 + - 0.31323242 + - 1.7900391 + - 5.8515625 + - 4.21875 + - -0.57714844 + - -1.3984375 + - 1.4736328 + - -1.1748047 + - 2.3183594 + - -3.3847656 + - -5.015625 + - -4.84375 + - -0.9609375 + - -1.7646484 + - -0.703125 + - 0.055725098 + - -2.2929688 + - -0.08001709 + - -3.7246094 + - 7.8984375 + - 4.2265625 + - -2.875 + - -3.3457031 + - 5.640625 + - -2.6347656 + - 2.0097656 + - -0.5444336 + - 1.3837891 + - -0.0869751 + - -3.8085938 + - -3.0058594 + - 4.2109375 + - 4.7578125 + - -4.3320313 + - 11.1640625 + - -1.6669922 + - -0.8486328 + - -5.8945313 + - -5.8632813 + - -0.9379883 + - -8.4453125 + - -5.4570313 + - 1.1132813 + - -2.1230469 + - -7.9101563 + - 5.0976563 + - -5.2382813 + - -0.027252197 + - 2.1542969 + - 3.9746094 + - 6.4414063 + - 4.1953125 + - 5.4414063 + - -2.6855469 + - 0.093933105 + - -2.6210938 + - 5.515625 + - -1.9550781 + - 3.7851563 + - -2.2285156 + - 1.6621094 + - 2.8261719 + - -0.21313477 + - 5.1914063 + - 7.0585938 + - -2.84375 + - 6.21875 + - -3.6640625 + - 5.7851563 + - -0.29492188 + - -3.5859375 + - -1.5400391 + - 6.1171875 + - -0.92285156 + - 2.9316406 + - -8.7265625 + - -0.25317383 + - 0.546875 + - 2.9980469 + - -2.3164063 + - 1.6005859 + - 7.4179688 + - -6.0273438 + - -0.48217773 + - 0.13757324 + - 0.84765625 + - -6.4023438 + - -1.2714844 + - -2.8984375 + - -1.1894531 + - 2.5839844 + - -3.8261719 + - 3.5957031 + - 11.265625 + - -9.9765625 + - 3.890625 + - 7.6054688 + - -2.4746094 + - 1.7714844 + - -0.30078125 + - -4.1523438 + - 0.3125 + - -4.4492188 + - -0.3779297 + - 3.453125 + - -1.7099609 + - 1.8554688 + - -8.171875 + - 3.0625 + - 6.2382813 + - 0.23913574 + - 8.5234375 + - -3.0488281 + - -1.9902344 + - 4.5351563 + - 3.2519531 + - 0.7084961 + - -2.8632813 + - 1.2373047 + - -6.3320313 + - 1.2314453 + - 1.2734375 + - -2.9257813 + - 1.3251953 + - -2.2890625 + - 0.7158203 + - -6.4804688 + - -4.09375 + - -2.4257813 + - -0.36157227 + - 1.6533203 + - -6.1914063 + - 4.1601563 + - -13.125 + - -1.1171875 + - 6.5039063 + - 3.3125 + - 4.0625 + - 2.9902344 + - 2.9628906 + - 7.8007813 + - -2.71875 + - -3.8261719 + - 6.375 + - 3.1621094 + - -8.0859375 + - -1.3447266 + - -4.8710938 + - -2.1953125 + - -0.62402344 + - -1.9199219 + - 4.578125 + - -3.9277344 + - -3.0625 + - -1.4238281 + - 20.28125 + - -1.7685547 + - 2.109375 + - -2.984375 + - 0.41845703 + - -4.765625 + - -0.69091797 + - 1.3945313 + - 2.0566406 + - 3.9042969 + - 1.7929688 + - 0.6171875 + - -2.4375 + - -0.94677734 + - 5.6601563 + - 0.81689453 + - 0.041137695 + - -1.7695313 + - 6.6289063 + - 0.49926758 + - -6.5 + - -3.3007813 + - -12.1796875 + - -0.38208008 + - -0.8300781 + - -1.9794922 + - 5.0234375 + - -3.1015625 + - 0.17346191 + - 10.1328125 + - 4.4179688 + - -3.2011719 + - 1.7480469 + - -8.9765625 + - 1.4941406 + - 6.7226563 + - 9.0390625 + - -2.6210938 + - -5.4492188 + - 4.4453125 + - -0.6225586 + - -5.9101563 + - 0.28149414 + - 4.0273438 + - 7.40625 + - 4.3203125 + - -6.875 + - -2.65625 + - -4.1875 + - -1.9970703 + - 1.03125 + - -9.4453125 + - -6.1835938 + - -4.7851563 + - -10.5 + - -0.062408447 + - 1.7246094 + - -5.8710938 + - 6.8046875 + - -2.2578125 + - -2.8085938 + - 5.453125 + - -2.2617188 + - 7.625 + - 0.67285156 + - 0.17578125 + - -12.84375 + - -0.18786621 + - -1.0966797 + - 4.1523438 + - -2.2402344 + - 3.0917969 + - 3.5488281 + - -7.2695313 + - 0.022140503 + - 1.2539063 + - -9.3203125 + - -8.265625 + - -2.2792969 + - -0.7631836 + - 6.8046875 + - -1.9013672 + - -11.8046875 + - -0.24047852 + - 3.5859375 + - -2.7890625 + - 0.5673828 + - -5.1953125 + - -2.3183594 + - -3.0273438 + - -4.1875 + - 3.7460938 + - -2.4316406 + - -2.0429688 + - -3.3789063 + - -2.3417969 + - 3.6582031 + - 9.1484375 + - -5.2226563 + - 3.0546875 + - 0.36157227 + - -1.1728516 + - -5.2539063 + - 2.1308594 + - -10.15625 + - 1.9169922 + - 0.2722168 + - 0.60839844 + - 3.9472656 + - 5.1679688 + - 0.6791992 + - -10.6953125 + - -2.1757813 + - 1.3056641 + - -1.2558594 + - 2.8378906 + - -1.3095703 + - -0.5136719 + - 1.3476563 + - 12.265625 + - -1.0419922 + - 4.5078125 + - 7.2890625 + - 1.2998047 + - 1.9511719 + - 3.9648438 + - 1.5673828 + - 1.5996094 + - -2.0605469 + - 1.8046875 + - 4.3632813 + - -7.7304688 + - 2.1425781 + - 0.7246094 + - -4.0976563 + - 0.8198242 + - 12.375 + - -7.5390625 + - -10 + - 1.4423828 + - -0.7089844 + - 0.7211914 + - 9.21875 + - -7.203125 + - 1.078125 + - 4.21875 + - 2.0488281 + - -4.5898438 + - -6.4414063 + - -4.6914063 + - -3.4394531 + - -1.21875 + - 17.265625 + - 2.96875 + - 1.1923828 + - 5.8125 + - -4.9609375 + - 2.5761719 + - -2.640625 + - -1.4892578 + - -8.359375 + - -0.8305664 + - 3.8242188 + - -2.7851563 + - -0.5551758 + - 2.0800781 + - 10.5078125 + - 6.3085938 + - 4.9375 + - 4.046875 + - -6.2148438 + - -1.1171875 + - 3.1464844 + - -5.7695313 + - 6.1328125 + - 2.7324219 + - -0.15002441 + - -6.1601563 + - 0.4855957 + - -5.0703125 + - -4.9296875 + - 2.6796875 + - 4.75 + - 4.1015625 + - -3.7539063 + - 1.7714844 + - 1.0996094 + - -1.8242188 + - -4.1914063 + - 1.6787109 + - 7.546875 + - 4.984375 + - 2.171875 + - -5.7109375 + - -0.77441406 + - 1.6904297 + - -3.1386719 + - -3.1113281 + - -9.4765625 + - -3.6054688 + - 7.015625 + - 1.6132813 + - -2.328125 + - -6.1367188 + - 2.8710938 + - 2.4628906 + - -1.3759766 + - 2.9160156 + - 0.4428711 + - 2.3945313 + - -1.7441406 + - -0.88671875 + - -0.1694336 + - 1.5869141 + - 0.16357422 + - -3.2832031 + - -0.15612793 + - 5.3320313 + - 5.5351563 + - -5.1640625 + - -2.4960938 + - 0.9658203 + - 12.1640625 + - -1.7626953 + - -1.1142578 + - 0.7270508 + - 8.3671875 + - 4.140625 + - -6.8867188 + - 1.8105469 + - 6.4296875 + - -4.1367188 + - 0.45458984 + - 2.5019531 + - 6.0742188 + - -1.1699219 + - 1.0537109 + - 5.3554688 + - 3.8125 + - -2.2871094 + - 0.9238281 + - 4.9296875 + - 1.9853516 + - 9.484375 + - 0.5942383 + - -2.4199219 + - -1.9736328 + - 2.2128906 + - -3.1914063 + - -10.7734375 + - 0.5703125 + - -6.2734375 + - 4.9804688 + - 1.1855469 + - 0.4416504 + - 3.8925781 + - -2.8496094 + - -2.1054688 + - 2.5566406 + - -0.7841797 + - -1.8798828 + - -8.125 + - 3.7285156 + - 0.09362793 + - -4.3515625 + - -2.8378906 + - 4.8515625 + - 1.8964844 + - -2.6269531 + - 1.4208984 + - 0.90185547 + - 2.3457031 + - -9.125 + - 1.0859375 + - 1.3027344 + - -2.2382813 + - 4.875 + - -3.1582031 + - -6.3789063 + - -1.2128906 + - 4.7773438 + - 0.27392578 + - -0.43188477 + - 5.8125 + - -4.1367188 + - -4.4570313 + - -7.8046875 + - -3.3515625 diff --git a/backends/candle/tests/test_flash_qwen2.rs b/backends/candle/tests/test_flash_qwen2.rs new file mode 100644 index 00000000..38e45553 --- /dev/null +++ b/backends/candle/tests/test_flash_qwen2.rs @@ -0,0 +1,77 @@ +#![allow(dead_code, unused_imports)] + +mod common; + +use crate::common::{sort_embeddings, SnapshotEmbeddings}; +use anyhow::Result; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; +use text_embeddings_backend_candle::CandleBackend; +use text_embeddings_backend_core::{Backend, ModelType, Pool}; +use tokenizers::processors::sequence::Sequence; +use tokenizers::processors::template::TemplateProcessing; +use tokenizers::{PostProcessorWrapper, Tokenizer}; + +#[test] +#[serial_test::serial] +#[cfg(all(feature = "cuda", feature = "flash-attn"))] +fn test_flash_qwen2() -> Result<()> { + let model_root = download_artifacts("Alibaba-NLP/gte-Qwen2-1.5B-instruct", None)?; + let mut tokenizer = load_tokenizer(&model_root)?; + // Qwen2 updates the post processor manually instead of into the tokenizer.json... + // https://huggingface.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct/blob/main/tokenization_qwen.py#L246 + let template = TemplateProcessing::builder() + .try_single("$A:0 <|endoftext|>:0") + .unwrap() + .try_pair("$A:0 <|endoftext|>:0 $B:1 <|endoftext|>:1") + .unwrap() + .special_tokens(vec![("<|endoftext|>", 151643)]) + .build() + .unwrap(); + match tokenizer.get_post_processor() { + None => tokenizer.with_post_processor(template), + Some(post_processor) => { + let post_processor = Sequence::new(vec![ + post_processor.clone(), + PostProcessorWrapper::Template(template), + ]); + tokenizer.with_post_processor(post_processor) + } + }; + + let backend = CandleBackend::new( + model_root, + "float16".to_string(), + ModelType::Embedding(Pool::LastToken), + )?; + + let input_batch = batch( + vec![ + tokenizer.encode("What is Deep Learning?", true).unwrap(), + tokenizer.encode("Deep Learning is...", true).unwrap(), + tokenizer.encode("What is Deep Learning?", true).unwrap(), + ], + [0, 1, 2].to_vec(), + vec![], + ); + + let matcher = cosine_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); + insta::assert_yaml_snapshot!("qwen2_batch", embeddings_batch, &matcher); + + let input_single = batch( + vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], + [0].to_vec(), + vec![], + ); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("qwen2_single", embeddings_single, &matcher); + assert_eq!(embeddings_batch[0], embeddings_single[0]); + assert_eq!(embeddings_batch[2], embeddings_single[0]); + + Ok(()) +} diff --git a/docs/source/en/supported_models.md b/docs/source/en/supported_models.md index f638639f..1a0f997b 100644 --- a/docs/source/en/supported_models.md +++ b/docs/source/en/supported_models.md @@ -21,7 +21,7 @@ We are continually expanding our support for other model types and plan to inclu ## Supported embeddings models Text Embeddings Inference currently supports Nomic, BERT, CamemBERT, XLM-RoBERTa models with absolute positions, JinaBERT -model with Alibi positions and Mistral, Alibabe GTE models with Rope positions. +model with Alibi positions and Mistral, Alibaba GTE and Qwen2 models with Rope positions. Below are some examples of the currently supported models: diff --git a/router/src/lib.rs b/router/src/lib.rs index f5fd102c..57dcecb6 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -35,7 +35,9 @@ use text_embeddings_core::infer::Infer; use text_embeddings_core::queue::Queue; use text_embeddings_core::tokenization::Tokenization; use text_embeddings_core::TextEmbeddingsError; -use tokenizers::Tokenizer; +use tokenizers::processors::sequence::Sequence; +use tokenizers::processors::template::TemplateProcessing; +use tokenizers::{PostProcessorWrapper, Tokenizer}; use tracing::Span; pub use logging::init_logging; @@ -144,6 +146,28 @@ pub async fn run( "tokenizer.json not found. text-embeddings-inference only supports fast tokenizers", ); tokenizer.with_padding(None); + // Qwen2 updates the post processor manually instead of into the tokenizer.json... + // https://huggingface.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct/blob/main/tokenization_qwen.py#L246 + if config.model_type == "qwen2" { + let template = TemplateProcessing::builder() + .try_single("$A:0 <|endoftext|>:0") + .unwrap() + .try_pair("$A:0 <|endoftext|>:0 $B:1 <|endoftext|>:1") + .unwrap() + .special_tokens(vec![("<|endoftext|>", 151643)]) + .build() + .unwrap(); + match tokenizer.get_post_processor() { + None => tokenizer.with_post_processor(template), + Some(post_processor) => { + let post_processor = Sequence::new(vec![ + post_processor.clone(), + PostProcessorWrapper::Template(template), + ]); + tokenizer.with_post_processor(post_processor) + } + }; + } // Position IDs offset. Used for Roberta and camembert. let position_offset = if &config.model_type == "xlm-roberta" From a0549e625b7c9045257d61d302322d9b64fc7395 Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:16:12 +0200 Subject: [PATCH 09/36] v1.4.0 --- Cargo.lock | 91 ++++++++++++++++++------------ Cargo.toml | 2 +- README.md | 24 ++++---- docs/openapi.json | 2 +- docs/source/en/private_models.md | 2 +- docs/source/en/quick_tour.md | 6 +- docs/source/en/supported_models.md | 12 ++-- 7 files changed, 80 insertions(+), 59 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c619481..a42181cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -251,7 +251,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.0", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-util", "itoa", "matchit", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.3.0" +version = "1.4.0" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -636,9 +636,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.101" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" dependencies = [ "jobserver", "libc", @@ -687,9 +687,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", "clap_derive", @@ -697,9 +697,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", @@ -709,9 +709,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.5" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" dependencies = [ "bytes", "futures-channel", @@ -1716,7 +1716,7 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-util", "log", "rustls 0.23.10", @@ -1761,7 +1761,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-util", "native-tls", "tokio", @@ -1771,16 +1771,16 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", - "hyper 1.3.1", + "hyper 1.4.0", "pin-project-lite", "socket2", "tokio", @@ -2164,7 +2164,7 @@ checksum = "bf0af7a0d7ced10c0151f870e5e3f3f8bc9ffc5992d32873566ca1f9169ae776" dependencies = [ "base64 0.22.1", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-rustls", "hyper-util", "indexmap 2.2.6", @@ -2209,9 +2209,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -2418,23 +2418,25 @@ dependencies = [ [[package]] name = "object" -version = "0.36.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] [[package]] name = "oci-spec" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e423c4f827362c0d8d8da4b1f571270f389ebde73bcd3240a3d23c6d6f61d0f0" +checksum = "098bc31d7c87110e22090eb082903caaed19f06319f63b6f7d7ed273bc8bdaec" dependencies = [ "derive_builder", "getset", "serde", "serde_json", + "strum", + "strum_macros", "thiserror", ] @@ -2731,9 +2733,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "4.2.0" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" +checksum = "19ff2cf528c6c03d9ed653d6c4ce1dc0582dc4af309790ad92f07c1cd551b0be" dependencies = [ "num-traits", ] @@ -3327,7 +3329,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.0", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", @@ -3611,9 +3613,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.118" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -3800,6 +3802,25 @@ 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" + +[[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.68", +] + [[package]] name = "subtle" version = "2.6.1" @@ -3911,7 +3932,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.3.0" +version = "1.4.0" dependencies = [ "clap", "text-embeddings-backend-candle", @@ -3923,7 +3944,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.3.0" +version = "1.4.0" dependencies = [ "accelerate-src", "anyhow", @@ -3953,7 +3974,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.3.0" +version = "1.4.0" dependencies = [ "clap", "nohash-hasher", @@ -3962,7 +3983,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.3.0" +version = "1.4.0" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3976,7 +3997,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.3.0" +version = "1.4.0" dependencies = [ "async-channel", "hf-hub", @@ -3991,7 +4012,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.3.0" +version = "1.4.0" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 54dd6092..9e1c26cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.3.0" +version = "1.4.0" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" diff --git a/README.md b/README.md index 86bb438f..837f3f54 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ model=BAAI/bge-large-en-v1.5 revision=refs/pr/5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision ``` And then you can make requests like @@ -309,13 +309,13 @@ Text Embeddings Inference ships with multiple Docker images that you can use to | Architecture | Image | |-------------------------------------|-------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.3 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.4 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.3 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.3 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.3 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.3 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.3 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.4 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.4 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.4 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.4 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.4 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. @@ -344,7 +344,7 @@ model= volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run token= -docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` ### Using Re-rankers models @@ -362,7 +362,7 @@ model=BAAI/bge-reranker-large revision=refs/pr/4 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision ``` And then you can rank the similarity between a query and a list of texts with: @@ -382,7 +382,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: @@ -402,7 +402,7 @@ You can choose to activate SPLADE pooling for Bert and Distilbert MaskedLM archi model=naver/efficient-splade-VI-BT-large-query volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --pooling splade +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --pooling splade ``` Once you have deployed the model you can use the `/embed_sparse` endpoint to get the sparse embedding: @@ -432,7 +432,7 @@ model=BAAI/bge-large-en-v1.5 revision=refs/pr/5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3-grpc --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4-grpc --model-id $model --revision $revision ``` ```shell diff --git a/docs/openapi.json b/docs/openapi.json index d2f36301..b90189e9 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "1.3.0" + "version": "1.4.0" }, "paths": { "/decode": { diff --git a/docs/source/en/private_models.md b/docs/source/en/private_models.md index 17012443..b5ae060d 100644 --- a/docs/source/en/private_models.md +++ b/docs/source/en/private_models.md @@ -37,5 +37,5 @@ model= volume=$PWD/data token= -docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index a481b278..b557f267 100644 --- a/docs/source/en/quick_tour.md +++ b/docs/source/en/quick_tour.md @@ -34,7 +34,7 @@ model=BAAI/bge-large-en-v1.5 revision=refs/pr/5 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision ``` @@ -69,7 +69,7 @@ model=BAAI/bge-reranker-large revision=refs/pr/4 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision ``` Once you have deployed a model, you can use the `rerank` endpoint to rank the similarity between a query and a list @@ -90,7 +90,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.3 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: diff --git a/docs/source/en/supported_models.md b/docs/source/en/supported_models.md index 1a0f997b..aee56971 100644 --- a/docs/source/en/supported_models.md +++ b/docs/source/en/supported_models.md @@ -66,13 +66,13 @@ Find the appropriate Docker image for your hardware in the following table: | Architecture | Image | |-------------------------------------|--------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.3 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.4 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.3 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.3 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.3 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.3 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.3 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.4 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.4 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.4 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.4 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.4 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. From acbbb9250def8ce8b2cb32e3ab054bebe4695310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Kaunism=C3=A4ki?= Date: Wed, 3 Jul 2024 15:03:27 +0200 Subject: [PATCH 10/36] tokenizer max limit on input size (#324) --- core/src/tokenization.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index c33bfafc..fece3a98 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -7,6 +7,8 @@ use tokenizers::{TruncationDirection, TruncationParams, TruncationStrategy}; use tokio::sync::oneshot; use tracing::{instrument, Span}; +static MAX_CHAR_MULTIPLIER: usize = 250; + /// Validation #[derive(Debug, Clone)] pub struct Tokenization { @@ -215,6 +217,7 @@ fn tokenizer_worker( let _ = response_tx.send(tokenize_input( inputs, add_special_tokens, + max_input_length, None, default_prompt_clone, prompt_name, @@ -269,9 +272,11 @@ fn prepare_pre_prompt( Ok(pre_prompt) } +#[allow(clippy::too_many_arguments)] fn tokenize_input( inputs: EncodingInput, add_special_tokens: bool, + max_input_length: usize, truncate_params: Option, default_prompt: Option, prompt_name: Option, @@ -280,6 +285,14 @@ fn tokenize_input( ) -> Result<(Option, RawEncoding), TextEmbeddingsError> { let pre_prompt = prepare_pre_prompt(default_prompt, prompt_name, prompts)?; + let input_chars = inputs.count_chars(); + let limit = max_input_length * MAX_CHAR_MULTIPLIER; + if input_chars > limit { + return Err(TextEmbeddingsError::Validation(format!( + "`inputs` must have less than {limit} characters. Given: {input_chars}" + ))); + } + let encoding = match inputs { // encode input EncodingInput::Single(s) => { @@ -359,6 +372,7 @@ fn encode_input( let (_, encoding) = tokenize_input( inputs, true, + max_input_length, truncate_params, default_prompt, prompt_name, @@ -404,6 +418,14 @@ impl EncodingInput { EncodingInput::Ids(v) => v.is_empty(), } } + + fn count_chars(&self) -> usize { + match self { + EncodingInput::Single(s) => s.chars().count(), + EncodingInput::Dual(s1, s2) => s1.chars().count() + s2.chars().count(), + EncodingInput::Ids(v) => v.len(), + } + } } impl From for EncodingInput { From 1e076c7590e636f2e4bdc85480e49e7ebaf5b745 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 4 Jul 2024 17:26:31 +0200 Subject: [PATCH 11/36] docs: air-gapped deployments (#326) --- README.md | 44 ++++++++++++++++++++++++++---------- docs/source/en/quick_tour.md | 23 +++++++++++++++++++ router/src/main.rs | 4 ++-- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 837f3f54..8f9bf9d4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ length of 512 tokens: - [Docker Images](#docker-images) - [API Documentation](#api-documentation) - [Using a private or gated model](#using-a-private-or-gated-model) + - [Air gapped deployment](#air-gapped-deployment) - [Using Re-rankers models](#using-re-rankers-models) - [Using Sequence Classification models](#using-sequence-classification-models) - [Using SPLADE pooling](#using-splade-pooling) @@ -100,11 +101,10 @@ Below are some examples of the currently supported models: ### Docker ```shell -model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 +model=Alibaba-NLP/gte-base-en-v1.5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` And then you can make requests like @@ -347,6 +347,29 @@ token= docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` +### Air gapped deployment + +To deploy Text Embeddings Inference in an air-gapped environment, first download the weights and then mount them inside +the container using a volume. + +For example: + +```shell +# (Optional) create a `models` directory +mkdir models +cd models + +# Make sure you have git-lfs installed (https://git-lfs.com) +git lfs install +git clone https://huggingface.co/Alibaba-NLP/gte-base-en-v1.5 + +# Set the models directory as the volume path +volume=$PWD + +# Mount the models directory inside the container with a volume and set the model ID +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id /data/gte-base-en-v1.5 +``` + ### Using Re-rankers models `text-embeddings-inference` v0.4.0 added support for CamemBERT, RoBERTa and XLM-RoBERTa Sequence Classification models. @@ -428,11 +451,10 @@ found [here](https://github.com/huggingface/text-embeddings-inference/blob/main/ You can use the gRPC API by adding the `-grpc` tag to any TEI Docker image. For example: ```shell -model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 +model=Alibaba-NLP/gte-base-en-v1.5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4-grpc --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4-grpc --model-id $model ``` ```shell @@ -463,10 +485,9 @@ cargo install --path router -F metal You can now launch Text Embeddings Inference on CPU with: ```shell -model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 +model=Alibaba-NLP/gte-base-en-v1.5 -text-embeddings-router --model-id $model --revision $revision --port 8080 +text-embeddings-router --model-id $model --port 8080 ``` **Note:** on some machines, you may also need the OpenSSL libraries and gcc. On Linux machines, run: @@ -502,10 +523,9 @@ cargo install --path router -F candle-cuda -F http --no-default-features You can now launch Text Embeddings Inference on GPU with: ```shell -model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 +model=Alibaba-NLP/gte-base-en-v1.5 -text-embeddings-router --model-id $model --revision $revision --port 8080 +text-embeddings-router --model-id $model --port 8080 ``` ## Docker build diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index b557f267..74d68f0d 100644 --- a/docs/source/en/quick_tour.md +++ b/docs/source/en/quick_tour.md @@ -121,3 +121,26 @@ curl 127.0.0.1:8080/predict \ -d '{"inputs":[["I like you."], ["I hate pineapples"]]}' \ -H 'Content-Type: application/json' ``` + +## Air gapped deployment + +To deploy Text Embeddings Inference in an air-gapped environment, first download the weights and then mount them inside +the container using a volume. + +For example: + +```shell +# (Optional) create a `models` directory +mkdir models +cd models + +# Make sure you have git-lfs installed (https://git-lfs.com) +git lfs install +git clone https://huggingface.co/Alibaba-NLP/gte-base-en-v1.5 + +# Set the models directory as the volume path +volume=$PWD + +# Mount the models directory inside the container with a volume and set the model ID +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id /data/gte-base-en-v1.5 +``` diff --git a/router/src/main.rs b/router/src/main.rs index a72caa8b..e9cf084f 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -14,10 +14,10 @@ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; struct Args { /// The name of the model to load. /// Can be a MODEL_ID as listed on like - /// `thenlper/gte-base`. + /// `Alibaba-NLP/gte-base-en-v1.5`. /// Or it can be a local directory containing the necessary files /// as saved by `save_pretrained(...)` methods of transformers - #[clap(default_value = "thenlper/gte-base", long, env)] + #[clap(default_value = "Alibaba-NLP/gte-base-en-v1.5", long, env)] #[redact(partial)] model_id: String, From 052037c0b63b9a80d10211ca0996089fd1879430 Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:34:25 +0200 Subject: [PATCH 12/36] docs: remove revisions --- README.md | 21 ++++++++++----------- docs/source/en/quick_tour.md | 7 ++----- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 8f9bf9d4..288225b7 100644 --- a/README.md +++ b/README.md @@ -92,16 +92,16 @@ Text Embeddings Inference currently supports CamemBERT, and XLM-RoBERTa Sequence Below are some examples of the currently supported models: -| Task | Model Type | Model ID | Revision | -|--------------------|-------------|---------------------------------------------------------------------------------------------|-------------| -| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-large](https://huggingface.co/BAAI/bge-reranker-large) | `refs/pr/4` | -| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base) | `refs/pr/5` | -| Sentiment Analysis | RoBERTa | [SamLowe/roberta-base-go_emotions](https://huggingface.co/SamLowe/roberta-base-go_emotions) | | +| Task | Model Type | Model ID | +|--------------------|-------------|---------------------------------------------------------------------------------------------| +| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-large](https://huggingface.co/BAAI/bge-reranker-large) | +| Re-Ranking | XLM-RoBERTa | [BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base) | +| Sentiment Analysis | RoBERTa | [SamLowe/roberta-base-go_emotions](https://huggingface.co/SamLowe/roberta-base-go_emotions) | ### Docker ```shell -model=Alibaba-NLP/gte-base-en-v1.5 +model=BAAI/bge-large-en-v1.5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model @@ -382,10 +382,9 @@ downstream performance. ```shell model=BAAI/bge-reranker-large -revision=refs/pr/4 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` And then you can rank the similarity between a query and a list of texts with: @@ -451,7 +450,7 @@ found [here](https://github.com/huggingface/text-embeddings-inference/blob/main/ You can use the gRPC API by adding the `-grpc` tag to any TEI Docker image. For example: ```shell -model=Alibaba-NLP/gte-base-en-v1.5 +model=BAAI/bge-large-en-v1.5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4-grpc --model-id $model @@ -485,7 +484,7 @@ cargo install --path router -F metal You can now launch Text Embeddings Inference on CPU with: ```shell -model=Alibaba-NLP/gte-base-en-v1.5 +model=BAAI/bge-large-en-v1.5 text-embeddings-router --model-id $model --port 8080 ``` @@ -523,7 +522,7 @@ cargo install --path router -F candle-cuda -F http --no-default-features You can now launch Text Embeddings Inference on GPU with: ```shell -model=Alibaba-NLP/gte-base-en-v1.5 +model=BAAI/bge-large-en-v1.5 text-embeddings-router --model-id $model --port 8080 ``` diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index 74d68f0d..0baa1f43 100644 --- a/docs/source/en/quick_tour.md +++ b/docs/source/en/quick_tour.md @@ -31,15 +31,13 @@ Finally, deploy your model. Let's say you want to use `BAAI/bge-large-en-v1.5`. ```shell model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` -Here we pass a `revision=refs/pr/5` because the `safetensors` variant of this model is currently in a pull request. We also recommend sharing a volume with the Docker container (`volume=$PWD/data`) to avoid downloading weights every run. @@ -66,10 +64,9 @@ Let's say you want to use `BAAI/bge-reranker-large`: ```shell model=BAAI/bge-reranker-large -revision=refs/pr/4 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model ``` Once you have deployed a model, you can use the `rerank` endpoint to rank the similarity between a query and a list From 7b9245d8b1ca28ed4c7d82a80632a1b0e5adfbd1 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 5 Jul 2024 20:03:24 +0200 Subject: [PATCH 13/36] feat(onnx): add onnx runtime for better CPU perf (#328) --- Cargo.lock | 83 +++++++ Cargo.toml | 1 + Dockerfile | 38 +-- Dockerfile-arm64 | 92 ------- README.md | 8 +- backends/Cargo.toml | 4 + backends/ort/Cargo.toml | 17 ++ backends/ort/src/lib.rs | 395 ++++++++++++++++++++++++++++++ backends/src/dtype.rs | 34 ++- backends/src/lib.rs | 78 ++++++ core/src/download.rs | 50 +--- router/Cargo.toml | 1 + router/src/lib.rs | 11 +- router/src/main.rs | 4 +- router/tests/test_http_predict.rs | 13 +- router/tests/test_http_rerank.rs | 7 +- 16 files changed, 626 insertions(+), 210 deletions(-) delete mode 100644 Dockerfile-arm64 create mode 100644 backends/ort/Cargo.toml create mode 100644 backends/ort/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index a42181cb..0bdc7848 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2115,6 +2115,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "memchr" version = "2.7.4" @@ -2299,6 +2309,19 @@ dependencies = [ "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 = "nohash-hasher" version = "0.2.0" @@ -2341,6 +2364,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[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-traits" version = "0.2.19" @@ -2740,6 +2772,33 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ort" +version = "2.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bc80894094c6a875bfac64415ed456fa661081a278a035e22be661305c87e14" +dependencies = [ + "half", + "js-sys", + "ndarray", + "ort-sys", + "thiserror", + "tracing", + "web-sys", +] + +[[package]] +name = "ort-sys" +version = "2.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d9c1373fc813d3f024d394f621f4c6dde0734c79b1c17113c3bb5bf0084bbe" +dependencies = [ + "flate2", + "sha2", + "tar", + "ureq", +] + [[package]] name = "overload" version = "0.1.1" @@ -3163,6 +3222,12 @@ dependencies = [ "bitflags 2.6.0", ] +[[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" @@ -3935,8 +4000,11 @@ name = "text-embeddings-backend" version = "1.4.0" dependencies = [ "clap", + "hf-hub", + "serde_json", "text-embeddings-backend-candle", "text-embeddings-backend-core", + "text-embeddings-backend-ort", "text-embeddings-backend-python", "tokio", "tracing", @@ -3981,6 +4049,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "text-embeddings-backend-ort" +version = "1.4.0" +dependencies = [ + "anyhow", + "ndarray", + "nohash-hasher", + "ort", + "serde", + "serde_json", + "text-embeddings-backend-core", + "thiserror", + "tracing", +] + [[package]] name = "text-embeddings-backend-python" version = "1.4.0" diff --git a/Cargo.toml b/Cargo.toml index 9e1c26cd..a780aa27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "backends", "backends/candle", + "backends/ort", "backends/core", "backends/python", "backends/grpc-client", diff --git a/Dockerfile b/Dockerfile index 8c1368c0..a3612d87 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,22 +28,9 @@ ARG ACTIONS_CACHE_URL ARG ACTIONS_RUNTIME_TOKEN ARG SCCACHE_GHA_ENABLED -RUN wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \ -| gpg --dearmor | tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null && \ - echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | \ - tee /etc/apt/sources.list.d/oneAPI.list - -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - intel-oneapi-mkl-devel=2024.0.0-49656 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* - -RUN echo "int mkl_serv_intel_cpu_true() {return 1;}" > fakeintel.c && \ - gcc -shared -fPIC -o libfakeintel.so fakeintel.c - COPY --from=planner /usr/src/recipe.json recipe.json -RUN cargo chef cook --release --features candle --features mkl-dynamic --no-default-features --recipe-path recipe.json && sccache -s +RUN cargo chef cook --release --features ort --no-default-features --recipe-path recipe.json && sccache -s COPY backends backends COPY core core @@ -53,7 +40,7 @@ COPY Cargo.lock ./ FROM builder as http-builder -RUN cargo build --release --bin text-embeddings-router -F candle -F mkl-dynamic -F http --no-default-features && sccache -s +RUN cargo build --release --bin text-embeddings-router -F ort -F http --no-default-features && sccache -s FROM builder as grpc-builder @@ -65,35 +52,18 @@ RUN PROTOC_ZIP=protoc-21.12-linux-x86_64.zip && \ COPY proto proto -RUN cargo build --release --bin text-embeddings-router -F grpc -F candle -F mkl-dynamic --no-default-features && sccache -s +RUN cargo build --release --bin text-embeddings-router -F grpc -F ort --no-default-features && sccache -s FROM debian:bookworm-slim as base ENV HUGGINGFACE_HUB_CACHE=/data \ - PORT=80 \ - MKL_ENABLE_INSTRUCTIONS=AVX512_E4 \ - RAYON_NUM_THREADS=8 \ - LD_PRELOAD=/usr/local/libfakeintel.so \ - LD_LIBRARY_PATH=/usr/local/lib + PORT=80 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - libomp-dev \ ca-certificates \ libssl-dev \ - curl \ && rm -rf /var/lib/apt/lists/* -# Copy a lot of the Intel shared objects because of the mkl_serv_intel_cpu_true patch... -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.so.2 /usr/local/lib/libmkl_intel_lp64.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_thread.so.2 /usr/local/lib/libmkl_intel_thread.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so.2 /usr/local/lib/libmkl_core.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_vml_def.so.2 /usr/local/lib/libmkl_vml_def.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_def.so.2 /usr/local/lib/libmkl_def.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_vml_avx2.so.2 /usr/local/lib/libmkl_vml_avx2.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_vml_avx512.so.2 /usr/local/lib/libmkl_vml_avx512.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_avx2.so.2 /usr/local/lib/libmkl_avx2.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_avx512.so.2 /usr/local/lib/libmkl_avx512.so.2 -COPY --from=builder /usr/src/libfakeintel.so /usr/local/libfakeintel.so FROM base as grpc diff --git a/Dockerfile-arm64 b/Dockerfile-arm64 deleted file mode 100644 index e170a534..00000000 --- a/Dockerfile-arm64 +++ /dev/null @@ -1,92 +0,0 @@ -FROM lukemathwalker/cargo-chef:latest-rust-1.75-bookworm AS chef - -WORKDIR /usr/src - -ENV SCCACHE=0.5.4 -ENV RUSTC_WRAPPER=/usr/local/bin/sccache - -# Donwload and configure sccache -RUN curl -fsSL https://github.com/mozilla/sccache/releases/download/v$SCCACHE/sccache-v$SCCACHE-x86_64-unknown-linux-musl.tar.gz | tar -xzv --strip-components=1 -C /usr/local/bin sccache-v$SCCACHE-x86_64-unknown-linux-musl/sccache && \ - chmod +x /usr/local/bin/sccache - -FROM chef AS planner - -COPY backends backends -COPY core core -COPY router router -COPY Cargo.toml ./ -COPY Cargo.lock ./ - -RUN cargo chef prepare --recipe-path recipe.json - -FROM chef AS builder - -ARG GIT_SHA -ARG DOCKER_LABEL - -# sccache specific variables -ARG ACTIONS_CACHE_URL -ARG ACTIONS_RUNTIME_TOKEN -ARG SCCACHE_GHA_ENABLED - -RUN echo "int mkl_serv_intel_cpu_true() {return 1;}" > fakeintel.c && \ - gcc -shared -fPIC -o libfakeintel.so fakeintel.c - -COPY --from=planner /usr/src/recipe.json recipe.json - -RUN cargo chef cook --release --features candle --no-default-features --recipe-path recipe.json && sccache -s - -COPY backends backends -COPY core core -COPY router router -COPY Cargo.toml ./ -COPY Cargo.lock ./ - -FROM builder as http-builder - -RUN cargo build --release --bin text-embeddings-router -F candle -F http --no-default-features && sccache -s - -FROM builder as grpc-builder - -RUN PROTOC_ZIP=protoc-21.12-linux-x86_64.zip && \ - curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP && \ - unzip -o $PROTOC_ZIP -d /usr/local bin/protoc && \ - unzip -o $PROTOC_ZIP -d /usr/local 'include/*' && \ - rm -f $PROTOC_ZIP - -COPY proto proto - -RUN cargo build --release --bin text-embeddings-router -F grpc -F candle --no-default-features && sccache -s - -FROM debian:bookworm-slim as base - -COPY --from=builder /usr/src/libfakeintel.so /usr/local/libfakeintel.so - -ENV HUGGINGFACE_HUB_CACHE=/data \ - PORT=80 \ - MKL_ENABLE_INSTRUCTIONS=AVX512_E4 \ - RAYON_NUM_THREADS=8 \ - LD_PRELOAD=/usr/local/libfakeintel.so \ - LD_LIBRARY_PATH=/usr/local/lib - -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - libomp-dev \ - ca-certificates \ - libssl-dev \ - curl \ - && rm -rf /var/lib/apt/lists/* - - -FROM base as grpc - -COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router - -ENTRYPOINT ["text-embeddings-router"] -CMD ["--json-output"] - -FROM base - -COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router - -ENTRYPOINT ["text-embeddings-router"] -CMD ["--json-output"] diff --git a/README.md b/README.md index 288225b7..8cbc2872 100644 --- a/README.md +++ b/README.md @@ -72,9 +72,9 @@ Below are some examples of the currently supported models: | MTEB Rank | Model Size | Model Type | Model ID | |-----------|---------------------|-------------|--------------------------------------------------------------------------------------------------| | 1 | 7B (Very Expensive) | Mistral | [Salesforce/SFR-Embedding-2_R](https://hf.co/Salesforce/SFR-Embedding-2_R) | -| 2 | 7B (Very Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-7B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-7B-instruct) | -| 9 | 1.5B (Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-1.5B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct) | -| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](Alibaba-NLP/gte-large-en-v1.5) | +| 2 | 7B (Very Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-7B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-7B-instruct) | +| 9 | 1.5B (Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-1.5B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct) | +| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](https://hf.co/Alibaba-NLP/gte-large-en-v1.5) | | 20 | 0.3B | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | | 24 | 0.5B | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | | N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | @@ -568,7 +568,7 @@ supported via Docker. As such inference will be CPU bound and most likely pretty M1/M2 ARM CPU. ``` -docker build . -f Dockerfile-arm64 --platform=linux/arm64 +docker build . -f Dockerfile --platform=linux/arm64 ``` ## Examples diff --git a/backends/Cargo.toml b/backends/Cargo.toml index d5659b18..f29283ad 100644 --- a/backends/Cargo.toml +++ b/backends/Cargo.toml @@ -7,15 +7,19 @@ homepage.workspace = true [dependencies] clap = { workspace = true, optional = true } +hf-hub = { workspace = true } +serde_json = { workspace = true } text-embeddings-backend-core = { path = "core" } text-embeddings-backend-python = { path = "python", optional = true } text-embeddings-backend-candle = { path = "candle", optional = true } +text-embeddings-backend-ort = { path = "ort", optional = true } tokio = { workspace = true } tracing = { workspace = true } [features] clap = ["dep:clap", "text-embeddings-backend-core/clap"] python = ["dep:text-embeddings-backend-python"] +ort = ["dep:text-embeddings-backend-ort"] candle = ["dep:text-embeddings-backend-candle"] cuda = ["text-embeddings-backend-candle?/cuda"] metal = ["text-embeddings-backend-candle?/metal"] diff --git a/backends/ort/Cargo.toml b/backends/ort/Cargo.toml new file mode 100644 index 00000000..9cbde87e --- /dev/null +++ b/backends/ort/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "text-embeddings-backend-ort" +version.workspace = true +edition.workspace = true +authors.workspace = true +homepage.workspace = true + +[dependencies] +anyhow = { workspace = true } +nohash-hasher = { workspace = true } +ndarray = "0.15.6" +ort = { version = "2.0.0-rc.2", default-features = false, features = ["download-binaries", "half", "onednn", "ndarray"] } +text-embeddings-backend-core = { path = "../core" } +tracing = { workspace = true } +thiserror = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } diff --git a/backends/ort/src/lib.rs b/backends/ort/src/lib.rs new file mode 100644 index 00000000..6951d3b4 --- /dev/null +++ b/backends/ort/src/lib.rs @@ -0,0 +1,395 @@ +use ndarray::{s, Axis}; +use nohash_hasher::BuildNoHashHasher; +use ort::{GraphOptimizationLevel, Session}; +use std::collections::HashMap; +use std::ops::{Div, Mul}; +use std::path::PathBuf; +use text_embeddings_backend_core::{ + Backend, BackendError, Batch, Embedding, Embeddings, ModelType, Pool, Predictions, +}; + +pub struct OrtBackend { + session: Session, + pool: Pool, + type_id_name: Option, +} + +impl OrtBackend { + pub fn new( + model_path: PathBuf, + dtype: String, + model_type: ModelType, + ) -> Result { + // Check dtype + if &dtype == "float32" { + } else { + return Err(BackendError::Start(format!( + "DType {dtype} is not supported" + ))); + }; + + // Check model type + let pool = match model_type { + ModelType::Classifier => Pool::Cls, + ModelType::Embedding(pool) => match pool { + Pool::Splade | Pool::LastToken => { + return Err(BackendError::Start(format!( + "Pooling {pool} is not supported for this backend. Use `candle` backend instead." + ))); + } + pool => pool, + }, + }; + + // Get model path + let onnx_path = { + let default_path = model_path.join("model.onnx"); + match default_path.exists() { + true => default_path, + false => model_path.join("onnx/model.onnx"), + } + }; + + // Start onnx session + let session = Session::builder() + .s()? + .with_optimization_level(GraphOptimizationLevel::Level3) + .s()? + .commit_from_file(onnx_path) + .s()?; + + // Check if the model requires type tokens + let mut type_id_name = None; + for input in &session.inputs { + if &input.name == "token_type_ids" || &input.name == "input_type" { + type_id_name = Some(input.name.clone()); + break; + } + } + + Ok(Self { + session, + pool, + type_id_name, + }) + } +} + +impl Backend for OrtBackend { + fn max_batch_size(&self) -> Option { + Some(8) + } + + fn health(&self) -> Result<(), BackendError> { + Ok(()) + } + + fn is_padded(&self) -> bool { + true + } + + fn embed(&self, batch: Batch) -> Result { + let batch_size = batch.len(); + let max_length = batch.max_length as usize; + + // Whether a least one of the request in the batch is padded + let mut masking = false; + + let (input_ids, type_ids, input_lengths, attention_mask) = { + let elems = batch_size * max_length; + + if batch_size > 1 { + // Prepare padded batch + let mut input_ids = Vec::with_capacity(elems); + let mut type_ids = Vec::with_capacity(elems); + let mut attention_mask = Vec::with_capacity(elems); + let mut input_lengths = Vec::with_capacity(batch_size); + + for i in 0..batch_size { + let start = batch.cumulative_seq_lengths[i] as usize; + let end = batch.cumulative_seq_lengths[i + 1] as usize; + let seq_length = (end - start) as u32; + input_lengths.push(seq_length as f32); + + // Copy values + for j in start..end { + input_ids.push(batch.input_ids[j] as i64); + type_ids.push(batch.token_type_ids[j] as i64); + attention_mask.push(1_i64); + } + + // Add padding if needed + let padding = batch.max_length - seq_length; + if padding > 0 { + // Set bool to use attention mask + masking = true; + for _ in 0..padding { + input_ids.push(0); + type_ids.push(0); + attention_mask.push(0_i64); + } + } + } + (input_ids, type_ids, input_lengths, attention_mask) + } else { + let attention_mask = vec![1_i64; elems]; + + ( + batch.input_ids.into_iter().map(|v| v as i64).collect(), + batch.token_type_ids.into_iter().map(|v| v as i64).collect(), + vec![batch.max_length as f32], + attention_mask, + ) + } + }; + + // Create ndarrays + let input_ids = ndarray::Array2::from_shape_vec((batch_size, max_length), input_ids).e()?; + let attention_mask = + ndarray::Array2::from_shape_vec((batch_size, max_length), attention_mask).e()?; + let input_lengths = ndarray::Array1::from_vec(input_lengths); + + // Create onnx inputs + let inputs = match self.type_id_name.as_ref() { + Some(type_id_name) => { + // Add type ids to inputs + let type_ids = + ndarray::Array2::from_shape_vec((batch_size, max_length), type_ids).e()?; + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone(), type_id_name => type_ids].e()? + } + None => { + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone()] + .e()? + } + }; + + // Run model + let outputs = self.session.run(inputs).e()?; + // Get last_hidden_state ndarray + + let outputs = outputs + .get("last_hidden_state") + .or(outputs.get("token_embeddings")) + .ok_or(BackendError::Inference(format!( + "Unknown output keys: {:?}", + self.session.outputs + )))? + .try_extract_tensor::() + .e()? + .to_owned(); + + // Final embeddings struct + let mut embeddings = + HashMap::with_capacity_and_hasher(batch_size, BuildNoHashHasher::default()); + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + if has_pooling_requests { + let mut outputs = outputs.clone(); + + // Only use pooled_indices if at least one member of the batch ask for raw embeddings + let indices = if has_raw_requests { + let indices: Vec = + batch.pooled_indices.iter().map(|v| *v as usize).collect(); + + // Select values in the batch + outputs = outputs.select(Axis(0), &indices); + Some(indices) + } else { + None + }; + + let pooled_embeddings = match self.pool { + // CLS pooling + Pool::Cls => outputs.slice(s![.., 0, ..]).into_owned().into_dyn(), + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), + // Mean pooling + Pool::Mean => { + if masking { + let mut attention_mask = attention_mask; + + if let Some(indices) = indices { + // Select values in the batch + attention_mask = attention_mask.select(Axis(0), &indices); + }; + + // Cast and reshape + let attention_mask = attention_mask.mapv(|x| x as f32).insert_axis(Axis(2)); + + // Mask padded values + outputs = outputs.mul(attention_mask); + outputs.sum_axis(Axis(1)).div(input_lengths) + } else { + outputs.mean_axis(Axis(1)).unwrap() + } + } + Pool::Splade => unreachable!(), + }; + + for (i, e) in batch + .pooled_indices + .into_iter() + .zip(pooled_embeddings.rows()) + { + embeddings.insert(i as usize, Embedding::Pooled(e.to_vec())); + } + }; + + if has_raw_requests { + // Reshape outputs + let s = outputs.shape().to_vec(); + let outputs = outputs.into_shape((s[0] * s[1], s[2])).e()?; + + // We need to remove the padding tokens only if batch_size > 1 and there are some + // member of the batch that require pooling + // or if batch_size > 1 and the members of the batch have different lengths + let raw_embeddings = if (masking || has_pooling_requests) && batch_size > 1 { + let mut final_indices: Vec = Vec::with_capacity(batch_size * max_length); + + for i in batch.raw_indices.iter() { + let start = i * batch.max_length; + let i = *i as usize; + let length = + batch.cumulative_seq_lengths[i + 1] - batch.cumulative_seq_lengths[i]; + + for j in start..start + length { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j as usize); + } + } + + // Select the tokens with final indices + outputs.select(Axis(0), &final_indices) + } else { + outputs + }; + + // Used for indexing in the raw_embeddings tensor + let input_lengths: Vec = (0..batch_size) + .map(|i| { + (batch.cumulative_seq_lengths[i + 1] - batch.cumulative_seq_lengths[i]) as usize + }) + .collect(); + + let mut cumulative_length = 0; + for i in batch.raw_indices.into_iter() { + let length = input_lengths[i as usize]; + let e = raw_embeddings.slice(s![cumulative_length..cumulative_length + length, ..]); + let e = e.rows().into_iter().map(|v| v.to_vec()).collect(); + + embeddings.insert(i as usize, Embedding::All(e)); + cumulative_length += length; + } + } + + Ok(embeddings) + } + + fn predict(&self, batch: Batch) -> Result { + let batch_size = batch.len(); + let max_length = batch.max_length as usize; + + let (input_ids, type_ids, attention_mask) = { + let elems = batch_size * max_length; + + if batch_size > 1 { + // Prepare padded batch + let mut input_ids = Vec::with_capacity(elems); + let mut type_ids = Vec::with_capacity(elems); + let mut attention_mask = Vec::with_capacity(elems); + + for i in 0..batch_size { + let start = batch.cumulative_seq_lengths[i] as usize; + let end = batch.cumulative_seq_lengths[i + 1] as usize; + let seq_length = (end - start) as u32; + + // Copy values + for j in start..end { + input_ids.push(batch.input_ids[j] as i64); + type_ids.push(batch.token_type_ids[j] as i64); + attention_mask.push(1_i64); + } + + // Add padding if needed + let padding = batch.max_length - seq_length; + if padding > 0 { + for _ in 0..padding { + input_ids.push(0); + type_ids.push(0); + attention_mask.push(0_i64); + } + } + } + (input_ids, type_ids, attention_mask) + } else { + let attention_mask = vec![1_i64; elems]; + + ( + batch.input_ids.into_iter().map(|v| v as i64).collect(), + batch.token_type_ids.into_iter().map(|v| v as i64).collect(), + attention_mask, + ) + } + }; + + // Create ndarrays + let input_ids = ndarray::Array2::from_shape_vec((batch_size, max_length), input_ids).e()?; + let attention_mask = + ndarray::Array2::from_shape_vec((batch_size, max_length), attention_mask).e()?; + + // Create onnx inputs + let inputs = match self.type_id_name.as_ref() { + Some(type_id_name) => { + // Add type ids to inputs + let type_ids = + ndarray::Array2::from_shape_vec((batch_size, max_length), type_ids).e()?; + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone(), type_id_name => type_ids].e()? + } + None => { + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone()] + .e()? + } + }; + + // Run model + let outputs = self.session.run(inputs).e()?; + // Get last_hidden_state ndarray + let outputs = outputs["logits"] + .try_extract_tensor::() + .e()? + .to_owned(); + + let mut predictions = + HashMap::with_capacity_and_hasher(batch_size, BuildNoHashHasher::default()); + for (i, r) in outputs.rows().into_iter().enumerate() { + predictions.insert(i, r.to_vec()); + } + + Ok(predictions) + } +} + +pub trait WrapErr { + fn s(self) -> Result; + fn e(self) -> Result; +} + +impl WrapErr for Result { + fn s(self) -> Result { + self.map_err(|e| BackendError::Start(e.to_string())) + } + fn e(self) -> Result { + self.map_err(|e| BackendError::Inference(e.to_string())) + } +} + +impl WrapErr for Result { + fn s(self) -> Result { + self.map_err(|e| BackendError::Start(e.to_string())) + } + fn e(self) -> Result { + self.map_err(|e| BackendError::Inference(e.to_string())) + } +} diff --git a/backends/src/dtype.rs b/backends/src/dtype.rs index d2c896ce..53193ef7 100644 --- a/backends/src/dtype.rs +++ b/backends/src/dtype.rs @@ -12,11 +12,8 @@ pub enum DType { all(feature = "candle", not(feature = "accelerate")) ))] Float16, - // Float32 is not available on candle cuda - #[cfg(any(feature = "python", feature = "candle"))] + #[cfg(any(feature = "python", feature = "candle", feature = "ort"))] Float32, - // #[cfg(feature = "candle")] - // Q6K, } impl fmt::Display for DType { @@ -28,11 +25,32 @@ impl fmt::Display for DType { all(feature = "candle", not(feature = "accelerate")) ))] DType::Float16 => write!(f, "float16"), - // Float32 is not available on candle cuda - #[cfg(any(feature = "python", feature = "candle"))] + #[cfg(any(feature = "python", feature = "candle", feature = "ort"))] DType::Float32 => write!(f, "float32"), - // #[cfg(feature = "candle")] - // DType::Q6K => write!(f, "q6k"), + } + } +} + +#[allow(clippy::derivable_impls)] +impl Default for DType { + fn default() -> Self { + #[cfg(any( + feature = "accelerate", + feature = "mkl", + feature = "mkl-dynamic", + feature = "ort" + ))] + { + DType::Float32 + } + #[cfg(not(any( + feature = "accelerate", + feature = "mkl", + feature = "mkl-dynamic", + feature = "ort" + )))] + { + DType::Float16 } } } diff --git a/backends/src/lib.rs b/backends/src/lib.rs index 9b5d1762..2ee63279 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -1,5 +1,6 @@ mod dtype; +use hf_hub::api::tokio::{ApiError, ApiRepo}; use std::cmp::{max, min}; use std::path::PathBuf; use std::sync::Arc; @@ -17,6 +18,9 @@ pub use text_embeddings_backend_core::{ #[cfg(feature = "candle")] use text_embeddings_backend_candle::CandleBackend; +#[cfg(feature = "ort")] +use text_embeddings_backend_ort::OrtBackend; + #[cfg(feature = "python")] use text_embeddings_backend_python::PythonBackend; @@ -222,6 +226,13 @@ fn init_backend( .expect("Python Backend management thread failed")?, )); } + } else if cfg!(feature = "ort") { + #[cfg(feature = "ort")] + return Ok(Box::new(OrtBackend::new( + model_path, + dtype.to_string(), + model_type, + )?)); } Err(BackendError::NoBackend) } @@ -286,3 +297,70 @@ enum BackendCommand { oneshot::Sender>, ), } + +pub async fn download_weights(api: &ApiRepo) -> Result, ApiError> { + let model_files = if cfg!(feature = "python") || cfg!(feature = "candle") { + match download_safetensors(api).await { + Ok(p) => p, + Err(_) => { + tracing::warn!("safetensors weights not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); + tracing::info!("Downloading `pytorch_model.bin`"); + let p = api.get("pytorch_model.bin").await?; + vec![p] + } + } + } else if cfg!(feature = "ort") { + tracing::info!("Downloading `model.onnx`"); + match api.get("model.onnx").await { + Ok(p) => vec![p], + Err(err) => { + tracing::warn!("Could not download `model.onnx`: {err}"); + tracing::info!("Downloading `onnx/model.onnx`"); + let p = api.get("onnx/model.onnx").await?; + vec![p.parent().unwrap().to_path_buf()] + } + } + } else { + unreachable!() + }; + Ok(model_files) +} + +async fn download_safetensors(api: &ApiRepo) -> Result, ApiError> { + // Single file + tracing::info!("Downloading `model.safetensors`"); + match api.get("model.safetensors").await { + Ok(p) => return Ok(vec![p]), + Err(err) => tracing::warn!("Could not download `model.safetensors`: {}", err), + }; + + // Sharded weights + // Download and parse index file + tracing::info!("Downloading `model.safetensors.index.json`"); + let index_file = api.get("model.safetensors.index.json").await?; + let index_file_string: String = + std::fs::read_to_string(index_file).expect("model.safetensors.index.json is corrupted"); + let json: serde_json::Value = serde_json::from_str(&index_file_string) + .expect("model.safetensors.index.json is corrupted"); + + let weight_map = match json.get("weight_map") { + Some(serde_json::Value::Object(map)) => map, + _ => panic!("model.safetensors.index.json is corrupted"), + }; + + let mut safetensors_filenames = std::collections::HashSet::new(); + for value in weight_map.values() { + if let Some(file) = value.as_str() { + safetensors_filenames.insert(file.to_string()); + } + } + + // Download weight files + let mut safetensors_files = Vec::new(); + for n in safetensors_filenames { + tracing::info!("Downloading `{}`", n); + safetensors_files.push(api.get(&n).await?); + } + + Ok(safetensors_files) +} diff --git a/core/src/download.rs b/core/src/download.rs index 08220752..02ea484d 100644 --- a/core/src/download.rs +++ b/core/src/download.rs @@ -1,5 +1,6 @@ use hf_hub::api::tokio::{ApiError, ApiRepo}; use std::path::PathBuf; +use text_embeddings_backend::download_weights; use tracing::instrument; // Old classes used other config names than 'sentence_bert_config.json' @@ -25,15 +26,7 @@ pub async fn download_artifacts(api: &ApiRepo) -> Result { tracing::info!("Downloading `tokenizer.json`"); api.get("tokenizer.json").await?; - let model_files = match download_safetensors(api).await { - Ok(p) => p, - Err(_) => { - tracing::warn!("safetensors weights not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); - tracing::info!("Downloading `pytorch_model.bin`"); - let p = api.get("pytorch_model.bin").await?; - vec![p] - } - }; + let model_files = download_weights(api).await?; let model_root = model_files[0].parent().unwrap().to_path_buf(); tracing::info!("Model artifacts downloaded in {:?}", start.elapsed()); @@ -47,45 +40,6 @@ pub async fn download_pool_config(api: &ApiRepo) -> Result { Ok(pool_config_path) } -async fn download_safetensors(api: &ApiRepo) -> Result, ApiError> { - // Single file - tracing::info!("Downloading `model.safetensors`"); - match api.get("model.safetensors").await { - Ok(p) => return Ok(vec![p]), - Err(err) => tracing::warn!("Could not download `model.safetensors`: {}", err), - }; - - // Sharded weights - // Download and parse index file - tracing::info!("Downloading `model.safetensors.index.json`"); - let index_file = api.get("model.safetensors.index.json").await?; - let index_file_string: String = - std::fs::read_to_string(index_file).expect("model.safetensors.index.json is corrupted"); - let json: serde_json::Value = serde_json::from_str(&index_file_string) - .expect("model.safetensors.index.json is corrupted"); - - let weight_map = match json.get("weight_map") { - Some(serde_json::Value::Object(map)) => map, - _ => panic!("model.safetensors.index.json is corrupted"), - }; - - let mut safetensors_filenames = std::collections::HashSet::new(); - for value in weight_map.values() { - if let Some(file) = value.as_str() { - safetensors_filenames.insert(file.to_string()); - } - } - - // Download weight files - let mut safetensors_files = Vec::new(); - for n in safetensors_filenames { - tracing::info!("Downloading `{}`", n); - safetensors_files.push(api.get(&n).await?); - } - - Ok(safetensors_files) -} - #[instrument(skip_all)] pub async fn download_st_config(api: &ApiRepo) -> Result { // Try default path diff --git a/router/Cargo.toml b/router/Cargo.toml index 44e56015..bc42265b 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -81,6 +81,7 @@ mkl = ["text-embeddings-backend/mkl"] mkl-dynamic = ["text-embeddings-backend/mkl-dynamic"] accelerate = ["text-embeddings-backend/accelerate"] python = ["text-embeddings-backend/python"] +ort = ["text-embeddings-backend/ort"] candle = ["text-embeddings-backend/candle"] candle-cuda = ["candle", "text-embeddings-backend/flash-attn"] candle-cuda-turing = ["candle", "text-embeddings-backend/flash-attn-v1"] diff --git a/router/src/lib.rs b/router/src/lib.rs index 57dcecb6..86a0f884 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -235,16 +235,7 @@ pub async fn run( ); // Get dtype - let dtype = dtype.unwrap_or({ - #[cfg(any(feature = "accelerate", feature = "mkl", feature = "mkl-dynamic"))] - { - DType::Float32 - } - #[cfg(not(any(feature = "accelerate", feature = "mkl", feature = "mkl-dynamic")))] - { - DType::Float16 - } - }); + let dtype = dtype.unwrap_or_default(); // Create backend tracing::info!("Starting model backend"); diff --git a/router/src/main.rs b/router/src/main.rs index e9cf084f..a3c8d042 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -14,10 +14,10 @@ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; struct Args { /// The name of the model to load. /// Can be a MODEL_ID as listed on like - /// `Alibaba-NLP/gte-base-en-v1.5`. + /// `BAAI/bge-large-en-v1.5`. /// Or it can be a local directory containing the necessary files /// as saved by `save_pretrained(...)` methods of transformers - #[clap(default_value = "Alibaba-NLP/gte-base-en-v1.5", long, env)] + #[clap(default_value = "BAAI/bge-large-en-v1.5", long, env)] #[redact(partial)] model_id: String, diff --git a/router/tests/test_http_predict.rs b/router/tests/test_http_predict.rs index 6869f721..850e0874 100644 --- a/router/tests/test_http_predict.rs +++ b/router/tests/test_http_predict.rs @@ -16,12 +16,13 @@ pub struct SnapshotPrediction { #[tokio::test] #[cfg(feature = "http")] async fn test_predict() -> Result<()> { - start_server( - "SamLowe/roberta-base-go_emotions".to_string(), - None, - DType::Float32, - ) - .await?; + let model_id = if cfg!(feature = "ort") { + "SamLowe/roberta-base-go_emotions-onnx" + } else { + "SamLowe/roberta-base-go_emotions" + }; + + start_server(model_id.to_string(), None, DType::Float32).await?; let request = json!({ "inputs": "test" diff --git a/router/tests/test_http_rerank.rs b/router/tests/test_http_rerank.rs index 0c5b6079..920eca4d 100644 --- a/router/tests/test_http_rerank.rs +++ b/router/tests/test_http_rerank.rs @@ -17,12 +17,7 @@ pub struct SnapshotRank { #[tokio::test] #[cfg(feature = "http")] async fn test_rerank() -> Result<()> { - start_server( - "BAAI/bge-reranker-base".to_string(), - Some("refs/pr/5".to_string()), - DType::Float32, - ) - .await?; + start_server("BAAI/bge-reranker-base".to_string(), None, DType::Float32).await?; let request = json!({ "query": "test", From e496fe7af07ffd22aa75b23bb267b607b9f8d75e Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Mon, 8 Jul 2024 12:24:39 +0200 Subject: [PATCH 14/36] feat: add `/similarity` route (#331) --- Cargo.lock | 10 +++ docs/openapi.json | 172 ++++++++++++++++++++++++++++++++++++++ router/Cargo.toml | 1 + router/src/http/server.rs | 98 +++++++++++++++++++++- router/src/http/types.rs | 42 ++++++++++ 5 files changed, 321 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0bdc7848..cd05ea15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3806,6 +3806,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +[[package]] +name = "simsimd" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc843bc8f12d9c8e6b734a0fe8918fc497b42f6ae0f347dbfdad5b5138ab9b4" +dependencies = [ + "cc", +] + [[package]] name = "sketches-ddsketch" version = "0.2.2" @@ -4121,6 +4130,7 @@ dependencies = [ "reqwest 0.12.5", "serde", "serde_json", + "simsimd", "text-embeddings-backend", "text-embeddings-core", "thiserror", diff --git a/docs/openapi.json b/docs/openapi.json index b90189e9..7cc9d50d 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -565,6 +565,93 @@ } } }, + "/similarity": { + "post": { + "tags": [ + "Text Embeddings Inference" + ], + "summary": "Get Sentence Similarity. Returns a 424 status code if the model is not an embedding model.", + "operationId": "similarity", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimilarityRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Sentence Similarity", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimilarityResponse" + } + } + } + }, + "413": { + "description": "Batch size error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Batch size error", + "error_type": "validation" + } + } + } + }, + "422": { + "description": "Tokenization error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Tokenization error", + "error_type": "tokenizer" + } + } + } + }, + "424": { + "description": "Embedding Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Inference failed", + "error_type": "backend" + } + } + } + }, + "429": { + "description": "Model is overloaded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Model is overloaded", + "error_type": "overloaded" + } + } + } + } + } + } + }, "/tokenize": { "post": { "tags": [ @@ -1441,6 +1528,91 @@ "$ref": "#/components/schemas/Rank" } }, + "SimilarityInput": { + "type": "object", + "required": [ + "source_sentence", + "sentences" + ], + "properties": { + "sentences": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of strings which will be compared against the source_sentence.", + "example": [ + "What is Machine Learning?" + ] + }, + "source_sentence": { + "type": "string", + "description": "The string that you wish to compare the other strings with. This can be a phrase, sentence,\nor longer passage, depending on the model being used.", + "example": "What is Deep Learning?" + } + } + }, + "SimilarityParameters": { + "type": "object", + "required": [ + "truncation_direction" + ], + "properties": { + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, + "truncate": { + "type": "boolean", + "default": "false", + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" + } + } + }, + "SimilarityRequest": { + "type": "object", + "required": [ + "inputs" + ], + "properties": { + "inputs": { + "$ref": "#/components/schemas/SimilarityInput" + }, + "parameters": { + "allOf": [ + { + "$ref": "#/components/schemas/SimilarityParameters" + } + ], + "default": "null", + "nullable": true + } + } + }, + "SimilarityResponse": { + "type": "array", + "items": { + "type": "number", + "format": "float" + }, + "example": [ + 0.0, + 1.0, + 0.5 + ] + }, "SimpleToken": { "type": "object", "required": [ diff --git a/router/Cargo.toml b/router/Cargo.toml index bc42265b..3a3fba27 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -30,6 +30,7 @@ opentelemetry = "0.23.0" opentelemetry_sdk = { version = "0.23.0", features = ["rt-tokio"] } opentelemetry-otlp = "0.16.0" reqwest = { version = "0.12.5", features = [] } +simsimd = "4.4.0" serde = { workspace = true } serde_json = { workspace = true } thiserror = { workspace = true } diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 35f5c1fb..040ac070 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -4,7 +4,8 @@ use crate::http::types::{ EmbedSparseRequest, EmbedSparseResponse, Embedding, EncodingFormat, Input, InputIds, InputType, OpenAICompatEmbedding, OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, PredictResponse, Prediction, Rank, - RerankRequest, RerankResponse, Sequence, SimpleToken, SparseValue, TokenizeInput, + RerankRequest, RerankResponse, Sequence, SimilarityInput, SimilarityParameters, + SimilarityRequest, SimilarityResponse, SimpleToken, SparseValue, TokenizeInput, TokenizeRequest, TokenizeResponse, TruncationDirection, VertexPrediction, VertexRequest, VertexResponse, }; @@ -26,6 +27,7 @@ use futures::future::join_all; use futures::FutureExt; use http::header::AUTHORIZATION; use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; +use simsimd::SpatialSimilarity; use std::net::SocketAddr; use std::time::{Duration, Instant}; use text_embeddings_backend::BackendError; @@ -455,6 +457,88 @@ async fn rerank( Ok((headers, Json(response))) } +/// Get Sentence Similarity. Returns a 424 status code if the model is not an embedding model. +#[utoipa::path( +post, +tag = "Text Embeddings Inference", +path = "/similarity", +request_body = SimilarityRequest, +responses( +(status = 200, description = "Sentence Similarity", body = SimilarityResponse), +(status = 424, description = "Embedding Error", body = ErrorResponse, +example = json ! ({"error": "Inference failed", "error_type": "backend"})), +(status = 429, description = "Model is overloaded", body = ErrorResponse, +example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), +(status = 422, description = "Tokenization error", body = ErrorResponse, +example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 413, description = "Batch size error", body = ErrorResponse, +example = json ! ({"error": "Batch size error", "error_type": "validation"})), +) +)] +#[instrument( + skip_all, + fields(total_time, tokenization_time, queue_time, inference_time,) +)] +async fn similarity( + infer: Extension, + info: Extension, + Json(req): Json, +) -> Result<(HeaderMap, Json), (StatusCode, Json)> { + if req.inputs.sentences.is_empty() { + let message = "`inputs.sentences` cannot be empty".to_string(); + tracing::error!("{message}"); + let err = ErrorResponse { + error: message, + error_type: ErrorType::Validation, + }; + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); + Err(err)?; + } + // +1 because of the source sentence + let batch_size = req.inputs.sentences.len() + 1; + if batch_size > info.max_client_batch_size { + let message = format!( + "batch size {batch_size} > maximum allowed batch size {}", + info.max_client_batch_size + ); + tracing::error!("{message}"); + let err = ErrorResponse { + error: message, + error_type: ErrorType::Validation, + }; + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); + Err(err)?; + } + + // Convert request to embed request + let mut inputs = Vec::with_capacity(req.inputs.sentences.len() + 1); + inputs.push(InputType::String(req.inputs.source_sentence)); + for s in req.inputs.sentences { + inputs.push(InputType::String(s)); + } + let parameters = req.parameters.unwrap_or_default(); + let embed_req = EmbedRequest { + inputs: Input::Batch(inputs), + truncate: parameters.truncate, + truncation_direction: parameters.truncation_direction, + prompt_name: parameters.prompt_name, + normalize: false, + }; + + // Get embeddings + let (header_map, embed_response) = embed(infer, info, Json(embed_req)).await?; + let embeddings = embed_response.0 .0; + + // Compute cosine + let distances = (1..batch_size) + .map(|i| 1.0 - f32::cosine(&embeddings[0], &embeddings[i]).unwrap() as f32) + .collect(); + + Ok((header_map, Json(SimilarityResponse(distances)))) +} + /// Get Embeddings. Returns a 424 status code if the model is not an embedding model. #[utoipa::path( post, @@ -1472,6 +1556,7 @@ pub async fn run( embed_all, embed_sparse, openai_embed, + similarity, tokenize, decode, metrics, @@ -1509,6 +1594,10 @@ pub async fn run( TokenizeRequest, TokenizeResponse, TruncationDirection, + SimilarityInput, + SimilarityParameters, + SimilarityRequest, + SimilarityResponse, SimpleToken, InputType, InputIds, @@ -1587,6 +1676,7 @@ pub async fn run( .route("/embed_sparse", post(embed_sparse)) .route("/predict", post(predict)) .route("/rerank", post(rerank)) + .route("/similarity", post(similarity)) .route("/tokenize", post(tokenize)) .route("/decode", post(decode)) // OpenAI compat route @@ -1634,7 +1724,11 @@ pub async fn run( .route("/invocations", post(rerank)) } ModelType::Embedding(model) => { - if model.pooling == "splade" { + if std::env::var("TASK").ok() == Some("sentence-similarity".to_string()) { + app.route("/", post(similarity)) + // AWS Sagemaker route + .route("/invocations", post(similarity)) + } else if model.pooling == "splade" { app.route("/", post(embed_sparse)) // AWS Sagemaker route .route("/invocations", post(embed_sparse)) diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 4414ecb4..486f8cb7 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -360,6 +360,48 @@ pub(crate) struct OpenAICompatResponse { pub usage: OpenAICompatUsage, } +#[derive(Deserialize, ToSchema)] +pub(crate) struct SimilarityInput { + /// The string that you wish to compare the other strings with. This can be a phrase, sentence, + /// or longer passage, depending on the model being used. + #[schema(example = "What is Deep Learning?")] + pub source_sentence: String, + /// A list of strings which will be compared against the source_sentence. + #[schema(example = json!(["What is Machine Learning?"]))] + pub sentences: Vec, +} + +#[derive(Deserialize, ToSchema, Default)] +pub(crate) struct SimilarityParameters { + #[schema(default = "false", example = "false", nullable = true)] + pub truncate: Option, + #[schema(default = "right", example = "right")] + pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, +} + +#[derive(Deserialize, ToSchema)] +pub(crate) struct SimilarityRequest { + pub inputs: SimilarityInput, + /// Additional inference parameters for Sentence Similarity + #[schema(default = "null", example = "null", nullable = true)] + pub parameters: Option, +} + +#[derive(Serialize, ToSchema)] +#[schema(example = json!([0.0, 1.0, 0.5]))] +pub(crate) struct SimilarityResponse(pub Vec); + #[derive(Deserialize, ToSchema)] pub(crate) struct EmbedRequest { pub inputs: Input, From 4cc38bda85b2ecdbf34082796ca9738466483b85 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Mon, 8 Jul 2024 12:56:18 +0200 Subject: [PATCH 15/36] fix(ort): fix mean pooling (#332) --- backends/candle/src/models/bert.rs | 3 ++- backends/ort/src/lib.rs | 6 +++++- load_tests/load.js | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/backends/candle/src/models/bert.rs b/backends/candle/src/models/bert.rs index a36a1555..32880d44 100644 --- a/backends/candle/src/models/bert.rs +++ b/backends/candle/src/models/bert.rs @@ -804,7 +804,7 @@ impl BertModel { let input_ids = Tensor::from_vec(input_ids, shape, &self.device)?; let type_ids = Tensor::from_vec(type_ids, shape, &self.device)?; let position_ids = Tensor::from_vec(position_ids, shape, &self.device)?; - let input_lengths = + let mut input_lengths = Tensor::from_vec(input_lengths, (batch_size, 1), &self.device)?.to_dtype(self.dtype)?; let embedding_output = self @@ -847,6 +847,7 @@ impl BertModel { if let Some(pooled_indices) = pooled_indices { // Select values in the batch attention_mask = attention_mask.index_select(&pooled_indices, 0)?; + input_lengths = input_lengths.index_select(&pooled_indices, 0)?; }; // Mask padded values diff --git a/backends/ort/src/lib.rs b/backends/ort/src/lib.rs index 6951d3b4..9573f6b0 100644 --- a/backends/ort/src/lib.rs +++ b/backends/ort/src/lib.rs @@ -209,10 +209,12 @@ impl Backend for OrtBackend { Pool::Mean => { if masking { let mut attention_mask = attention_mask; + let mut input_lengths = input_lengths; if let Some(indices) = indices { // Select values in the batch attention_mask = attention_mask.select(Axis(0), &indices); + input_lengths = input_lengths.select(Axis(0), &indices); }; // Cast and reshape @@ -220,7 +222,9 @@ impl Backend for OrtBackend { // Mask padded values outputs = outputs.mul(attention_mask); - outputs.sum_axis(Axis(1)).div(input_lengths) + outputs + .sum_axis(Axis(1)) + .div(input_lengths.insert_axis(Axis(1))) } else { outputs.mean_axis(Axis(1)).unwrap() } diff --git a/load_tests/load.js b/load_tests/load.js index b3705476..867f9fdb 100644 --- a/load_tests/load.js +++ b/load_tests/load.js @@ -27,7 +27,7 @@ export const options = { executor: 'constant-arrival-rate', duration: '30s', preAllocatedVUs: 5000, - rate: 10, + rate: 50, timeUnit: '1s', gracefulStop: '1s', }, From dcbea38ede454040d82558a7616f21eb68c6201e Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 9 Jul 2024 16:26:07 +0200 Subject: [PATCH 16/36] chore(candle): update flash attn (#335) --- Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a780aa27..2243f46f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,10 +33,10 @@ thiserror = "1.0" [patch.crates-io] cudarc = { git = "https://github.com/coreylowman/cudarc", rev = "c388e724af93a3e8fbe484f5ded2d8b3c1badd8e" } -candle = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-core" } -candle-nn = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-nn" } -candle-transformers = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-transformers" } -candle-flash-attn = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-flash-attn" } +candle = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-core" } +candle-nn = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-nn" } +candle-transformers = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-transformers" } +candle-flash-attn = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-flash-attn" } [profile.release] debug = 0 From 661a77ffba48f92fccda8c7b7302f6a973570016 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Wed, 10 Jul 2024 17:33:10 +0200 Subject: [PATCH 17/36] v1.5.0 (#336) --- .github/workflows/build_75.yaml | 22 +++----------- .github/workflows/build_80.yaml | 22 +++----------- .github/workflows/build_86.yaml | 22 +++----------- .github/workflows/build_89.yaml | 22 +++----------- .github/workflows/build_90.yaml | 22 +++----------- .github/workflows/build_all.yaml | 49 ++---------------------------- .github/workflows/build_cpu.yaml | 22 +++----------- Cargo.lock | 28 ++++++++--------- Cargo.toml | 2 +- Dockerfile | 10 +++--- Dockerfile-cuda | 8 ++--- Dockerfile-cuda-all | 2 +- README.md | 26 ++++++++-------- docs/openapi.json | 2 +- docs/source/en/private_models.md | 2 +- docs/source/en/quick_tour.md | 8 ++--- docs/source/en/supported_models.md | 12 ++++---- 17 files changed, 83 insertions(+), 198 deletions(-) diff --git a/.github/workflows/build_75.yaml b/.github/workflows/build_75.yaml index 6d941d03..20416e14 100644 --- a/.github/workflows/build_75.yaml +++ b/.github/workflows/build_75.yaml @@ -25,11 +25,6 @@ - name: Checkout repository uses: actions/checkout@v3 - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - name: Initialize Docker Buildx uses: docker/setup-buildx-action@v2.0.0 with: @@ -56,19 +51,12 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - name: Extract metadata (tags, labels) for Docker id: meta-75 uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -96,15 +84,15 @@ DEFAULT_USE_FLASH_ATTENTION=False tags: ${{ steps.meta-75.outputs.tags }} labels: ${{ steps.meta-75.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-75,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-75,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-75,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-75,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - name: Extract metadata (tags, labels) for Docker id: meta-75-grpc uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -133,4 +121,4 @@ DEFAULT_USE_FLASH_ATTENTION=False tags: ${{ steps.meta-75-grpc.outputs.tags }} labels: ${{ steps.meta-75-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-75,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-75,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_80.yaml b/.github/workflows/build_80.yaml index 7a41c117..7098bad8 100644 --- a/.github/workflows/build_80.yaml +++ b/.github/workflows/build_80.yaml @@ -37,11 +37,6 @@ - name: Checkout repository uses: actions/checkout@v3 - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - name: Initialize Docker Buildx uses: docker/setup-buildx-action@v2.0.0 with: @@ -68,19 +63,12 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - name: Extract metadata (tags, labels) for Docker id: meta-80 uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -107,15 +95,15 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-80.outputs.tags }} labels: ${{ steps.meta-80.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-80,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-80,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-80,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-80,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - name: Extract metadata (tags, labels) for Docker id: meta-80-grpc uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -143,4 +131,4 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-80-grpc.outputs.tags }} labels: ${{ steps.meta-80-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-80,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-80,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_86.yaml b/.github/workflows/build_86.yaml index 16c182ec..d0b6e5cb 100644 --- a/.github/workflows/build_86.yaml +++ b/.github/workflows/build_86.yaml @@ -25,11 +25,6 @@ - name: Checkout repository uses: actions/checkout@v3 - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - name: Initialize Docker Buildx uses: docker/setup-buildx-action@v2.0.0 with: @@ -56,19 +51,12 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - name: Extract metadata (tags, labels) for Docker id: meta-86 uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -95,15 +83,15 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-86.outputs.tags }} labels: ${{ steps.meta-86.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-86,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-86,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-86,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-86,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - name: Extract metadata (tags, labels) for Docker id: meta-86-grpc uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -131,4 +119,4 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-86-grpc.outputs.tags }} labels: ${{ steps.meta-86-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-86,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-86,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_89.yaml b/.github/workflows/build_89.yaml index 689838f6..5a9e0752 100644 --- a/.github/workflows/build_89.yaml +++ b/.github/workflows/build_89.yaml @@ -25,11 +25,6 @@ - name: Checkout repository uses: actions/checkout@v3 - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - name: Initialize Docker Buildx uses: docker/setup-buildx-action@v2.0.0 with: @@ -56,19 +51,12 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - name: Extract metadata (tags, labels) for Docker id: meta-89 uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -95,15 +83,15 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-89.outputs.tags }} labels: ${{ steps.meta-89.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-89,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-89,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-89,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-89,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - name: Extract metadata (tags, labels) for Docker id: meta-89-grpc uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -131,4 +119,4 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-89-grpc.outputs.tags }} labels: ${{ steps.meta-89-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-89,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-89,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_90.yaml b/.github/workflows/build_90.yaml index 40f05235..e7801f45 100644 --- a/.github/workflows/build_90.yaml +++ b/.github/workflows/build_90.yaml @@ -25,11 +25,6 @@ - name: Checkout repository uses: actions/checkout@v3 - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - name: Initialize Docker Buildx uses: docker/setup-buildx-action@v2.0.0 with: @@ -56,19 +51,12 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - name: Extract metadata (tags, labels) for Docker id: meta-90 uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -95,15 +83,15 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-90.outputs.tags }} labels: ${{ steps.meta-90.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-90,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-90,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-90,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-90,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - name: Extract metadata (tags, labels) for Docker id: meta-90-grpc uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -131,4 +119,4 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-90-grpc.outputs.tags }} labels: ${{ steps.meta-90-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-90,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-90,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml index 58aa7b09..f5a6510a 100644 --- a/.github/workflows/build_all.yaml +++ b/.github/workflows/build_all.yaml @@ -25,11 +25,6 @@ - name: Checkout repository uses: actions/checkout@v3 - - name: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - name: Initialize Docker Buildx uses: docker/setup-buildx-action@v2.0.0 with: @@ -49,19 +44,12 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -84,36 +72,5 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-sagemaker - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference/sagemaker - flavor: | - latest=false - tags: | - type=semver,pattern=cuda-{{version}} - type=semver,pattern=cuda-{{major}}.{{minor}} - type=raw,value=cuda-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=cuda-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-sagemaker - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda-all - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - target: sagemaker - build-args: | - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-sagemaker.outputs.tags }} - labels: ${{ steps.meta-sagemaker.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-all,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-all,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_cpu.yaml b/.github/workflows/build_cpu.yaml index 3cf87f5a..032abbbf 100644 --- a/.github/workflows/build_cpu.yaml +++ b/.github/workflows/build_cpu.yaml @@ -47,11 +47,6 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - name: Initialize Docker Buildx uses: docker/setup-buildx-action@v2.0.0 with: @@ -68,19 +63,12 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - name: Extract metadata (tags, labels) for Docker id: meta-cpu uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -106,15 +94,15 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-cpu.outputs.tags }} labels: ${{ steps.meta-cpu.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-cpu,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-cpu,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-cpu,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-cpu,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - name: Extract metadata (tags, labels) for Docker id: meta-cpu-grpc uses: docker/metadata-action@v4.3.0 with: images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference + registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference ghcr.io/huggingface/text-embeddings-inference flavor: | latest=false @@ -141,4 +129,4 @@ DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} tags: ${{ steps.meta-cpu-grpc.outputs.tags }} labels: ${{ steps.meta-cpu-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-cpu,mode=max + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-cpu,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/Cargo.lock b/Cargo.lock index cd05ea15..d7a13c2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.4.0" +version = "1.5.0" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -499,7 +499,7 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "candle-core" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "accelerate-src", "byteorder", @@ -536,7 +536,7 @@ dependencies = [ [[package]] name = "candle-flash-attn" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "anyhow", "bindgen_cuda", @@ -559,7 +559,7 @@ dependencies = [ [[package]] name = "candle-kernels" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "bindgen_cuda", ] @@ -579,7 +579,7 @@ dependencies = [ [[package]] name = "candle-metal-kernels" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "metal", "once_cell", @@ -590,7 +590,7 @@ dependencies = [ [[package]] name = "candle-nn" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "accelerate-src", "candle-core", @@ -619,7 +619,7 @@ dependencies = [ [[package]] name = "candle-transformers" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "byteorder", "candle-core", @@ -4006,7 +4006,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.4.0" +version = "1.5.0" dependencies = [ "clap", "hf-hub", @@ -4021,7 +4021,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.4.0" +version = "1.5.0" dependencies = [ "accelerate-src", "anyhow", @@ -4051,7 +4051,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.4.0" +version = "1.5.0" dependencies = [ "clap", "nohash-hasher", @@ -4060,7 +4060,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-ort" -version = "1.4.0" +version = "1.5.0" dependencies = [ "anyhow", "ndarray", @@ -4075,7 +4075,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.4.0" +version = "1.5.0" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -4089,7 +4089,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.4.0" +version = "1.5.0" dependencies = [ "async-channel", "hf-hub", @@ -4104,7 +4104,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.4.0" +version = "1.5.0" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 2243f46f..82e79e57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.4.0" +version = "1.5.0" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" diff --git a/Dockerfile b/Dockerfile index a3612d87..43dd0535 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,11 +38,11 @@ COPY router router COPY Cargo.toml ./ COPY Cargo.lock ./ -FROM builder as http-builder +FROM builder AS http-builder RUN cargo build --release --bin text-embeddings-router -F ort -F http --no-default-features && sccache -s -FROM builder as grpc-builder +FROM builder AS grpc-builder RUN PROTOC_ZIP=protoc-21.12-linux-x86_64.zip && \ curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP && \ @@ -54,7 +54,7 @@ COPY proto proto RUN cargo build --release --bin text-embeddings-router -F grpc -F ort --no-default-features && sccache -s -FROM debian:bookworm-slim as base +FROM debian:bookworm-slim AS base ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 @@ -65,7 +65,7 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-ins && rm -rf /var/lib/apt/lists/* -FROM base as grpc +FROM base AS grpc COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router @@ -77,7 +77,7 @@ FROM base AS http COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router # Amazon SageMaker compatible image -FROM http as sagemaker +FROM http AS sagemaker COPY --chmod=775 sagemaker-entrypoint.sh entrypoint.sh ENTRYPOINT ["./entrypoint.sh"] diff --git a/Dockerfile-cuda b/Dockerfile-cuda index d67eba93..fe1d9467 100644 --- a/Dockerfile-cuda +++ b/Dockerfile-cuda @@ -75,7 +75,7 @@ COPY router router COPY Cargo.toml ./ COPY Cargo.lock ./ -FROM builder as http-builder +FROM builder AS http-builder RUN if [ ${CUDA_COMPUTE_CAP} -ge 75 -a ${CUDA_COMPUTE_CAP} -lt 80 ]; \ then \ @@ -84,7 +84,7 @@ RUN if [ ${CUDA_COMPUTE_CAP} -ge 75 -a ${CUDA_COMPUTE_CAP} -lt 80 ]; \ cargo build --release --bin text-embeddings-router -F candle-cuda -F static-linking -F http --no-default-features && sccache -s; \ fi; -FROM builder as grpc-builder +FROM builder AS grpc-builder RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ unzip \ @@ -105,7 +105,7 @@ RUN if [ ${CUDA_COMPUTE_CAP} -ge 75 -a ${CUDA_COMPUTE_CAP} -lt 80 ]; \ cargo build --release --bin text-embeddings-router -F candle-cuda -F static-linking -F grpc --no-default-features && sccache -s; \ fi; -FROM nvidia/cuda:12.2.0-base-ubuntu22.04 as base +FROM nvidia/cuda:12.2.0-base-ubuntu22.04 AS base ARG DEFAULT_USE_FLASH_ATTENTION=True @@ -113,7 +113,7 @@ ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 \ USE_FLASH_ATTENTION=$DEFAULT_USE_FLASH_ATTENTION -FROM base as grpc +FROM base AS grpc COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 71321705..5314770d 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -110,7 +110,7 @@ RUN if [ $VERTEX = "true" ]; \ RUN mv /usr/src/target/release/text-embeddings-router /usr/src/target/release/text-embeddings-router-90 -FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 as base +FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 AS base ARG DEFAULT_USE_FLASH_ATTENTION=True diff --git a/README.md b/README.md index 8cbc2872..54bd2dec 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ Below are some examples of the currently supported models: model=BAAI/bge-large-en-v1.5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` And then you can make requests like @@ -309,13 +309,13 @@ Text Embeddings Inference ships with multiple Docker images that you can use to | Architecture | Image | |-------------------------------------|-------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.4 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.5 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.4 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.4 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.4 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.4 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.4 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.5 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.5 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.5 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.5 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.5 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. @@ -344,7 +344,7 @@ model= volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run token= -docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` ### Air gapped deployment @@ -367,7 +367,7 @@ git clone https://huggingface.co/Alibaba-NLP/gte-base-en-v1.5 volume=$PWD # Mount the models directory inside the container with a volume and set the model ID -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id /data/gte-base-en-v1.5 +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id /data/gte-base-en-v1.5 ``` ### Using Re-rankers models @@ -384,7 +384,7 @@ downstream performance. model=BAAI/bge-reranker-large volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` And then you can rank the similarity between a query and a list of texts with: @@ -404,7 +404,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: @@ -424,7 +424,7 @@ You can choose to activate SPLADE pooling for Bert and Distilbert MaskedLM archi model=naver/efficient-splade-VI-BT-large-query volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model --pooling splade +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model --pooling splade ``` Once you have deployed the model you can use the `/embed_sparse` endpoint to get the sparse embedding: @@ -453,7 +453,7 @@ You can use the gRPC API by adding the `-grpc` tag to any TEI Docker image. For model=BAAI/bge-large-en-v1.5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4-grpc --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5-grpc --model-id $model ``` ```shell diff --git a/docs/openapi.json b/docs/openapi.json index 7cc9d50d..457ec56f 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "1.4.0" + "version": "1.5.0" }, "paths": { "/decode": { diff --git a/docs/source/en/private_models.md b/docs/source/en/private_models.md index b5ae060d..d11d66f3 100644 --- a/docs/source/en/private_models.md +++ b/docs/source/en/private_models.md @@ -37,5 +37,5 @@ model= volume=$PWD/data token= -docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index 0baa1f43..aceb5674 100644 --- a/docs/source/en/quick_tour.md +++ b/docs/source/en/quick_tour.md @@ -33,7 +33,7 @@ Finally, deploy your model. Let's say you want to use `BAAI/bge-large-en-v1.5`. model=BAAI/bge-large-en-v1.5 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` @@ -66,7 +66,7 @@ Let's say you want to use `BAAI/bge-reranker-large`: model=BAAI/bge-reranker-large volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` Once you have deployed a model, you can use the `rerank` endpoint to rank the similarity between a query and a list @@ -87,7 +87,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: @@ -139,5 +139,5 @@ git clone https://huggingface.co/Alibaba-NLP/gte-base-en-v1.5 volume=$PWD # Mount the models directory inside the container with a volume and set the model ID -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.4 --model-id /data/gte-base-en-v1.5 +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id /data/gte-base-en-v1.5 ``` diff --git a/docs/source/en/supported_models.md b/docs/source/en/supported_models.md index aee56971..c5e1be85 100644 --- a/docs/source/en/supported_models.md +++ b/docs/source/en/supported_models.md @@ -66,13 +66,13 @@ Find the appropriate Docker image for your hardware in the following table: | Architecture | Image | |-------------------------------------|--------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.4 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.5 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.4 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.4 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.4 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.4 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.4 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.5 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.5 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.5 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.5 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.5 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. From ce1edf4e1ae8e5ab95474b228d2fc55fbdca9fca Mon Sep 17 00:00:00 2001 From: Hyeongchan Kim Date: Tue, 16 Jul 2024 00:53:11 +0900 Subject: [PATCH 18/36] fix: Download `model.onnx_data` (#343) --- backends/src/lib.rs | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/backends/src/lib.rs b/backends/src/lib.rs index 2ee63279..9d44cdbd 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -310,19 +310,16 @@ pub async fn download_weights(api: &ApiRepo) -> Result, ApiError> { } } } else if cfg!(feature = "ort") { - tracing::info!("Downloading `model.onnx`"); - match api.get("model.onnx").await { - Ok(p) => vec![p], + match download_onnx(api).await { + Ok(p) => p, Err(err) => { - tracing::warn!("Could not download `model.onnx`: {err}"); - tracing::info!("Downloading `onnx/model.onnx`"); - let p = api.get("onnx/model.onnx").await?; - vec![p.parent().unwrap().to_path_buf()] + panic!("failed to download `model.onnx` or `model.onnx_data`. Check the onnx file exists in the repository. {err}"); } } } else { unreachable!() }; + Ok(model_files) } @@ -364,3 +361,34 @@ async fn download_safetensors(api: &ApiRepo) -> Result, ApiError> { Ok(safetensors_files) } + +async fn download_onnx(api: &ApiRepo) -> Result, ApiError> { + let mut model_files: Vec = Vec::new(); + + tracing::info!("Downloading `model.onnx`"); + match api.get("model.onnx").await { + Ok(p) => model_files.push(p), + Err(err) => { + tracing::warn!("Could not download `model.onnx`: {err}"); + tracing::info!("Downloading `onnx/model.onnx`"); + let p = api.get("onnx/model.onnx").await?; + model_files.push(p.parent().unwrap().to_path_buf()) + } + }; + + tracing::info!("Downloading `model.onnx_data`"); + match api.get("model.onnx_data").await { + Ok(p) => model_files.push(p), + Err(err) => { + tracing::warn!("Could not download `model.onnx_data`: {err}"); + tracing::info!("Downloading `onnx/model.onnx_data`"); + + match api.get("onnx/model.onnx_data").await { + Ok(p) => model_files.push(p.parent().unwrap().to_path_buf()), + Err(err) => tracing::warn!("Could not download `onnx/model.onnx_data`: {err}"), + } + } + } + + Ok(model_files) +} From af89c278d36630b0524848b038fc0679fdc20721 Mon Sep 17 00:00:00 2001 From: Lucain Date: Mon, 15 Jul 2024 17:53:47 +0200 Subject: [PATCH 19/36] docs: Rename 'Sentence Transformers' to 'sentence-transformers' in docstrings (#342) --- README.md | 2 +- docs/openapi.json | 10 +++++----- docs/source/en/cli_arguments.md | 2 +- router/src/http/types.rs | 10 +++++----- router/src/main.rs | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 54bd2dec..002bcdfc 100644 --- a/README.md +++ b/README.md @@ -214,7 +214,7 @@ Options: --default-prompt-name The name of the prompt that should be used by default for encoding. If not set, no prompt will be applied. - Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + Must be a key in the `sentence-transformers` configuration `prompts` dictionary. For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, then the sentence "What is the capital of France?" will be encoded as "query: What is the capital of France?" because diff --git a/docs/openapi.json b/docs/openapi.json index 457ec56f..aedb7365 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -851,7 +851,7 @@ }, "prompt_name": { "type": "string", - "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", "default": "null", "example": "null", "nullable": true @@ -910,7 +910,7 @@ }, "prompt_name": { "type": "string", - "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", "default": "null", "example": "null", "nullable": true @@ -959,7 +959,7 @@ }, "prompt_name": { "type": "string", - "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", "default": "null", "example": "null", "nullable": true @@ -1560,7 +1560,7 @@ "properties": { "prompt_name": { "type": "string", - "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", "default": "null", "example": "null", "nullable": true @@ -1695,7 +1695,7 @@ }, "prompt_name": { "type": "string", - "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `Sentence Transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", "default": "null", "example": "null", "nullable": true diff --git a/docs/source/en/cli_arguments.md b/docs/source/en/cli_arguments.md index 7a070f37..e25e60b7 100644 --- a/docs/source/en/cli_arguments.md +++ b/docs/source/en/cli_arguments.md @@ -110,7 +110,7 @@ Options: --default-prompt-name The name of the prompt that should be used by default for encoding. If not set, no prompt will be applied. - Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + Must be a key in the `sentence-transformers` configuration `prompts` dictionary. For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, then the sentence "What is the capital of France?" will be encoded as "query: What is the capital of France?" because diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 486f8cb7..4a83a3f8 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -380,7 +380,7 @@ pub(crate) struct SimilarityParameters { /// The name of the prompt that should be used by for encoding. If not set, no prompt /// will be applied. /// - /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. /// /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, /// then the sentence "What is the capital of France?" will be encoded as @@ -414,7 +414,7 @@ pub(crate) struct EmbedRequest { /// The name of the prompt that should be used by for encoding. If not set, no prompt /// will be applied. /// - /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. /// /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, /// then the sentence "What is the capital of France?" will be encoded as @@ -447,7 +447,7 @@ pub(crate) struct EmbedSparseRequest { /// The name of the prompt that should be used by for encoding. If not set, no prompt /// will be applied. /// - /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. /// /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, /// then the sentence "What is the capital of France?" will be encoded as @@ -478,7 +478,7 @@ pub(crate) struct EmbedAllRequest { /// The name of the prompt that should be used by for encoding. If not set, no prompt /// will be applied. /// - /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. /// /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, /// then the sentence "What is the capital of France?" will be encoded as @@ -516,7 +516,7 @@ pub(crate) struct TokenizeRequest { /// The name of the prompt that should be used by for encoding. If not set, no prompt /// will be applied. /// - /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. /// /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, /// then the sentence "What is the capital of France?" will be encoded as diff --git a/router/src/main.rs b/router/src/main.rs index a3c8d042..67fb76c7 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -82,7 +82,7 @@ struct Args { /// The name of the prompt that should be used by default for encoding. If not set, no prompt /// will be applied. /// - /// Must be a key in the `Sentence Transformers` configuration `prompts` dictionary. + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. /// /// For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, /// then the sentence "What is the capital of France?" will be encoded as From a68893ddeb235ed84f53a3719a7a9e3fea7ab132 Mon Sep 17 00:00:00 2001 From: Adrien Date: Thu, 18 Jul 2024 15:18:39 +0200 Subject: [PATCH 20/36] Ci new cluster (#345) Signed-off-by: Adrien Co-authored-by: Guillaume LEGENDRE --- .github/workflows/build.yaml | 164 +++++++++++++++++++++++++++++++ .github/workflows/build_75.yaml | 124 ----------------------- .github/workflows/build_80.yaml | 134 ------------------------- .github/workflows/build_86.yaml | 122 ----------------------- .github/workflows/build_89.yaml | 122 ----------------------- .github/workflows/build_90.yaml | 122 ----------------------- .github/workflows/build_all.yaml | 76 -------------- .github/workflows/build_cpu.yaml | 132 ------------------------- .github/workflows/matrix.json | 57 +++++++++++ 9 files changed, 221 insertions(+), 832 deletions(-) create mode 100644 .github/workflows/build.yaml delete mode 100644 .github/workflows/build_75.yaml delete mode 100644 .github/workflows/build_80.yaml delete mode 100644 .github/workflows/build_86.yaml delete mode 100644 .github/workflows/build_89.yaml delete mode 100644 .github/workflows/build_90.yaml delete mode 100644 .github/workflows/build_all.yaml delete mode 100644 .github/workflows/build_cpu.yaml create mode 100644 .github/workflows/matrix.json diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..a4889a38 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,164 @@ +name: Build and push docker image to registry + +on: + workflow_dispatch: + push: + branches: + - 'main' + tags: + - 'v*' + pull_request: + paths: + - ".github/workflows/build.yaml" + - ".github/workflows/matrix.json" + - "integration-tests/**" + - "backends/**" + - "core/**" + - "router/**" + - "Cargo.lock" + - "rust-toolchain.toml" + - "Dockerfile" + branches: + - 'main' + +jobs: + matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - id: set-matrix + run: | + branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g') + matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' .github/workflows/matrix.json) + echo "{\"include\":$(echo $matrix)}" + echo ::set-output name=matrix::{\"include\":$(echo $matrix)}\" + + build-and-push-image: + needs: matrix + strategy: + matrix: ${{fromJson(needs.matrix.outputs.matrix)}} + concurrency: + group: ${{ github.workflow }}-${{ github.job }}-${{matrix.name}}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + runs-on: + group: aws-r7i-8xlarge-priv + permissions: + contents: write + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + security-events: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + install: true + buildkitd-config-inline: | + [registry."docker.io"] + mirrors = ["registry-us-east-1.prod.aws.ci.huggingface.tech"] + + - name: Configure sccache + uses: actions/github-script@v6 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Inject slug/short variables + uses: rlespinasse/github-slug-action@v4 + + - name: Login to internal Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_PASSWORD }} + registry: registry.internal.huggingface.tech + + - name: Login to GitHub Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: | + registry.internal.huggingface.tech/api-inference/text-embeddings-inference + ghcr.io/huggingface/text-embeddings-inference + flavor: | + latest=false + tags: | + type=semver,pattern=${{ matrix.imageNamePrefix }}{{version}} + type=semver,pattern=${{ matrix.imageNamePrefix }}{{major}}.{{minor}} + type=raw,value=${{ matrix.imageNamePrefix }}latest + type=raw,value=${{ matrix.imageNamePrefix }}sha-${{ env.GITHUB_SHA_SHORT }} + + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.dockerfile }} + push: ${{ github.event_name != 'pull_request' }} + platforms: 'linux/amd64' + build-args: | + SCCACHE_GHA_ENABLED=${{ matrix.sccache }} + ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} + ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} + CUDA_COMPUTE_CAP=${{ matrix.cudaComputeCap }} + GIT_SHA=${{ env.GITHUB_SHA }} + DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} + ${{matrix.extraBuildArgs}} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-${{matrix.name}},access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-${{matrix.name}},access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + + - name: Extract metadata (tags, labels) for Docker + id: meta-grpc + uses: docker/metadata-action@v5 + with: + images: | + registry.internal.huggingface.tech/api-inference/text-embeddings-inference + ghcr.io/huggingface/text-embeddings-inference + flavor: | + latest=false + tags: | + type=semver,pattern=${{ matrix.imageNamePrefix }}{{version}}-grpc + type=semver,pattern=${{ matrix.imageNamePrefix }}{{major}}.{{minor}}-grpc + type=raw,value=${{ matrix.imageNamePrefix }}latest-grpc + type=raw,value=${{ matrix.imageNamePrefix }}sha-${{ env.GITHUB_SHA_SHORT }}-grpc + + - name: Build and push Docker image + id: build-and-push-grpc + uses: docker/build-push-action@v6 + with: + context: . + target: grpc + file: Dockerfile-cuda + push: ${{ github.event_name != 'pull_request' }} + platforms: 'linux/amd64' + build-args: | + SCCACHE_GHA_ENABLED=${{ matrix.sccache }} + ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} + ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} + CUDA_COMPUTE_CAP=${{ matrix.cudaComputeCap }} + GIT_SHA=${{ env.GITHUB_SHA }} + DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} + ${{matrix.extraBuildArgs}} + tags: ${{ steps.meta-grpc.outputs.tags }} + labels: ${{ steps.meta-grpc.outputs.labels }} + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-${{matrix.name}},access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_75.yaml b/.github/workflows/build_75.yaml deleted file mode 100644 index 20416e14..00000000 --- a/.github/workflows/build_75.yaml +++ /dev/null @@ -1,124 +0,0 @@ - name: Build and push Cuda Turing docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-75-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta-75 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=turing-{{version}} - type=semver,pattern=turing-{{major}}.{{minor}} - type=raw,value=turing-latest - type=raw,value=turing-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-75 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=75 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - DEFAULT_USE_FLASH_ATTENTION=False - tags: ${{ steps.meta-75.outputs.tags }} - labels: ${{ steps.meta-75.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-75,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-75,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-75-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=turing-{{version}}-grpc - type=semver,pattern=turing-{{major}}.{{minor}}-grpc - type=raw,value=turing-latest-grpc - type=raw,value=turing-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-75-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=75 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - DEFAULT_USE_FLASH_ATTENTION=False - tags: ${{ steps.meta-75-grpc.outputs.tags }} - labels: ${{ steps.meta-75-grpc.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-75,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_80.yaml b/.github/workflows/build_80.yaml deleted file mode 100644 index 7098bad8..00000000 --- a/.github/workflows/build_80.yaml +++ /dev/null @@ -1,134 +0,0 @@ - name: Build and push Cuda Ampere docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - pull_request: - paths: - - ".github/workflows/build.yaml" -# - "integration-tests/**" - - "backends/**" - - "core/**" - - "router/**" - - "Cargo.lock" - - "rust-toolchain.toml" - - "Dockerfile" - branches: - - 'main' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-80-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta-80 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,value=latest - type=raw,value=sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-80 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=80 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-80.outputs.tags }} - labels: ${{ steps.meta-80.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-80,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-80,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-80-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern={{version}}-grpc - type=semver,pattern={{major}}.{{minor}}-grpc - type=raw,value=latest-grpc - type=raw,value=sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-80-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=80 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-80-grpc.outputs.tags }} - labels: ${{ steps.meta-80-grpc.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-80,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_86.yaml b/.github/workflows/build_86.yaml deleted file mode 100644 index d0b6e5cb..00000000 --- a/.github/workflows/build_86.yaml +++ /dev/null @@ -1,122 +0,0 @@ - name: Build and push Cuda A10 docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-86-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta-86 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=86-{{version}} - type=semver,pattern=86-{{major}}.{{minor}} - type=raw,value=86-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=86-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-86 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=86 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-86.outputs.tags }} - labels: ${{ steps.meta-86.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-86,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-86,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-86-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=86-{{version}}-grpc - type=semver,pattern=86-{{major}}.{{minor}}-grpc - type=raw,value=86-latest-grpc - type=raw,value=86-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-86-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=86 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-86-grpc.outputs.tags }} - labels: ${{ steps.meta-86-grpc.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-86,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_89.yaml b/.github/workflows/build_89.yaml deleted file mode 100644 index 5a9e0752..00000000 --- a/.github/workflows/build_89.yaml +++ /dev/null @@ -1,122 +0,0 @@ - name: Build and push Cuda RTX 4000 series docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-89-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta-89 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=89-{{version}} - type=semver,pattern=89-{{major}}.{{minor}} - type=raw,value=89-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=89-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-89 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=89 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-89.outputs.tags }} - labels: ${{ steps.meta-89.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-89,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-89,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-89-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=89-{{version}}-grpc - type=semver,pattern=89-{{major}}.{{minor}}-grpc - type=raw,value=89-latest-grpc - type=raw,value=89-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-89-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=89 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-89-grpc.outputs.tags }} - labels: ${{ steps.meta-89-grpc.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-89,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_90.yaml b/.github/workflows/build_90.yaml deleted file mode 100644 index e7801f45..00000000 --- a/.github/workflows/build_90.yaml +++ /dev/null @@ -1,122 +0,0 @@ - name: Build and push Cuda Hopper docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-90-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta-90 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=hopper-{{version}} - type=semver,pattern=hopper-{{major}}.{{minor}} - type=raw,value=hopper-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=hopper-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-90 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=90 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-90.outputs.tags }} - labels: ${{ steps.meta-90.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-90,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-90,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-90-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=hopper-{{version}}-grpc - type=semver,pattern=hopper-{{major}}.{{minor}}-grpc - type=raw,value=hopper-latest-grpc - type=raw,value=hopper-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-90-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=90 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-90-grpc.outputs.tags }} - labels: ${{ steps.meta-90-grpc.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-90,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml deleted file mode 100644 index f5a6510a..00000000 --- a/.github/workflows/build_all.yaml +++ /dev/null @@ -1,76 +0,0 @@ - name: Build and push Cuda docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-all-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=cuda-{{version}} - type=semver,pattern=cuda-{{major}}.{{minor}} - type=raw,value=cuda-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=cuda-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda-all - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-all,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-all,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_cpu.yaml b/.github/workflows/build_cpu.yaml deleted file mode 100644 index 032abbbf..00000000 --- a/.github/workflows/build_cpu.yaml +++ /dev/null @@ -1,132 +0,0 @@ - name: Build and push CPU docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - pull_request: - paths: - - ".github/workflows/build.yaml" -# - "integration-tests/**" - - "backends/**" - - "core/**" - - "router/**" - - "Cargo.lock" - - "rust-toolchain.toml" - - "Dockerfile" - branches: - - 'main' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-cpu-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta-cpu - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=cpu-{{version}} - type=semver,pattern=cpu-{{major}}.{{minor}} - type=raw,value=cpu-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=cpu-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-cpu - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-cpu.outputs.tags }} - labels: ${{ steps.meta-cpu.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-cpu,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-cpu,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-cpu-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry-push.github-runners.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=cpu-{{version}}-grpc - type=semver,pattern=cpu-{{major}}.{{minor}}-grpc - type=raw,value=cpu-latest-grpc - type=raw,value=cpu-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-cpu-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-cpu-grpc.outputs.tags }} - labels: ${{ steps.meta-cpu-grpc.outputs.labels }} - cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-cpu,access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/matrix.json b/.github/workflows/matrix.json new file mode 100644 index 00000000..c83fcf34 --- /dev/null +++ b/.github/workflows/matrix.json @@ -0,0 +1,57 @@ +[ + { + "name": "turing", + "imageNamePrefix": "turing-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 75, + "extraBuildArgs": "DEFAULT_USE_FLASH_ATTENTION=False", + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "ampere", + "imageNamePrefix": "", + "runOn": "always", + "sccache": true, + "cudaComputeCap": 80, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "a10", + "imageNamePrefix": "86-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 86, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "RTX 4000", + "imageNamePrefix": "89-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 89, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "Hopper", + "imageNamePrefix": "hopper-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 90, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "All", + "imageNamePrefix": "cuda-", + "runOn": "main", + "sccache": false, + "dockerfile": "Dockerfile-cuda-all" + }, + { + "name": "cpu", + "imageNamePrefix": "cpu-", + "runOn": "main", + "sccache": true, + "dockerfile": "Dockerfile" + } +] From a1f493f3bfb44ecbf5a920a9c64a6724878d0398 Mon Sep 17 00:00:00 2001 From: Adrien Date: Thu, 18 Jul 2024 15:34:30 +0200 Subject: [PATCH 21/36] fix(ci): fix incorrect Dockerfile Signed-off-by: Adrien --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a4889a38..5aeb7786 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -148,7 +148,7 @@ jobs: with: context: . target: grpc - file: Dockerfile-cuda + file: ${{ matrix.dockerfile }} push: ${{ github.event_name != 'pull_request' }} platforms: 'linux/amd64' build-args: | From 630ddc71d305fce920574ad0c392ab43ea6c0e81 Mon Sep 17 00:00:00 2001 From: Adrien Date: Mon, 22 Jul 2024 14:39:17 +0200 Subject: [PATCH 22/36] chore(ci): improve ci (#351) Signed-off-by: Adrien --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5aeb7786..adb19ed2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -45,7 +45,7 @@ jobs: group: ${{ github.workflow }}-${{ github.job }}-${{matrix.name}}-${{ github.head_ref || github.run_id }} cancel-in-progress: true runs-on: - group: aws-r7i-8xlarge-priv + group: aws-r6id-8xlarge-priv permissions: contents: write packages: write From b563f8005663afe5c9f2f5f9b52dc7c39249d8dc Mon Sep 17 00:00:00 2001 From: Adrien Date: Mon, 22 Jul 2024 16:37:14 +0200 Subject: [PATCH 23/36] fix: use a more generic name (#352) Signed-off-by: Adrien --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index adb19ed2..55d39314 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -45,7 +45,7 @@ jobs: group: ${{ github.workflow }}-${{ github.job }}-${{matrix.name}}-${{ github.head_ref || github.run_id }} cancel-in-progress: true runs-on: - group: aws-r6id-8xlarge-priv + group: aws-highmemory-32-plus-priv permissions: contents: write packages: write From 9ec8f34204c2818de96a8f910a74550b95a60dd8 Mon Sep 17 00:00:00 2001 From: Adrien Date: Mon, 29 Jul 2024 09:26:43 +0200 Subject: [PATCH 24/36] chore(ci): update build.yaml for buildkitd-config Signed-off-by: Adrien --- .github/workflows/build.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 55d39314..e43183cd 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -61,9 +61,7 @@ jobs: uses: docker/setup-buildx-action@v3 with: install: true - buildkitd-config-inline: | - [registry."docker.io"] - mirrors = ["registry-us-east-1.prod.aws.ci.huggingface.tech"] + buildkitd-config: /tmp/buildkitd.toml - name: Configure sccache uses: actions/github-script@v6 From 29f728ec57c1d2bfc16097102cdaf1837b830e0e Mon Sep 17 00:00:00 2001 From: drbh Date: Thu, 5 Sep 2024 10:11:33 -0400 Subject: [PATCH 25/36] fix: add serde default for truncation direction (#399) --- router/src/http/types.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 4a83a3f8..60122888 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -375,6 +375,7 @@ pub(crate) struct SimilarityInput { pub(crate) struct SimilarityParameters { #[schema(default = "false", example = "false", nullable = true)] pub truncate: Option, + #[serde(default)] #[schema(default = "right", example = "right")] pub truncation_direction: TruncationDirection, /// The name of the prompt that should be used by for encoding. If not set, no prompt From dbeb3ab16e19a1256cdb93a122d6f6e16088e536 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 17 Sep 2024 17:14:44 +0200 Subject: [PATCH 26/36] fix: metrics unbounded memory (#409) --- router/src/http/server.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 040ac070..b1bd7e03 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1634,9 +1634,12 @@ pub async fn run( } }); - let prom_handle = prom_builder - .install_recorder() - .context("failed to install metrics recorder")?; + // See: https://github.com/metrics-rs/metrics/issues/467#issuecomment-2022755151 + let (recorder, _) = prom_builder + .build() + .context("failed to build prometheus recorder")?; + let prom_handle = recorder.handle(); + metrics::set_global_recorder(recorder).context("Failed to set global recorder")?; // CORS layer let allow_origin = allow_origin.unwrap_or(AllowOrigin::any()); From ebe078a1b9effd54ad05ed774a2e270b1e99c1f9 Mon Sep 17 00:00:00 2001 From: Hyeongchan Kim Date: Wed, 18 Sep 2024 00:17:34 +0900 Subject: [PATCH 27/36] fix: allow health check w/o auth (#360) --- router/src/http/server.rs | 57 ++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index b1bd7e03..e2623c38 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1669,9 +1669,7 @@ pub async fn run( ApiDoc::openapi() }; - // Create router - let mut app = Router::new() - .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", doc)) + let mut routes = Router::new() // Base routes .route("/info", get(get_model_info)) .route("/embed", post(embed)) @@ -1686,7 +1684,10 @@ pub async fn run( .route("/embeddings", post(openai_embed)) .route("/v1/embeddings", post(openai_embed)) // Vertex compat route - .route("/vertex", post(vertex_compatibility)) + .route("/vertex", post(vertex_compatibility)); + + #[allow(unused_mut)] + let mut public_routes = Router::new() // Base Health route .route("/health", get(health)) // Inference API health route @@ -1694,9 +1695,7 @@ pub async fn run( // AWS Sagemaker health route .route("/ping", get(health)) // Prometheus metrics route - .route("/metrics", get(metrics)) - // Update payload limit - .layer(DefaultBodyLimit::max(payload_limit)); + .route("/metrics", get(metrics)); #[cfg(feature = "google")] { @@ -1704,39 +1703,44 @@ pub async fn run( if let Ok(env_predict_route) = std::env::var("AIP_PREDICT_ROUTE") { tracing::info!("Serving Vertex compatible route on {env_predict_route}"); - app = app.route(&env_predict_route, post(vertex_compatibility)); + routes = routes.route(&env_predict_route, post(vertex_compatibility)); } if let Ok(env_health_route) = std::env::var("AIP_HEALTH_ROUTE") { tracing::info!("Serving Vertex compatible health route on {env_health_route}"); - app = app.route(&env_health_route, get(health)); + public_routes = public_routes.route(&env_health_route, get(health)); } } #[cfg(not(feature = "google"))] { // Set default routes - app = match &info.model_type { + routes = match &info.model_type { ModelType::Classifier(_) => { - app.route("/", post(predict)) + routes + .route("/", post(predict)) // AWS Sagemaker route .route("/invocations", post(predict)) } ModelType::Reranker(_) => { - app.route("/", post(rerank)) + routes + .route("/", post(rerank)) // AWS Sagemaker route .route("/invocations", post(rerank)) } ModelType::Embedding(model) => { if std::env::var("TASK").ok() == Some("sentence-similarity".to_string()) { - app.route("/", post(similarity)) + routes + .route("/", post(similarity)) // AWS Sagemaker route .route("/invocations", post(similarity)) } else if model.pooling == "splade" { - app.route("/", post(embed_sparse)) + routes + .route("/", post(embed_sparse)) // AWS Sagemaker route .route("/invocations", post(embed_sparse)) } else { - app.route("/", post(embed)) + routes + .route("/", post(embed)) // AWS Sagemaker route .route("/invocations", post(embed)) } @@ -1744,16 +1748,8 @@ pub async fn run( }; } - app = app - .layer(Extension(infer)) - .layer(Extension(info)) - .layer(Extension(prom_handle.clone())) - .layer(OtelAxumLayer::default()) - .layer(cors_layer); - if let Some(api_key) = api_key { - let mut prefix = "Bearer ".to_string(); - prefix.push_str(&api_key); + let prefix = format!("Bearer {}", api_key); // Leak to allow FnMut let api_key: &'static str = prefix.leak(); @@ -1770,9 +1766,20 @@ pub async fn run( } }; - app = app.layer(axum::middleware::from_fn(auth)); + routes = routes.layer(axum::middleware::from_fn(auth)); } + let app = Router::new() + .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", doc)) + .merge(routes) + .merge(public_routes) + .layer(Extension(infer)) + .layer(Extension(info)) + .layer(Extension(prom_handle.clone())) + .layer(OtelAxumLayer::default()) + .layer(DefaultBodyLimit::max(payload_limit)) + .layer(cors_layer); + // Run server let listener = tokio::net::TcpListener::bind(&addr) .await From df0319575c2d49c5d077b5bffe5fb304d3a1bff7 Mon Sep 17 00:00:00 2001 From: Hyeongchan Kim Date: Wed, 18 Sep 2024 00:18:08 +0900 Subject: [PATCH 28/36] Update `ort` crate version to `2.0.0-rc.4` to support onnx IR version 10 (#361) --- Cargo.lock | 21 +++++++++++++++++---- backends/ort/Cargo.toml | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7a13c2c..36facc4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2774,9 +2774,9 @@ dependencies = [ [[package]] name = "ort" -version = "2.0.0-rc.2" +version = "2.0.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bc80894094c6a875bfac64415ed456fa661081a278a035e22be661305c87e14" +checksum = "86d83095ae3c1258738d70ae7a06195c94d966a8e546f0d3609dc90885fb61f5" dependencies = [ "half", "js-sys", @@ -2789,11 +2789,12 @@ dependencies = [ [[package]] name = "ort-sys" -version = "2.0.0-rc.2" +version = "2.0.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d9c1373fc813d3f024d394f621f4c6dde0734c79b1c17113c3bb5bf0084bbe" +checksum = "0f2f6427193c808010b126bef45ebd33f8dee43770223a1200f84d3734d6c656" dependencies = [ "flate2", + "pkg-config", "sha2", "tar", "ureq", @@ -3846,6 +3847,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socks" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" +dependencies = [ + "byteorder", + "libc", + "winapi", +] + [[package]] name = "spin" version = "0.9.8" @@ -4790,6 +4802,7 @@ dependencies = [ "rustls-webpki", "serde", "serde_json", + "socks", "url", "webpki-roots", ] diff --git a/backends/ort/Cargo.toml b/backends/ort/Cargo.toml index 9cbde87e..8fdad006 100644 --- a/backends/ort/Cargo.toml +++ b/backends/ort/Cargo.toml @@ -9,7 +9,7 @@ homepage.workspace = true anyhow = { workspace = true } nohash-hasher = { workspace = true } ndarray = "0.15.6" -ort = { version = "2.0.0-rc.2", default-features = false, features = ["download-binaries", "half", "onednn", "ndarray"] } +ort = { version = "2.0.0-rc.4", default-features = false, features = ["download-binaries", "half", "onednn", "ndarray"] } text-embeddings-backend-core = { path = "../core" } tracing = { workspace = true } thiserror = { workspace = true } From fef77b0c08ec40375073db822be95a4e971122a7 Mon Sep 17 00:00:00 2001 From: Wissam Antoun Date: Tue, 17 Sep 2024 08:19:28 -0700 Subject: [PATCH 29/36] adds curl to fix healthcheck (#376) --- Dockerfile | 1 + Dockerfile-cuda | 6 ++++++ Dockerfile-cuda-all | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/Dockerfile b/Dockerfile index 43dd0535..152f2738 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,6 +62,7 @@ ENV HUGGINGFACE_HUB_CACHE=/data \ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ ca-certificates \ libssl-dev \ + curl \ && rm -rf /var/lib/apt/lists/* diff --git a/Dockerfile-cuda b/Dockerfile-cuda index fe1d9467..1e39fb1e 100644 --- a/Dockerfile-cuda +++ b/Dockerfile-cuda @@ -113,6 +113,12 @@ ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 \ USE_FLASH_ATTENTION=$DEFAULT_USE_FLASH_ATTENTION +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + libssl-dev \ + curl \ + && rm -rf /var/lib/apt/lists/* + FROM base AS grpc COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 5314770d..851a3c97 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -118,6 +118,12 @@ ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 \ USE_FLASH_ATTENTION=$DEFAULT_USE_FLASH_ATTENTION +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + libssl-dev \ + curl \ + && rm -rf /var/lib/apt/lists/* + COPY --from=builder /usr/src/target/release/text-embeddings-router-75 /usr/local/bin/text-embeddings-router-75 COPY --from=builder /usr/src/target/release/text-embeddings-router-80 /usr/local/bin/text-embeddings-router-80 COPY --from=builder /usr/src/target/release/text-embeddings-router-90 /usr/local/bin/text-embeddings-router-90 From 416efe19f2ad687a3461ae453c32003be0892749 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Wed, 18 Sep 2024 11:11:15 +0200 Subject: [PATCH 30/36] fix: use num_cpus::get to check as get_physical does not check cgroups (#410) --- Cargo.lock | 1 + Cargo.toml | 1 + backends/ort/Cargo.toml | 1 + backends/ort/src/lib.rs | 2 ++ router/Cargo.toml | 2 +- router/src/lib.rs | 2 +- 6 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36facc4e..1289b141 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4077,6 +4077,7 @@ dependencies = [ "anyhow", "ndarray", "nohash-hasher", + "num_cpus", "ort", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 82e79e57..64c4d721 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ clap = { version = "4.1", features = ["derive", "env"] } hf-hub = { version = "0.3.2", features = ["tokio", "online"], default-features = false } metrics = "0.23" nohash-hasher = "0.2" +num_cpus = "1.16.0" tokenizers = { version = "0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } tokio = { version = "1.25", features = ["rt", "rt-multi-thread", "parking_lot", "sync", "signal"] } tracing = "0.1" diff --git a/backends/ort/Cargo.toml b/backends/ort/Cargo.toml index 8fdad006..0d40fddd 100644 --- a/backends/ort/Cargo.toml +++ b/backends/ort/Cargo.toml @@ -9,6 +9,7 @@ homepage.workspace = true anyhow = { workspace = true } nohash-hasher = { workspace = true } ndarray = "0.15.6" +num_cpus = { workspace = true } ort = { version = "2.0.0-rc.4", default-features = false, features = ["download-binaries", "half", "onednn", "ndarray"] } text-embeddings-backend-core = { path = "../core" } tracing = { workspace = true } diff --git a/backends/ort/src/lib.rs b/backends/ort/src/lib.rs index 9573f6b0..08dbfa7e 100644 --- a/backends/ort/src/lib.rs +++ b/backends/ort/src/lib.rs @@ -52,6 +52,8 @@ impl OrtBackend { // Start onnx session let session = Session::builder() + .s()? + .with_intra_threads(num_cpus::get()) .s()? .with_optimization_level(GraphOptimizationLevel::Level3) .s()? diff --git a/router/Cargo.toml b/router/Cargo.toml index 3a3fba27..e648036b 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -23,7 +23,7 @@ futures = "^0.3" init-tracing-opentelemetry = { version = "0.18.1", features = ["opentelemetry-otlp"] } hf-hub = { workspace = true } http = "1.0.0" -num_cpus = "1.16.0" +num_cpus = { workspace = true } metrics = { workspace = true } metrics-exporter-prometheus = { version = "0.15.1", features = [] } opentelemetry = "0.23.0" diff --git a/router/src/lib.rs b/router/src/lib.rs index 86a0f884..540e61af 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -198,7 +198,7 @@ pub async fn run( }; tracing::info!("Maximum number of tokens per request: {max_input_length}"); - let tokenization_workers = tokenization_workers.unwrap_or_else(num_cpus::get_physical); + let tokenization_workers = tokenization_workers.unwrap_or_else(num_cpus::get); // Try to load new ST Config let mut new_st_config: Option = None; From 205f96c9d9d751a26a609f5c959ecec86a6545aa Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 17 Oct 2024 12:30:58 +0200 Subject: [PATCH 31/36] fix: use status code 400 when batch is empty (#413) --- .github/workflows/build.yaml | 2 ++ .github/workflows/matrix.json | 7 ++++++ router/src/grpc/server.rs | 1 + router/src/http/server.rs | 45 +++++++++++++++++++++++++++-------- router/src/lib.rs | 1 + 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e43183cd..8a2880a8 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -127,6 +127,7 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta-grpc + if: ${{ matrix.grpc }} uses: docker/metadata-action@v5 with: images: | @@ -142,6 +143,7 @@ jobs: - name: Build and push Docker image id: build-and-push-grpc + if: ${{ matrix.grpc }} uses: docker/build-push-action@v6 with: context: . diff --git a/.github/workflows/matrix.json b/.github/workflows/matrix.json index c83fcf34..230bd986 100644 --- a/.github/workflows/matrix.json +++ b/.github/workflows/matrix.json @@ -6,6 +6,7 @@ "sccache": true, "cudaComputeCap": 75, "extraBuildArgs": "DEFAULT_USE_FLASH_ATTENTION=False", + "grpc": true, "dockerfile": "Dockerfile-cuda" }, { @@ -14,6 +15,7 @@ "runOn": "always", "sccache": true, "cudaComputeCap": 80, + "grpc": true, "dockerfile": "Dockerfile-cuda" }, { @@ -22,6 +24,7 @@ "runOn": "main", "sccache": true, "cudaComputeCap": 86, + "grpc": true, "dockerfile": "Dockerfile-cuda" }, { @@ -30,6 +33,7 @@ "runOn": "main", "sccache": true, "cudaComputeCap": 89, + "grpc": true, "dockerfile": "Dockerfile-cuda" }, { @@ -38,6 +42,7 @@ "runOn": "main", "sccache": true, "cudaComputeCap": 90, + "grpc": true, "dockerfile": "Dockerfile-cuda" }, { @@ -45,6 +50,7 @@ "imageNamePrefix": "cuda-", "runOn": "main", "sccache": false, + "grpc": false, "dockerfile": "Dockerfile-cuda-all" }, { @@ -52,6 +58,7 @@ "imageNamePrefix": "cpu-", "runOn": "main", "sccache": true, + "grpc": true, "dockerfile": "Dockerfile" } ] diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index d3666214..c3b34a8e 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -1534,6 +1534,7 @@ impl From for Status { ErrorType::Overloaded => Code::ResourceExhausted, ErrorType::Validation => Code::InvalidArgument, ErrorType::Tokenizer => Code::FailedPrecondition, + ErrorType::Empty => Code::InvalidArgument, }; Status::new(code, value.error) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index e2623c38..ae3d8a60 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -89,6 +89,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -285,6 +287,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -306,7 +310,7 @@ async fn rerank( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -471,6 +475,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -489,7 +495,7 @@ async fn similarity( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -553,6 +559,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -615,7 +623,7 @@ async fn embed( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -722,6 +730,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -792,7 +802,7 @@ async fn embed_sparse( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -900,6 +910,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -961,7 +973,7 @@ async fn embed_all( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -1067,6 +1079,8 @@ example = json ! ({"message": "Inference failed", "type": "backend"})), example = json ! ({"message": "Model is overloaded", "type": "overloaded"})), (status = 422, description = "Tokenization error", body = OpenAICompatErrorResponse, example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = OpenAICompatErrorResponse, +example = json ! ({"message": "Batch is empty", "type": "empty"})), (status = 413, description = "Batch size error", body = OpenAICompatErrorResponse, example = json ! ({"message": "Batch size error", "type": "validation"})), ) @@ -1150,7 +1164,7 @@ async fn openai_embed( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -1265,8 +1279,12 @@ path = "/tokenize", request_body = TokenizeRequest, responses( (status = 200, description = "Tokenized ids", body = TokenizeResponse), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), +(status = 413, description = "Batch size error", body = ErrorResponse, +example = json ! ({"error": "Batch size error", "error_type": "validation"})), (status = 422, description = "Tokenization error", body = ErrorResponse, -example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), +example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), ) )] #[instrument(skip_all)] @@ -1327,7 +1345,7 @@ async fn tokenize( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -1377,8 +1395,12 @@ path = "/decode", request_body = DecodeRequest, responses( (status = 200, description = "Decoded ids", body = DecodeResponse), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), +(status = 413, description = "Batch size error", body = ErrorResponse, +example = json ! ({"error": "Batch size error", "error_type": "validation"})), (status = 422, description = "Tokenization error", body = ErrorResponse, -example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), +example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), ) )] #[instrument(skip_all)] @@ -1403,7 +1425,7 @@ async fn decode( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; let counter = metrics::counter!("te_request_failure", "err" => "validation"); counter.increment(1); @@ -1454,6 +1476,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -1804,6 +1828,7 @@ impl From<&ErrorType> for StatusCode { ErrorType::Overloaded => StatusCode::TOO_MANY_REQUESTS, ErrorType::Tokenizer => StatusCode::UNPROCESSABLE_ENTITY, ErrorType::Validation => StatusCode::PAYLOAD_TOO_LARGE, + ErrorType::Empty => StatusCode::BAD_REQUEST, } } } diff --git a/router/src/lib.rs b/router/src/lib.rs index 540e61af..68c86b87 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -516,6 +516,7 @@ pub enum ErrorType { Overloaded, Validation, Tokenizer, + Empty, } #[derive(Serialize)] From 750898d3db2a6c1b6000d2f7bf37fd52010fb410 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 17 Oct 2024 12:31:09 +0200 Subject: [PATCH 32/36] fix: add cls pooling as default for BERT variants (#426) --- router/src/lib.rs | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/router/src/lib.rs b/router/src/lib.rs index 68c86b87..b7b214e6 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -91,13 +91,20 @@ pub async fn run( // Optionally download the pooling config. if pooling.is_none() { // If a pooling config exist, download it - let _ = download_pool_config(&api_repo).await; + let _ = download_pool_config(&api_repo).await.map_err(|err| { + tracing::warn!("Download failed: {err}"); + err + }); } - // Download sentence transformers config + // Download legacy sentence transformers config + // We don't warn on failure as it is a legacy file let _ = download_st_config(&api_repo).await; // Download new sentence transformers config - let _ = download_new_st_config(&api_repo).await; + let _ = download_new_st_config(&api_repo).await.map_err(|err| { + tracing::warn!("Download failed: {err}"); + err + }); // Download model from the Hub download_artifacts(&api_repo) @@ -387,10 +394,21 @@ fn get_backend_model_type( None => { // Load pooling config let config_path = model_root.join("1_Pooling/config.json"); - let config = fs::read_to_string(config_path).context("The `--pooling` arg is not set and we could not find a pooling configuration (`1_Pooling/config.json`) for this model.")?; - let config: PoolConfig = - serde_json::from_str(&config).context("Failed to parse `1_Pooling/config.json`")?; - Pool::try_from(config)? + + match fs::read_to_string(config_path) { + Ok(config) => { + let config: PoolConfig = serde_json::from_str(&config) + .context("Failed to parse `1_Pooling/config.json`")?; + Pool::try_from(config)? + } + Err(err) => { + if !config.model_type.to_lowercase().contains("bert") { + return Err(err).context("The `--pooling` arg is not set and we could not find a pooling configuration (`1_Pooling/config.json`) for this model."); + } + tracing::warn!("The `--pooling` arg is not set and we could not find a pooling configuration (`1_Pooling/config.json`) for this model but the model is a BERT variant. Defaulting to `CLS` pooling."); + text_embeddings_backend::Pool::Cls + } + } } }; Ok(text_embeddings_backend::ModelType::Embedding(pool)) From cb1e594709fb1caea674ed460b6e426b2b4a531b Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 17 Oct 2024 12:51:23 +0200 Subject: [PATCH 33/36] feat: auto limit string if truncate is set (#428) --- core/src/tokenization.rs | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index fece3a98..71617daf 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -274,7 +274,7 @@ fn prepare_pre_prompt( #[allow(clippy::too_many_arguments)] fn tokenize_input( - inputs: EncodingInput, + mut inputs: EncodingInput, add_special_tokens: bool, max_input_length: usize, truncate_params: Option, @@ -288,9 +288,12 @@ fn tokenize_input( let input_chars = inputs.count_chars(); let limit = max_input_length * MAX_CHAR_MULTIPLIER; if input_chars > limit { - return Err(TextEmbeddingsError::Validation(format!( - "`inputs` must have less than {limit} characters. Given: {input_chars}" - ))); + if truncate_params.is_none() { + return Err(TextEmbeddingsError::Validation(format!( + "`inputs` must have less than {limit} characters. Given: {input_chars}" + ))); + } + inputs.apply_limit(limit); } let encoding = match inputs { @@ -426,6 +429,25 @@ impl EncodingInput { EncodingInput::Ids(v) => v.len(), } } + + fn apply_limit(&mut self, limit: usize) { + let truncate_string = |s: &mut String, limit: usize| { + if s.is_char_boundary(limit) { + s.truncate(limit) + } + }; + + match self { + EncodingInput::Single(s) => { + truncate_string(s, limit); + } + EncodingInput::Dual(s1, s2) => { + truncate_string(s1, limit / 2); + truncate_string(s2, limit / 2); + } + EncodingInput::Ids(_) => {} + } + } } impl From for EncodingInput { From bbde203aca7bee6ea1b88c4ebd38063c8100f5b2 Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:42:42 +0100 Subject: [PATCH 34/36] v1.5.1 --- Cargo.lock | 1409 ++++++++++++++++++++++++++------------------- Cargo.toml | 2 +- docs/openapi.json | 2 +- 3 files changed, 834 insertions(+), 579 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1289b141..38b11c24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,18 +10,18 @@ checksum = "415ed64958754dbe991900f3940677e6a7eefb4d7367afd70d642677b0c7d19d" [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -76,52 +76,52 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" dependencies = [ "backtrace", ] [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "775a8770d29db3dadcb858482cc240af7b2ffde4ac4de67d1d4955728103f0e2" dependencies = [ "derive_arbitrary", ] @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -151,24 +151,24 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -179,15 +179,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a47f2fb521b70c11ce7369a6c5fa4bd6af7e5d62ec06303875bafe7c6ba245" +checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -197,9 +197,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.19.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2927c7af777b460b7ccd95f8b67acd7b4c04ec8896bf0c8e80ba30523cffc057" +checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" dependencies = [ "bindgen", "cc", @@ -223,7 +223,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.31", "itoa", "matchit", "memchr", @@ -233,25 +233,25 @@ dependencies = [ "rustversion", "serde", "sync_wrapper 0.1.2", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", ] [[package]] name = "axum" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", - "axum-core 0.4.3", + "axum-core 0.4.5", "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.4.0", + "hyper 1.5.0", "hyper-util", "itoa", "matchit", @@ -266,7 +266,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower", + "tower 0.5.1", "tower-layer", "tower-service", "tracing", @@ -291,20 +291,20 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -316,13 +316,13 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26965dca35be1ca4a128177b9302c4c04f0661443621171adb09d002dcdf1d5" dependencies = [ - "axum 0.7.5", + "axum 0.7.7", "futures-core", "futures-util", "http 1.1.0", "opentelemetry 0.22.0", "pin-project-lite", - "tower", + "tower 0.4.13", "tracing", "tracing-opentelemetry 0.23.0", "tracing-opentelemetry-instrumentation-sdk", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.5.0" +version = "1.5.1" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -339,23 +339,23 @@ dependencies = [ "tokio", "tonic 0.9.2", "tonic-build 0.9.2", - "tower", + "tower 0.4.13", "tracing", ] [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -384,9 +384,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -395,13 +395,13 @@ dependencies = [ "lazy_static", "lazycell", "log", - "prettyplease 0.2.20", + "prettyplease 0.2.25", "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.68", + "syn 2.0.87", "which", ] @@ -466,22 +466,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -492,9 +492,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "candle-core" @@ -636,13 +636,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.104" +version = "1.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" +checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" dependencies = [ "jobserver", "libc", - "once_cell", + "shlex", ] [[package]] @@ -660,6 +660,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[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.38" @@ -671,7 +677,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -687,9 +693,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.8" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -697,9 +703,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -709,36 +715,36 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.8" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "cmake" -version = "0.1.50" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" dependencies = [ "cc", ] [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -774,9 +780,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics-types" @@ -791,9 +797,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -867,9 +873,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -877,27 +883,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -924,44 +930,44 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "d475dfebcb4854d596b17b09f477616f80f17a550517f2b3615d8c205d5c802b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "derive_builder" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "derive_builder_macro" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -1012,14 +1018,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-stack" @@ -1045,23 +1051,23 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -1117,26 +1123,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] @@ -1147,9 +1153,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -1188,7 +1194,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -1220,9 +1226,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1235,9 +1241,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1245,15 +1251,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1262,38 +1268,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1448,21 +1454,21 @@ dependencies = [ [[package]] name = "getset" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" +checksum = "f636605b743120a8d32ed92fc27b6cde1a769f8f936c065151eb66f88ded513c" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1492,7 +1498,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.2.6", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1501,9 +1507,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ "atomic-waker", "bytes", @@ -1511,7 +1517,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.2.6", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1547,6 +1553,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" + [[package]] name = "heck" version = "0.4.1" @@ -1630,9 +1642,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -1647,15 +1659,15 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1665,9 +1677,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -1689,16 +1701,16 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "httpdate", "itoa", @@ -1710,16 +1722,16 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.0", + "hyper 1.5.0", "hyper-util", "log", - "rustls 0.23.10", + "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -1734,7 +1746,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.29", + "hyper 0.14.31", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1747,7 +1759,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.29", + "hyper 0.14.31", "native-tls", "tokio", "tokio-native-tls", @@ -1761,7 +1773,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.0", + "hyper 1.5.0", "hyper-util", "native-tls", "tokio", @@ -1771,29 +1783,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", - "hyper 1.4.0", + "http-body 1.0.1", + "hyper 1.5.0", "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1812,6 +1823,124 @@ 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.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1820,12 +1949,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "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]] @@ -1840,12 +1980,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.1", "serde", ] @@ -1923,9 +2063,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_close" @@ -1938,9 +2078,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -1977,18 +2117,18 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -2007,25 +2147,25 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmimalloc-sys" @@ -2045,6 +2185,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", + "redox_syscall", ] [[package]] @@ -2059,6 +2200,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -2117,9 +2264,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "matrixmultiply" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" dependencies = [ "autocfg", "rawpointer", @@ -2133,9 +2280,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", "stable_deref_trait", @@ -2168,16 +2315,16 @@ dependencies = [ [[package]] name = "metrics-exporter-prometheus" -version = "0.15.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0af7a0d7ced10c0151f870e5e3f3f8bc9ffc5992d32873566ca1f9169ae776" +checksum = "b4f0c8427b39666bf970460908b213ec09b3b350f20c0c2eabcbba51704a08e6" dependencies = [ "base64 0.22.1", "http-body-util", - "hyper 1.4.0", + "hyper 1.5.0", "hyper-rustls", "hyper-util", - "indexmap 2.2.6", + "indexmap 2.6.0", "ipnet", "metrics", "metrics-util", @@ -2235,22 +2382,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2277,7 +2425,7 @@ checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -2322,6 +2470,21 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2395,23 +2558,23 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -2450,21 +2613,23 @@ dependencies = [ [[package]] name = "object" -version = "0.36.1" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "oci-spec" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098bc31d7c87110e22090eb082903caaed19f06319f63b6f7d7ed273bc8bdaec" +checksum = "3f5a3fe998d50101ae009351fec56d88a69f4ed182e11000e711068c2f5abf72" dependencies = [ "derive_builder", "getset", + "once_cell", + "regex", "serde", "serde_json", "strum", @@ -2529,9 +2694,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -2550,7 +2715,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -2561,9 +2726,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -2765,33 +2930,30 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "4.2.1" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ff2cf528c6c03d9ed653d6c4ce1dc0582dc4af309790ad92f07c1cd551b0be" +checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" dependencies = [ "num-traits", ] [[package]] name = "ort" -version = "2.0.0-rc.4" +version = "2.0.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d83095ae3c1258738d70ae7a06195c94d966a8e546f0d3609dc90885fb61f5" +checksum = "11826e6118cc42fea0cb2b102f7d006c1bb339cb167f8badb5fb568616438234" dependencies = [ "half", - "js-sys", - "ndarray", + "ndarray 0.16.1", "ort-sys", - "thiserror", "tracing", - "web-sys", ] [[package]] name = "ort-sys" -version = "2.0.0-rc.4" +version = "2.0.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2f6427193c808010b126bef45ebd33f8dee43770223a1200f84d3734d6c656" +checksum = "c4780a8b8681e653b2bed85c7f0e2c6e8547224c3e983e5ad27bf0457e012407" dependencies = [ "flate2", "pkg-config", @@ -2808,9 +2970,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2830,9 +2992,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2854,34 +3016,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.2.6", + "indexmap 2.6.0", ] [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2891,15 +3053,24 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "portable-atomic" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + +[[package]] +name = "portable-atomic-util" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" +dependencies = [ + "portable-atomic", +] [[package]] name = "powerfmt" @@ -2909,9 +3080,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" @@ -2925,21 +3099,21 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] @@ -2966,11 +3140,33 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -3030,11 +3226,11 @@ dependencies = [ "multimap 0.10.0", "once_cell", "petgraph", - "prettyplease 0.2.20", + "prettyplease 0.2.25", "prost 0.12.6", "prost-types 0.12.6", "regex", - "syn 2.0.68", + "syn 2.0.87", "tempfile", ] @@ -3061,7 +3257,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3084,9 +3280,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.18.21" +version = "0.18.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec8d02258294f59e4e223b41ad7e81c874aa6b15bc4ced9ba3965826da0eed5" +checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" dependencies = [ "bytemuck", "libm", @@ -3103,7 +3299,7 @@ dependencies = [ "crossbeam-utils", "libc", "once_cell", - "raw-cpuid 11.0.2", + "raw-cpuid 11.2.0", "wasi", "web-sys", "winapi", @@ -3111,16 +3307,17 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", - "rustls 0.23.10", + "rustc-hash 2.0.0", + "rustls", + "socket2", "thiserror", "tokio", "tracing", @@ -3128,15 +3325,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.3" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", "rand", "ring", - "rustc-hash", - "rustls 0.23.10", + "rustc-hash 2.0.0", + "rustls", "slab", "thiserror", "tinyvec", @@ -3145,22 +3342,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3216,9 +3414,9 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.0.2" +version = "11.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" +checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" dependencies = [ "bitflags 2.6.0", ] @@ -3268,27 +3466,18 @@ checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" [[package]] name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", @@ -3297,14 +3486,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -3318,13 +3507,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -3335,9 +3524,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -3353,7 +3542,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.31", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -3368,7 +3557,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration", + "system-configuration 0.5.1", "tokio", "tokio-native-tls", "tower-service", @@ -3376,14 +3565,14 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.50.0", + "winreg", ] [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -3391,11 +3580,11 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.4.0", + "hyper 1.5.0", "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", @@ -3408,14 +3597,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.10", - "rustls-pemfile 2.1.2", + "rustls", + "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", - "system-configuration", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", "tokio-rustls", @@ -3425,7 +3614,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg 0.52.0", + "windows-registry", ] [[package]] @@ -3445,9 +3634,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.4.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19549741604902eb99a7ed0ee177a0663ee1eda51a29f71401f166e47e77806a" +checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -3456,22 +3645,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.4.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9f96e283ec64401f30d3df8ee2aaeb2561f34c824381efa24a35f79bf40ee4" +checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.68", + "syn 2.0.87", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.4.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c74a686185620830701348de757fd36bef4aa9680fd23c49fc539ddcc1af32" +checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" dependencies = [ "sha2", "walkdir", @@ -3489,11 +3678,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" dependencies = [ "bitflags 2.6.0", "errno", @@ -3504,23 +3699,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.4" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "aws-lc-rs", "log", @@ -3534,12 +3715,12 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.2", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -3556,25 +3737,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "aws-lc-rs", "ring", @@ -3584,9 +3764,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -3596,9 +3776,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safetensors" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ced76b22c7fba1162f11a5a75d9d8405264b467a07ae0c9c29be119b9297db9" +checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" dependencies = [ "serde", "serde_json", @@ -3615,11 +3795,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3630,9 +3810,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -3643,9 +3823,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -3659,31 +3839,32 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -3709,9 +3890,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -3734,7 +3915,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -3763,7 +3944,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3803,9 +3984,9 @@ dependencies = [ [[package]] name = "similar" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" [[package]] name = "simsimd" @@ -3904,7 +4085,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3926,9 +4107,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.68" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -3946,6 +4127,9 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -3955,7 +4139,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3980,7 +4164,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] @@ -3993,11 +4188,21 @@ dependencies = [ "libc", ] +[[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 = "tar" -version = "0.4.41" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -4006,19 +4211,20 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "text-embeddings-backend" -version = "1.5.0" +version = "1.5.1" dependencies = [ "clap", "hf-hub", @@ -4033,7 +4239,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.5.0" +version = "1.5.1" dependencies = [ "accelerate-src", "anyhow", @@ -4063,7 +4269,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.5.0" +version = "1.5.1" dependencies = [ "clap", "nohash-hasher", @@ -4072,10 +4278,10 @@ dependencies = [ [[package]] name = "text-embeddings-backend-ort" -version = "1.5.0" +version = "1.5.1" dependencies = [ "anyhow", - "ndarray", + "ndarray 0.15.6", "nohash-hasher", "num_cpus", "ort", @@ -4088,7 +4294,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.5.0" +version = "1.5.1" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -4102,7 +4308,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.5.0" +version = "1.5.1" dependencies = [ "async-channel", "hf-hub", @@ -4117,11 +4323,11 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.5.0" +version = "1.5.1" dependencies = [ "anyhow", "async-stream", - "axum 0.7.5", + "axum 0.7.7", "axum-tracing-opentelemetry", "base64 0.22.1", "clap", @@ -4140,7 +4346,7 @@ dependencies = [ "opentelemetry-otlp 0.16.0", "opentelemetry_sdk 0.23.0", "prost 0.12.6", - "reqwest 0.12.5", + "reqwest 0.12.9", "serde", "serde_json", "simsimd", @@ -4166,22 +4372,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4227,11 +4433,21 @@ dependencies = [ "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.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4263,7 +4479,7 @@ dependencies = [ "rayon", "rayon-cond", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "serde", "serde_json", "spm_precompiled", @@ -4275,21 +4491,20 @@ dependencies = [ [[package]] name = "tokio" -version = "1.38.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4304,13 +4519,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4329,16 +4544,16 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.10", + "rustls", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -4347,9 +4562,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -4360,47 +4575,36 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.14", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.14" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.13", + "winnow", ] [[package]] @@ -4418,14 +4622,14 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.31", "hyper-timeout", "percent-encoding", "pin-project", "prost 0.11.9", "tokio", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -4445,14 +4649,14 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.31", "hyper-timeout", "percent-encoding", "pin-project", "prost 0.12.6", "tokio", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -4477,11 +4681,11 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ - "prettyplease 0.2.20", + "prettyplease 0.2.25", "proc-macro2", "prost-build 0.12.6", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4530,6 +4734,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-http" version = "0.5.2" @@ -4539,7 +4759,7 @@ dependencies = [ "bitflags 2.6.0", "bytes", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", "pin-project-lite", "tower-layer", @@ -4548,15 +4768,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -4578,7 +4798,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4720,33 +4940,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization-alignments" @@ -4759,15 +4961,15 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode_categories" @@ -4789,18 +4991,17 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.7" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd" +checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" dependencies = [ "base64 0.22.1", "flate2", "log", "native-tls", "once_cell", - "rustls 0.22.4", + "rustls", "rustls-pki-types", - "rustls-webpki", "serde", "serde_json", "socks", @@ -4810,9 +5011,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -4825,6 +5026,18 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[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" @@ -4837,7 +5050,7 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.6.0", "serde", "serde_json", "utoipa-gen", @@ -4845,15 +5058,15 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "4.3.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bf0e16c02bc4bf5322ab65f10ab1149bdbcaa782cba66dc7057370a3f8190be" +checksum = "20c24e8ab68ff9ee746aad22d39b5535601e6416d1b0feeabf78be986a5c4392" dependencies = [ "proc-macro-error", "proc-macro2", "quote", "regex", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4862,10 +5075,10 @@ version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "943e0ff606c6d57d410fd5663a4d7c074ab2c5f14ab903b9514565e59fa1189e" dependencies = [ - "axum 0.7.5", + "axum 0.7.7", "mime_guess", "regex", - "reqwest 0.12.5", + "reqwest 0.12.9", "rust-embed", "serde", "serde_json", @@ -4876,9 +5089,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.9.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", ] @@ -4913,14 +5126,14 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "vergen" -version = "8.3.1" +version = "8.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525" +checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" dependencies = [ "anyhow", "cfg-if", @@ -4930,9 +5143,9 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -4961,34 +5174,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -4998,9 +5212,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5008,28 +5222,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -5047,9 +5261,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.3" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] @@ -5084,11 +5298,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5103,7 +5317,37 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "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", + "windows-targets 0.52.6", ] [[package]] @@ -5121,7 +5365,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "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]] @@ -5141,18 +5394,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "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.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "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]] @@ -5163,9 +5416,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -5175,9 +5428,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -5187,15 +5440,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -5205,9 +5458,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -5217,9 +5470,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -5229,9 +5482,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -5241,24 +5494,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winnow" -version = "0.5.40" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.13" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -5274,14 +5518,16 @@ dependencies = [ ] [[package]] -name = "winreg" -version = "0.52.0" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xattr" @@ -5323,28 +5569,29 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -5364,7 +5611,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "synstructure", ] @@ -5373,19 +5620,27 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ - "zeroize_derive", + "yoke", + "zerofrom", + "zerovec-derive", ] [[package]] -name = "zeroize_derive" -version = "1.4.2" +name = "zerovec-derive" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -5410,7 +5665,7 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.2.6", + "indexmap 2.6.0", "num_enum", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 64c4d721..3d13f7de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.5.0" +version = "1.5.1" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" diff --git a/docs/openapi.json b/docs/openapi.json index aedb7365..f12811d3 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "1.5.0" + "version": "1.5.1" }, "paths": { "/decode": { From 76b29f1c24f4f25da927717c12b39e06d77be7a9 Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:57:30 +0100 Subject: [PATCH 35/36] hotfix lockfile --- Cargo.lock | 1393 +++++++++++++++++++++------------------------------- 1 file changed, 569 insertions(+), 824 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38b11c24..837abcbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,18 +10,18 @@ checksum = "415ed64958754dbe991900f3940677e6a7eefb4d7367afd70d642677b0c7d19d" [[package]] name = "addr2line" -version = "0.24.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] [[package]] -name = "adler2" -version = "2.0.0" +name = "adler" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", @@ -76,52 +76,52 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" dependencies = [ "backtrace", ] [[package]] name = "arbitrary" -version = "1.4.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775a8770d29db3dadcb858482cc240af7b2ffde4ac4de67d1d4955728103f0e2" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", @@ -151,24 +151,24 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -179,15 +179,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "aws-lc-rs" -version = "1.10.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" +checksum = "a8a47f2fb521b70c11ce7369a6c5fa4bd6af7e5d62ec06303875bafe7c6ba245" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -197,9 +197,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.22.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" +checksum = "2927c7af777b460b7ccd95f8b67acd7b4c04ec8896bf0c8e80ba30523cffc057" dependencies = [ "bindgen", "cc", @@ -223,7 +223,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.29", "itoa", "matchit", "memchr", @@ -233,25 +233,25 @@ dependencies = [ "rustversion", "serde", "sync_wrapper 0.1.2", - "tower 0.4.13", + "tower", "tower-layer", "tower-service", ] [[package]] name = "axum" -version = "0.7.7" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" dependencies = [ "async-trait", - "axum-core 0.4.5", + "axum-core 0.4.3", "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body 1.0.0", "http-body-util", - "hyper 1.5.0", + "hyper 1.4.0", "hyper-util", "itoa", "matchit", @@ -266,7 +266,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower 0.5.1", + "tower", "tower-layer", "tower-service", "tracing", @@ -291,20 +291,20 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" dependencies = [ "async-trait", "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body 1.0.0", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 0.1.2", "tower-layer", "tower-service", "tracing", @@ -316,13 +316,13 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26965dca35be1ca4a128177b9302c4c04f0661443621171adb09d002dcdf1d5" dependencies = [ - "axum 0.7.7", + "axum 0.7.5", "futures-core", "futures-util", "http 1.1.0", "opentelemetry 0.22.0", "pin-project-lite", - "tower 0.4.13", + "tower", "tracing", "tracing-opentelemetry 0.23.0", "tracing-opentelemetry-instrumentation-sdk", @@ -339,23 +339,23 @@ dependencies = [ "tokio", "tonic 0.9.2", "tonic-build 0.9.2", - "tower 0.4.13", + "tower", "tracing", ] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", + "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", ] [[package]] @@ -384,9 +384,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bindgen" -version = "0.69.5" +version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -395,13 +395,13 @@ dependencies = [ "lazy_static", "lazycell", "log", - "prettyplease 0.2.25", + "prettyplease 0.2.20", "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash", "shlex", - "syn 2.0.87", + "syn 2.0.68", "which", ] @@ -466,22 +466,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -492,9 +492,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "candle-core" @@ -636,13 +636,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.35" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" +checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" dependencies = [ "jobserver", "libc", - "shlex", + "once_cell", ] [[package]] @@ -660,12 +660,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[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.38" @@ -677,7 +671,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-targets 0.52.5", ] [[package]] @@ -693,9 +687,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", "clap_derive", @@ -703,9 +697,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", @@ -715,36 +709,36 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "cmake" -version = "0.1.51" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" dependencies = [ "cc", ] [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "concurrent-queue" @@ -780,9 +774,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics-types" @@ -797,9 +791,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -873,9 +867,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -883,27 +877,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -930,44 +924,44 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d475dfebcb4854d596b17b09f477616f80f17a550517f2b3615d8c205d5c802b" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "derive_builder" -version = "0.20.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "derive_builder_macro" -version = "0.20.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -1018,14 +1012,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "dunce" -version = "1.0.5" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "dyn-stack" @@ -1051,23 +1045,23 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -1123,26 +1117,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] name = "fastrand" -version = "2.1.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "libredox", - "windows-sys 0.59.0", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] [[package]] @@ -1153,9 +1147,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -1194,7 +1188,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -1226,9 +1220,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1241,9 +1235,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1251,15 +1245,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1268,38 +1262,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1454,21 +1448,21 @@ dependencies = [ [[package]] name = "getset" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f636605b743120a8d32ed92fc27b6cde1a769f8f936c065151eb66f88ded513c" +checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" dependencies = [ - "proc-macro-error2", + "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.87", + "syn 1.0.109", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1498,7 +1492,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1507,9 +1501,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ "atomic-waker", "bytes", @@ -1517,7 +1511,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.6.0", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1553,12 +1547,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" - [[package]] name = "heck" version = "0.4.1" @@ -1642,9 +1630,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", "http 1.1.0", @@ -1659,15 +1647,15 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body 1.0.0", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1677,9 +1665,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -1701,16 +1689,16 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", + "h2 0.4.5", "http 1.1.0", - "http-body 1.0.1", + "http-body 1.0.0", "httparse", "httpdate", "itoa", @@ -1722,16 +1710,16 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.5.0", + "hyper 1.4.0", "hyper-util", "log", - "rustls", + "rustls 0.23.10", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -1746,7 +1734,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.31", + "hyper 0.14.29", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1759,7 +1747,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.31", + "hyper 0.14.29", "native-tls", "tokio", "tokio-native-tls", @@ -1773,7 +1761,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.0", + "hyper 1.4.0", "hyper-util", "native-tls", "tokio", @@ -1783,28 +1771,29 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.1", - "hyper 1.5.0", + "http-body 1.0.0", + "hyper 1.4.0", "pin-project-lite", "socket2", "tokio", + "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1823,124 +1812,6 @@ 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.87", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1949,23 +1820,12 @@ 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" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "icu_normalizer", - "icu_properties", + "unicode-bidi", + "unicode-normalization", ] [[package]] @@ -1980,12 +1840,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.14.5", "serde", ] @@ -2063,9 +1923,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is_close" @@ -2078,9 +1938,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" [[package]] name = "itertools" @@ -2117,18 +1977,18 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2147,25 +2007,25 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.52.5", ] [[package]] name = "libm" -version = "0.2.11" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libmimalloc-sys" @@ -2185,7 +2045,6 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall", ] [[package]] @@ -2200,12 +2059,6 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" -[[package]] -name = "litemap" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" - [[package]] name = "lock_api" version = "0.4.12" @@ -2264,9 +2117,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" dependencies = [ "autocfg", "rawpointer", @@ -2280,9 +2133,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" dependencies = [ "libc", "stable_deref_trait", @@ -2315,16 +2168,16 @@ dependencies = [ [[package]] name = "metrics-exporter-prometheus" -version = "0.15.3" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f0c8427b39666bf970460908b213ec09b3b350f20c0c2eabcbba51704a08e6" +checksum = "bf0af7a0d7ced10c0151f870e5e3f3f8bc9ffc5992d32873566ca1f9169ae776" dependencies = [ "base64 0.22.1", "http-body-util", - "hyper 1.5.0", + "hyper 1.4.0", "hyper-rustls", "hyper-util", - "indexmap 2.6.0", + "indexmap 2.2.6", "ipnet", "metrics", "metrics-util", @@ -2382,23 +2235,22 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ - "adler2", + "adler", ] [[package]] name = "mio" -version = "1.0.2" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ - "hermit-abi", "libc", "wasi", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -2425,7 +2277,7 @@ checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -2470,21 +2322,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "ndarray" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "portable-atomic", - "portable-atomic-util", - "rawpointer", -] - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2558,23 +2395,23 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -2613,23 +2450,21 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] [[package]] name = "oci-spec" -version = "0.6.8" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f5a3fe998d50101ae009351fec56d88a69f4ed182e11000e711068c2f5abf72" +checksum = "098bc31d7c87110e22090eb082903caaed19f06319f63b6f7d7ed273bc8bdaec" dependencies = [ "derive_builder", "getset", - "once_cell", - "regex", "serde", "serde_json", "strum", @@ -2694,9 +2529,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -2715,7 +2550,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -2726,9 +2561,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -2930,30 +2765,33 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "4.5.0" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" +checksum = "19ff2cf528c6c03d9ed653d6c4ce1dc0582dc4af309790ad92f07c1cd551b0be" dependencies = [ "num-traits", ] [[package]] name = "ort" -version = "2.0.0-rc.8" +version = "2.0.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11826e6118cc42fea0cb2b102f7d006c1bb339cb167f8badb5fb568616438234" +checksum = "86d83095ae3c1258738d70ae7a06195c94d966a8e546f0d3609dc90885fb61f5" dependencies = [ "half", - "ndarray 0.16.1", + "js-sys", + "ndarray", "ort-sys", + "thiserror", "tracing", + "web-sys", ] [[package]] name = "ort-sys" -version = "2.0.0-rc.8" +version = "2.0.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4780a8b8681e653b2bed85c7f0e2c6e8547224c3e983e5ad27bf0457e012407" +checksum = "0f2f6427193c808010b126bef45ebd33f8dee43770223a1200f84d3734d6c656" dependencies = [ "flate2", "pkg-config", @@ -2970,9 +2808,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking" -version = "2.2.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" @@ -2992,9 +2830,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.52.6", + "windows-targets 0.52.5", ] [[package]] @@ -3016,34 +2854,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.2.6", ] [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3053,24 +2891,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - -[[package]] -name = "portable-atomic-util" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" -dependencies = [ - "portable-atomic", -] +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "powerfmt" @@ -3080,12 +2909,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" @@ -3099,21 +2925,21 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit", + "toml_edit 0.21.1", ] [[package]] @@ -3140,33 +2966,11 @@ dependencies = [ "version_check", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -3226,11 +3030,11 @@ dependencies = [ "multimap 0.10.0", "once_cell", "petgraph", - "prettyplease 0.2.25", + "prettyplease 0.2.20", "prost 0.12.6", "prost-types 0.12.6", "regex", - "syn 2.0.87", + "syn 2.0.68", "tempfile", ] @@ -3257,7 +3061,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -3280,9 +3084,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.18.22" +version = "0.18.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" +checksum = "0ec8d02258294f59e4e223b41ad7e81c874aa6b15bc4ced9ba3965826da0eed5" dependencies = [ "bytemuck", "libm", @@ -3299,7 +3103,7 @@ dependencies = [ "crossbeam-utils", "libc", "once_cell", - "raw-cpuid 11.2.0", + "raw-cpuid 11.0.2", "wasi", "web-sys", "winapi", @@ -3307,17 +3111,16 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", - "rustls", - "socket2", + "rustc-hash", + "rustls 0.23.10", "thiserror", "tokio", "tracing", @@ -3325,15 +3128,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" dependencies = [ "bytes", "rand", "ring", - "rustc-hash 2.0.0", - "rustls", + "rustc-hash", + "rustls 0.23.10", "slab", "thiserror", "tinyvec", @@ -3342,23 +3145,22 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" dependencies = [ - "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -3414,9 +3216,9 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.2.0" +version = "11.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" dependencies = [ "bitflags 2.6.0", ] @@ -3466,18 +3268,27 @@ checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", @@ -3486,14 +3297,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -3507,13 +3318,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax 0.8.4", ] [[package]] @@ -3524,9 +3335,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -3542,7 +3353,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.29", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -3557,7 +3368,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration 0.5.1", + "system-configuration", "tokio", "tokio-native-tls", "tower-service", @@ -3565,14 +3376,14 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "winreg 0.50.0", ] [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ "base64 0.22.1", "bytes", @@ -3580,11 +3391,11 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.6", + "h2 0.4.5", "http 1.1.0", - "http-body 1.0.1", + "http-body 1.0.0", "http-body-util", - "hyper 1.5.0", + "hyper 1.4.0", "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", @@ -3597,14 +3408,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls", - "rustls-pemfile 2.2.0", + "rustls 0.23.10", + "rustls-pemfile 2.1.2", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", - "system-configuration 0.6.1", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -3614,7 +3425,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "windows-registry", + "winreg 0.52.0", ] [[package]] @@ -3634,9 +3445,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.5.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +checksum = "19549741604902eb99a7ed0ee177a0663ee1eda51a29f71401f166e47e77806a" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -3645,22 +3456,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.5.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +checksum = "cb9f96e283ec64401f30d3df8ee2aaeb2561f34c824381efa24a35f79bf40ee4" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.87", + "syn 2.0.68", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.5.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +checksum = "38c74a686185620830701348de757fd36bef4aa9680fd23c49fc539ddcc1af32" dependencies = [ "sha2", "walkdir", @@ -3678,17 +3489,11 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - [[package]] name = "rustix" -version = "0.38.39" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.6.0", "errno", @@ -3699,9 +3504,23 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls" +version = "0.23.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" dependencies = [ "aws-lc-rs", "log", @@ -3715,12 +3534,12 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile 2.2.0", + "rustls-pemfile 2.1.2", "rustls-pki-types", "schannel", "security-framework", @@ -3737,24 +3556,25 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.2.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ + "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "aws-lc-rs", "ring", @@ -3764,9 +3584,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" @@ -3776,9 +3596,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safetensors" -version = "0.4.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" +checksum = "8ced76b22c7fba1162f11a5a75d9d8405264b467a07ae0c9c29be119b9297db9" dependencies = [ "serde", "serde_json", @@ -3795,11 +3615,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3810,9 +3630,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -3823,9 +3643,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -3839,32 +3659,31 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", - "memchr", "ryu", "serde", ] @@ -3890,9 +3709,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -3915,7 +3734,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.2.6", "itoa", "ryu", "serde", @@ -3944,7 +3763,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -3984,9 +3803,9 @@ dependencies = [ [[package]] name = "similar" -version = "2.6.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" +checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" [[package]] name = "simsimd" @@ -4085,7 +3904,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -4107,9 +3926,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -4127,9 +3946,6 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -dependencies = [ - "futures-core", -] [[package]] name = "synstructure" @@ -4139,7 +3955,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -4164,18 +3980,7 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys 0.5.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "system-configuration-sys 0.6.0", + "system-configuration-sys", ] [[package]] @@ -4188,21 +3993,11 @@ dependencies = [ "libc", ] -[[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 = "tar" -version = "0.4.43" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -4211,15 +4006,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", - "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4281,7 +4075,7 @@ name = "text-embeddings-backend-ort" version = "1.5.1" dependencies = [ "anyhow", - "ndarray 0.15.6", + "ndarray", "nohash-hasher", "num_cpus", "ort", @@ -4327,7 +4121,7 @@ version = "1.5.1" dependencies = [ "anyhow", "async-stream", - "axum 0.7.7", + "axum 0.7.5", "axum-tracing-opentelemetry", "base64 0.22.1", "clap", @@ -4346,7 +4140,7 @@ dependencies = [ "opentelemetry-otlp 0.16.0", "opentelemetry_sdk 0.23.0", "prost 0.12.6", - "reqwest 0.12.9", + "reqwest 0.12.5", "serde", "serde_json", "simsimd", @@ -4372,22 +4166,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -4433,21 +4227,11 @@ dependencies = [ "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.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -4479,7 +4263,7 @@ dependencies = [ "rayon", "rayon-cond", "regex", - "regex-syntax 0.8.5", + "regex-syntax 0.8.4", "serde", "serde_json", "spm_precompiled", @@ -4491,20 +4275,21 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", "libc", "mio", + "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -4519,13 +4304,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -4544,16 +4329,16 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls", + "rustls 0.23.10", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -4562,9 +4347,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", @@ -4575,36 +4360,47 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.14", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +dependencies = [ + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.13", ] [[package]] @@ -4622,14 +4418,14 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.29", "hyper-timeout", "percent-encoding", "pin-project", "prost 0.11.9", "tokio", "tokio-stream", - "tower 0.4.13", + "tower", "tower-layer", "tower-service", "tracing", @@ -4649,14 +4445,14 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.29", "hyper-timeout", "percent-encoding", "pin-project", "prost 0.12.6", "tokio", "tokio-stream", - "tower 0.4.13", + "tower", "tower-layer", "tower-service", "tracing", @@ -4681,11 +4477,11 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ - "prettyplease 0.2.25", + "prettyplease 0.2.20", "proc-macro2", "prost-build 0.12.6", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -4734,22 +4530,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 0.1.2", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower-http" version = "0.5.2" @@ -4759,7 +4539,7 @@ dependencies = [ "bitflags 2.6.0", "bytes", "http 1.1.0", - "http-body 1.0.1", + "http-body 1.0.0", "http-body-util", "pin-project-lite", "tower-layer", @@ -4768,15 +4548,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" [[package]] name = "tower-service" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" @@ -4798,7 +4578,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -4940,15 +4720,33 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.8.0" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] [[package]] name = "unicode-normalization-alignments" @@ -4961,15 +4759,15 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode_categories" @@ -4991,17 +4789,18 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.10.1" +version = "2.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" +checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd" dependencies = [ "base64 0.22.1", "flate2", "log", "native-tls", "once_cell", - "rustls", + "rustls 0.22.4", "rustls-pki-types", + "rustls-webpki", "serde", "serde_json", "socks", @@ -5011,9 +4810,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.3" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -5026,18 +4825,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[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" @@ -5050,7 +4837,7 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.2.6", "serde", "serde_json", "utoipa-gen", @@ -5058,15 +4845,15 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "4.3.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c24e8ab68ff9ee746aad22d39b5535601e6416d1b0feeabf78be986a5c4392" +checksum = "7bf0e16c02bc4bf5322ab65f10ab1149bdbcaa782cba66dc7057370a3f8190be" dependencies = [ "proc-macro-error", "proc-macro2", "quote", "regex", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -5075,10 +4862,10 @@ version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "943e0ff606c6d57d410fd5663a4d7c074ab2c5f14ab903b9514565e59fa1189e" dependencies = [ - "axum 0.7.7", + "axum 0.7.5", "mime_guess", "regex", - "reqwest 0.12.9", + "reqwest 0.12.5", "rust-embed", "serde", "serde_json", @@ -5089,9 +4876,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.11.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" dependencies = [ "getrandom", ] @@ -5126,14 +4913,14 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] name = "vergen" -version = "8.3.2" +version = "8.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" +checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525" dependencies = [ "anyhow", "cfg-if", @@ -5143,9 +4930,9 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" @@ -5174,35 +4961,34 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", - "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -5212,9 +4998,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5222,28 +5008,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -5261,9 +5047,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] @@ -5298,11 +5084,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -5317,37 +5103,7 @@ 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-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "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", - "windows-targets 0.52.6", + "windows-targets 0.52.5", ] [[package]] @@ -5365,16 +5121,7 @@ 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", + "windows-targets 0.52.5", ] [[package]] @@ -5394,18 +5141,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", "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", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -5416,9 +5163,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -5428,9 +5175,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -5440,15 +5187,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] name = "windows_i686_gnullvm" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -5458,9 +5205,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -5470,9 +5217,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -5482,9 +5229,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -5494,15 +5241,24 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.6" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.20" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] @@ -5518,16 +5274,14 @@ dependencies = [ ] [[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" +name = "winreg" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] [[package]] name = "xattr" @@ -5569,29 +5323,28 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -5611,7 +5364,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", "synstructure", ] @@ -5620,27 +5373,19 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", + "zeroize_derive", ] [[package]] -name = "zerovec-derive" -version = "0.10.3" +name = "zeroize_derive" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.68", ] [[package]] @@ -5665,7 +5410,7 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.6.0", + "indexmap 2.2.6", "num_enum", "thiserror", ] From 015029b5e086965b39db4e4eabf4c612dba7a2dd Mon Sep 17 00:00:00 2001 From: kozistr Date: Sun, 17 Nov 2024 16:20:12 +0900 Subject: [PATCH 36/36] update dependency --- Cargo.lock | 26 +++++++++++++++++--------- backends/ort/Cargo.toml | 4 ++-- backends/ort/src/lib.rs | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 837abcbb..38c868f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2311,14 +2311,16 @@ dependencies = [ [[package]] name = "ndarray" -version = "0.15.6" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" dependencies = [ "matrixmultiply", "num-complex", "num-integer", "num-traits", + "portable-atomic", + "portable-atomic-util", "rawpointer", ] @@ -2774,24 +2776,21 @@ dependencies = [ [[package]] name = "ort" -version = "2.0.0-rc.4" +version = "2.0.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d83095ae3c1258738d70ae7a06195c94d966a8e546f0d3609dc90885fb61f5" +checksum = "11826e6118cc42fea0cb2b102f7d006c1bb339cb167f8badb5fb568616438234" dependencies = [ "half", - "js-sys", "ndarray", "ort-sys", - "thiserror", "tracing", - "web-sys", ] [[package]] name = "ort-sys" -version = "2.0.0-rc.4" +version = "2.0.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2f6427193c808010b126bef45ebd33f8dee43770223a1200f84d3734d6c656" +checksum = "c4780a8b8681e653b2bed85c7f0e2c6e8547224c3e983e5ad27bf0457e012407" dependencies = [ "flate2", "pkg-config", @@ -2901,6 +2900,15 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +[[package]] +name = "portable-atomic-util" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" +dependencies = [ + "portable-atomic", +] + [[package]] name = "powerfmt" version = "0.2.0" diff --git a/backends/ort/Cargo.toml b/backends/ort/Cargo.toml index 0d40fddd..40ccc560 100644 --- a/backends/ort/Cargo.toml +++ b/backends/ort/Cargo.toml @@ -8,9 +8,9 @@ homepage.workspace = true [dependencies] anyhow = { workspace = true } nohash-hasher = { workspace = true } -ndarray = "0.15.6" +ndarray = "0.16.1" num_cpus = { workspace = true } -ort = { version = "2.0.0-rc.4", default-features = false, features = ["download-binaries", "half", "onednn", "ndarray"] } +ort = { version = "2.0.0-rc.8", default-features = false, features = ["download-binaries", "half", "onednn", "ndarray"] } text-embeddings-backend-core = { path = "../core" } tracing = { workspace = true } thiserror = { workspace = true } diff --git a/backends/ort/src/lib.rs b/backends/ort/src/lib.rs index 08dbfa7e..ab38fcc1 100644 --- a/backends/ort/src/lib.rs +++ b/backends/ort/src/lib.rs @@ -246,7 +246,7 @@ impl Backend for OrtBackend { if has_raw_requests { // Reshape outputs let s = outputs.shape().to_vec(); - let outputs = outputs.into_shape((s[0] * s[1], s[2])).e()?; + let outputs = outputs.into_shape_with_order((s[0] * s[1], s[2])).e()?; // We need to remove the padding tokens only if batch_size > 1 and there are some // member of the batch that require pooling