From b7be6c09df4b2298ed74779e2d6a5e4855dc2c94 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 5 Mar 2024 18:42:31 +0100 Subject: [PATCH 01/72] feat: add cuda all image to facilitate deployment (#186) --- .github/workflows/build_all.yaml | 85 ++++++++++++++++++++ Cargo.toml | 2 +- Dockerfile-cuda-all | 98 ++++++++++++++++++++++++ backends/candle/src/models/distilbert.rs | 4 +- cuda-all-entrypoint.sh | 21 +++++ 5 files changed, 206 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/build_all.yaml create mode 100644 Dockerfile-cuda-all create mode 100644 cuda-all-entrypoint.sh diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml new file mode 100644 index 00000000..9e095183 --- /dev/null +++ b/.github/workflows/build_all.yaml @@ -0,0 +1,85 @@ + name: Build and push Cuda docker image to registry + + on: + workflow_dispatch: + push: + 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, tgi-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 + - 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: Tailscale + uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + with: + authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + - 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: 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 + 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: | + 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.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 diff --git a/Cargo.toml b/Cargo.toml index 40ae6dc3..b57e7346 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ hf-hub = { git = "https://github.com/huggingface/hf-hub", rev = "b167f69692be5f4 [profile.release] -debug = 1 +debug = 0 incremental = true lto = "off" panic = "abort" diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all new file mode 100644 index 00000000..ac2dcdb2 --- /dev/null +++ b/Dockerfile-cuda-all @@ -0,0 +1,98 @@ +FROM nvidia/cuda:12.2.0-devel-ubuntu22.04 AS base-builder + +ENV SCCACHE=0.5.4 +ENV RUSTC_WRAPPER=/usr/local/bin/sccache +ENV PATH="/root/.cargo/bin:${PATH}" + +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + curl \ + libssl-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# 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 + +RUN curl https://sh.rustup.rs -sSf | bash -s -- -y +RUN cargo install cargo-chef --locked + +FROM base-builder AS planner + +WORKDIR /usr/src + +COPY backends backends +COPY core core +COPY router router +COPY Cargo.toml ./ +COPY Cargo.lock ./ + +RUN cargo chef prepare --recipe-path recipe.json + +FROM base-builder AS builder + +ARG GIT_SHA +ARG DOCKER_LABEL + +# sccache specific variables +ARG ACTIONS_CACHE_URL +ARG ACTIONS_RUNTIME_TOKEN +ARG SCCACHE_GHA_ENABLED + +WORKDIR /usr/src + +COPY --from=planner /usr/src/recipe.json recipe.json + +FROM builder as builder-75 + +RUN CUDA_COMPUTE_CAP=75 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s + +COPY backends backends +COPY core core +COPY router router +COPY Cargo.toml ./ +COPY Cargo.lock ./ + +RUN CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s + +FROM builder as builder-80 + +RUN CUDA_COMPUTE_CAP=80 cargo chef cook --release --features candle-cuda --no-default-features --recipe-path recipe.json && sccache -s + +COPY backends backends +COPY core core +COPY router router +COPY Cargo.toml ./ +COPY Cargo.lock ./ + +RUN CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s + +FROM builder as builder-90 + +RUN CUDA_COMPUTE_CAP=90 cargo chef cook --release --features candle-cuda --no-default-features --recipe-path recipe.json && sccache -s + +COPY backends backends +COPY core core +COPY router router +COPY Cargo.toml ./ +COPY Cargo.lock ./ + +RUN CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s + +FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 as base + +ARG DEFAULT_USE_FLASH_ATTENTION=True + +ENV HUGGINGFACE_HUB_CACHE=/data \ + PORT=80 \ + USE_FLASH_ATTENTION=$DEFAULT_USE_FLASH_ATTENTION + +COPY --from=builder-75 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-75 +COPY --from=builder-80 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-80 +COPY --from=builder-90 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-90 + +COPY cuda-all-entrypoint.sh entrypoint.sh +RUN chmod +x entrypoint.sh + +ENTRYPOINT ["./entrypoint.sh"] +CMD ["--json-output"] diff --git a/backends/candle/src/models/distilbert.rs b/backends/candle/src/models/distilbert.rs index 5caa18af..e7145309 100644 --- a/backends/candle/src/models/distilbert.rs +++ b/backends/candle/src/models/distilbert.rs @@ -364,9 +364,7 @@ impl DistilBertSpladeHead { let hidden_states = self.vocab_transform.forward(hidden_states)?; let hidden_states = self.vocab_layer_norm.forward(&hidden_states, None)?; let hidden_states = self.vocab_projector.forward(&hidden_states)?; - Ok(hidden_states) - - // (1.0 + hidden_states)?.log() + (1.0 + hidden_states)?.log() } } diff --git a/cuda-all-entrypoint.sh b/cuda-all-entrypoint.sh new file mode 100644 index 00000000..d9be21ea --- /dev/null +++ b/cuda-all-entrypoint.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +if ! command -v nvidia-smi &> /dev/null; then + echo "Error: 'nvidia-smi' command not found." + exit 1 +fi + +compute_cap=$(nvidia-smi --query-gpu=compute_cap --format=csv | sed -n '2p' | sed 's/\.//g') + +if [ ${compute_cap} -eq 75 ] +then + exec text-embeddings-router-75 "$@" +elif [ ${compute_cap} -ge 80 -a ${compute_cap} -lt 90 ] +then + exec text-embeddings-router-80 "$@" +elif [ ${compute_cap} -eq 90 ] +then + exec text-embeddings-router-90 "$@" +else + echo "cuda compute cap ${compute_cap} is not supported"; exit 1 +fi From 9ab2f2c5d1e7bca8cc3e2bc4abf21ed9010e2f00 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Wed, 6 Mar 2024 12:05:40 +0100 Subject: [PATCH 02/72] feat: add splade pooling to Bert (#187) --- .github/workflows/build_75.yaml | 12 -- .github/workflows/build_86.yaml | 12 -- .github/workflows/build_89.yaml | 12 -- .github/workflows/build_90.yaml | 12 -- backends/candle/src/lib.rs | 2 +- backends/candle/src/models/bert.rs | 133 ++++++++++++++++-- backends/candle/src/models/flash_bert.rs | 62 ++++++-- .../candle/src/models/flash_distilbert.rs | 4 +- 8 files changed, 174 insertions(+), 75 deletions(-) diff --git a/.github/workflows/build_75.yaml b/.github/workflows/build_75.yaml index 4c77db52..609a73c7 100644 --- a/.github/workflows/build_75.yaml +++ b/.github/workflows/build_75.yaml @@ -7,18 +7,6 @@ - 'main' tags: - 'v*' - pull_request: - paths: - - ".github/workflows/build_75.yaml" -# - "integration-tests/**" - - "backends/**" - - "core/**" - - "router/**" - - "Cargo.lock" - - "rust-toolchain.toml" - - "Dockerfile" - branches: - - 'main' jobs: build-and-push-image: diff --git a/.github/workflows/build_86.yaml b/.github/workflows/build_86.yaml index 03b444f6..5c8f0838 100644 --- a/.github/workflows/build_86.yaml +++ b/.github/workflows/build_86.yaml @@ -7,18 +7,6 @@ - '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: diff --git a/.github/workflows/build_89.yaml b/.github/workflows/build_89.yaml index 8602e2cb..7371708f 100644 --- a/.github/workflows/build_89.yaml +++ b/.github/workflows/build_89.yaml @@ -7,18 +7,6 @@ - '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: diff --git a/.github/workflows/build_90.yaml b/.github/workflows/build_90.yaml index b441823c..a7e8617d 100644 --- a/.github/workflows/build_90.yaml +++ b/.github/workflows/build_90.yaml @@ -7,18 +7,6 @@ - '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: diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index 972148db..9b9ab832 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -194,7 +194,7 @@ impl CandleBackend { .to_lowercase() == "true" { - tracing::info!("Starting FlashNomicBertModel model on {:?}", device); + tracing::info!("Starting FlashDistilBertModel model on {:?}", device); Ok(Box::new( FlashDistilBertModel::load(vb, &config, model_type).s()?, )) diff --git a/backends/candle/src/models/bert.rs b/backends/candle/src/models/bert.rs index f5c74133..fde7e08e 100644 --- a/backends/candle/src/models/bert.rs +++ b/backends/candle/src/models/bert.rs @@ -440,11 +440,95 @@ impl ClassificationHead for RobertaClassificationHead { } } +#[derive(Debug)] +pub struct BertSpladeHead { + transform: Linear, + transform_layer_norm: LayerNorm, + decoder: Linear, + span: tracing::Span, +} + +impl BertSpladeHead { + pub(crate) fn load(vb: VarBuilder, config: &BertConfig) -> Result { + let vb = vb.pp("cls.predictions"); + let transform_weight = vb + .pp("transform.dense") + .get((config.hidden_size, config.hidden_size), "weight")?; + let transform_bias = vb.pp("transform.dense").get(config.hidden_size, "bias")?; + let transform = Linear::new( + transform_weight, + Some(transform_bias), + Some(config.hidden_act.clone()), + ); + + let transform_layer_norm = LayerNorm::load( + vb.pp("transform.LayerNorm"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + let decoder_weight = vb + .pp("decoder") + .get((config.vocab_size, config.hidden_size), "weight")?; + let decoder_bias = vb.get(config.vocab_size, "bias")?; + let decoder = Linear::new(decoder_weight, Some(decoder_bias), Some(HiddenAct::Relu)); + + Ok(Self { + transform, + transform_layer_norm, + decoder, + span: tracing::span!(tracing::Level::TRACE, "splade"), + }) + } + + pub(crate) fn load_roberta(vb: VarBuilder, config: &BertConfig) -> Result { + let vb = vb.pp("lm_head"); + let transform_weight = vb + .pp("dense") + .get((config.hidden_size, config.hidden_size), "weight")?; + let transform_bias = vb.pp("dense").get(config.hidden_size, "bias")?; + let transform = Linear::new( + transform_weight, + Some(transform_bias), + Some(HiddenAct::Gelu), + ); + + let transform_layer_norm = LayerNorm::load( + vb.pp("layer_norm"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + let decoder_weight = vb + .pp("decoder") + .get((config.vocab_size, config.hidden_size), "weight")?; + let decoder_bias = vb.get(config.vocab_size, "bias")?; + let decoder = Linear::new(decoder_weight, Some(decoder_bias), Some(HiddenAct::Relu)); + + Ok(Self { + transform, + transform_layer_norm, + decoder, + span: tracing::span!(tracing::Level::TRACE, "splade"), + }) + } + + pub(crate) fn forward(&self, hidden_states: &Tensor) -> Result { + let _enter = self.span.enter(); + + let hidden_states = self.transform.forward(hidden_states)?; + let hidden_states = self.transform_layer_norm.forward(&hidden_states, None)?; + let hidden_states = self.decoder.forward(&hidden_states)?; + (1.0 + hidden_states)?.log() + } +} + pub struct BertModel { embeddings: BertEmbeddings, encoder: BertEncoder, pool: Pool, classifier: Option>, + splade: Option, num_attention_heads: usize, @@ -461,20 +545,22 @@ impl BertModel { candle::bail!("Bert only supports absolute position embeddings") } - let (pool, classifier) = match model_type { + let (pool, classifier, splade) = match model_type { // Classifier models always use CLS pooling ModelType::Classifier => { let pool = Pool::Cls; let classifier: Box = Box::new(BertClassificationHead::load(vb.pp("classifier"), config)?); - (pool, Some(classifier)) + (pool, Some(classifier), None) } ModelType::Embedding(pool) => { - if pool == Pool::Splade { - candle::bail!("`splade` is not supported for Nomic") - } - (pool, None) + let splade = if pool == Pool::Splade { + Some(BertSpladeHead::load(vb.clone(), config)?) + } else { + None + }; + (pool, None, splade) } }; @@ -500,6 +586,7 @@ impl BertModel { encoder, pool, classifier, + splade, num_attention_heads: config.num_attention_heads, device: vb.device().clone(), dtype: vb.dtype(), @@ -517,7 +604,7 @@ impl BertModel { candle::bail!("Bert only supports absolute position embeddings") } - let (pool, classifier) = match model_type { + let (pool, classifier, splade) = match model_type { // Classifier models always use CLS pooling ModelType::Classifier => { let pool = Pool::Cls; @@ -525,9 +612,16 @@ impl BertModel { let classifier: Box = Box::new( RobertaClassificationHead::load(vb.pp("classifier"), config)?, ); - (pool, Some(classifier)) + (pool, Some(classifier), None) + } + ModelType::Embedding(pool) => { + let splade = if pool == Pool::Splade { + Some(BertSpladeHead::load_roberta(vb.clone(), config)?) + } else { + None + }; + (pool, None, splade) } - ModelType::Embedding(pool) => (pool, None), }; let (embeddings, encoder) = match ( @@ -562,6 +656,7 @@ impl BertModel { encoder, pool, classifier, + splade, num_attention_heads: config.num_attention_heads, device: vb.device().clone(), dtype: vb.dtype(), @@ -730,7 +825,25 @@ impl BertModel { (outputs.sum(1)?.broadcast_div(&input_lengths))? } - Pool::Splade => unreachable!(), + Pool::Splade => { + // Unwrap is safe here + let splade_head = self.splade.as_ref().unwrap(); + let mut relu_log = splade_head.forward(&outputs)?; + + if let Some(ref attention_mask) = attention_mask { + let mut attention_mask = attention_mask.clone(); + + if let Some(pooled_indices) = pooled_indices { + // Select values in the batch + attention_mask = attention_mask.index_select(&pooled_indices, 0)?; + }; + + // Mask padded values + relu_log = relu_log.broadcast_mul(&attention_mask)?; + } + + relu_log.max(1)? + } }; Some(pooled_embeddings) } else { diff --git a/backends/candle/src/models/flash_bert.rs b/backends/candle/src/models/flash_bert.rs index 01a5cc9d..50d99fc7 100644 --- a/backends/candle/src/models/flash_bert.rs +++ b/backends/candle/src/models/flash_bert.rs @@ -1,8 +1,8 @@ use crate::flash_attn::flash_attn_varlen; use crate::layers::{LayerNorm, Linear}; use crate::models::bert::{ - BertClassificationHead, BertConfig, BertEmbeddings, ClassificationHead, PositionEmbeddingType, - RobertaClassificationHead, + BertClassificationHead, BertConfig, BertEmbeddings, BertSpladeHead, ClassificationHead, + PositionEmbeddingType, RobertaClassificationHead, }; use crate::models::Model; use candle::{DType, Device, Result, Tensor}; @@ -217,6 +217,8 @@ pub struct FlashBertModel { encoder: BertEncoder, pool: Pool, classifier: Option>, + splade: Option, + pub device: Device, span: tracing::Span, @@ -238,20 +240,22 @@ impl FlashBertModel { candle::bail!("FlashBert only supports absolute position embeddings") } - let (pool, classifier) = match model_type { + let (pool, classifier, splade) = match model_type { // Classifier models always use CLS pooling ModelType::Classifier => { let pool = Pool::Cls; let classifier: Box = Box::new(BertClassificationHead::load(vb.pp("classifier"), config)?); - (pool, Some(classifier)) + (pool, Some(classifier), None) } ModelType::Embedding(pool) => { - if pool == Pool::Splade { - candle::bail!("`splade` is not supported for Nomic") - } - (pool, None) + let splade = if pool == Pool::Splade { + Some(BertSpladeHead::load(vb.clone(), config)?) + } else { + None + }; + (pool, None, splade) } }; @@ -277,6 +281,7 @@ impl FlashBertModel { encoder, pool, classifier, + splade, device: vb.device().clone(), span: tracing::span!(tracing::Level::TRACE, "model"), }) @@ -301,7 +306,7 @@ impl FlashBertModel { candle::bail!("FlashBert only supports absolute position embeddings") } - let (pool, classifier) = match model_type { + let (pool, classifier, splade) = match model_type { // Classifier models always use CLS pooling ModelType::Classifier => { let pool = Pool::Cls; @@ -309,13 +314,15 @@ impl FlashBertModel { let classifier: Box = Box::new( RobertaClassificationHead::load(vb.pp("classifier"), config)?, ); - (pool, Some(classifier)) + (pool, Some(classifier), None) } ModelType::Embedding(pool) => { - if pool == Pool::Splade { - candle::bail!("`splade` is not supported for Nomic") - } - (pool, None) + let splade = if pool == Pool::Splade { + Some(BertSpladeHead::load_roberta(vb.clone(), config)?) + } else { + None + }; + (pool, None, splade) } }; @@ -351,6 +358,7 @@ impl FlashBertModel { encoder, pool, classifier, + splade, device: vb.device().clone(), span: tracing::span!(tracing::Level::TRACE, "model"), }) @@ -432,7 +440,31 @@ impl FlashBertModel { } } Pool::Splade => { - unreachable!(); + // Unwrap is safe here + let splade_head = self.splade.as_ref().unwrap(); + let relu_log = splade_head.forward(&outputs)?; + + 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; + + relu_log + .narrow(0, start as usize, len as usize)? + .max_keepdim(0) + }) + .collect(); + + // Concatenate all results + Some(Tensor::cat(&results?, 0)?) + } else { + Some(relu_log.max_keepdim(0)?) + } } } } else { diff --git a/backends/candle/src/models/flash_distilbert.rs b/backends/candle/src/models/flash_distilbert.rs index 26e99721..3d30c3a8 100644 --- a/backends/candle/src/models/flash_distilbert.rs +++ b/backends/candle/src/models/flash_distilbert.rs @@ -320,7 +320,9 @@ impl FlashDistilBertModel { let start = batch.cumulative_seq_lengths[i]; let len = batch.cumulative_seq_lengths[i + 1] - start; - relu_log.narrow(0, start as usize, len as usize)?.max(0) + relu_log + .narrow(0, start as usize, len as usize)? + .max_keepdim(0) }) .collect(); From ec04b9d60e06acdaa4c3d4ff8fa0e5ab9cdca68f Mon Sep 17 00:00:00 2001 From: drbh Date: Wed, 6 Mar 2024 08:36:09 -0500 Subject: [PATCH 03/72] feat: support vertex api endpoint (#184) Co-authored-by: OlivierDehaene --- router/Cargo.toml | 1 + router/src/http/server.rs | 144 ++++++++++++++++++++++++++++++++++++-- router/src/http/types.rs | 17 +++++ router/src/lib.rs | 10 +++ 4 files changed, 168 insertions(+), 4 deletions(-) diff --git a/router/Cargo.toml b/router/Cargo.toml index 1f6226ef..ae10065c 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -78,3 +78,4 @@ candle-cuda = ["candle", "text-embeddings-backend/flash-attn"] candle-cuda-turing = ["candle", "text-embeddings-backend/flash-attn-v1"] candle-cuda-volta = ["candle", "text-embeddings-backend/cuda"] static-linking = ["text-embeddings-backend/static-linking"] +google = [] diff --git a/router/src/http/server.rs b/router/src/http/server.rs index b7958ece..bb883935 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -3,7 +3,7 @@ use crate::http::types::{ EmbedAllRequest, EmbedAllResponse, EmbedRequest, EmbedResponse, Input, OpenAICompatEmbedding, OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, - Sequence, SimpleToken, TokenizeRequest, TokenizeResponse, + Sequence, SimpleToken, TokenizeRequest, TokenizeResponse, VertexRequest, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -992,6 +992,101 @@ async fn tokenize( Ok(Json(TokenizeResponse(tokens))) } +/// Generate embeddings from a Vertex request +#[utoipa::path( + post, + tag = "Text Embeddings Inference", + path = "/vertex", + request_body = VertexRequest, + responses( + (status = 200, description = "Embeddings", body = EmbedResponse), + (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)] +async fn vertex_compatibility( + infer: Extension, + info: Extension, + Json(req): Json, +) -> Result<(HeaderMap, Json), (StatusCode, Json)> { + let span = tracing::Span::current(); + let start_time = Instant::now(); + + let batch_size = req.instances.len(); + 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, + }; + metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + Err(err)?; + } + + let mut futures = Vec::with_capacity(batch_size); + let mut compute_chars = 0; + + for instance in req.instances.iter() { + let input = instance.inputs.clone(); + compute_chars += input.chars().count(); + + let local_infer = infer.clone(); + futures.push(async move { + let permit = local_infer.acquire_permit().await; + local_infer + .embed_pooled(input, instance.truncate, instance.normalize, permit) + .await + }) + } + let results = join_all(futures) + .await + .into_iter() + .collect::, TextEmbeddingsError>>() + .map_err(ErrorResponse::from)?; + + let mut embeddings = Vec::with_capacity(batch_size); + let mut total_tokenization_time = 0; + let mut total_queue_time = 0; + let mut total_inference_time = 0; + let mut total_compute_tokens = 0; + + for r in results { + total_tokenization_time += r.metadata.tokenization.as_nanos() as u64; + total_queue_time += r.metadata.queue.as_nanos() as u64; + total_inference_time += r.metadata.inference.as_nanos() as u64; + total_compute_tokens += r.metadata.prompt_tokens; + embeddings.push(r.results); + } + let batch_size = batch_size as u64; + + let response = EmbedResponse(embeddings); + let metadata = ResponseMetadata::new( + compute_chars, + total_compute_tokens, + start_time, + Duration::from_nanos(total_tokenization_time / batch_size), + Duration::from_nanos(total_queue_time / batch_size), + Duration::from_nanos(total_inference_time / batch_size), + ); + + metadata.record_span(&span); + metadata.record_metrics(); + tracing::info!("Success"); + + Ok((HeaderMap::from(metadata), Json(response))) +} + /// Prometheus metrics scrape endpoint #[utoipa::path( get, @@ -1089,9 +1184,32 @@ pub async fn run( .allow_headers([http::header::CONTENT_TYPE]) .allow_origin(allow_origin); + // Define VertextApiDoc conditionally only if the "google" feature is enabled + let doc = { + // avoid `mut` if possible + #[cfg(feature = "google")] + { + use crate::http::types::VertexInstance; + + #[derive(OpenApi)] + #[openapi( + paths(vertex_compatibility), + components(schemas(VertexInstance, VertexRequest)) + )] + struct VertextApiDoc; + + // limiting mutability to the smallest scope necessary + let mut doc = ApiDoc::openapi(); + doc.merge(VertextApiDoc::openapi()); + doc + } + #[cfg(not(feature = "google"))] + ApiDoc::openapi() + }; + // Create router - let app = Router::new() - .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", ApiDoc::openapi())) + let base_routes = Router::new() + .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", doc)) // Base routes .route("/info", get(get_model_info)) .route("/embed", post(embed)) @@ -1101,6 +1219,8 @@ pub async fn run( .route("/tokenize", post(tokenize)) // OpenAI compat route .route("/embeddings", post(openai_embed)) + // Vertex compat route + .route("/vertex", post(vertex_compatibility)) // Base Health route .route("/health", get(health)) // Inference API health route @@ -1110,8 +1230,10 @@ pub async fn run( // Prometheus metrics route .route("/metrics", get(metrics)); + let mut app = Router::new().merge(base_routes); + // Set default routes - let app = match &info.model_type { + app = match &info.model_type { ModelType::Classifier(_) => { app.route("/", post(predict)) // AWS Sagemaker route @@ -1129,6 +1251,20 @@ pub async fn run( } }; + #[cfg(feature = "google")] + { + tracing::info!("Built with `google` feature"); + tracing::info!( + "Environment variables `AIP_PREDICT_ROUTE` and `AIP_HEALTH_ROUTE` will be respected." + ); + if let Ok(env_predict_route) = std::env::var("AIP_PREDICT_ROUTE") { + app = app.route(&env_predict_route, post(vertex_compatibility)); + } + if let Ok(env_health_route) = std::env::var("AIP_HEALTH_ROUTE") { + app = app.route(&env_health_route, get(health)); + } + } + let app = app .layer(Extension(infer)) .layer(Extension(info)) diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 29181162..176902b1 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -364,3 +364,20 @@ pub(crate) struct SimpleToken { #[derive(Serialize, ToSchema)] #[schema(example = json!([[{"id": 0, "text": "test", "special": false, "start": 0, "stop": 2}]]))] pub(crate) struct TokenizeResponse(pub Vec>); + +#[derive(Clone, Deserialize, ToSchema)] +pub(crate) struct VertexInstance { + #[schema(example = "What is Deep Learning?")] + pub inputs: String, + #[serde(default)] + #[schema(default = "false", example = "false")] + pub truncate: bool, + #[serde(default = "default_normalize")] + #[schema(default = "true", example = "true")] + pub normalize: bool, +} + +#[derive(Deserialize, ToSchema)] +pub(crate) struct VertexRequest { + pub instances: Vec, +} diff --git a/router/src/lib.rs b/router/src/lib.rs index 600e9d33..2e224c6e 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -239,6 +239,16 @@ pub async fn run( docker_label: option_env!("DOCKER_LABEL"), }; + // use AIP_HTTP_PORT if google feature is enabled + let port = if cfg!(feature = "google") { + std::env::var("AIP_HTTP_PORT") + .ok() + .and_then(|p| p.parse().ok()) + .expect("Invalid or unset AIP_HTTP_PORT") + } else { + port + }; + let addr = match hostname.unwrap_or("0.0.0.0".to_string()).parse() { Ok(ip) => SocketAddr::new(ip, port), Err(_) => { From e7ae777fe8af1a46b93fd0f5b760509832575980 Mon Sep 17 00:00:00 2001 From: plaggy <35706832+plaggy@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:49:40 +0100 Subject: [PATCH 04/72] docs: readme examples (#180) --- README.md | 5 +++++ docs/source/en/_toctree.yml | 2 ++ docs/source/en/examples.md | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 docs/source/en/examples.md diff --git a/README.md b/README.md index 4036de85..57215ce5 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ length of 512 tokens: - [gRPC](#grpc) - [Local Install](#local-install) - [Docker Build](#docker-build) +- [Examples](#examples) Text Embeddings Inference (TEI) is a toolkit for deploying and serving open source text embeddings and sequence classification models. TEI enables high-performance extraction for the most popular models, including FlagEmbedding, @@ -453,3 +454,7 @@ runtime_compute_cap=90 docker build . -f Dockerfile-cuda --build-arg CUDA_COMPUTE_CAP=$runtime_compute_cap ``` + +## 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/_toctree.yml b/docs/source/en/_toctree.yml index 3237c953..211d1ca5 100644 --- a/docs/source/en/_toctree.yml +++ b/docs/source/en/_toctree.yml @@ -19,6 +19,8 @@ # title: Using TEI CLI - local: custom_container title: Build custom container for TEI + - local: examples + title: Example uses title: Tutorials - sections: - local: cli_arguments diff --git a/docs/source/en/examples.md b/docs/source/en/examples.md new file mode 100644 index 00000000..ef7f381a --- /dev/null +++ b/docs/source/en/examples.md @@ -0,0 +1,20 @@ + + +# Example uses + +- [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) From 2b8ad5f4f12cdd32332861a9a8ce012983634028 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 7 Mar 2024 11:15:10 +0100 Subject: [PATCH 05/72] fix: add_pooling_layer for bert classification (#190) --- backends/candle/src/models/bert.rs | 29 ++++++++++-- backends/candle/src/models/flash_bert.rs | 2 +- backends/candle/tests/common.rs | 15 ++++++- ...test_bert__bert_classification_single.snap | 7 +++ ...lash_bert__bert_classification_single.snap | 6 +++ backends/candle/tests/test_bert.rs | 41 +++++++++++++++-- backends/candle/tests/test_flash_bert.rs | 45 +++++++++++++++++-- backends/candle/tests/test_flash_jina.rs | 2 +- backends/candle/tests/test_flash_nomic.rs | 2 +- backends/candle/tests/test_jina.rs | 2 +- backends/candle/tests/test_nomic.rs | 2 +- backends/python/src/logging.rs | 2 +- backends/python/src/management.rs | 2 +- 13 files changed, 138 insertions(+), 19 deletions(-) create mode 100644 backends/candle/tests/snapshots/test_bert__bert_classification_single.snap create mode 100644 backends/candle/tests/snapshots/test_flash_bert__bert_classification_single.snap diff --git a/backends/candle/src/models/bert.rs b/backends/candle/src/models/bert.rs index fde7e08e..200e41de 100644 --- a/backends/candle/src/models/bert.rs +++ b/backends/candle/src/models/bert.rs @@ -365,6 +365,7 @@ pub trait ClassificationHead { } pub struct BertClassificationHead { + pooler: Option, output: Linear, span: tracing::Span, } @@ -376,11 +377,24 @@ impl BertClassificationHead { Some(id2label) => id2label.len(), }; - let output_weight = vb.get((n_classes, config.hidden_size), "weight")?; - let output_bias = vb.get(n_classes, "bias")?; + let pooler = if let Ok(pooler_weight) = vb + .pp("bert.pooler.dense") + .get((config.hidden_size, config.hidden_size), "weight") + { + let pooler_bias = vb.pp("bert.pooler.dense").get(config.hidden_size, "bias")?; + Some(Linear::new(pooler_weight, Some(pooler_bias), None)) + } else { + None + }; + + let output_weight = vb + .pp("classifier") + .get((n_classes, config.hidden_size), "weight")?; + let output_bias = vb.pp("classifier").get(n_classes, "bias")?; let output = Linear::new(output_weight, Some(output_bias), None); Ok(Self { + pooler, output, span: tracing::span!(tracing::Level::TRACE, "classifier"), }) @@ -390,7 +404,14 @@ impl BertClassificationHead { impl ClassificationHead for BertClassificationHead { fn forward(&self, hidden_states: &Tensor) -> Result { let _enter = self.span.enter(); - let hidden_states = self.output.forward(hidden_states)?; + + let mut hidden_states = hidden_states.clone(); + if let Some(pooler) = self.pooler.as_ref() { + hidden_states = pooler.forward(&hidden_states)?; + hidden_states = hidden_states.tanh()?; + } + + let hidden_states = self.output.forward(&hidden_states)?; Ok(hidden_states) } } @@ -551,7 +572,7 @@ impl BertModel { let pool = Pool::Cls; let classifier: Box = - Box::new(BertClassificationHead::load(vb.pp("classifier"), config)?); + Box::new(BertClassificationHead::load(vb.clone(), config)?); (pool, Some(classifier), None) } ModelType::Embedding(pool) => { diff --git a/backends/candle/src/models/flash_bert.rs b/backends/candle/src/models/flash_bert.rs index 50d99fc7..d248c91f 100644 --- a/backends/candle/src/models/flash_bert.rs +++ b/backends/candle/src/models/flash_bert.rs @@ -246,7 +246,7 @@ impl FlashBertModel { let pool = Pool::Cls; let classifier: Box = - Box::new(BertClassificationHead::load(vb.pp("classifier"), config)?); + Box::new(BertClassificationHead::load(vb.clone(), config)?); (pool, Some(classifier), None) } ModelType::Embedding(pool) => { diff --git a/backends/candle/tests/common.rs b/backends/candle/tests/common.rs index fa8fcc84..b9d23995 100644 --- a/backends/candle/tests/common.rs +++ b/backends/candle/tests/common.rs @@ -65,11 +65,22 @@ pub fn sort_embeddings(embeddings: Embeddings) -> (Vec>, Vec>) (pooled_embeddings, raw_embeddings) } -pub fn download_artifacts(model_id: &'static str) -> Result { +pub fn download_artifacts( + model_id: &'static str, + revision: Option<&'static str>, +) -> Result { let builder = ApiBuilder::new().with_progress(false); let api = builder.build().unwrap(); - let api_repo = api.repo(Repo::new(model_id.to_string(), RepoType::Model)); + let api_repo = if let Some(revision) = revision { + api.repo(Repo::with_revision( + model_id.to_string(), + RepoType::Model, + revision.to_string(), + )) + } else { + api.repo(Repo::new(model_id.to_string(), RepoType::Model)) + }; api_repo.get("config.json")?; api_repo.get("tokenizer.json")?; diff --git a/backends/candle/tests/snapshots/test_bert__bert_classification_single.snap b/backends/candle/tests/snapshots/test_bert__bert_classification_single.snap new file mode 100644 index 00000000..f9b3da1a --- /dev/null +++ b/backends/candle/tests/snapshots/test_bert__bert_classification_single.snap @@ -0,0 +1,7 @@ +--- +source: backends/candle/tests/test_bert.rs +assertion_line: 211 +expression: predictions_single +--- +- - 2.8580017 + - -2.9722357 diff --git a/backends/candle/tests/snapshots/test_flash_bert__bert_classification_single.snap b/backends/candle/tests/snapshots/test_flash_bert__bert_classification_single.snap new file mode 100644 index 00000000..a581c47e --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_bert__bert_classification_single.snap @@ -0,0 +1,6 @@ +--- +source: backends/candle/tests/test_flash_bert.rs +expression: predictions_single +--- +- - 2.8574219 + - -2.9726563 diff --git a/backends/candle/tests/test_bert.rs b/backends/candle/tests/test_bert.rs index 098f4fd3..45d02577 100644 --- a/backends/candle/tests/test_bert.rs +++ b/backends/candle/tests/test_bert.rs @@ -9,7 +9,7 @@ use text_embeddings_backend_core::{Backend, ModelType, Pool}; #[test] #[serial_test::serial] fn test_mini() -> Result<()> { - let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2")?; + let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( @@ -69,7 +69,7 @@ fn test_mini() -> Result<()> { #[test] #[serial_test::serial] fn test_mini_pooled_raw() -> Result<()> { - let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2")?; + let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( @@ -139,7 +139,7 @@ fn test_mini_pooled_raw() -> Result<()> { #[test] #[serial_test::serial] fn test_emotions() -> Result<()> { - let model_root = download_artifacts("SamLowe/roberta-base-go_emotions")?; + let model_root = download_artifacts("SamLowe/roberta-base-go_emotions", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new(model_root, "float32".to_string(), ModelType::Classifier)?; @@ -185,3 +185,38 @@ fn test_emotions() -> Result<()> { Ok(()) } + +#[test] +#[serial_test::serial] +fn test_bert_classification() -> Result<()> { + let model_root = download_artifacts("ibm/re2g-reranker-nq", Some("refs/pr/3"))?; + let tokenizer = load_tokenizer(&model_root)?; + + let backend = CandleBackend::new(model_root, "float32".to_string(), ModelType::Classifier)?; + + let input_single = batch( + vec![tokenizer + .encode( + ( + "PrimeTime is a timing signoff tool", + "PrimeTime can perform most accurate timing analysis", + ), + true, + ) + .unwrap()], + [0].to_vec(), + vec![], + ); + + let predictions: Vec> = backend + .predict(input_single)? + .into_iter() + .map(|(_, v)| v) + .collect(); + let predictions_single = SnapshotScores::from(predictions); + + let matcher = relative_matcher(); + insta::assert_yaml_snapshot!("bert_classification_single", predictions_single, &matcher); + + Ok(()) +} diff --git a/backends/candle/tests/test_flash_bert.rs b/backends/candle/tests/test_flash_bert.rs index cc19c7e6..1888a32b 100644 --- a/backends/candle/tests/test_flash_bert.rs +++ b/backends/candle/tests/test_flash_bert.rs @@ -15,7 +15,7 @@ use text_embeddings_backend_core::{Backend, ModelType, Pool}; any(feature = "flash-attn", feature = "flash-attn-v1") ))] fn test_flash_mini() -> Result<()> { - let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2")?; + let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( @@ -79,7 +79,7 @@ fn test_flash_mini() -> Result<()> { any(feature = "flash-attn", feature = "flash-attn-v1") ))] fn test_flash_mini_pooled_raw() -> Result<()> { - let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2")?; + let model_root = download_artifacts("sentence-transformers/all-MiniLM-L6-v2", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( @@ -153,7 +153,7 @@ fn test_flash_mini_pooled_raw() -> Result<()> { any(feature = "flash-attn", feature = "flash-attn-v1") ))] fn test_flash_emotions() -> Result<()> { - let model_root = download_artifacts("SamLowe/roberta-base-go_emotions")?; + let model_root = download_artifacts("SamLowe/roberta-base-go_emotions", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new(model_root, "float16".to_string(), ModelType::Classifier)?; @@ -199,3 +199,42 @@ fn test_flash_emotions() -> Result<()> { Ok(()) } + +#[test] +#[serial_test::serial] +#[cfg(all( + feature = "cuda", + any(feature = "flash-attn", feature = "flash-attn-v1") +))] +fn test_flash_bert_classification() -> Result<()> { + let model_root = download_artifacts("ibm/re2g-reranker-nq", Some("refs/pr/3"))?; + let tokenizer = load_tokenizer(&model_root)?; + + let backend = CandleBackend::new(model_root, "float16".to_string(), ModelType::Classifier)?; + + let input_single = batch( + vec![tokenizer + .encode( + ( + "PrimeTime is a timing signoff tool", + "PrimeTime can perform most accurate timing analysis", + ), + true, + ) + .unwrap()], + [0].to_vec(), + vec![], + ); + + let predictions: Vec> = backend + .predict(input_single)? + .into_iter() + .map(|(_, v)| v) + .collect(); + let predictions_single = SnapshotScores::from(predictions); + + let matcher = relative_matcher(); + insta::assert_yaml_snapshot!("bert_classification_single", predictions_single, &matcher); + + Ok(()) +} diff --git a/backends/candle/tests/test_flash_jina.rs b/backends/candle/tests/test_flash_jina.rs index 34960ff2..4a5f8276 100644 --- a/backends/candle/tests/test_flash_jina.rs +++ b/backends/candle/tests/test_flash_jina.rs @@ -11,7 +11,7 @@ use text_embeddings_backend_core::{Backend, ModelType, Pool}; #[serial_test::serial] #[cfg(all(feature = "cuda", feature = "flash-attn"))] fn test_flash_jina_small() -> Result<()> { - let model_root = download_artifacts("jinaai/jina-embeddings-v2-small-en")?; + let model_root = download_artifacts("jinaai/jina-embeddings-v2-small-en", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( diff --git a/backends/candle/tests/test_flash_nomic.rs b/backends/candle/tests/test_flash_nomic.rs index 90e557d2..3e9b6e1d 100644 --- a/backends/candle/tests/test_flash_nomic.rs +++ b/backends/candle/tests/test_flash_nomic.rs @@ -11,7 +11,7 @@ use text_embeddings_backend_core::{Backend, ModelType, Pool}; #[serial_test::serial] #[cfg(all(feature = "cuda", feature = "flash-attn"))] fn test_flash_nomic_small() -> Result<()> { - let model_root = download_artifacts("nomic-ai/nomic-embed-text-v1.5")?; + let model_root = download_artifacts("nomic-ai/nomic-embed-text-v1.5", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( diff --git a/backends/candle/tests/test_jina.rs b/backends/candle/tests/test_jina.rs index 7422b39e..4cd7bba6 100644 --- a/backends/candle/tests/test_jina.rs +++ b/backends/candle/tests/test_jina.rs @@ -8,7 +8,7 @@ use text_embeddings_backend_core::{Backend, ModelType, Pool}; #[test] fn test_jina_small() -> Result<()> { - let model_root = download_artifacts("jinaai/jina-embeddings-v2-small-en")?; + let model_root = download_artifacts("jinaai/jina-embeddings-v2-small-en", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( diff --git a/backends/candle/tests/test_nomic.rs b/backends/candle/tests/test_nomic.rs index a5ddb33d..914be7ea 100644 --- a/backends/candle/tests/test_nomic.rs +++ b/backends/candle/tests/test_nomic.rs @@ -8,7 +8,7 @@ use text_embeddings_backend_core::{Backend, ModelType, Pool}; #[test] fn test_nomic_small() -> Result<()> { - let model_root = download_artifacts("nomic-ai/nomic-embed-text-v1.5")?; + let model_root = download_artifacts("nomic-ai/nomic-embed-text-v1.5", None)?; let tokenizer = load_tokenizer(&model_root)?; let backend = CandleBackend::new( diff --git a/backends/python/src/logging.rs b/backends/python/src/logging.rs index 63b76f0d..8f55e8e6 100644 --- a/backends/python/src/logging.rs +++ b/backends/python/src/logging.rs @@ -52,7 +52,7 @@ impl TryFrom<&String> for PythonLogMessage { } pub(crate) fn log_lines(lines: Lines) { - for line in lines.flatten() { + for line in lines.map_while(Result::ok) { match PythonLogMessage::try_from(&line) { Ok(log) => log.trace(), Err(_) => tracing::debug!("{line}"), diff --git a/backends/python/src/management.rs b/backends/python/src/management.rs index 4ec23c07..ed0c851e 100644 --- a/backends/python/src/management.rs +++ b/backends/python/src/management.rs @@ -89,7 +89,7 @@ impl BackendProcess { // We read stderr in another thread as it seems that lines() can block in some cases let (err_sender, err_receiver) = mpsc::channel(); thread::spawn(move || { - for line in stderr_reader.lines().flatten() { + for line in stderr_reader.lines().map_while(Result::ok) { err_sender.send(line).unwrap_or(()); } }); From 7efa697d87d8499ef2da86a9f4c244d2ffca84d0 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 7 Mar 2024 11:51:31 +0100 Subject: [PATCH 06/72] feat: add /embed_sparse route (#191) --- README.md | 21 ++++ core/src/infer.rs | 48 +++++++ docs/openapi.json | 256 ++++++++++++++++++++++++++++++++++++++ proto/tei.proto | 17 +++ router/src/grpc/server.rs | 174 +++++++++++++++++++++++++- router/src/http/server.rs | 217 ++++++++++++++++++++++++++++---- router/src/http/types.rs | 17 +++ 7 files changed, 724 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 57215ce5..bff4f21b 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ length of 512 tokens: - [Using a private or gated model](#using-a-private-or-gated-model) - [Using Re-rankers models](#using-re-rankers-models) - [Using Sequence Classification models](#using-sequence-classification-models) + - [Using SPLADE pooling](#using-splade-pooling) - [Distributed Tracing](#distributed-tracing) - [gRPC](#grpc) - [Local Install](#local-install) @@ -331,6 +332,26 @@ curl 127.0.0.1:8080/predict \ -H 'Content-Type: application/json' ``` +### Using SPLADE pooling + +You can choose to activate SPLADE pooling for Bert and Distilbert MaskedLM architectures: + +```shell +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.1 --model-id $model --pooling splade +``` + +Once you have deployed the model you can use the `/embed_sparse` endpoint to get the sparse embedding: + +```bash +curl 127.0.0.1:8080/embed_sparse \ + -X POST \ + -d '{"inputs":"I like you."}' \ + -H 'Content-Type: application/json' +``` + ### Distributed Tracing `text-embeddings-inference` is instrumented with distributed tracing using OpenTelemetry. You can use this feature diff --git a/core/src/infer.rs b/core/src/infer.rs index f9428a82..e2cef5d5 100644 --- a/core/src/infer.rs +++ b/core/src/infer.rs @@ -144,6 +144,54 @@ impl Infer { Ok(response) } + #[instrument(skip(self, permit))] + pub async fn embed_sparse + std::fmt::Debug>( + &self, + inputs: I, + truncate: bool, + permit: OwnedSemaphorePermit, + ) -> Result { + let start_time = Instant::now(); + + if !self.is_splade() { + metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let message = "Model is not an embedding model with SPLADE pooling".to_string(); + tracing::error!("{message}"); + return Err(TextEmbeddingsError::Backend(BackendError::Inference( + message, + ))); + } + + let results = self + .embed(inputs, truncate, true, &start_time, permit) + .await?; + + let InferResult::PooledEmbedding(response) = results else { + panic!("unexpected enum variant") + }; + + // Timings + 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() + ); + + Ok(response) + } + #[instrument(skip(self, permit))] pub async fn embed_pooled + std::fmt::Debug>( &self, diff --git a/docs/openapi.json b/docs/openapi.json index 3588e48e..c9377087 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -100,6 +100,182 @@ } } }, + "/embed_all": { + "post": { + "tags": [ + "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.", + "operationId": "embed_all", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbedAllRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Embeddings", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbedAllResponse" + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/embed_sparse": { + "post": { + "tags": [ + "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": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbedSparseRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Embeddings", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbedSparseResponse" + } + } + } + }, + "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" + } + } + } + } + } + } + }, "/embeddings": { "post": { "tags": [ @@ -514,6 +690,44 @@ } } }, + "EmbedAllRequest": { + "type": "object", + "required": [ + "inputs" + ], + "properties": { + "inputs": { + "$ref": "#/components/schemas/Input" + }, + "truncate": { + "type": "boolean", + "default": "false", + "example": "false" + } + } + }, + "EmbedAllResponse": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number", + "format": "float" + } + } + }, + "example": [ + [ + [ + 0.0, + 1.0, + 2.0 + ] + ] + ] + }, "EmbedRequest": { "type": "object", "required": [ @@ -552,6 +766,31 @@ ] ] }, + "EmbedSparseRequest": { + "type": "object", + "required": [ + "inputs" + ], + "properties": { + "inputs": { + "$ref": "#/components/schemas/Input" + }, + "truncate": { + "type": "boolean", + "default": "false", + "example": "false" + } + } + }, + "EmbedSparseResponse": { + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SparseValue" + } + } + }, "EmbeddingModel": { "type": "object", "required": [ @@ -1047,6 +1286,23 @@ } } }, + "SparseValue": { + "type": "object", + "required": [ + "index", + "value" + ], + "properties": { + "index": { + "type": "integer", + "minimum": 0 + }, + "value": { + "type": "number", + "format": "float" + } + } + }, "TokenizeRequest": { "type": "object", "required": [ diff --git a/proto/tei.proto b/proto/tei.proto index b5f352a3..87205129 100644 --- a/proto/tei.proto +++ b/proto/tei.proto @@ -11,6 +11,8 @@ service Info { service Embed { rpc Embed (EmbedRequest) returns (EmbedResponse); rpc EmbedStream (stream EmbedRequest) returns (stream EmbedResponse); + rpc EmbedSparse (EmbedSparseRequest) returns (EmbedSparseResponse); + rpc EmbedSparseStream (stream EmbedSparseRequest) returns (stream EmbedSparseResponse); rpc EmbedAll (EmbedAllRequest) returns (EmbedAllResponse); rpc EmbedAllStream (stream EmbedAllRequest) returns (stream EmbedAllResponse); } @@ -74,6 +76,21 @@ message EmbedResponse { Metadata metadata = 2; } +message EmbedSparseRequest { + string inputs = 1; + bool truncate = 2; +} + +message SparseValue { + uint32 index = 1; + float value = 2; +} + +message EmbedSparseResponse { + repeated SparseValue sparse_embeddings = 1; + Metadata metadata = 2; +} + message EmbedAllRequest { string inputs = 1; bool truncate = 2; diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index 3fffb296..eefe58ce 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -1,6 +1,6 @@ use crate::grpc::pb::tei::v1::{ - EmbedAllRequest, EmbedAllResponse, EncodeRequest, EncodeResponse, RerankStreamRequest, - SimpleToken, TokenEmbedding, + EmbedAllRequest, EmbedAllResponse, EmbedSparseRequest, EmbedSparseResponse, EncodeRequest, + EncodeResponse, RerankStreamRequest, SimpleToken, SparseValue, TokenEmbedding, }; use crate::grpc::{ EmbedRequest, EmbedResponse, InfoRequest, InfoResponse, PredictRequest, PredictResponse, @@ -105,6 +105,65 @@ impl TextEmbeddingsService { )) } + #[instrument( + skip_all, + fields( + compute_chars, + compute_tokens, + total_time, + tokenization_time, + queue_time, + inference_time, + ) + )] + async fn embed_sparse_inner( + &self, + request: EmbedSparseRequest, + permit: OwnedSemaphorePermit, + ) -> Result<(EmbedSparseResponse, ResponseMetadata), Status> { + let span = Span::current(); + let start_time = Instant::now(); + + let compute_chars = request.inputs.chars().count(); + let response = self + .infer + .embed_sparse(request.inputs, request.truncate, permit) + .await + .map_err(ErrorResponse::from)?; + + let response_metadata = ResponseMetadata::new( + compute_chars, + response.metadata.prompt_tokens, + start_time, + response.metadata.tokenization, + response.metadata.queue, + response.metadata.inference, + ); + + let mut sparse_values = Vec::with_capacity(response.results.len()); + for (index, value) in response.results.into_iter().enumerate() { + if value != 0.0 { + sparse_values.push(SparseValue { + index: index as u32, + value, + }); + } + } + + response_metadata.record_span(&span); + response_metadata.record_metrics(); + + tracing::info!("Success"); + + Ok(( + EmbedSparseResponse { + sparse_embeddings: sparse_values, + metadata: Some(grpc::Metadata::from(&response_metadata)), + }, + response_metadata, + )) + } + #[instrument( skip_all, fields( @@ -416,6 +475,117 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { ))) } + async fn embed_sparse( + &self, + request: Request, + ) -> Result, Status> { + metrics::increment_counter!("te_request_count", "method" => "single"); + + let permit = self + .infer + .try_acquire_permit() + .map_err(ErrorResponse::from)?; + + let request = request.into_inner(); + let (response, metadata) = self.embed_sparse_inner(request, permit).await?; + let headers = HeaderMap::from(metadata); + + metrics::increment_counter!("te_request_success", "method" => "single"); + + Ok(Response::from_parts( + MetadataMap::from_headers(headers), + response, + Extensions::default(), + )) + } + + type EmbedSparseStreamStream = UnboundedReceiverStream>; + + async fn embed_sparse_stream( + &self, + request: Request>, + ) -> Result, Status> { + let mut request_stream = request.into_inner(); + + // Create bounded channel to have an upper bound of spawned tasks + // We will have at most `max_parallel_stream_requests` messages from this stream in the queue + let (embed_sender, mut embed_receiver) = mpsc::channel::<( + EmbedSparseRequest, + oneshot::Sender>, + )>(self.max_parallel_stream_requests); + + // Required for the async move below + let local = self.clone(); + + // Background task that uses the bounded channel + tokio::spawn(async move { + while let Some((request, mut sender)) = embed_receiver.recv().await { + // Wait on permit before spawning the task to avoid creating more tasks than needed + let permit = local.infer.acquire_permit().await; + + // Required for the async move below + let task_local = local.clone(); + + // Create async task for this specific input + tokio::spawn(async move { + // Select on closed to cancel work if the stream was closed + tokio::select! { + response = task_local.embed_sparse_inner(request, permit) => { + let _ = sender.send(response.map(|(r, _m)| r)); + } + _ = sender.closed() => {} + } + }); + } + }); + + // Intermediate channels + // Required to keep the order of the requests + let (intermediate_sender, mut intermediate_receiver) = mpsc::unbounded_channel(); + + tokio::spawn(async move { + // Iterate on input + while let Some(request) = request_stream.next().await { + // Create return channel + let (result_sender, result_receiver) = oneshot::channel(); + // Push to intermediate channel and preserve ordering + intermediate_sender + .send(result_receiver) + .expect("`intermediate_receiver` was dropped. This is a bug."); + + match request { + Ok(request) => embed_sender + .send((request, result_sender)) + .await + .expect("`embed_receiver` was dropped. This is a bug."), + Err(status) => { + // Request is malformed + let _ = result_sender.send(Err(status)); + } + }; + } + }); + + // Final channel for the outputs + let (response_sender, response_receiver) = mpsc::unbounded_channel(); + + tokio::spawn(async move { + while let Some(result_receiver) = intermediate_receiver.recv().await { + // Select on closed to cancel work if the stream was closed + tokio::select! { + response = result_receiver => { + let _ = response_sender.send(response.expect("`result_sender` was dropped. This is a bug.")); + } + _ = response_sender.closed() => {} + } + } + }); + + Ok(Response::new(UnboundedReceiverStream::new( + response_receiver, + ))) + } + #[instrument(skip_all)] async fn embed_all( &self, diff --git a/router/src/http/server.rs b/router/src/http/server.rs index bb883935..6d60653c 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1,9 +1,10 @@ /// HTTP Server logic use crate::http::types::{ - EmbedAllRequest, EmbedAllResponse, EmbedRequest, EmbedResponse, Input, OpenAICompatEmbedding, - OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, - PredictInput, PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, - Sequence, SimpleToken, TokenizeRequest, TokenizeResponse, VertexRequest, + EmbedAllRequest, EmbedAllResponse, EmbedRequest, EmbedResponse, EmbedSparseRequest, + EmbedSparseResponse, Input, OpenAICompatEmbedding, OpenAICompatErrorResponse, + OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, + PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, Sequence, SimpleToken, + SparseValue, TokenizeRequest, TokenizeResponse, VertexRequest, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -23,7 +24,7 @@ use std::net::SocketAddr; use std::time::{Duration, Instant}; use text_embeddings_backend::BackendError; use text_embeddings_core::infer::{ - AllEmbeddingsInferResponse, Infer, PooledEmbeddingsInferResponse, + AllEmbeddingsInferResponse, Infer, InferMetadata, PooledEmbeddingsInferResponse, }; use text_embeddings_core::TextEmbeddingsError; use tokio::sync::OwnedSemaphorePermit; @@ -582,6 +583,163 @@ async fn embed( Ok((headers, Json(response))) } +/// Get Sparse Embeddings. Returns a 424 status code if the model is not an embedding model with SPLADE pooling. +#[utoipa::path( +post, +tag = "Text Embeddings Inference", +path = "/embed_sparse", +request_body = EmbedSparseRequest, +responses( +(status = 200, description = "Embeddings", body = EmbedSparseResponse), +(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 embed_sparse( + infer: Extension, + info: Extension, + Json(req): Json, +) -> Result<(HeaderMap, Json), (StatusCode, Json)> { + let span = tracing::Span::current(); + let start_time = Instant::now(); + + let sparsify = |values: Vec| { + let mut sparse_values = Vec::with_capacity(values.len()); + for (index, value) in values.into_iter().enumerate() { + if value != 0.0 { + sparse_values.push(SparseValue { index, value }); + } + } + sparse_values + }; + + let (response, metadata) = match req.inputs { + Input::Single(input) => { + metrics::increment_counter!("te_request_count", "method" => "single"); + + let compute_chars = input.chars().count(); + + let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; + let response = infer + .embed_sparse(input, req.truncate, permit) + .await + .map_err(ErrorResponse::from)?; + + metrics::increment_counter!("te_request_success", "method" => "single"); + + ( + EmbedSparseResponse(vec![sparsify(response.results)]), + ResponseMetadata::new( + compute_chars, + response.metadata.prompt_tokens, + start_time, + response.metadata.tokenization, + response.metadata.queue, + response.metadata.inference, + ), + ) + } + Input::Batch(inputs) => { + metrics::increment_counter!("te_request_count", "method" => "batch"); + + if inputs.is_empty() { + let message = "`inputs` cannot be empty".to_string(); + tracing::error!("{message}"); + let err = ErrorResponse { + error: message, + error_type: ErrorType::Validation, + }; + metrics::increment_counter!("te_request_failure", "err" => "validation"); + Err(err)?; + } + + let batch_size = inputs.len(); + 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, + }; + metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + Err(err)?; + } + + let mut futures = Vec::with_capacity(batch_size); + let mut compute_chars = 0; + + for input in inputs { + compute_chars += input.chars().count(); + + let local_infer = infer.clone(); + futures.push(async move { + let permit = local_infer.acquire_permit().await; + let response = local_infer + .embed_sparse(input, req.truncate, permit) + .await?; + Ok((sparsify(response.results), response.metadata)) + }) + } + let results = join_all(futures) + .await + .into_iter() + .collect::, InferMetadata)>, TextEmbeddingsError>>() + .map_err(ErrorResponse::from)?; + + let mut embeddings = Vec::with_capacity(batch_size); + let mut total_tokenization_time = 0; + let mut total_queue_time = 0; + let mut total_inference_time = 0; + let mut total_compute_tokens = 0; + + for r in results { + total_tokenization_time += r.1.tokenization.as_nanos() as u64; + total_queue_time += r.1.queue.as_nanos() as u64; + total_inference_time += r.1.inference.as_nanos() as u64; + total_compute_tokens += r.1.prompt_tokens; + embeddings.push(r.0); + } + let batch_size = batch_size as u64; + + metrics::increment_counter!("te_request_success", "method" => "batch"); + + ( + EmbedSparseResponse(embeddings), + ResponseMetadata::new( + compute_chars, + total_compute_tokens, + start_time, + Duration::from_nanos(total_tokenization_time / batch_size), + Duration::from_nanos(total_queue_time / batch_size), + Duration::from_nanos(total_inference_time / batch_size), + ), + ) + } + }; + + metadata.record_span(&span); + metadata.record_metrics(); + + let headers = HeaderMap::from(metadata); + + tracing::info!("Success"); + + Ok((headers, Json(response))) +} + /// Get all Embeddings without Pooling. /// Returns a 424 status code if the model is not an embedding model. #[utoipa::path( @@ -994,21 +1152,21 @@ async fn tokenize( /// Generate embeddings from a Vertex request #[utoipa::path( - post, - tag = "Text Embeddings Inference", - path = "/vertex", - request_body = VertexRequest, - responses( - (status = 200, description = "Embeddings", body = EmbedResponse), - (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"})), - ) +post, +tag = "Text Embeddings Inference", +path = "/vertex", +request_body = VertexRequest, +responses( +(status = 200, description = "Embeddings", body = EmbedResponse), +(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)] async fn vertex_compatibility( @@ -1116,6 +1274,7 @@ pub async fn run( rerank, embed, embed_all, + embed_sparse, openai_embed, tokenize, metrics, @@ -1137,6 +1296,9 @@ pub async fn run( OpenAICompatResponse, EmbedAllRequest, EmbedAllResponse, + EmbedSparseRequest, + SparseValue, + EmbedSparseResponse, RerankRequest, Rank, RerankResponse, @@ -1214,6 +1376,7 @@ pub async fn run( .route("/info", get(get_model_info)) .route("/embed", post(embed)) .route("/embed_all", post(embed_all)) + .route("/embed_sparse", post(embed_sparse)) .route("/predict", post(predict)) .route("/rerank", post(rerank)) .route("/tokenize", post(tokenize)) @@ -1244,10 +1407,16 @@ pub async fn run( // AWS Sagemaker route .route("/invocations", post(rerank)) } - ModelType::Embedding(_) => { - app.route("/", post(embed)) - // AWS Sagemaker route - .route("/invocations", post(embed)) + ModelType::Embedding(model) => { + if model.pooling == "splade" { + app.route("/", post(embed_sparse)) + // AWS Sagemaker route + .route("/invocations", post(embed_sparse)) + } else { + app.route("/", post(embed)) + // AWS Sagemaker route + .route("/invocations", post(embed)) + } } }; diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 176902b1..a638fb29 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -315,6 +315,23 @@ fn default_normalize() -> bool { #[schema(example = json!([[0.0, 1.0, 2.0]]))] pub(crate) struct EmbedResponse(pub Vec>); +#[derive(Deserialize, ToSchema)] +pub(crate) struct EmbedSparseRequest { + pub inputs: Input, + #[serde(default)] + #[schema(default = "false", example = "false")] + pub truncate: bool, +} + +#[derive(Serialize, ToSchema)] +pub(crate) struct SparseValue { + pub index: usize, + pub value: f32, +} + +#[derive(Serialize, ToSchema)] +pub(crate) struct EmbedSparseResponse(pub Vec>); + #[derive(Deserialize, ToSchema)] pub(crate) struct EmbedAllRequest { pub inputs: Input, From 2d1776f725fd0eba012c8a3ee77d86d6e958e644 Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:58:23 +0000 Subject: [PATCH 07/72] docs: add http feature --- README.md | 8 ++++---- docs/source/en/local_cpu.md | 4 ++-- docs/source/en/local_gpu.md | 4 ++-- docs/source/en/local_metal.md | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index bff4f21b..3f818537 100644 --- a/README.md +++ b/README.md @@ -392,9 +392,9 @@ Then run: ```shell # On x86 -cargo install --path router -F candle -F mkl +cargo install --path router -F mkl # On M1 or M2 -cargo install --path router -F candle -F metal +cargo install --path router -F metal ``` You can now launch Text Embeddings Inference on CPU with: @@ -429,10 +429,10 @@ Then run: # This can take a while as we need to compile a lot of cuda kernels # On Turing GPUs (T4, RTX 2000 series ... ) -cargo install --path router -F candle-cuda-turing --no-default-features +cargo install --path router -F candle-cuda-turing -F http --no-default-features # On Ampere and Hopper -cargo install --path router -F candle-cuda --no-default-features +cargo install --path router -F candle-cuda -F http --no-default-features ``` You can now launch Text Embeddings Inference on GPU with: diff --git a/docs/source/en/local_cpu.md b/docs/source/en/local_cpu.md index 41faa4a1..504d3548 100644 --- a/docs/source/en/local_cpu.md +++ b/docs/source/en/local_cpu.md @@ -33,13 +33,13 @@ Depending on your machine's architecture, run one of the following commands: ### For x86 Machines ```shell -cargo install --path router -F candle -F mkl +cargo install --path router -F mkl ``` ### For M1 or M2 Machines ```shell -cargo install --path router -F candle -F accelerate +cargo install --path router -F metal ``` ## Step 3: Launch Text Embeddings Inference diff --git a/docs/source/en/local_gpu.md b/docs/source/en/local_gpu.md index 14683086..7b76300a 100644 --- a/docs/source/en/local_gpu.md +++ b/docs/source/en/local_gpu.md @@ -44,13 +44,13 @@ This step can take a while as we need to compile a lot of cuda kernels. ### For Turing GPUs (T4, RTX 2000 series ... ) ```shell -cargo install --path router -F candle-cuda-turing --no-default-features +cargo install --path router -F candle-cuda-turing -F http --no-default-features ``` ### For Ampere and Hopper ```shell -cargo install --path router -F candle-cuda --no-default-features +cargo install --path router -F candle-cuda -F http --no-default-features ``` ## Step 4: Launch Text Embeddings Inference diff --git a/docs/source/en/local_metal.md b/docs/source/en/local_metal.md index 66800994..0fd7f8ac 100644 --- a/docs/source/en/local_metal.md +++ b/docs/source/en/local_metal.md @@ -30,7 +30,7 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ## Step 2: Install with Metal support ```shell -cargo install --path router -F candle -F metal +cargo install --path router -F metal ``` ## Step 3: Launch Text Embeddings Inference From 0b40ade24627e84b4beac2474f8af8d92274e0d7 Mon Sep 17 00:00:00 2001 From: Christof Weickhardt Date: Mon, 18 Mar 2024 14:10:02 +0100 Subject: [PATCH 08/72] Applying `Cargo.toml` optimization options (#201) --- Cargo.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index b57e7346..5ecc2070 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,5 +28,8 @@ hf-hub = { git = "https://github.com/huggingface/hf-hub", rev = "b167f69692be5f4 [profile.release] debug = 0 incremental = true -lto = "off" +lto = "fat" +opt-level = 3 +codegen-units = 1 +strip = "symbols" panic = "abort" From 6fa3c6a5c0bf505b68103225465ed7fa331a4347 Mon Sep 17 00:00:00 2001 From: Guillaume Picard Date: Thu, 21 Mar 2024 17:24:44 +0700 Subject: [PATCH 09/72] feat: Add Dockerfile-arm64 to allow docker builds on Apple M1/M2 architecture (#209) --- Dockerfile-arm64 | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 8 +++++ 2 files changed, 100 insertions(+) create mode 100644 Dockerfile-arm64 diff --git a/Dockerfile-arm64 b/Dockerfile-arm64 new file mode 100644 index 00000000..e170a534 --- /dev/null +++ b/Dockerfile-arm64 @@ -0,0 +1,92 @@ +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 3f818537..872a506a 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ length of 512 tokens: - [gRPC](#grpc) - [Local Install](#local-install) - [Docker Build](#docker-build) + - [Apple M1/M2 Arm](#apple-m1m2-arm64-architectures) - [Examples](#examples) Text Embeddings Inference (TEI) is a toolkit for deploying and serving open source text embeddings and sequence @@ -476,6 +477,13 @@ runtime_compute_cap=90 docker build . -f Dockerfile-cuda --build-arg CUDA_COMPUTE_CAP=$runtime_compute_cap ``` +### 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. +``` +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) From 1d6f288e517469e0a1bf63b38a0d380e03d1a8e1 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 21 Mar 2024 11:44:26 +0100 Subject: [PATCH 10/72] feat: configurable payload limit (#210) --- README.md | 11 +++++++++-- router/src/http/server.rs | 8 ++++---- router/src/lib.rs | 11 ++++++++++- router/src/main.rs | 7 +++++++ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 872a506a..835d9475 100644 --- a/README.md +++ b/README.md @@ -223,11 +223,18 @@ 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] + --payload-limit + Payload size limit in bytes + + Default is 2MB + + [env: PAYLOAD_LIMIT=] + [default: 2000000] + --json-output Outputs the logs in JSON format (useful for telemetry) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 6d60653c..7da0e6a6 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -12,7 +12,7 @@ use crate::{ }; use ::http::HeaderMap; use anyhow::Context; -use axum::extract::Extension; +use axum::extract::{DefaultBodyLimit, Extension}; use axum::http::HeaderValue; use axum::http::{Method, StatusCode}; use axum::routing::{get, post}; @@ -1262,6 +1262,7 @@ pub async fn run( info: Info, addr: SocketAddr, prom_builder: PrometheusBuilder, + payload_limit: usize, cors_allow_origin: Option>, ) -> Result<(), anyhow::Error> { // OpenAPI documentation @@ -1370,7 +1371,8 @@ pub async fn run( }; // Create router - let base_routes = Router::new() + let mut app = Router::new() + .layer(DefaultBodyLimit::max(payload_limit)) .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", doc)) // Base routes .route("/info", get(get_model_info)) @@ -1393,8 +1395,6 @@ pub async fn run( // Prometheus metrics route .route("/metrics", get(metrics)); - let mut app = Router::new().merge(base_routes); - // Set default routes app = match &info.model_type { ModelType::Classifier(_) => { diff --git a/router/src/lib.rs b/router/src/lib.rs index 2e224c6e..92121648 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -56,6 +56,7 @@ pub async fn run( port: u16, uds_path: Option, huggingface_hub_cache: Option, + payload_limit: usize, otlp_endpoint: Option, cors_allow_origin: Option>, ) -> Result<()> { @@ -268,7 +269,15 @@ pub async fn run( #[cfg(feature = "http")] { let server = tokio::spawn(async move { - http::server::run(infer, info, addr, prom_builder, cors_allow_origin).await + http::server::run( + infer, + info, + addr, + prom_builder, + payload_limit, + cors_allow_origin, + ) + .await }); tracing::info!("Ready"); server.await??; diff --git a/router/src/main.rs b/router/src/main.rs index 5e5a32f9..dad1a3d6 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -96,6 +96,12 @@ struct Args { #[clap(long, env)] huggingface_hub_cache: Option, + /// Payload size limit in bytes + /// + /// Default is 2MB + #[clap(default_value = "2000000", long, env)] + payload_limit: usize, + /// Outputs the logs in JSON format (useful for telemetry) #[clap(long, env)] json_output: bool, @@ -136,6 +142,7 @@ async fn main() -> Result<()> { args.port, Some(args.uds_path), args.huggingface_hub_cache, + args.payload_limit, args.otlp_endpoint, args.cors_allow_origin, ) From 5e60d06d09f6987ab0a358020b2ae9f94db987c1 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 21 Mar 2024 16:59:00 +0100 Subject: [PATCH 11/72] feat: add api_key for request authorization (#211) --- README.md | 11 ++++++-- docs/source/en/cli_arguments.md | 17 +++++++++++ router/src/grpc/server.rs | 50 ++++++++++++++++++++++++++------- router/src/http/server.rs | 26 ++++++++++++++++- router/src/lib.rs | 10 +++++-- router/src/main.rs | 7 +++++ 6 files changed, 105 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 835d9475..4a709643 100644 --- a/README.md +++ b/README.md @@ -235,14 +235,21 @@ Options: [env: PAYLOAD_LIMIT=] [default: 2000000] + --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. + + [env: API_KEY=] + --json-output Outputs the logs in JSON format (useful for telemetry) [env: JSON_OUTPUT=] --otlp-endpoint - The grpc endpoint for opentelemetry. Telemetry is sent to this endpoint as OTLP over gRPC. - e.g. `http://localhost:4317` + The grpc endpoint for opentelemetry. Telemetry is sent to this endpoint as OTLP over gRPC. e.g. `http://localhost:4317` + [env: OTLP_ENDPOINT=] --cors-allow-origin diff --git a/docs/source/en/cli_arguments.md b/docs/source/en/cli_arguments.md index 9dd407bd..c79b7f9c 100644 --- a/docs/source/en/cli_arguments.md +++ b/docs/source/en/cli_arguments.md @@ -128,12 +128,29 @@ Options: [env: HUGGINGFACE_HUB_CACHE=/data] + --payload-limit + Payload size limit in bytes + + Default is 2MB + + [env: PAYLOAD_LIMIT=] + [default: 2000000] + + --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. + + [env: API_KEY=] + --json-output Outputs the logs in JSON format (useful for telemetry) [env: JSON_OUTPUT=] --otlp-endpoint + The grpc endpoint for opentelemetry. Telemetry is sent to this endpoint as OTLP over gRPC. e.g. `http://localhost:4317` + [env: OTLP_ENDPOINT=] --cors-allow-origin diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index eefe58ce..58acaa06 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -1334,6 +1334,7 @@ pub async fn run( info: Info, addr: SocketAddr, prom_builder: PrometheusBuilder, + api_key: Option, ) -> Result<(), anyhow::Error> { prom_builder.install()?; tracing::info!("Serving Prometheus metrics: 0.0.0.0:9000"); @@ -1431,17 +1432,46 @@ pub async fn run( let service = TextEmbeddingsService::new(infer, info); // Create gRPC server + let server = if let Some(api_key) = api_key { + let mut prefix = "Bearer ".to_string(); + prefix.push_str(&api_key); + + // Leak to allow FnMut + let api_key: &'static str = prefix.leak(); + + let auth = move |req: Request<()>| -> Result, Status> { + match req.metadata().get("authorization") { + Some(t) if t == api_key => Ok(req), + _ => Err(Status::unauthenticated("No valid auth token")), + } + }; + + Server::builder() + .add_service(health_service) + .add_service(reflection_service) + .add_service(grpc::InfoServer::with_interceptor(service.clone(), auth)) + .add_service(grpc::TokenizeServer::with_interceptor( + service.clone(), + auth, + )) + .add_service(grpc::EmbedServer::with_interceptor(service.clone(), auth)) + .add_service(grpc::PredictServer::with_interceptor(service.clone(), auth)) + .add_service(grpc::RerankServer::with_interceptor(service, auth)) + .serve_with_shutdown(addr, shutdown::shutdown_signal()) + } else { + Server::builder() + .add_service(health_service) + .add_service(reflection_service) + .add_service(grpc::InfoServer::new(service.clone())) + .add_service(grpc::TokenizeServer::new(service.clone())) + .add_service(grpc::EmbedServer::new(service.clone())) + .add_service(grpc::PredictServer::new(service.clone())) + .add_service(grpc::RerankServer::new(service)) + .serve_with_shutdown(addr, shutdown::shutdown_signal()) + }; + tracing::info!("Starting gRPC server: {}", &addr); - Server::builder() - .add_service(health_service) - .add_service(reflection_service) - .add_service(grpc::InfoServer::new(service.clone())) - .add_service(grpc::TokenizeServer::new(service.clone())) - .add_service(grpc::EmbedServer::new(service.clone())) - .add_service(grpc::PredictServer::new(service.clone())) - .add_service(grpc::RerankServer::new(service)) - .serve_with_shutdown(addr, shutdown::shutdown_signal()) - .await?; + server.await?; Ok(()) } diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 7da0e6a6..453f75b9 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -19,6 +19,7 @@ use axum::routing::{get, post}; use axum::{http, Json, Router}; use axum_tracing_opentelemetry::middleware::OtelAxumLayer; use futures::future::join_all; +use http::header::AUTHORIZATION; use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; use std::net::SocketAddr; use std::time::{Duration, Instant}; @@ -1263,6 +1264,7 @@ pub async fn run( addr: SocketAddr, prom_builder: PrometheusBuilder, payload_limit: usize, + api_key: Option, cors_allow_origin: Option>, ) -> Result<(), anyhow::Error> { // OpenAPI documentation @@ -1434,13 +1436,35 @@ pub async fn run( } } - let app = app + 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); + + // Leak to allow FnMut + let api_key: &'static str = prefix.leak(); + + let auth = move |headers: HeaderMap, + request: axum::extract::Request, + next: axum::middleware::Next| async move { + match headers.get(AUTHORIZATION) { + Some(token) if token == api_key => { + let response = next.run(request).await; + Ok(response) + } + _ => Err(StatusCode::UNAUTHORIZED), + } + }; + + app = app.layer(axum::middleware::from_fn(auth)); + } + // Run server let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); diff --git a/router/src/lib.rs b/router/src/lib.rs index 92121648..17008853 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -57,6 +57,7 @@ pub async fn run( uds_path: Option, huggingface_hub_cache: Option, payload_limit: usize, + api_key: Option, otlp_endpoint: Option, cors_allow_origin: Option>, ) -> Result<()> { @@ -275,6 +276,7 @@ pub async fn run( addr, prom_builder, payload_limit, + api_key, cors_allow_origin, ) .await @@ -285,10 +287,12 @@ pub async fn run( #[cfg(feature = "grpc")] { - // cors_allow_origin is not used for gRPC servers + // cors_allow_origin and payload_limit are not used for gRPC servers let _ = cors_allow_origin; - let server = - tokio::spawn(async move { grpc::server::run(infer, info, addr, prom_builder).await }); + let _ = payload_limit; + let server = tokio::spawn(async move { + grpc::server::run(infer, info, addr, prom_builder, api_key).await + }); tracing::info!("Ready"); server.await??; } diff --git a/router/src/main.rs b/router/src/main.rs index dad1a3d6..d89d40ab 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -102,6 +102,12 @@ struct Args { #[clap(default_value = "2000000", long, env)] payload_limit: usize, + /// 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. + #[clap(long, env)] + api_key: Option, + /// Outputs the logs in JSON format (useful for telemetry) #[clap(long, env)] json_output: bool, @@ -143,6 +149,7 @@ async fn main() -> Result<()> { Some(args.uds_path), args.huggingface_hub_cache, args.payload_limit, + args.api_key, args.otlp_endpoint, args.cors_allow_origin, ) From a57cf613c9d6ecfbd5edab2651f6c669a9b69989 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 21 Mar 2024 17:44:48 +0100 Subject: [PATCH 12/72] feat: add all methods to vertex API (#192) --- Dockerfile-cuda-all | 43 ++++- docs/openapi.json | 349 ++++++++++++++++++++++++++++++++++++++ router/src/http/server.rs | 200 +++++++++++----------- router/src/http/types.rs | 28 +-- router/src/lib.rs | 5 +- router/tests/common.rs | 2 + 6 files changed, 505 insertions(+), 122 deletions(-) diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index ac2dcdb2..5b72fc65 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -33,6 +33,7 @@ FROM base-builder AS builder ARG GIT_SHA ARG DOCKER_LABEL +ARG VERTEX # sccache specific variables ARG ACTIONS_CACHE_URL @@ -45,7 +46,12 @@ COPY --from=planner /usr/src/recipe.json recipe.json FROM builder as builder-75 -RUN CUDA_COMPUTE_CAP=75 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s +RUN if [ $VERTEX = "true" ]; \ + then \ + CUDA_COMPUTE_CAP=75 cargo chef cook --release --features google --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + else \ + CUDA_COMPUTE_CAP=75 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + fi; COPY backends backends COPY core core @@ -53,11 +59,21 @@ COPY router router COPY Cargo.toml ./ COPY Cargo.lock ./ -RUN CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s +RUN if [ $VERTEX = "true" ]; \ + then \ + CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http -F google --no-default-features && sccache -s; \ + else \ + CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s; \ + fi; FROM builder as builder-80 -RUN CUDA_COMPUTE_CAP=80 cargo chef cook --release --features candle-cuda --no-default-features --recipe-path recipe.json && sccache -s +RUN if [ $VERTEX = "true" ]; \ + then \ + CUDA_COMPUTE_CAP=80 cargo chef cook --release --features google --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + else \ + CUDA_COMPUTE_CAP=80 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + fi; COPY backends backends COPY core core @@ -65,11 +81,21 @@ COPY router router COPY Cargo.toml ./ COPY Cargo.lock ./ -RUN CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s +RUN if [ $VERTEX = "true" ]; \ + then \ + CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http -F google --no-default-features && sccache -s; \ + else \ + CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s; \ + fi; FROM builder as builder-90 -RUN CUDA_COMPUTE_CAP=90 cargo chef cook --release --features candle-cuda --no-default-features --recipe-path recipe.json && sccache -s +RUN if [ $VERTEX = "true" ]; \ + then \ + CUDA_COMPUTE_CAP=90 cargo chef cook --release --features google --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + else \ + CUDA_COMPUTE_CAP=90 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + fi; COPY backends backends COPY core core @@ -77,7 +103,12 @@ COPY router router COPY Cargo.toml ./ COPY Cargo.lock ./ -RUN CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s +RUN if [ $VERTEX = "true" ]; \ + then \ + CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http -F google --no-default-features && sccache -s; \ + else \ + CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s; \ + fi; FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 as base diff --git a/docs/openapi.json b/docs/openapi.json index c9377087..867c7197 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -658,6 +658,87 @@ } } } + }, + "/vertex": { + "post": { + "tags": [ + "Text Embeddings Inference" + ], + "summary": "Generate embeddings from a Vertex request", + "description": "Generate embeddings from a Vertex request", + "operationId": "vertex_compatibility", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VertexRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Results" + }, + "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": "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" + } + } + } + } + } + } } }, "components": { @@ -1338,6 +1419,274 @@ } ] ] + }, + "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" + } } } }, diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 453f75b9..6f4d4eb5 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -4,7 +4,8 @@ use crate::http::types::{ EmbedSparseResponse, Input, OpenAICompatEmbedding, OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, Sequence, SimpleToken, - SparseValue, TokenizeRequest, TokenizeResponse, VertexRequest, + SparseValue, TokenizeRequest, TokenizeResponse, VertexRequest, VertexResponse, + VertexResponseInstance, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -19,6 +20,7 @@ use axum::routing::{get, post}; use axum::{http, Json, Router}; use axum_tracing_opentelemetry::middleware::OtelAxumLayer; use futures::future::join_all; +use futures::FutureExt; use http::header::AUTHORIZATION; use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; use std::net::SocketAddr; @@ -1158,8 +1160,8 @@ tag = "Text Embeddings Inference", path = "/vertex", request_body = VertexRequest, responses( -(status = 200, description = "Embeddings", body = EmbedResponse), -(status = 424, description = "Embedding Error", body = ErrorResponse, +(status = 200, description = "Results"), +(status = 424, description = "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"})), @@ -1174,76 +1176,64 @@ async fn vertex_compatibility( infer: Extension, info: Extension, Json(req): Json, -) -> Result<(HeaderMap, Json), (StatusCode, Json)> { - let span = tracing::Span::current(); - let start_time = Instant::now(); - - let batch_size = req.instances.len(); - 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, +) -> Result, (StatusCode, Json)> { + let embed_future = move |infer: Extension, info: Extension, req: EmbedRequest| async move { + let result = embed(infer, info, Json(req)).await?; + Ok(VertexResponseInstance::Embed(result.1 .0)) + }; + let embed_sparse_future = + move |infer: Extension, info: Extension, req: EmbedSparseRequest| async move { + let result = embed_sparse(infer, info, Json(req)).await?; + Ok(VertexResponseInstance::EmbedSparse(result.1 .0)) + }; + let predict_future = + move |infer: Extension, info: Extension, req: PredictRequest| async move { + let result = predict(infer, info, Json(req)).await?; + Ok(VertexResponseInstance::Predict(result.1 .0)) + }; + let rerank_future = + move |infer: Extension, info: Extension, req: RerankRequest| async move { + let result = rerank(infer, info, Json(req)).await?; + Ok(VertexResponseInstance::Rerank(result.1 .0)) }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); - Err(err)?; - } - let mut futures = Vec::with_capacity(batch_size); - let mut compute_chars = 0; + let mut futures = Vec::with_capacity(req.instances.len()); + for instance in req.instances { + let local_infer = infer.clone(); + let local_info = info.clone(); - for instance in req.instances.iter() { - let input = instance.inputs.clone(); - compute_chars += input.chars().count(); + // Rerank is the only payload that can me matched safely + if let Ok(instance) = serde_json::from_value::(instance.clone()) { + futures.push(rerank_future(local_infer, local_info, instance).boxed()); + continue; + } - let local_infer = infer.clone(); - futures.push(async move { - let permit = local_infer.acquire_permit().await; - local_infer - .embed_pooled(input, instance.truncate, instance.normalize, permit) - .await - }) + match info.model_type { + ModelType::Classifier(_) | ModelType::Reranker(_) => { + let instance = serde_json::from_value::(instance) + .map_err(ErrorResponse::from)?; + futures.push(predict_future(local_infer, local_info, instance).boxed()); + } + ModelType::Embedding(_) => { + if infer.is_splade() { + let instance = serde_json::from_value::(instance) + .map_err(ErrorResponse::from)?; + futures.push(embed_sparse_future(local_infer, local_info, instance).boxed()); + } else { + let instance = serde_json::from_value::(instance) + .map_err(ErrorResponse::from)?; + futures.push(embed_future(local_infer, local_info, instance).boxed()); + } + } + } } - let results = join_all(futures) + + let predictions = join_all(futures) .await .into_iter() - .collect::, TextEmbeddingsError>>() - .map_err(ErrorResponse::from)?; - - let mut embeddings = Vec::with_capacity(batch_size); - let mut total_tokenization_time = 0; - let mut total_queue_time = 0; - let mut total_inference_time = 0; - let mut total_compute_tokens = 0; - - for r in results { - total_tokenization_time += r.metadata.tokenization.as_nanos() as u64; - total_queue_time += r.metadata.queue.as_nanos() as u64; - total_inference_time += r.metadata.inference.as_nanos() as u64; - total_compute_tokens += r.metadata.prompt_tokens; - embeddings.push(r.results); - } - let batch_size = batch_size as u64; - - let response = EmbedResponse(embeddings); - let metadata = ResponseMetadata::new( - compute_chars, - total_compute_tokens, - start_time, - Duration::from_nanos(total_tokenization_time / batch_size), - Duration::from_nanos(total_queue_time / batch_size), - Duration::from_nanos(total_inference_time / batch_size), - ); + .collect::, (StatusCode, Json)>>()?; - metadata.record_span(&span); - metadata.record_metrics(); - tracing::info!("Success"); - - Ok((HeaderMap::from(metadata), Json(response))) + Ok(Json(VertexResponse { predictions })) } /// Prometheus metrics scrape endpoint @@ -1354,12 +1344,10 @@ pub async fn run( // avoid `mut` if possible #[cfg(feature = "google")] { - use crate::http::types::VertexInstance; - #[derive(OpenApi)] #[openapi( paths(vertex_compatibility), - components(schemas(VertexInstance, VertexRequest)) + components(schemas(VertexRequest, VertexResponse, VertexResponseInstance)) )] struct VertextApiDoc; @@ -1397,43 +1385,42 @@ pub async fn run( // Prometheus metrics route .route("/metrics", get(metrics)); - // Set default routes - app = match &info.model_type { - ModelType::Classifier(_) => { - app.route("/", post(predict)) - // AWS Sagemaker route - .route("/invocations", post(predict)) - } - ModelType::Reranker(_) => { - app.route("/", post(rerank)) - // AWS Sagemaker route - .route("/invocations", post(rerank)) - } - ModelType::Embedding(model) => { - if model.pooling == "splade" { - app.route("/", post(embed_sparse)) - // AWS Sagemaker route - .route("/invocations", post(embed_sparse)) - } else { - app.route("/", post(embed)) - // AWS Sagemaker route - .route("/invocations", post(embed)) - } - } - }; - #[cfg(feature = "google")] { tracing::info!("Built with `google` feature"); - tracing::info!( - "Environment variables `AIP_PREDICT_ROUTE` and `AIP_HEALTH_ROUTE` will be respected." - ); - if let Ok(env_predict_route) = std::env::var("AIP_PREDICT_ROUTE") { - app = app.route(&env_predict_route, post(vertex_compatibility)); - } - if let Ok(env_health_route) = std::env::var("AIP_HEALTH_ROUTE") { - app = app.route(&env_health_route, get(health)); - } + let env_predict_route = std::env::var("AIP_PREDICT_ROUTE") + .context("`AIP_PREDICT_ROUTE` env var must be set for Google Vertex deployments")?; + app = app.route(&env_predict_route, post(vertex_compatibility)); + let env_health_route = std::env::var("AIP_HEALTH_ROUTE") + .context("`AIP_HEALTH_ROUTE` env var must be set for Google Vertex deployments")?; + app = app.route(&env_health_route, get(health)); + } + #[cfg(not(feature = "google"))] + { + // Set default routes + app = match &info.model_type { + ModelType::Classifier(_) => { + app.route("/", post(predict)) + // AWS Sagemaker route + .route("/invocations", post(predict)) + } + ModelType::Reranker(_) => { + app.route("/", post(rerank)) + // AWS Sagemaker route + .route("/invocations", post(rerank)) + } + ModelType::Embedding(model) => { + if model.pooling == "splade" { + app.route("/", post(embed_sparse)) + // AWS Sagemaker route + .route("/invocations", post(embed_sparse)) + } else { + app.route("/", post(embed)) + // AWS Sagemaker route + .route("/invocations", post(embed)) + } + } + }; } app = app @@ -1510,3 +1497,12 @@ impl From for (StatusCode, Json) { (StatusCode::from(&err.error_type), Json(err.into())) } } + +impl From for ErrorResponse { + fn from(err: serde_json::Error) -> Self { + ErrorResponse { + error: err.to_string(), + error_type: ErrorType::Validation, + } + } +} diff --git a/router/src/http/types.rs b/router/src/http/types.rs index a638fb29..30c9e728 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -382,19 +382,21 @@ pub(crate) struct SimpleToken { #[schema(example = json!([[{"id": 0, "text": "test", "special": false, "start": 0, "stop": 2}]]))] pub(crate) struct TokenizeResponse(pub Vec>); -#[derive(Clone, Deserialize, ToSchema)] -pub(crate) struct VertexInstance { - #[schema(example = "What is Deep Learning?")] - pub inputs: String, - #[serde(default)] - #[schema(default = "false", example = "false")] - pub truncate: bool, - #[serde(default = "default_normalize")] - #[schema(default = "true", example = "true")] - pub normalize: bool, -} - #[derive(Deserialize, ToSchema)] pub(crate) struct VertexRequest { - pub instances: Vec, + pub instances: Vec, +} + +#[derive(Serialize, ToSchema)] +#[serde(untagged)] +pub(crate) enum VertexResponseInstance { + Embed(EmbedResponse), + EmbedSparse(EmbedSparseResponse), + Predict(PredictResponse), + Rerank(RerankResponse), +} + +#[derive(Serialize, ToSchema)] +pub(crate) struct VertexResponse { + pub predictions: Vec, } diff --git a/router/src/lib.rs b/router/src/lib.rs index 17008853..8a5715a6 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -246,7 +246,7 @@ pub async fn run( std::env::var("AIP_HTTP_PORT") .ok() .and_then(|p| p.parse().ok()) - .expect("Invalid or unset AIP_HTTP_PORT") + .context("`AIP_HTTP_PORT` env var must be set for Google Vertex deployments")? } else { port }; @@ -264,6 +264,9 @@ pub async fn run( #[cfg(all(feature = "grpc", feature = "http"))] compile_error!("Features `http` and `grpc` cannot be enabled at the same time."); + #[cfg(all(feature = "grpc", feature = "google"))] + compile_error!("Features `http` and `google` cannot be enabled at the same time."); + #[cfg(not(any(feature = "http", feature = "grpc")))] compile_error!("Either feature `http` or `grpc` must be enabled."); diff --git a/router/tests/common.rs b/router/tests/common.rs index 5e8842f4..29331188 100644 --- a/router/tests/common.rs +++ b/router/tests/common.rs @@ -60,6 +60,8 @@ pub async fn start_server(model_id: String, revision: Option, dtype: DTy 8090, None, None, + 2_000_000, + None, None, None, ) From 90ea664bb71019325429123920c4cbba9a61369b Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 22 Mar 2024 15:19:07 +0100 Subject: [PATCH 13/72] feat: add `/decode` route (#212) --- core/src/infer.rs | 16 ++++++ core/src/tokenization.rs | 57 ++++++++++++++++++++ docs/openapi.json | 96 ++++++++++++++++++++++++++++++++- proto/tei.proto | 11 ++++ router/src/grpc/server.rs | 108 +++++++++++++++++++++++++++++++++++++- router/src/http/server.rs | 100 ++++++++++++++++++++++++++++++----- router/src/http/types.rs | 27 +++++++++- 7 files changed, 397 insertions(+), 18 deletions(-) diff --git a/core/src/infer.rs b/core/src/infer.rs index e2cef5d5..54f755d9 100644 --- a/core/src/infer.rs +++ b/core/src/infer.rs @@ -74,6 +74,22 @@ impl Infer { }) } + #[instrument(skip(self))] + pub async fn decode( + &self, + ids: Vec, + skip_special_tokens: bool, + ) -> Result { + self.tokenization + .decode(ids, skip_special_tokens) + .await + .map_err(|err| { + metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + tracing::error!("{err}"); + err + }) + } + #[instrument(skip(self))] pub fn try_acquire_permit(&self) -> Result { // Limit concurrent requests by acquiring a permit from the semaphore diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index 787a9e81..42073b32 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -120,6 +120,37 @@ impl Tokenization { // Unwrap is safe here response_receiver.await.expect("Tokenization background task dropped the sender without sending a response. This is a bug.") } + + #[instrument(skip_all)] + pub async fn decode( + &self, + ids: Vec, + skip_special_tokens: bool, + ) -> Result { + // Check if inputs is empty + if ids.is_empty() { + return Err(TextEmbeddingsError::Validation( + "`input_ids` cannot be empty".to_string(), + )); + } + + // Create response channel + let (response_sender, response_receiver) = oneshot::channel(); + // Send request to the background validation task + // Unwrap is safe here + self.sender + .send(TokenizerRequest::Decode( + ids, + skip_special_tokens, + response_sender, + Span::current(), + )) + .expect("Tokenization background task dropped the receiver. This is a bug."); + + // Await on response channel + // Unwrap is safe here + response_receiver.await.expect("Tokenization background task dropped the sender without sending a response. This is a bug.") + } } /// Start tokenization workers @@ -161,10 +192,30 @@ fn tokenizer_worker( } }) } + TokenizerRequest::Decode(ids, skip_special_tokens, response_tx, parent_span) => { + parent_span.in_scope(|| { + if !response_tx.is_closed() { + // It's possible that the user dropped its request resulting in a send error. + // We just discard the error + let _ = + response_tx.send(decode_ids(ids, skip_special_tokens, &mut tokenizer)); + } + }) + } } } } +fn decode_ids( + ids: Vec, + skip_special_tokens: bool, + tokenizer: &mut Tokenizer, +) -> Result { + Ok(tokenizer + .with_truncation(None)? + .decode(&ids, skip_special_tokens)?) +} + fn tokenize_input( inputs: EncodingInput, add_special_tokens: bool, @@ -263,4 +314,10 @@ enum TokenizerRequest { oneshot::Sender>, Span, ), + Decode( + Vec, + bool, + oneshot::Sender>, + Span, + ), } diff --git a/docs/openapi.json b/docs/openapi.json index 867c7197..fa05251d 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -12,6 +12,52 @@ "version": "1.1.0" }, "paths": { + "/decode": { + "post": { + "tags": [ + "Text Embeddings Inference" + ], + "summary": "Decode input ids", + "description": "Decode input ids", + "operationId": "decode", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DecodeRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Decoded ids", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DecodeResponse" + } + } + } + }, + "422": { + "description": "Tokenization error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "message": "Tokenization error", + "type": "tokenizer" + } + } + } + } + } + } + }, "/embed": { "post": { "tags": [ @@ -647,7 +693,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" + "$ref": "#/components/schemas/ErrorResponse" }, "example": { "message": "Tokenization error", @@ -771,6 +817,31 @@ } } }, + "DecodeRequest": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "$ref": "#/components/schemas/InputIds" + }, + "skip_special_tokens": { + "type": "boolean", + "default": "true", + "example": "true" + } + } + }, + "DecodeResponse": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "test" + ] + }, "EmbedAllRequest": { "type": "object", "required": [ @@ -1003,6 +1074,29 @@ } ] }, + "InputIds": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "integer", + "format": "int32", + "minimum": 0 + } + }, + { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "integer", + "format": "int32", + "minimum": 0 + } + } + } + ] + }, "ModelType": { "oneOf": [ { diff --git a/proto/tei.proto b/proto/tei.proto index 87205129..51ad0002 100644 --- a/proto/tei.proto +++ b/proto/tei.proto @@ -30,6 +30,8 @@ service Rerank { service Tokenize { rpc Tokenize (EncodeRequest) returns (EncodeResponse); rpc TokenizeStream (stream EncodeRequest) returns (stream EncodeResponse); + rpc Decode (DecodeRequest) returns (DecodeResponse); + rpc DecodeStream (stream DecodeRequest) returns (stream DecodeResponse); } message InfoRequest {} @@ -166,3 +168,12 @@ message SimpleToken { message EncodeResponse { repeated SimpleToken tokens = 1; } + +message DecodeRequest { + repeated uint32 ids = 1; + bool skip_special_tokens = 2; +} + +message DecodeResponse { + string text = 1; +} diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index 58acaa06..4829e2f0 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -3,8 +3,8 @@ use crate::grpc::pb::tei::v1::{ EncodeResponse, RerankStreamRequest, SimpleToken, SparseValue, TokenEmbedding, }; use crate::grpc::{ - EmbedRequest, EmbedResponse, InfoRequest, InfoResponse, PredictRequest, PredictResponse, - Prediction, Rank, RerankRequest, RerankResponse, + DecodeRequest, DecodeResponse, EmbedRequest, EmbedResponse, InfoRequest, InfoResponse, + PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, }; use crate::ResponseMetadata; use crate::{grpc, shutdown, ErrorResponse, ErrorType, Info, ModelType}; @@ -331,6 +331,17 @@ impl TextEmbeddingsService { .collect(); Ok(EncodeResponse { tokens }) } + + #[instrument(skip_all)] + async fn decode_inner(&self, request: DecodeRequest) -> Result { + let ids = request.ids; + let text = self + .infer + .decode(ids, request.skip_special_tokens) + .await + .map_err(ErrorResponse::from)?; + Ok(DecodeResponse { text }) + } } #[tonic::async_trait] @@ -1327,6 +1338,99 @@ impl grpc::tokenize_server::Tokenize for TextEmbeddingsService { response_receiver, ))) } + + async fn decode( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + let tokens = self.decode_inner(request).await?; + Ok(Response::new(tokens)) + } + + type DecodeStreamStream = UnboundedReceiverStream>; + + async fn decode_stream( + &self, + request: Request>, + ) -> Result, Status> { + let mut request_stream = request.into_inner(); + + // Create bounded channel to have an upper bound of spawned tasks + // We will have at most `max_parallel_stream_requests` messages from this stream in the queue + let (encode_sender, mut encode_receiver) = mpsc::channel::<( + DecodeRequest, + oneshot::Sender>, + )>(self.max_parallel_stream_requests); + + // Required for the async move below + let local = self.clone(); + + // Background task that uses the bounded channel + tokio::spawn(async move { + while let Some((request, mut sender)) = encode_receiver.recv().await { + // Required for the async move below + let task_local = local.clone(); + + // Create async task for this specific input + tokio::spawn(async move { + // Select on closed to cancel work if the stream was closed + tokio::select! { + response = task_local.decode_inner(request) => { + let _ = sender.send(response); + } + _ = sender.closed() => {} + } + }); + } + }); + + // Intermediate channels + // Required to keep the order of the requests + let (intermediate_sender, mut intermediate_receiver) = mpsc::unbounded_channel(); + + tokio::spawn(async move { + // Iterate on input + while let Some(request) = request_stream.next().await { + // Create return channel + let (result_sender, result_receiver) = oneshot::channel(); + // Push to intermediate channel and preserve ordering + intermediate_sender + .send(result_receiver) + .expect("`intermediate_receiver` was dropped. This is a bug."); + + match request { + Ok(request) => encode_sender + .send((request, result_sender)) + .await + .expect("`encode_receiver` was dropped. This is a bug."), + Err(status) => { + // Request is malformed + let _ = result_sender.send(Err(status)); + } + }; + } + }); + + // Final channel for the outputs + let (response_sender, response_receiver) = mpsc::unbounded_channel(); + + tokio::spawn(async move { + while let Some(result_receiver) = intermediate_receiver.recv().await { + // Select on closed to cancel work if the stream was closed + tokio::select! { + response = result_receiver => { + let _ = response_sender.send(response.expect("`result_sender` was dropped. This is a bug.")); + } + _ = response_sender.closed() => {} + } + } + }); + + Ok(Response::new(UnboundedReceiverStream::new( + response_receiver, + ))) + } } pub async fn run( diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 6f4d4eb5..db68b089 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1,11 +1,11 @@ /// HTTP Server logic use crate::http::types::{ - EmbedAllRequest, EmbedAllResponse, EmbedRequest, EmbedResponse, EmbedSparseRequest, - EmbedSparseResponse, Input, OpenAICompatEmbedding, OpenAICompatErrorResponse, - OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, - PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, Sequence, SimpleToken, - SparseValue, TokenizeRequest, TokenizeResponse, VertexRequest, VertexResponse, - VertexResponseInstance, + DecodeRequest, DecodeResponse, EmbedAllRequest, EmbedAllResponse, EmbedRequest, EmbedResponse, + EmbedSparseRequest, EmbedSparseResponse, Input, InputIds, OpenAICompatEmbedding, + OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, + PredictInput, PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, + Sequence, SimpleToken, SparseValue, TokenizeRequest, TokenizeResponse, VertexPrediction, + VertexRequest, VertexResponse, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -1059,7 +1059,7 @@ path = "/tokenize", request_body = TokenizeRequest, responses( (status = 200, description = "Tokenized ids", body = TokenizeResponse), -(status = 422, description = "Tokenization error", body = OpenAICompatErrorResponse, +(status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), ) )] @@ -1153,6 +1153,75 @@ async fn tokenize( Ok(Json(TokenizeResponse(tokens))) } +/// Decode input ids +#[utoipa::path( +post, +tag = "Text Embeddings Inference", +path = "/decode", +request_body = DecodeRequest, +responses( +(status = 200, description = "Decoded ids", body = DecodeResponse), +(status = 422, description = "Tokenization error", body = ErrorResponse, +example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), +) +)] +#[instrument(skip_all)] +async fn decode( + infer: Extension, + info: Extension, + Json(req): Json, +) -> Result, (StatusCode, Json)> { + let decode_inner = move |ids: Vec, skip_special_tokens: bool, infer: Infer| async move { + let text = infer + .decode(ids, skip_special_tokens) + .await + .map_err(ErrorResponse::from)?; + Ok::(text) + }; + + let texts = match req.ids { + InputIds::Single(ids) => vec![decode_inner(ids, req.skip_special_tokens, infer.0).await?], + InputIds::Batch(ids) => { + if ids.is_empty() { + let message = "`ids` cannot be empty".to_string(); + tracing::error!("{message}"); + let err = ErrorResponse { + error: message, + error_type: ErrorType::Validation, + }; + metrics::increment_counter!("te_request_failure", "err" => "validation"); + Err(err)?; + } + + let batch_size = ids.len(); + 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, + }; + metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + Err(err)?; + } + + let mut futures = Vec::with_capacity(batch_size); + for ids in ids { + futures.push(decode_inner(ids, req.skip_special_tokens, infer.0.clone())); + } + + join_all(futures) + .await + .into_iter() + .collect::, ErrorResponse>>()? + } + }; + Ok(Json(DecodeResponse(texts))) +} + /// Generate embeddings from a Vertex request #[utoipa::path( post, @@ -1179,22 +1248,22 @@ async fn vertex_compatibility( ) -> Result, (StatusCode, Json)> { let embed_future = move |infer: Extension, info: Extension, req: EmbedRequest| async move { let result = embed(infer, info, Json(req)).await?; - Ok(VertexResponseInstance::Embed(result.1 .0)) + Ok(VertexPrediction::Embed(result.1 .0)) }; let embed_sparse_future = move |infer: Extension, info: Extension, req: EmbedSparseRequest| async move { let result = embed_sparse(infer, info, Json(req)).await?; - Ok(VertexResponseInstance::EmbedSparse(result.1 .0)) + Ok(VertexPrediction::EmbedSparse(result.1 .0)) }; let predict_future = move |infer: Extension, info: Extension, req: PredictRequest| async move { let result = predict(infer, info, Json(req)).await?; - Ok(VertexResponseInstance::Predict(result.1 .0)) + Ok(VertexPrediction::Predict(result.1 .0)) }; let rerank_future = move |infer: Extension, info: Extension, req: RerankRequest| async move { let result = rerank(infer, info, Json(req)).await?; - Ok(VertexResponseInstance::Rerank(result.1 .0)) + Ok(VertexPrediction::Rerank(result.1 .0)) }; let mut futures = Vec::with_capacity(req.instances.len()); @@ -1231,7 +1300,7 @@ async fn vertex_compatibility( let predictions = join_all(futures) .await .into_iter() - .collect::, (StatusCode, Json)>>()?; + .collect::, (StatusCode, Json)>>()?; Ok(Json(VertexResponse { predictions })) } @@ -1270,6 +1339,7 @@ pub async fn run( embed_sparse, openai_embed, tokenize, + decode, metrics, ), components( @@ -1302,6 +1372,9 @@ pub async fn run( TokenizeRequest, TokenizeResponse, SimpleToken, + InputIds, + DecodeRequest, + DecodeResponse, ErrorType, ) ), @@ -1347,7 +1420,7 @@ pub async fn run( #[derive(OpenApi)] #[openapi( paths(vertex_compatibility), - components(schemas(VertexRequest, VertexResponse, VertexResponseInstance)) + components(schemas(VertexRequest, VertexResponse, VertexPrediction)) )] struct VertextApiDoc; @@ -1372,6 +1445,7 @@ pub async fn run( .route("/predict", post(predict)) .route("/rerank", post(rerank)) .route("/tokenize", post(tokenize)) + .route("/decode", post(decode)) // OpenAI compat route .route("/embeddings", post(openai_embed)) // Vertex compat route diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 30c9e728..4721ba88 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -382,6 +382,29 @@ pub(crate) struct SimpleToken { #[schema(example = json!([[{"id": 0, "text": "test", "special": false, "start": 0, "stop": 2}]]))] pub(crate) struct TokenizeResponse(pub Vec>); +#[derive(Deserialize, ToSchema)] +#[serde(untagged)] +pub(crate) enum InputIds { + Single(Vec), + Batch(Vec>), +} + +#[derive(Deserialize, ToSchema)] +pub(crate) struct DecodeRequest { + pub ids: InputIds, + #[serde(default = "default_skip_special_tokens")] + #[schema(default = "true", example = "true")] + pub skip_special_tokens: bool, +} + +fn default_skip_special_tokens() -> bool { + true +} + +#[derive(Serialize, ToSchema)] +#[schema(example = json!(["test"]))] +pub(crate) struct DecodeResponse(pub Vec); + #[derive(Deserialize, ToSchema)] pub(crate) struct VertexRequest { pub instances: Vec, @@ -389,7 +412,7 @@ pub(crate) struct VertexRequest { #[derive(Serialize, ToSchema)] #[serde(untagged)] -pub(crate) enum VertexResponseInstance { +pub(crate) enum VertexPrediction { Embed(EmbedResponse), EmbedSparse(EmbedSparseResponse), Predict(PredictResponse), @@ -398,5 +421,5 @@ pub(crate) enum VertexResponseInstance { #[derive(Serialize, ToSchema)] pub(crate) struct VertexResponse { - pub predictions: Vec, + pub predictions: Vec, } From a1dd76dfecfad5cb363ac5e0f5508cd0a47c4c7a Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 22 Mar 2024 16:40:56 +0100 Subject: [PATCH 14/72] Input Types Compatibility with OpenAI's API (#112) (#214) Co-authored-by: Numan Laanait --- core/src/tokenization.rs | 31 +++++++++++++++++++---------- router/src/http/server.rs | 33 ++++++++++++++++++------------- router/src/http/types.rs | 35 ++++++++++++++++++++++++++++++--- router/tests/test_http_embed.rs | 27 +++++++++++++++++++++++-- 4 files changed, 97 insertions(+), 29 deletions(-) diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index 42073b32..46f1411e 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -2,7 +2,7 @@ use crate::TextEmbeddingsError; use tokenizers::tokenizer::Tokenizer; pub use tokenizers::Encoding as RawEncoding; -use tokenizers::{EncodeInput, TruncationDirection, TruncationParams, TruncationStrategy}; +use tokenizers::{TruncationDirection, TruncationParams, TruncationStrategy}; use tokio::sync::{mpsc, oneshot}; use tracing::{instrument, Span}; @@ -222,14 +222,25 @@ fn tokenize_input( truncate_params: Option, tokenizer: &mut Tokenizer, ) -> Result { - let inputs: EncodeInput = match inputs { - EncodingInput::Single(s) => s.into(), - EncodingInput::Dual(s1, s2) => (s1, s2).into(), + let encoding = match inputs { + // encode input + EncodingInput::Single(s) => tokenizer + .with_truncation(truncate_params)? + .encode::(s, add_special_tokens)?, + EncodingInput::Dual(s1, s2) => { + 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)? + } }; - - Ok(tokenizer - .with_truncation(truncate_params)? - .encode(inputs, add_special_tokens)?) + Ok(encoding) } /// Get input length and optionally truncate it @@ -256,9 +267,7 @@ 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); - Ok(ValidEncoding { input_ids: encoding.get_ids().to_vec(), token_type_ids: encoding.get_type_ids().to_vec(), @@ -278,6 +287,7 @@ pub struct ValidEncoding { pub enum EncodingInput { Single(String), Dual(String, String), + Ids(Vec), } impl EncodingInput { @@ -285,6 +295,7 @@ impl EncodingInput { match self { EncodingInput::Single(s) => s.is_empty(), EncodingInput::Dual(s1, s2) => s1.is_empty() && s2.is_empty(), + EncodingInput::Ids(v) => v.is_empty(), } } } diff --git a/router/src/http/server.rs b/router/src/http/server.rs index db68b089..5e498fc9 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1,11 +1,11 @@ /// HTTP Server logic use crate::http::types::{ DecodeRequest, DecodeResponse, EmbedAllRequest, EmbedAllResponse, EmbedRequest, EmbedResponse, - EmbedSparseRequest, EmbedSparseResponse, Input, InputIds, OpenAICompatEmbedding, + EmbedSparseRequest, EmbedSparseResponse, Input, InputIds, InputType, OpenAICompatEmbedding, OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, - Sequence, SimpleToken, SparseValue, TokenizeRequest, TokenizeResponse, VertexPrediction, - VertexRequest, VertexResponse, + Sequence, SimpleToken, SparseValue, TokenizeInput, TokenizeRequest, TokenizeResponse, + VertexPrediction, VertexRequest, VertexResponse, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -474,7 +474,7 @@ async fn embed( Input::Single(input) => { metrics::increment_counter!("te_request_count", "method" => "single"); - let compute_chars = input.chars().count(); + let compute_chars = input.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer @@ -529,7 +529,7 @@ async fn embed( let mut compute_chars = 0; for input in inputs { - compute_chars += input.chars().count(); + compute_chars += input.count_chars(); let local_infer = infer.clone(); futures.push(async move { @@ -630,7 +630,7 @@ async fn embed_sparse( Input::Single(input) => { metrics::increment_counter!("te_request_count", "method" => "single"); - let compute_chars = input.chars().count(); + let compute_chars = input.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer @@ -685,7 +685,7 @@ async fn embed_sparse( let mut compute_chars = 0; for input in inputs { - compute_chars += input.chars().count(); + compute_chars += input.count_chars(); let local_infer = infer.clone(); futures.push(async move { @@ -778,7 +778,7 @@ async fn embed_all( Input::Single(input) => { metrics::increment_counter!("te_request_count", "method" => "single"); - let compute_chars = input.chars().count(); + let compute_chars = input.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer @@ -833,7 +833,7 @@ async fn embed_all( let mut compute_chars = 0; for input in inputs { - compute_chars += input.chars().count(); + compute_chars += input.count_chars(); let local_infer = infer.clone(); futures.push(async move { @@ -892,7 +892,7 @@ async fn embed_all( #[utoipa::path( post, tag = "Text Embeddings Inference", -path = "/embeddings", +path = "/v1/embeddings", request_body = OpenAICompatRequest, responses( (status = 200, description = "Embeddings", body = OpenAICompatResponse), @@ -923,7 +923,7 @@ async fn openai_embed( Input::Single(input) => { metrics::increment_counter!("te_request_count", "method" => "single"); - let compute_chars = input.chars().count(); + let compute_chars = input.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer @@ -982,7 +982,7 @@ async fn openai_embed( let mut compute_chars = 0; for input in inputs { - compute_chars += input.chars().count(); + compute_chars += input.count_chars(); let local_infer = infer.clone(); futures.push(async move { @@ -1107,8 +1107,10 @@ async fn tokenize( }; let tokens = match req.inputs { - Input::Single(input) => vec![tokenize_inner(input, req.add_special_tokens, infer.0).await?], - Input::Batch(inputs) => { + TokenizeInput::Single(input) => { + vec![tokenize_inner(input, req.add_special_tokens, infer.0).await?] + } + TokenizeInput::Batch(inputs) => { if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); tracing::error!("{message}"); @@ -1369,9 +1371,11 @@ pub async fn run( EmbedResponse, ErrorResponse, OpenAICompatErrorResponse, + TokenizeInput, TokenizeRequest, TokenizeResponse, SimpleToken, + InputType, InputIds, DecodeRequest, DecodeResponse, @@ -1448,6 +1452,7 @@ pub async fn run( .route("/decode", post(decode)) // OpenAI compat route .route("/embeddings", post(openai_embed)) + .route("/v1/embeddings", post(openai_embed)) // Vertex compat route .route("/vertex", post(vertex_compatibility)) // Base Health route diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 4721ba88..420e3c79 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -250,11 +250,33 @@ pub(crate) struct Rank { #[derive(Serialize, ToSchema)] pub(crate) struct RerankResponse(pub Vec); +#[derive(Deserialize, ToSchema, Debug)] +#[serde(untagged)] +pub(crate) enum InputType { + String(String), + Ids(Vec), +} +impl InputType { + pub(crate) fn count_chars(&self) -> usize { + match self { + InputType::String(s) => s.chars().count(), + InputType::Ids(v) => v.len(), + } + } +} +impl From for EncodingInput { + fn from(value: InputType) -> Self { + match value { + InputType::String(s) => Self::Single(s), + InputType::Ids(v) => Self::Ids(v), + } + } +} #[derive(Deserialize, ToSchema)] #[serde(untagged)] pub(crate) enum Input { - Single(String), - Batch(Vec), + Single(InputType), + Batch(Vec), } #[derive(Deserialize, ToSchema)] @@ -352,9 +374,16 @@ pub(crate) struct OpenAICompatErrorResponse { pub error_type: ErrorType, } +#[derive(Deserialize, ToSchema)] +#[serde(untagged)] +pub(crate) enum TokenizeInput { + Single(String), + Batch(Vec), +} + #[derive(Deserialize, ToSchema)] pub(crate) struct TokenizeRequest { - pub inputs: Input, + pub inputs: TokenizeInput, #[serde(default = "default_add_special_tokens")] #[schema(default = "true", example = "true")] pub add_special_tokens: bool, diff --git a/router/tests/test_http_embed.rs b/router/tests/test_http_embed.rs index 4c8124c7..c58c918d 100644 --- a/router/tests/test_http_embed.rs +++ b/router/tests/test_http_embed.rs @@ -19,7 +19,6 @@ async fn test_embeddings() -> Result<()> { let request = json!({ "inputs": "test" }); - let client = reqwest::Client::new(); let res = client .post("http://0.0.0.0:8090/embed") @@ -31,6 +30,18 @@ async fn test_embeddings() -> Result<()> { let matcher = YamlMatcher::>>::new(); insta::assert_yaml_snapshot!("embeddings_single", embeddings_single, &matcher); + let test_tokens = vec![[101, 3231, 102]]; // tokenized "test" + let request = json!({"inputs": &test_tokens}); + let res = client + .post("http://0.0.0.0:8090/embed") + .json(&request) + .send() + .await?; + + let embeddings_single = res.json::>>().await?; + let matcher = YamlMatcher::>>::new(); + insta::assert_yaml_snapshot!("embeddings_single", embeddings_single, &matcher); + let request = json!({ "inputs": vec!["test", "test", "test", "test", "test"], }); @@ -41,10 +52,22 @@ async fn test_embeddings() -> Result<()> { .json(&request) .send() .await?; - let embeddings_batch = res.json::>>().await?; insta::assert_yaml_snapshot!("embeddings_batch", embeddings_batch, &matcher); + for embeddings in &embeddings_batch { + assert_eq!(embeddings, &embeddings_single[0]); + } + let request = + json!({"inputs": &test_tokens.repeat(request["inputs"].as_array().unwrap().len())}); + let res = client + .post("http://0.0.0.0:8090/embed") + .json(&request) + .send() + .await?; + + let embeddings_batch = res.json::>>().await?; + insta::assert_yaml_snapshot!("embeddings_batch", embeddings_batch, &matcher); for embeddings in &embeddings_batch { assert_eq!(embeddings, &embeddings_single[0]); } From 3edace22f22d5dab32d421034683183953fe5061 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 22 Mar 2024 17:35:17 +0100 Subject: [PATCH 15/72] v1.2.0 (#215) --- Cargo.lock | 350 +++++++++++++++-------------- 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, 202 insertions(+), 196 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e3b1811b..6a4ecdac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,9 +25,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", @@ -37,9 +37,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" dependencies = [ "backtrace", ] @@ -135,18 +135,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -166,7 +166,7 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http 0.2.11", + "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "itoa", @@ -193,7 +193,7 @@ dependencies = [ "axum-core 0.4.3", "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "hyper 1.2.0", @@ -226,7 +226,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 0.2.11", + "http 0.2.12", "http-body 0.4.6", "mime", "rustversion", @@ -243,7 +243,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "mime", @@ -264,7 +264,7 @@ dependencies = [ "axum 0.7.4", "futures-core", "futures-util", - "http 1.0.0", + "http 1.1.0", "opentelemetry 0.21.0", "pin-project-lite", "tower", @@ -275,7 +275,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.1.0" +version = "1.2.0" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -290,9 +290,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "95d8e92cac0961e91dbd517496b00f7e9b92363dbe6d42c3198268323798860c" dependencies = [ "addr2line", "cc", @@ -340,9 +340,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block" @@ -361,28 +361,28 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -536,9 +536,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.88" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -548,9 +548,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", @@ -562,9 +562,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.1" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" dependencies = [ "clap_builder", "clap_derive", @@ -572,9 +572,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", @@ -584,14 +584,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -929,10 +929,10 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1027,7 +1027,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1107,7 +1107,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1315,17 +1315,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.11", - "indexmap 2.2.4", + "http 0.2.12", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -1334,17 +1334,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" +checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 1.0.0", - "indexmap 2.2.4", + "http 1.1.0", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -1392,6 +1392,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1405,7 +1411,7 @@ source = "git+https://github.com/huggingface/hf-hub?rev=b167f69692be5f49eb800378 dependencies = [ "dirs", "futures", - "http 1.0.0", + "http 1.1.0", "indicatif", "log", "native-tls", @@ -1430,9 +1436,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -1441,9 +1447,9 @@ dependencies = [ [[package]] name = "http" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -1457,7 +1463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http 0.2.11", + "http 0.2.12", "pin-project-lite", ] @@ -1468,18 +1474,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", - "http 1.0.0", + "http 1.1.0", ] [[package]] name = "http-body-util" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" dependencies = [ "bytes", - "futures-util", - "http 1.0.0", + "futures-core", + "http 1.1.0", "http-body 1.0.0", "pin-project-lite", ] @@ -1506,8 +1512,8 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.24", - "http 0.2.11", + "h2 0.3.25", + "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", @@ -1529,8 +1535,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.2", - "http 1.0.0", + "h2 0.4.3", + "http 1.1.0", "http-body 1.0.0", "httparse", "httpdate", @@ -1573,7 +1579,7 @@ checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "hyper 1.2.0", "pin-project-lite", @@ -1632,9 +1638,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.4" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "967d6dd42f16dbf0eb8040cb9e477933562684d3918f7d253f2ff9087fb3e7a3" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1762,9 +1768,9 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1803,7 +1809,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "libc", "redox_syscall", ] @@ -1907,7 +1913,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -1953,7 +1959,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2013,9 +2019,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -2040,7 +2046,7 @@ checksum = "f686d68a09079e63b1d2c64aa305095887ce50565f00a922ebfaeeee0d9ba6ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2246,7 +2252,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2263,7 +2269,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2312,7 +2318,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.2.4", + "indexmap 2.2.5", "js-sys", "once_cell", "pin-project-lite", @@ -2328,7 +2334,7 @@ checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" dependencies = [ "async-trait", "futures-core", - "http 0.2.11", + "http 0.2.12", "opentelemetry-proto", "opentelemetry-semantic-conventions", "opentelemetry_api 0.20.0", @@ -2527,27 +2533,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.4", + "indexmap 2.2.5", ] [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2603,7 +2609,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2632,9 +2638,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -2666,7 +2672,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ "bytes", - "heck", + "heck 0.4.1", "itertools 0.10.5", "lazy_static", "log", @@ -2688,7 +2694,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", - "heck", + "heck 0.4.1", "itertools 0.11.0", "log", "multimap", @@ -2698,7 +2704,7 @@ dependencies = [ "prost 0.12.3", "prost-types 0.12.3", "regex", - "syn 2.0.52", + "syn 2.0.53", "tempfile", "which", ] @@ -2726,7 +2732,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2749,9 +2755,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.18.8" +version = "0.18.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091bad01115892393939669b38f88ff2b70838e969a7ac172a9d06d05345a732" +checksum = "03457ac216146f43f921500bac4e892d5cd32b0479b929cbfc90f95cd6c599c2" dependencies = [ "bytemuck", "libm", @@ -2898,7 +2904,7 @@ checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.5", + "regex-automata 0.4.6", "regex-syntax 0.8.2", ] @@ -2913,9 +2919,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -2936,17 +2942,17 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.24", - "http 0.2.11", + "h2 0.3.25", + "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "hyper-tls", @@ -3009,7 +3015,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.52", + "syn 2.0.53", "walkdir", ] @@ -3031,11 +3037,11 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -3174,7 +3180,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -3190,9 +3196,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ "itoa", "serde", @@ -3221,11 +3227,11 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.32" +version = "0.9.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f" +checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9" dependencies = [ - "indexmap 2.2.4", + "indexmap 2.2.5", "itoa", "ryu", "serde", @@ -3254,7 +3260,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -3309,9 +3315,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -3389,9 +3395,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -3412,7 +3418,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -3421,7 +3427,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "byteorder", "enum-as-inner", "libc", @@ -3475,7 +3481,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.1.0" +version = "1.2.0" dependencies = [ "clap", "text-embeddings-backend-candle", @@ -3487,7 +3493,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.1.0" +version = "1.2.0" dependencies = [ "accelerate-src", "anyhow", @@ -3517,7 +3523,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.1.0" +version = "1.2.0" dependencies = [ "clap", "nohash-hasher", @@ -3526,7 +3532,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.1.0" +version = "1.2.0" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3540,7 +3546,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.1.0" +version = "1.2.0" dependencies = [ "hf-hub", "metrics", @@ -3553,7 +3559,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.1.0" +version = "1.2.0" dependencies = [ "anyhow", "async-stream", @@ -3562,7 +3568,7 @@ dependencies = [ "clap", "futures", "hf-hub", - "http 1.0.0", + "http 1.1.0", "init-tracing-opentelemetry", "insta", "is_close", @@ -3598,22 +3604,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -3742,7 +3748,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -3757,9 +3763,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -3801,8 +3807,8 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2 0.3.24", - "http 0.2.11", + "h2 0.3.25", + "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "hyper-timeout", @@ -3828,8 +3834,8 @@ dependencies = [ "axum 0.6.20", "base64 0.21.7", "bytes", - "h2 0.3.24", - "http 0.2.11", + "h2 0.3.25", + "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "hyper-timeout", @@ -3867,7 +3873,7 @@ dependencies = [ "proc-macro2", "prost-build 0.12.3", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -3922,9 +3928,9 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "bytes", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "pin-project-lite", @@ -3964,7 +3970,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -4053,7 +4059,7 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9db99a4f5224920c499515a737e2749eb9a19b729b3880afc24594524e9861de" dependencies = [ - "http 1.0.0", + "http 1.1.0", "opentelemetry 0.21.0", "tracing", "tracing-opentelemetry 0.22.0", @@ -4161,9 +4167,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "unsafe-libyaml" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -4221,7 +4227,7 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "272ebdfbc99111033031d2f10e018836056e4d2c8e2acda76450ec7974269fa7" dependencies = [ - "indexmap 2.2.4", + "indexmap 2.2.5", "serde", "serde_json", "utoipa-gen", @@ -4237,7 +4243,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -4258,9 +4264,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom", ] @@ -4295,7 +4301,7 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -4318,9 +4324,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -4343,9 +4349,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4353,24 +4359,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -4380,9 +4386,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4390,28 +4396,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -4670,7 +4676,7 @@ checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "synstructure", ] @@ -4691,7 +4697,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -4711,7 +4717,7 @@ checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index 5ecc2070..45aedca8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.1.0" +version = "1.2.0" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" diff --git a/README.md b/README.md index 4a709643..cf08a3b8 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,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.1 --model-id $model --revision $revision +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 ``` And then you can make requests like @@ -262,13 +262,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.1 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.2 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.1 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.1 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.1 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.1 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.1 (experimental) | +| 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) | **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. @@ -297,7 +297,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.1 --model-id $model +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 ``` ### Using Re-rankers models @@ -315,7 +315,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.1 --model-id $model --revision $revision +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 ``` And then you can rank the similarity between a query and a list of texts with: @@ -335,7 +335,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.1 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: @@ -355,7 +355,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.1 --model-id $model --pooling splade +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 ``` Once you have deployed the model you can use the `/embed_sparse` endpoint to get the sparse embedding: @@ -384,7 +384,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.1-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.2-grpc --model-id $model --revision $revision ``` ```shell diff --git a/docs/openapi.json b/docs/openapi.json index fa05251d..5f739722 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -9,7 +9,7 @@ "license": { "name": "HFOIL" }, - "version": "1.1.0" + "version": "1.2.0" }, "paths": { "/decode": { diff --git a/docs/source/en/private_models.md b/docs/source/en/private_models.md index f8aeb6a7..bd9041c7 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 HUGGING_FACE_HUB_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.1 --model-id $model +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 ``` diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index b91456d2..995031d1 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.1 --model-id $model --revision $revision +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 ``` @@ -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.1 --model-id $model --revision $revision +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 ``` 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.1 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --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 232c6bf4..64ecbc1f 100644 --- a/docs/source/en/supported_models.md +++ b/docs/source/en/supported_models.md @@ -63,13 +63,13 @@ Find the appropriate Docker image for your hardware in the following table: | Architecture | Image | |-------------------------------------|--------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.1 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.2 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.1 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.1 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.1 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.1 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.1 (experimental) | +| 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) | **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 53e28e0d0478d44503a0a92429187cb015437a4d Mon Sep 17 00:00:00 2001 From: Omar Sanseviero Date: Tue, 2 Apr 2024 16:43:44 +0200 Subject: [PATCH 16/72] Document how to send batched inputs (#222) Co-authored-by: OlivierDehaene --- docs/source/en/quick_tour.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index 995031d1..c0fe008c 100644 --- a/docs/source/en/quick_tour.md +++ b/docs/source/en/quick_tour.md @@ -39,12 +39,12 @@ docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingf -Here we pass a `revision=refs/pr/5`, because the `safetensors` variant of this model is currently in a pull request. +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. -Once you have deployed a model you can use the `embed` endpoint by sending requests: +Once you have deployed a model, you can use the `embed` endpoint by sending requests: ```bash curl 127.0.0.1:8080/embed \ @@ -72,7 +72,7 @@ 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 ``` -Once you have deployed a model you can use the `rerank` endpoint to rank the similarity between a query and a list +Once you have deployed a model, you can use the `rerank` endpoint to rank the similarity between a query and a list of texts: ```bash @@ -101,3 +101,23 @@ curl 127.0.0.1:8080/predict \ -d '{"inputs":"I like you."}' \ -H 'Content-Type: application/json' ``` + +## Batching + +You can send multiple inputs in a batch. For example, for embeddings + +```bash +curl 127.0.0.1:8080/embed \ + -X POST \ + -d '{"inputs":["Today is a nice day", "I like you"]}' \ + -H 'Content-Type: application/json' +``` + +And for Sequence Classification: + +```bash +curl 127.0.0.1:8080/predict \ + -X POST \ + -d '{"inputs":[["I like you."], ["I hate pineapples"]]}' \ + -H 'Content-Type: application/json' +``` From 68d63ed47958e226dcca6abe523dbfd69d7409c6 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 2 Apr 2024 17:58:38 +0200 Subject: [PATCH 17/72] feat: add auto-truncate arg (#224) --- router/src/http/server.rs | 28 +++++++++++++++++----------- router/src/http/types.rs | 21 ++++++++++----------- router/src/lib.rs | 3 +++ router/src/main.rs | 9 ++++++++- 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 5e498fc9..0da5d901 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -159,7 +159,7 @@ async fn predict( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let (prompt_tokens, tokenization, queue, inference, predictions) = predict_inner( inputs, - req.truncate, + req.truncate.unwrap_or(info.auto_truncate), req.raw_scores, infer.0, info.0, @@ -208,7 +208,7 @@ async fn predict( let local_info = info.clone(); futures.push(predict_inner( input, - req.truncate, + req.truncate.unwrap_or(info.auto_truncate), req.raw_scores, local_infer.0, local_info.0, @@ -370,7 +370,7 @@ async fn rerank( futures.push(rerank_inner( req.query.clone(), text.clone(), - req.truncate, + req.truncate.unwrap_or(info.auto_truncate), req.raw_scores, local_infer.0, )) @@ -478,7 +478,12 @@ async fn embed( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_pooled(input, req.truncate, req.normalize, permit) + .embed_pooled( + input, + req.truncate.unwrap_or(info.auto_truncate), + req.normalize, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -531,11 +536,12 @@ async fn embed( for input in inputs { compute_chars += input.count_chars(); + let truncate = req.truncate.unwrap_or(info.auto_truncate); let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer - .embed_pooled(input, req.truncate, req.normalize, permit) + .embed_pooled(input, truncate, req.normalize, permit) .await }) } @@ -634,7 +640,7 @@ async fn embed_sparse( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_sparse(input, req.truncate, permit) + .embed_sparse(input, req.truncate.unwrap_or(info.auto_truncate), permit) .await .map_err(ErrorResponse::from)?; @@ -687,12 +693,11 @@ async fn embed_sparse( for input in inputs { compute_chars += input.count_chars(); + let truncate = req.truncate.unwrap_or(info.auto_truncate); let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; - let response = local_infer - .embed_sparse(input, req.truncate, permit) - .await?; + let response = local_infer.embed_sparse(input, truncate, permit).await?; Ok((sparsify(response.results), response.metadata)) }) } @@ -782,7 +787,7 @@ async fn embed_all( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_all(input, req.truncate, permit) + .embed_all(input, req.truncate.unwrap_or(info.auto_truncate), permit) .await .map_err(ErrorResponse::from)?; @@ -835,10 +840,11 @@ async fn embed_all( for input in inputs { compute_chars += input.count_chars(); + let truncate = req.truncate.unwrap_or(info.auto_truncate); let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; - local_infer.embed_all(input, req.truncate, permit).await + local_infer.embed_all(input, truncate, permit).await }) } let results = join_all(futures) diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 420e3c79..be514d40 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -196,9 +196,8 @@ impl<'__s> ToSchema<'__s> for PredictInput { #[derive(Deserialize, ToSchema)] pub(crate) struct PredictRequest { pub inputs: PredictInput, - #[serde(default)] - #[schema(default = "false", example = "false")] - pub truncate: bool, + #[schema(default = "false", example = "false", nullable = true)] + pub truncate: Option, #[serde(default)] #[schema(default = "false", example = "false")] pub raw_scores: bool, @@ -226,8 +225,8 @@ pub(crate) struct RerankRequest { #[schema(example = json!(["Deep Learning is ..."]))] pub texts: Vec, #[serde(default)] - #[schema(default = "false", example = "false")] - pub truncate: bool, + #[schema(default = "false", example = "false", nullable = true)] + pub truncate: Option, #[serde(default)] #[schema(default = "false", example = "false")] pub raw_scores: bool, @@ -322,8 +321,8 @@ pub(crate) struct OpenAICompatResponse { pub(crate) struct EmbedRequest { pub inputs: Input, #[serde(default)] - #[schema(default = "false", example = "false")] - pub truncate: bool, + #[schema(default = "false", example = "false", nullable = true)] + pub truncate: Option, #[serde(default = "default_normalize")] #[schema(default = "true", example = "true")] pub normalize: bool, @@ -341,8 +340,8 @@ pub(crate) struct EmbedResponse(pub Vec>); pub(crate) struct EmbedSparseRequest { pub inputs: Input, #[serde(default)] - #[schema(default = "false", example = "false")] - pub truncate: bool, + #[schema(default = "false", example = "false", nullable = true)] + pub truncate: Option, } #[derive(Serialize, ToSchema)] @@ -358,8 +357,8 @@ pub(crate) struct EmbedSparseResponse(pub Vec>); pub(crate) struct EmbedAllRequest { pub inputs: Input, #[serde(default)] - #[schema(default = "false", example = "false")] - pub truncate: bool, + #[schema(default = "false", example = "false", nullable = true)] + pub truncate: Option, } #[derive(Serialize, ToSchema)] diff --git a/router/src/lib.rs b/router/src/lib.rs index 8a5715a6..df0fad4b 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -51,6 +51,7 @@ pub async fn run( max_batch_tokens: usize, max_batch_requests: Option, max_client_batch_size: usize, + auto_truncate: bool, hf_api_token: Option, hostname: Option, port: u16, @@ -236,6 +237,7 @@ pub async fn run( tokenization_workers, max_batch_requests, max_client_batch_size, + auto_truncate, version: env!("CARGO_PKG_VERSION"), sha: option_env!("VERGEN_GIT_SHA"), docker_label: option_env!("DOCKER_LABEL"), @@ -428,6 +430,7 @@ pub struct Info { pub max_batch_requests: Option, #[cfg_attr(feature = "http", schema(example = "32"))] pub max_client_batch_size: usize, + pub auto_truncate: bool, #[cfg_attr(feature = "http", schema(example = "4"))] pub tokenization_workers: usize, /// Router Info diff --git a/router/src/main.rs b/router/src/main.rs index d89d40ab..06cd576a 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -73,6 +73,12 @@ struct Args { #[clap(default_value = "32", long, env)] max_client_batch_size: usize, + /// Automatically truncate inputs that are longer than the maximum supported size + /// + /// Unused for gRPC servers + #[clap(long, env)] + auto_truncate: bool, + /// Your HuggingFace hub token #[clap(long, env)] #[redact(partial)] @@ -117,7 +123,7 @@ struct Args { #[clap(long, env)] otlp_endpoint: Option, - // Unused for gRPC servers + /// Unused for gRPC servers #[clap(long, env)] cors_allow_origin: Option>, } @@ -143,6 +149,7 @@ async fn main() -> Result<()> { args.max_batch_tokens, args.max_batch_requests, args.max_client_batch_size, + args.auto_truncate, args.hf_api_token, Some(args.hostname), args.port, From a556f43befa3154826c5b8681bc7ae0491efbb9d Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 2 Apr 2024 17:59:52 +0200 Subject: [PATCH 18/72] feat: add PredictPair to proto (#225) --- proto/tei.proto | 8 + router/src/grpc/server.rs | 674 +++++++++++++++----------------------- 2 files changed, 265 insertions(+), 417 deletions(-) diff --git a/proto/tei.proto b/proto/tei.proto index 51ad0002..6538e34a 100644 --- a/proto/tei.proto +++ b/proto/tei.proto @@ -19,7 +19,9 @@ service Embed { service Predict { rpc Predict (PredictRequest) returns (PredictResponse); + rpc PredictPair (PredictPairRequest) returns (PredictResponse); rpc PredictStream (stream PredictRequest) returns (stream PredictResponse); + rpc PredictPairStream (stream PredictPairRequest) returns (stream PredictResponse); } service Rerank { @@ -113,6 +115,12 @@ message PredictRequest { bool raw_scores = 3; } +message PredictPairRequest { + repeated string inputs = 1; + bool truncate = 2; + bool raw_scores = 3; +} + message Prediction { float score = 1; string label = 2; diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index 4829e2f0..df76275e 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -1,6 +1,7 @@ use crate::grpc::pb::tei::v1::{ EmbedAllRequest, EmbedAllResponse, EmbedSparseRequest, EmbedSparseResponse, EncodeRequest, - EncodeResponse, RerankStreamRequest, SimpleToken, SparseValue, TokenEmbedding, + EncodeResponse, PredictPairRequest, RerankStreamRequest, SimpleToken, SparseValue, + TokenEmbedding, }; use crate::grpc::{ DecodeRequest, DecodeResponse, EmbedRequest, EmbedResponse, InfoRequest, InfoResponse, @@ -10,9 +11,11 @@ use crate::ResponseMetadata; use crate::{grpc, shutdown, ErrorResponse, ErrorType, Info, ModelType}; use futures::future::join_all; use metrics_exporter_prometheus::PrometheusBuilder; +use std::future::Future; use std::net::SocketAddr; use std::time::{Duration, Instant}; use text_embeddings_core::infer::Infer; +use text_embeddings_core::tokenization::EncodingInput; use tokio::sync::{mpsc, oneshot, OwnedSemaphorePermit}; use tokio_stream::wrappers::UnboundedReceiverStream; use tokio_stream::StreamExt; @@ -229,18 +232,26 @@ impl TextEmbeddingsService { inference_time, ) )] - async fn predict_inner( + async fn predict_inner + std::fmt::Debug>( &self, - request: PredictRequest, + inputs: I, + truncate: bool, + raw_scores: bool, permit: OwnedSemaphorePermit, ) -> Result<(PredictResponse, ResponseMetadata), Status> { let span = Span::current(); let start_time = Instant::now(); - let compute_chars = request.inputs.chars().count(); + let inputs = inputs.into(); + let compute_chars = match &inputs { + EncodingInput::Single(s) => s.chars().count(), + EncodingInput::Dual(s1, s2) => s1.chars().count() + s2.chars().count(), + EncodingInput::Ids(_) => unreachable!(), + }; + let response = self .infer - .predict(request.inputs, request.truncate, request.raw_scores, permit) + .predict(inputs, truncate, raw_scores, permit) .await .map_err(ErrorResponse::from)?; @@ -342,76 +353,26 @@ impl TextEmbeddingsService { .map_err(ErrorResponse::from)?; Ok(DecodeResponse { text }) } -} - -#[tonic::async_trait] -impl grpc::info_server::Info for TextEmbeddingsService { - async fn info(&self, _request: Request) -> Result, Status> { - let model_type = match self.info.model_type { - ModelType::Classifier(_) => grpc::ModelType::Classifier, - ModelType::Embedding(_) => grpc::ModelType::Embedding, - ModelType::Reranker(_) => grpc::ModelType::Reranker, - }; - - Ok(Response::new(InfoResponse { - version: self.info.version.to_string(), - sha: self.info.sha.map(|s| s.to_string()), - docker_label: self.info.docker_label.map(|s| s.to_string()), - model_id: self.info.model_id.clone(), - model_sha: self.info.model_sha.clone(), - model_dtype: self.info.model_dtype.clone(), - model_type: model_type.into(), - max_concurrent_requests: self.info.max_concurrent_requests as u32, - max_input_length: self.info.max_input_length as u32, - max_batch_tokens: self.info.max_batch_tokens as u32, - max_batch_requests: self.info.max_batch_requests.map(|v| v as u32), - max_client_batch_size: self.info.max_client_batch_size as u32, - tokenization_workers: self.info.tokenization_workers as u32, - })) - } -} -#[tonic::async_trait] -impl grpc::embed_server::Embed for TextEmbeddingsService { #[instrument(skip_all)] - async fn embed( + async fn stream( &self, - request: Request, - ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); - - let permit = self - .infer - .try_acquire_permit() - .map_err(ErrorResponse::from)?; - - let request = request.into_inner(); - let (response, metadata) = self.embed_pooled_inner(request, permit).await?; - let headers = HeaderMap::from(metadata); - - metrics::increment_counter!("te_request_success", "method" => "single"); - - Ok(Response::from_parts( - MetadataMap::from_headers(headers), - response, - Extensions::default(), - )) - } - - type EmbedStreamStream = UnboundedReceiverStream>; - - #[instrument(skip_all)] - async fn embed_stream( - &self, - request: Request>, - ) -> Result, Status> { + request: Request>, + function: F, + ) -> Result>>, Status> + where + Req: Send + 'static, + Res: Send + 'static, + F: FnOnce(Req, OwnedSemaphorePermit) -> Fut + Send + Clone + 'static, + Fut: Future> + Send, + { let mut request_stream = request.into_inner(); // Create bounded channel to have an upper bound of spawned tasks // We will have at most `max_parallel_stream_requests` messages from this stream in the queue - let (embed_sender, mut embed_receiver) = mpsc::channel::<( - EmbedRequest, - oneshot::Sender>, + let (internal_sender, mut internal_receiver) = mpsc::channel::<( + Req, + oneshot::Sender>, )>(self.max_parallel_stream_requests); // Required for the async move below @@ -419,18 +380,18 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { // Background task that uses the bounded channel tokio::spawn(async move { - while let Some((request, mut sender)) = embed_receiver.recv().await { + while let Some((request, mut sender)) = internal_receiver.recv().await { // Wait on permit before spawning the task to avoid creating more tasks than needed let permit = local.infer.acquire_permit().await; // Required for the async move below - let task_local = local.clone(); + let function_local = function.clone(); // Create async task for this specific input tokio::spawn(async move { // Select on closed to cancel work if the stream was closed tokio::select! { - response = task_local.embed_pooled_inner(request, permit) => { + response = function_local(request, permit) => { let _ = sender.send(response.map(|(r, _m)| r)); } _ = sender.closed() => {} @@ -454,10 +415,10 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { .expect("`intermediate_receiver` was dropped. This is a bug."); match request { - Ok(request) => embed_sender + Ok(request) => internal_sender .send((request, result_sender)) .await - .expect("`embed_receiver` was dropped. This is a bug."), + .expect("`internal_receiver` was dropped. This is a bug."), Err(status) => { // Request is malformed let _ = result_sender.send(Err(status)); @@ -486,63 +447,39 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { ))) } - async fn embed_sparse( - &self, - request: Request, - ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); - - let permit = self - .infer - .try_acquire_permit() - .map_err(ErrorResponse::from)?; - - let request = request.into_inner(); - let (response, metadata) = self.embed_sparse_inner(request, permit).await?; - let headers = HeaderMap::from(metadata); - - metrics::increment_counter!("te_request_success", "method" => "single"); - - Ok(Response::from_parts( - MetadataMap::from_headers(headers), - response, - Extensions::default(), - )) - } - - type EmbedSparseStreamStream = UnboundedReceiverStream>; - - async fn embed_sparse_stream( + #[instrument(skip_all)] + async fn stream_no_permit( &self, - request: Request>, - ) -> Result, Status> { + request: Request>, + function: F, + ) -> Result>>, Status> + where + Req: Send + 'static, + Res: Send + 'static, + F: FnOnce(Req) -> Fut + Send + Clone + 'static, + Fut: Future> + Send, + { let mut request_stream = request.into_inner(); // Create bounded channel to have an upper bound of spawned tasks // We will have at most `max_parallel_stream_requests` messages from this stream in the queue - let (embed_sender, mut embed_receiver) = mpsc::channel::<( - EmbedSparseRequest, - oneshot::Sender>, + let (internal_sender, mut internal_receiver) = mpsc::channel::<( + Req, + oneshot::Sender>, )>(self.max_parallel_stream_requests); - // Required for the async move below - let local = self.clone(); - // Background task that uses the bounded channel tokio::spawn(async move { - while let Some((request, mut sender)) = embed_receiver.recv().await { - // Wait on permit before spawning the task to avoid creating more tasks than needed - let permit = local.infer.acquire_permit().await; - + while let Some((request, mut sender)) = internal_receiver.recv().await { // Required for the async move below - let task_local = local.clone(); + let function_local = function.clone(); // Create async task for this specific input tokio::spawn(async move { // Select on closed to cancel work if the stream was closed tokio::select! { - response = task_local.embed_sparse_inner(request, permit) => { - let _ = sender.send(response.map(|(r, _m)| r)); + response = function_local(request) => { + let _ = sender.send(response); } _ = sender.closed() => {} } @@ -565,10 +502,10 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { .expect("`intermediate_receiver` was dropped. This is a bug."); match request { - Ok(request) => embed_sender + Ok(request) => internal_sender .send((request, result_sender)) .await - .expect("`embed_receiver` was dropped. This is a bug."), + .expect("`internal_receiver` was dropped. This is a bug."), Err(status) => { // Request is malformed let _ = result_sender.send(Err(status)); @@ -596,12 +533,42 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { response_receiver, ))) } +} + +#[tonic::async_trait] +impl grpc::info_server::Info for TextEmbeddingsService { + async fn info(&self, _request: Request) -> Result, Status> { + let model_type = match self.info.model_type { + ModelType::Classifier(_) => grpc::ModelType::Classifier, + ModelType::Embedding(_) => grpc::ModelType::Embedding, + ModelType::Reranker(_) => grpc::ModelType::Reranker, + }; + Ok(Response::new(InfoResponse { + version: self.info.version.to_string(), + sha: self.info.sha.map(|s| s.to_string()), + docker_label: self.info.docker_label.map(|s| s.to_string()), + model_id: self.info.model_id.clone(), + model_sha: self.info.model_sha.clone(), + model_dtype: self.info.model_dtype.clone(), + model_type: model_type.into(), + max_concurrent_requests: self.info.max_concurrent_requests as u32, + max_input_length: self.info.max_input_length as u32, + max_batch_tokens: self.info.max_batch_tokens as u32, + max_batch_requests: self.info.max_batch_requests.map(|v| v as u32), + max_client_batch_size: self.info.max_client_batch_size as u32, + tokenization_workers: self.info.tokenization_workers as u32, + })) + } +} + +#[tonic::async_trait] +impl grpc::embed_server::Embed for TextEmbeddingsService { #[instrument(skip_all)] - async fn embed_all( + async fn embed( &self, - request: Request, - ) -> Result, Status> { + request: Request, + ) -> Result, Status> { metrics::increment_counter!("te_request_count", "method" => "single"); let permit = self @@ -610,7 +577,7 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { .map_err(ErrorResponse::from)?; let request = request.into_inner(); - let (response, metadata) = self.embed_all_inner(request, permit).await?; + let (response, metadata) = self.embed_pooled_inner(request, permit).await?; let headers = HeaderMap::from(metadata); metrics::increment_counter!("te_request_success", "method" => "single"); @@ -622,92 +589,100 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { )) } - type EmbedAllStreamStream = UnboundedReceiverStream>; + type EmbedStreamStream = UnboundedReceiverStream>; #[instrument(skip_all)] - async fn embed_all_stream( + async fn embed_stream( &self, - request: Request>, - ) -> Result, Status> { - let mut request_stream = request.into_inner(); + request: Request>, + ) -> Result, Status> { + // Clone for move below + let clone = self.clone(); + let function = |req: EmbedRequest, permit: OwnedSemaphorePermit| async move { + clone.embed_pooled_inner(req, permit).await + }; - // Create bounded channel to have an upper bound of spawned tasks - // We will have at most `max_parallel_stream_requests` messages from this stream in the queue - let (embed_sender, mut embed_receiver) = mpsc::channel::<( - EmbedAllRequest, - oneshot::Sender>, - )>(self.max_parallel_stream_requests); + self.stream(request, function).await + } - // Required for the async move below - let local = self.clone(); + async fn embed_sparse( + &self, + request: Request, + ) -> Result, Status> { + metrics::increment_counter!("te_request_count", "method" => "single"); - // Background task that uses the bounded channel - tokio::spawn(async move { - while let Some((request, mut sender)) = embed_receiver.recv().await { - // Wait on permit before spawning the task to avoid creating more tasks than needed - let permit = local.infer.acquire_permit().await; + let permit = self + .infer + .try_acquire_permit() + .map_err(ErrorResponse::from)?; - // Required for the async move below - let task_local = local.clone(); + let request = request.into_inner(); + let (response, metadata) = self.embed_sparse_inner(request, permit).await?; + let headers = HeaderMap::from(metadata); - // Create async task for this specific input - tokio::spawn(async move { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = task_local.embed_all_inner(request, permit) => { - let _ = sender.send(response.map(|(r, _m)| r)); - } - _ = sender.closed() => {} - } - }); - } - }); + metrics::increment_counter!("te_request_success", "method" => "single"); - // Intermediate channels - // Required to keep the order of the requests - let (intermediate_sender, mut intermediate_receiver) = mpsc::unbounded_channel(); + Ok(Response::from_parts( + MetadataMap::from_headers(headers), + response, + Extensions::default(), + )) + } - tokio::spawn(async move { - // Iterate on input - while let Some(request) = request_stream.next().await { - // Create return channel - let (result_sender, result_receiver) = oneshot::channel(); - // Push to intermediate channel and preserve ordering - intermediate_sender - .send(result_receiver) - .expect("`intermediate_receiver` was dropped. This is a bug."); + type EmbedSparseStreamStream = UnboundedReceiverStream>; - match request { - Ok(request) => embed_sender - .send((request, result_sender)) - .await - .expect("`embed_receiver` was dropped. This is a bug."), - Err(status) => { - // Request is malformed - let _ = result_sender.send(Err(status)); - } - }; - } - }); + async fn embed_sparse_stream( + &self, + request: Request>, + ) -> Result, Status> { + // Clone for move below + let clone = self.clone(); + let function = |req: EmbedSparseRequest, permit: OwnedSemaphorePermit| async move { + clone.embed_sparse_inner(req, permit).await + }; - // Final channel for the outputs - let (response_sender, response_receiver) = mpsc::unbounded_channel(); + self.stream(request, function).await + } - tokio::spawn(async move { - while let Some(result_receiver) = intermediate_receiver.recv().await { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = result_receiver => { - let _ = response_sender.send(response.expect("`result_sender` was dropped. This is a bug.")); - } - _ = response_sender.closed() => {} - } - } - }); + #[instrument(skip_all)] + async fn embed_all( + &self, + request: Request, + ) -> Result, Status> { + metrics::increment_counter!("te_request_count", "method" => "single"); - Ok(Response::new(UnboundedReceiverStream::new( - response_receiver, - ))) + let permit = self + .infer + .try_acquire_permit() + .map_err(ErrorResponse::from)?; + + let request = request.into_inner(); + let (response, metadata) = self.embed_all_inner(request, permit).await?; + let headers = HeaderMap::from(metadata); + + metrics::increment_counter!("te_request_success", "method" => "single"); + + Ok(Response::from_parts( + MetadataMap::from_headers(headers), + response, + Extensions::default(), + )) + } + + type EmbedAllStreamStream = UnboundedReceiverStream>; + + #[instrument(skip_all)] + async fn embed_all_stream( + &self, + request: Request>, + ) -> Result, Status> { + // Clone for move below + let clone = self.clone(); + let function = |req: EmbedAllRequest, permit: OwnedSemaphorePermit| async move { + clone.embed_all_inner(req, permit).await + }; + + self.stream(request, function).await } } @@ -726,7 +701,9 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { .map_err(ErrorResponse::from)?; let request = request.into_inner(); - let (response, metadata) = self.predict_inner(request, permit).await?; + let (response, metadata) = self + .predict_inner(request.inputs, request.truncate, request.raw_scores, permit) + .await?; let headers = HeaderMap::from(metadata); metrics::increment_counter!("te_request_success", "method" => "single"); @@ -738,92 +715,97 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { )) } - type PredictStreamStream = UnboundedReceiverStream>; - - #[instrument(skip_all)] - async fn predict_stream( + async fn predict_pair( &self, - request: Request>, - ) -> Result, Status> { - let mut request_stream = request.into_inner(); + request: Request, + ) -> Result, Status> { + metrics::increment_counter!("te_request_count", "method" => "single"); + let request = request.into_inner(); - // Create bounded channel to have an upper bound of spawned tasks - // We will have at most `max_parallel_stream_requests` messages from this stream in the queue - let (predict_sender, mut predict_receiver) = mpsc::channel::<( - PredictRequest, - oneshot::Sender>, - )>(self.max_parallel_stream_requests); + let mut inputs = request.inputs; - // Required for the async move below - let local = self.clone(); + let inputs = match inputs.len() { + 1 => EncodingInput::Single(inputs.pop().unwrap()), + 2 => EncodingInput::Dual(inputs.swap_remove(0), inputs.pop().unwrap()), + _ => { + return Err(Status::from(ErrorResponse { + error: format!( + "`inputs` must have a single or two elements. Given: {}", + inputs.len() + ), + error_type: ErrorType::Validation, + })) + } + }; - // Background task that uses the bounded channel - tokio::spawn(async move { - while let Some((request, mut sender)) = predict_receiver.recv().await { - // Wait on permit before spawning the task to avoid creating more tasks than needed - let permit = local.infer.acquire_permit().await; + let permit = self + .infer + .try_acquire_permit() + .map_err(ErrorResponse::from)?; - // Required for the async move below - let task_local = local.clone(); + let (response, metadata) = self + .predict_inner(inputs, request.truncate, request.raw_scores, permit) + .await?; + let headers = HeaderMap::from(metadata); - // Create async task for this specific input - tokio::spawn(async move { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = task_local.predict_inner(request, permit) => { - let _ = sender.send(response.map(|(r, _m)| r)); - } - _ = sender.closed() => {} - } - }); - } - }); + metrics::increment_counter!("te_request_success", "method" => "single"); - // Intermediate channels - // Required to keep the order of the requests - let (intermediate_sender, mut intermediate_receiver) = mpsc::unbounded_channel(); + Ok(Response::from_parts( + MetadataMap::from_headers(headers), + response, + Extensions::default(), + )) + } - tokio::spawn(async move { - // Iterate on input - while let Some(request) = request_stream.next().await { - // Create return channel - let (result_sender, result_receiver) = oneshot::channel(); - // Push to intermediate channel and preserve ordering - intermediate_sender - .send(result_receiver) - .expect("`intermediate_receiver` was dropped. This is a bug."); + type PredictStreamStream = UnboundedReceiverStream>; - match request { - Ok(request) => predict_sender - .send((request, result_sender)) - .await - .expect("`predict_receiver` was dropped. This is a bug."), - Err(status) => { - // Request is malformed - let _ = result_sender.send(Err(status)); - } - }; - } - }); + #[instrument(skip_all)] + async fn predict_stream( + &self, + request: Request>, + ) -> Result, Status> { + // Clone for move below + let clone = self.clone(); + let function = |req: PredictRequest, permit: OwnedSemaphorePermit| async move { + clone + .predict_inner(req.inputs, req.truncate, req.raw_scores, permit) + .await + }; - // Final channel for the outputs - let (response_sender, response_receiver) = mpsc::unbounded_channel(); + self.stream(request, function).await + } - tokio::spawn(async move { - while let Some(result_receiver) = intermediate_receiver.recv().await { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = result_receiver => { - let _ = response_sender.send(response.expect("`result_sender` was dropped. This is a bug.")); - } - _ = response_sender.closed() => {} + type PredictPairStreamStream = UnboundedReceiverStream>; + + async fn predict_pair_stream( + &self, + request: Request>, + ) -> Result, Status> { + // Clone for move below + let clone = self.clone(); + let function = |req: PredictPairRequest, permit: OwnedSemaphorePermit| async move { + let mut inputs = req.inputs; + + let inputs = match inputs.len() { + 1 => EncodingInput::Single(inputs.pop().unwrap()), + 2 => EncodingInput::Dual(inputs.swap_remove(0), inputs.pop().unwrap()), + _ => { + return Err(Status::from(ErrorResponse { + error: format!( + "`inputs` must have a single or two elements. Given: {}", + inputs.len() + ), + error_type: ErrorType::Validation, + })) } - } - }); + }; - Ok(Response::new(UnboundedReceiverStream::new( - response_receiver, - ))) + clone + .predict_inner(inputs, req.truncate, req.raw_scores, permit) + .await + }; + + self.stream(request, function).await } } @@ -1261,82 +1243,11 @@ impl grpc::tokenize_server::Tokenize for TextEmbeddingsService { &self, request: Request>, ) -> Result, Status> { - let mut request_stream = request.into_inner(); - - // Create bounded channel to have an upper bound of spawned tasks - // We will have at most `max_parallel_stream_requests` messages from this stream in the queue - let (encode_sender, mut encode_receiver) = mpsc::channel::<( - EncodeRequest, - oneshot::Sender>, - )>(self.max_parallel_stream_requests); - - // Required for the async move below - let local = self.clone(); + // Clone for move below + let clone = self.clone(); + let function = |req: EncodeRequest| async move { clone.tokenize_inner(req).await }; - // Background task that uses the bounded channel - tokio::spawn(async move { - while let Some((request, mut sender)) = encode_receiver.recv().await { - // Required for the async move below - let task_local = local.clone(); - - // Create async task for this specific input - tokio::spawn(async move { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = task_local.tokenize_inner(request) => { - let _ = sender.send(response); - } - _ = sender.closed() => {} - } - }); - } - }); - - // Intermediate channels - // Required to keep the order of the requests - let (intermediate_sender, mut intermediate_receiver) = mpsc::unbounded_channel(); - - tokio::spawn(async move { - // Iterate on input - while let Some(request) = request_stream.next().await { - // Create return channel - let (result_sender, result_receiver) = oneshot::channel(); - // Push to intermediate channel and preserve ordering - intermediate_sender - .send(result_receiver) - .expect("`intermediate_receiver` was dropped. This is a bug."); - - match request { - Ok(request) => encode_sender - .send((request, result_sender)) - .await - .expect("`encode_receiver` was dropped. This is a bug."), - Err(status) => { - // Request is malformed - let _ = result_sender.send(Err(status)); - } - }; - } - }); - - // Final channel for the outputs - let (response_sender, response_receiver) = mpsc::unbounded_channel(); - - tokio::spawn(async move { - while let Some(result_receiver) = intermediate_receiver.recv().await { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = result_receiver => { - let _ = response_sender.send(response.expect("`result_sender` was dropped. This is a bug.")); - } - _ = response_sender.closed() => {} - } - } - }); - - Ok(Response::new(UnboundedReceiverStream::new( - response_receiver, - ))) + self.stream_no_permit(request, function).await } async fn decode( @@ -1354,82 +1265,11 @@ impl grpc::tokenize_server::Tokenize for TextEmbeddingsService { &self, request: Request>, ) -> Result, Status> { - let mut request_stream = request.into_inner(); - - // Create bounded channel to have an upper bound of spawned tasks - // We will have at most `max_parallel_stream_requests` messages from this stream in the queue - let (encode_sender, mut encode_receiver) = mpsc::channel::<( - DecodeRequest, - oneshot::Sender>, - )>(self.max_parallel_stream_requests); - - // Required for the async move below - let local = self.clone(); - - // Background task that uses the bounded channel - tokio::spawn(async move { - while let Some((request, mut sender)) = encode_receiver.recv().await { - // Required for the async move below - let task_local = local.clone(); - - // Create async task for this specific input - tokio::spawn(async move { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = task_local.decode_inner(request) => { - let _ = sender.send(response); - } - _ = sender.closed() => {} - } - }); - } - }); - - // Intermediate channels - // Required to keep the order of the requests - let (intermediate_sender, mut intermediate_receiver) = mpsc::unbounded_channel(); - - tokio::spawn(async move { - // Iterate on input - while let Some(request) = request_stream.next().await { - // Create return channel - let (result_sender, result_receiver) = oneshot::channel(); - // Push to intermediate channel and preserve ordering - intermediate_sender - .send(result_receiver) - .expect("`intermediate_receiver` was dropped. This is a bug."); - - match request { - Ok(request) => encode_sender - .send((request, result_sender)) - .await - .expect("`encode_receiver` was dropped. This is a bug."), - Err(status) => { - // Request is malformed - let _ = result_sender.send(Err(status)); - } - }; - } - }); - - // Final channel for the outputs - let (response_sender, response_receiver) = mpsc::unbounded_channel(); + // Clone for move below + let clone = self.clone(); + let function = |req: DecodeRequest| async move { clone.decode_inner(req).await }; - tokio::spawn(async move { - while let Some(result_receiver) = intermediate_receiver.recv().await { - // Select on closed to cancel work if the stream was closed - tokio::select! { - response = result_receiver => { - let _ = response_sender.send(response.expect("`result_sender` was dropped. This is a bug.")); - } - _ = response_sender.closed() => {} - } - } - }); - - Ok(Response::new(UnboundedReceiverStream::new( - response_receiver, - ))) + self.stream_no_permit(request, function).await } } From eef2912b318fef33df736f048d769df7056cea16 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 4 Apr 2024 16:21:58 +0200 Subject: [PATCH 19/72] fix: fix auto_truncate for openai (#228) --- router/src/http/server.rs | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 0da5d901..f41aac9f 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -151,6 +151,8 @@ async fn predict( )) }; + let truncate = req.truncate.unwrap_or(info.auto_truncate); + let (response, metadata) = match req.inputs { PredictInput::Single(inputs) => { metrics::increment_counter!("te_request_count", "method" => "single"); @@ -159,7 +161,7 @@ async fn predict( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let (prompt_tokens, tokenization, queue, inference, predictions) = predict_inner( inputs, - req.truncate.unwrap_or(info.auto_truncate), + truncate, req.raw_scores, infer.0, info.0, @@ -208,7 +210,7 @@ async fn predict( let local_info = info.clone(); futures.push(predict_inner( input, - req.truncate.unwrap_or(info.auto_truncate), + truncate, req.raw_scores, local_infer.0, local_info.0, @@ -342,6 +344,8 @@ async fn rerank( )) }; + let truncate = req.truncate.unwrap_or(info.auto_truncate); + let (response, metadata) = { metrics::increment_counter!("te_request_count", "method" => "batch"); @@ -370,7 +374,7 @@ async fn rerank( futures.push(rerank_inner( req.query.clone(), text.clone(), - req.truncate.unwrap_or(info.auto_truncate), + truncate, req.raw_scores, local_infer.0, )) @@ -470,6 +474,8 @@ async fn embed( let span = tracing::Span::current(); let start_time = Instant::now(); + let truncate = req.truncate.unwrap_or(info.auto_truncate); + let (response, metadata) = match req.inputs { Input::Single(input) => { metrics::increment_counter!("te_request_count", "method" => "single"); @@ -478,12 +484,7 @@ async fn embed( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_pooled( - input, - req.truncate.unwrap_or(info.auto_truncate), - req.normalize, - permit, - ) + .embed_pooled(input, truncate, req.normalize, permit) .await .map_err(ErrorResponse::from)?; @@ -536,7 +537,6 @@ async fn embed( for input in inputs { compute_chars += input.count_chars(); - let truncate = req.truncate.unwrap_or(info.auto_truncate); let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; @@ -631,6 +631,7 @@ async fn embed_sparse( } sparse_values }; + let truncate = req.truncate.unwrap_or(info.auto_truncate); let (response, metadata) = match req.inputs { Input::Single(input) => { @@ -640,7 +641,7 @@ async fn embed_sparse( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_sparse(input, req.truncate.unwrap_or(info.auto_truncate), permit) + .embed_sparse(input, truncate, permit) .await .map_err(ErrorResponse::from)?; @@ -693,7 +694,6 @@ async fn embed_sparse( for input in inputs { compute_chars += input.count_chars(); - let truncate = req.truncate.unwrap_or(info.auto_truncate); let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; @@ -779,6 +779,8 @@ async fn embed_all( let span = tracing::Span::current(); let start_time = Instant::now(); + let truncate = req.truncate.unwrap_or(info.auto_truncate); + let (response, metadata) = match req.inputs { Input::Single(input) => { metrics::increment_counter!("te_request_count", "method" => "single"); @@ -787,7 +789,7 @@ async fn embed_all( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_all(input, req.truncate.unwrap_or(info.auto_truncate), permit) + .embed_all(input, truncate, permit) .await .map_err(ErrorResponse::from)?; @@ -840,7 +842,6 @@ async fn embed_all( for input in inputs { compute_chars += input.count_chars(); - let truncate = req.truncate.unwrap_or(info.auto_truncate); let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; @@ -925,6 +926,8 @@ async fn openai_embed( let span = tracing::Span::current(); let start_time = Instant::now(); + let truncate = info.auto_truncate; + let (embeddings, metadata) = match req.input { Input::Single(input) => { metrics::increment_counter!("te_request_count", "method" => "single"); @@ -933,7 +936,7 @@ async fn openai_embed( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_pooled(input, false, true, permit) + .embed_pooled(input, truncate, true, permit) .await .map_err(ErrorResponse::from)?; @@ -993,7 +996,9 @@ async fn openai_embed( let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; - local_infer.embed_pooled(input, false, true, permit).await + local_infer + .embed_pooled(input, truncate, true, permit) + .await }) } let results = join_all(futures) From 3c385a4fdced6c526a3ef3ec340e343a2fa40196 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Mon, 8 Apr 2024 15:07:36 +0200 Subject: [PATCH 20/72] Change license to Apache 2.0 (#231) Co-authored-by: Julien Chaumond --- LICENSE | 382 ++++++++++++++++++++------------------ docs/openapi.json | 3 +- router/src/http/server.rs | 3 +- 3 files changed, 205 insertions(+), 183 deletions(-) diff --git a/LICENSE b/LICENSE index 19a34fcf..7d0e8034 100644 --- a/LICENSE +++ b/LICENSE @@ -1,181 +1,201 @@ -Hugging Face Optimized Inference License 1.0 (HFOILv1.0) - - -This License Agreement governs the use of the Software and its Modifications. It is a -binding agreement between the Licensor and You. - -This License Agreement shall be referred to as Hugging Face Optimized Inference License -1.0 or HFOILv1.0. We may publish revised versions of this License Agreement from time to -time. Each version will be given a distinguished number. - -By downloading, accessing, modifying, distributing or otherwise using the Software, You -consent to all of the terms and conditions below. So, if You do not agree with those, -please do not download, access, modify, distribute, or use the Software. - - -1. PERMISSIONS - -You may use, modify and distribute the Software pursuant to the following terms and -conditions: - -Copyright License. Subject to the terms and conditions of this License Agreement and where -and as applicable, each Contributor hereby grants You a perpetual, worldwide, -non-exclusive, royalty-free, copyright license to reproduce, prepare, publicly display, -publicly perform, sublicense under the terms herein, and distribute the Software and -Modifications of the Software. - -Patent License. Subject to the terms and conditions of this License Agreement and where -and as applicable, each Contributor hereby grants You a perpetual, worldwide, -non-exclusive, royalty-free patent license to make, have made, Use, offer to sell, sell, -import, and otherwise transfer the Software, where such license applies only to those -patent claims licensable by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) with the Software to -which such Contribution(s) was submitted. If You institute patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Software -or a Contribution incorporated within the Software constitutes direct or contributory -patent infringement, then any rights granted to You under this License Agreement for the -Software shall terminate as of the date such litigation is filed. - -No other rights. All rights not expressly granted herein are retained. - - -2. RESTRICTIONS - -You may not distribute the Software as a hosted or managed, and paid service, where the -service grants users access to any substantial set of the features or functionality of the -Software. If you wish to do so, You will need to be granted additional rights from the -Licensor which will be subject to a separate mutually agreed agreement. - -You may not sublicense the Software under any other terms than those listed in this -License. - - -3. OBLIGATIONS - -When You modify the Software, You agree to: - attach a notice stating the Modifications of -the Software You made; and - attach a notice stating that the Modifications of the -Software are released under this License Agreement. - -When You distribute the Software or Modifications of the Software, You agree to: - give -any recipients of the Software a copy of this License Agreement; - retain all Explanatory -Documentation; and if sharing the Modifications of the Software, add Explanatory -Documentation documenting the changes made to create the Modifications of the Software; - -retain all copyright, patent, trademark and attribution notices. - - -4. MISCELLANEOUS - -Termination. Licensor reserves the right to restrict Use of the Software in violation of -this License Agreement, upon which Your licenses will automatically terminate. - -Contributions. Unless You explicitly state otherwise, any Contribution intentionally -submitted for inclusion in the Software by You to the Licensor shall be under the terms -and conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of any -separate license agreement you may have executed with Licensor regarding such -Contributions. - -Trademarks and related. Nothing in this License Agreement permits You (i) to make Use of -Licensors’ trademarks, trade names, or logos, (ii) otherwise suggest endorsement by -Licensor, or (iii) misrepresent the relationship between the parties; and any rights not -expressly granted herein are reserved by the Licensors. - -Output You generate. Licensor claims no rights in the Output. You agree not to contravene -any provision as stated in the License Agreement with your Use of the Output. - -Disclaimer of Warranty. Except as expressly provided otherwise herein, and to the fullest -extent permitted by law, Licensor provides the Software (and each Contributor provides its -Contributions) AS IS, and Licensor disclaims all warranties or guarantees of any kind, -express or implied, whether arising under any law or from any usage in trade, or otherwise -including but not limited to the implied warranties of merchantability, non-infringement, -quiet enjoyment, fitness for a particular purpose, or otherwise. You are solely -responsible for determining the appropriateness of the Software and Modifications of the -Software for your purposes (including your use or distribution of the Software and -Modifications of the Software), and assume any risks associated with Your exercise of -permissions under this License Agreement. - -Limitation of Liability. In no event and under no legal theory, whether in tort (including -negligence), contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to -You for damages, including any direct, indirect, special, incidental, or consequential -damages of any character arising as a result of this License Agreement or out of the Use -or inability to Use the Software (including but not limited to damages for loss of -goodwill, work stoppage, computer failure or malfunction, model failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has been advised -of the possibility of such damages. - -Accepting Warranty or Additional Liability. While sharing the Software or Modifications of -the Software thereof, You may choose to offer and charge a fee for, acceptance of support, -warranty, indemnity, or other liability obligations and/or rights consistent with this -License Agreement. However, in accepting such obligations, You may act only on Your own -behalf and on Your sole responsibility, not on behalf of Licensor or any other -Contributor, and you hereby agree to indemnify, defend, and hold Licensor and each other -Contributor (and their successors or assigns) harmless for any liability incurred by, or -claims asserted against, such Licensor or Contributor (and their successors or assigns) by -reason of your accepting any such warranty or additional liability. - -Severability. This License Agreement is a license of copyright and patent rights and an -agreement in contract between You and the Licensor. If any provision of this License -Agreement is held to be invalid, illegal or unenforceable, the remaining provisions shall -be unaffected thereby and remain valid as if such provision had not been set forth herein. - - -5. DEFINITIONS - -“Contribution” refers to any work of authorship, including the original version of the -Software and any Modifications of the Software that is intentionally submitted to Licensor -for inclusion in the Software by the copyright owner or by an individual or entity -authorized to submit on behalf of the copyright owner. For the purposes of this -definition, “submitted” means any form of electronic, verbal, or written communication -sent to the Licensor or its representatives, including but not limited to communication on -electronic mailing lists, source code control systems, and issue tracking systems that are -managed by, or on behalf of, the Licensor for the purpose of discussing and improving the -Software, but excluding communication that is conspicuously marked or otherwise designated -in writing by the copyright owner as “Not a Contribution.” - -“Contributor” refers to Licensor and any individual or entity on behalf of whom a -Contribution has been received by Licensor and subsequently incorporated within the -Software. - -“Data” refers to a collection of information extracted from the dataset used with the -Model, including to train, pretrain, or otherwise evaluate the Model. The Data is not -licensed under this License Agreement. - -“Explanatory Documentation” refers to any documentation or related information including -but not limited to model cards or data cards dedicated to inform the public about the -characteristics of the Software. Explanatory documentation is not licensed under this -License. - -"License Agreement" refers to these terms and conditions. - -“Licensor” refers to the rights owners or entity authorized by the rights owners that are -granting the terms and conditions of this License Agreement. - -“Model” refers to machine-learning based assemblies (including checkpoints), consisting of -learnt weights and parameters (including optimizer states), corresponding to a model -architecture as embodied in Software source code. Source code is not licensed under this -License Agreement. - -“Modifications of the Software” refers to all changes to the Software, including without -limitation derivative works of the Software. - -“Output” refers to the results of operating the Software. - -“Share” refers to any transmission, reproduction, publication or other sharing of the -Software or Modifications of the Software to a third party, including providing the -Softwaire as a hosted service made available by electronic or other remote means, -including - but not limited to - API-based or web access. - -“Software” refers to the software and Model (or parts of either) that Licensor makes -available under this License Agreement. - -“Third Parties” refers to individuals or legal entities that are not under common control -with Licensor or You. - -“Use” refers to anything You or your representatives do with the Software, including but -not limited to generating any Output, fine tuning, updating, running, training, evaluating -and/or reparametrizing the Model. - -"You" (or "Your") refers to an individual or Legal Entity exercising permissions granted -by this License Agreement and/or making Use of the Software for whichever purpose and in -any field of Use. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Hugging Face + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/openapi.json b/docs/openapi.json index 5f739722..b0a2a440 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -7,7 +7,8 @@ "name": "Olivier Dehaene" }, "license": { - "name": "HFOIL" + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "version": "1.2.0" }, diff --git a/router/src/http/server.rs b/router/src/http/server.rs index f41aac9f..d7dc1a6c 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1399,7 +1399,8 @@ pub async fn run( info( title = "Text Embeddings Inference", license( - name = "HFOIL", + name = "Apache 2.0", + url = "https://www.apache.org/licenses/LICENSE-2.0" ) ) )] From 432448ca18c019ee48b8f6cdb395b1fd6c1a4507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Galego?= Date: Thu, 11 Apr 2024 18:02:10 +0100 Subject: [PATCH 21/72] feat: Amazon SageMaker compatible images (#103) --- .github/workflows/build_all.yaml | 68 ++++++++++++++++++++++++++++++++ Dockerfile-cuda-all | 8 ++++ sagemaker-entrypoint.sh | 36 +++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 sagemaker-entrypoint.sh diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml index 9e095183..9fc37877 100644 --- a/.github/workflows/build_all.yaml +++ b/.github/workflows/build_all.yaml @@ -83,3 +83,71 @@ 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 + + build-and-push-sagemaker-image: + needs: + - 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, tgi-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 + - 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 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/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: | + 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.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 \ No newline at end of file diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 5b72fc65..3ef2db27 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -127,3 +127,11 @@ RUN chmod +x entrypoint.sh ENTRYPOINT ["./entrypoint.sh"] CMD ["--json-output"] + +# Amazon SageMaker compatible image +FROM base AS sagemaker + +COPY sagemaker-entrypoint.sh entrypoint.sh +RUN chmod +x entrypoint.sh + +ENTRYPOINT ["./entrypoint.sh"] diff --git a/sagemaker-entrypoint.sh b/sagemaker-entrypoint.sh new file mode 100644 index 00000000..0546e671 --- /dev/null +++ b/sagemaker-entrypoint.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +if [[ -z "${HF_MODEL_ID}" ]]; then + echo "HF_MODEL_ID must be set" + exit 1 +fi +export MODEL_ID="${HF_MODEL_ID}" + +if [[ -n "${HF_MODEL_REVISION}" ]]; then + export REVISION="${HF_MODEL_REVISION}" +fi + +if ! command -v nvidia-smi &> /dev/null; then + echo "Error: 'nvidia-smi' command not found." + exit 1 +fi + +if [[ -z "${CUDA_COMPUTE_CAP}" ]] +then + compute_cap=$(nvidia-smi --query-gpu=compute_cap --format=csv | sed -n '2p' | sed 's/\.//g') +else + compute_cap=$CUDA_COMPUTE_CAP +fi + +if [[ ${compute_cap} -eq 75 ]] +then + text-embeddings-router-75 --port 8080 +elif [[ ${compute_cap} -ge 80 && ${compute_cap} -lt 90 ]] +then + text-embeddings-router-80 --port 8080 +elif [[ ${compute_cap} -eq 90 ]] +then + text-embeddings-router-90 --port 8080 +else + echo "cuda compute cap ${compute_cap} is not supported"; exit 1 +fi From cb802a25d43fe6078c715b49652a3bc8a7d5aac8 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 11 Apr 2024 19:56:44 +0200 Subject: [PATCH 22/72] fix(CI): fix build all (#236) --- .github/workflows/build_all.yaml | 56 +-- Cargo.lock | 570 ++++++++++++++++++------------- Cargo.toml | 8 +- 3 files changed, 338 insertions(+), 296 deletions(-) diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml index 9fc37877..50e93e14 100644 --- a/.github/workflows/build_all.yaml +++ b/.github/workflows/build_all.yaml @@ -26,12 +26,6 @@ uses: docker/setup-buildx-action@v2.0.0 with: install: true - - 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: Tailscale @@ -74,53 +68,14 @@ 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.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 - - build-and-push-sagemaker-image: - needs: - - 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, tgi-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 - - 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 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 + id: meta-sagemaker uses: docker/metadata-action@v4.3.0 with: images: | @@ -142,12 +97,9 @@ platforms: 'linux/amd64' target: sagemaker 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.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + 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 \ No newline at end of file + cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max diff --git a/Cargo.lock b/Cargo.lock index 6a4ecdac..a78de45b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" dependencies = [ "backtrace", ] @@ -135,25 +135,25 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "async-trait" -version = "0.1.78" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "axum" @@ -177,7 +177,7 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", + "sync_wrapper 0.1.2", "tower", "tower-layer", "tower-service", @@ -185,9 +185,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" dependencies = [ "async-trait", "axum-core 0.4.3", @@ -209,7 +209,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", "tower", "tower-layer", @@ -249,7 +249,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper", + "sync_wrapper 0.1.2", "tower-layer", "tower-service", "tracing", @@ -261,7 +261,7 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91387a3e9f6aa45f112cd05d1e5430f9ba40b51440849e4760a5dd51b736149f" dependencies = [ - "axum 0.7.4", + "axum 0.7.5", "futures-core", "futures-util", "http 1.1.0", @@ -290,9 +290,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.70" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d8e92cac0961e91dbd517496b00f7e9b92363dbe6d42c3198268323798860c" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -305,9 +305,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -321,17 +321,38 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "bindgen_cuda" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853f25ad4724e82569cc7dd3b08048d21bd15950208f8b0ceeab6ac062b33c1f" +checksum = "1f8489af5b7d17a81bffe37e0f4d6e1e4de87c87329d05447f22c35d95a1227d" dependencies = [ "glob", "num_cpus", "rayon", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -361,9 +382,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" @@ -382,7 +403,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -393,14 +414,14 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "candle-core" -version = "0.4.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=14a716f55f99d3a059f788084b8cb24dcf05b8a0#14a716f55f99d3a059f788084b8cb24dcf05b8a0" +version = "0.5.0" +source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" dependencies = [ "accelerate-src", "byteorder", @@ -436,8 +457,8 @@ dependencies = [ [[package]] name = "candle-flash-attn" -version = "0.4.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=14a716f55f99d3a059f788084b8cb24dcf05b8a0#14a716f55f99d3a059f788084b8cb24dcf05b8a0" +version = "0.5.0" +source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" dependencies = [ "anyhow", "bindgen_cuda", @@ -459,8 +480,8 @@ dependencies = [ [[package]] name = "candle-kernels" -version = "0.4.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=14a716f55f99d3a059f788084b8cb24dcf05b8a0#14a716f55f99d3a059f788084b8cb24dcf05b8a0" +version = "0.5.0" +source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" dependencies = [ "bindgen_cuda", ] @@ -479,8 +500,8 @@ dependencies = [ [[package]] name = "candle-metal-kernels" -version = "0.4.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=14a716f55f99d3a059f788084b8cb24dcf05b8a0#14a716f55f99d3a059f788084b8cb24dcf05b8a0" +version = "0.5.0" +source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" dependencies = [ "metal", "once_cell", @@ -490,8 +511,8 @@ dependencies = [ [[package]] name = "candle-nn" -version = "0.4.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=14a716f55f99d3a059f788084b8cb24dcf05b8a0#14a716f55f99d3a059f788084b8cb24dcf05b8a0" +version = "0.5.0" +source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" dependencies = [ "accelerate-src", "candle-core", @@ -519,12 +540,13 @@ dependencies = [ [[package]] name = "candle-transformers" -version = "0.4.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=14a716f55f99d3a059f788084b8cb24dcf05b8a0#14a716f55f99d3a059f788084b8cb24dcf05b8a0" +version = "0.5.0" +source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" dependencies = [ "byteorder", "candle-core", "candle-nn", + "fancy-regex", "num-traits", "rand", "rayon", @@ -536,9 +558,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.90" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" [[package]] name = "cfg-if" @@ -548,9 +570,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.35" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" dependencies = [ "android-tzdata", "iana-time-zone", @@ -562,9 +584,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.3" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -579,19 +601,19 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.5.3" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -728,8 +750,18 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core 0.20.8", + "darling_macro 0.20.8", ] [[package]] @@ -746,17 +778,42 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.58", +] + [[package]] name = "darling_macro" version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ - "darling_core", + "darling_core 0.14.4", "quote", "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core 0.20.8", + "quote", + "syn 2.0.58", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -781,29 +838,29 @@ dependencies = [ [[package]] name = "derive_builder" -version = "0.11.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" +checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" dependencies = [ - "derive_builder_macro 0.11.2", + "derive_builder_macro 0.12.0", ] [[package]] name = "derive_builder" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" +checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" dependencies = [ - "derive_builder_macro 0.12.0", + "derive_builder_macro 0.20.0", ] [[package]] name = "derive_builder_core" -version = "0.11.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" +checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" dependencies = [ - "darling", + "darling 0.14.4", "proc-macro2", "quote", "syn 1.0.109", @@ -811,34 +868,34 @@ dependencies = [ [[package]] name = "derive_builder_core" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" +checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" dependencies = [ - "darling", + "darling 0.20.8", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] name = "derive_builder_macro" -version = "0.11.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" +checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" dependencies = [ - "derive_builder_core 0.11.2", + "derive_builder_core 0.12.0", "syn 1.0.109", ] [[package]] name = "derive_builder_macro" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" +checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ - "derive_builder_core 0.12.0", - "syn 1.0.109", + "derive_builder_core 0.20.0", + "syn 2.0.58", ] [[package]] @@ -853,11 +910,11 @@ dependencies = [ [[package]] name = "directories" -version = "4.0.1" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ - "dirs-sys 0.3.7", + "dirs-sys", ] [[package]] @@ -866,18 +923,7 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", + "dirs-sys", ] [[package]] @@ -916,9 +962,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -932,7 +978,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -960,11 +1006,22 @@ dependencies = [ "cc", ] +[[package]] +name = "fancy-regex" +version = "0.13.0" +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", +] + [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "filetime" @@ -1027,7 +1084,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1107,7 +1164,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1270,9 +1327,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", @@ -1315,9 +1372,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -1325,26 +1382,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.2.5", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 1.1.0", - "indexmap 2.2.5", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1353,9 +1391,9 @@ dependencies = [ [[package]] name = "half" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "bytemuck", "cfg-if", @@ -1512,7 +1550,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.25", + "h2", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -1535,7 +1573,6 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.3", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -1638,9 +1675,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1762,9 +1799,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" @@ -1805,13 +1842,12 @@ dependencies = [ [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.5.0", "libc", - "redox_syscall", ] [[package]] @@ -1893,9 +1929,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memmap2" @@ -1959,7 +1995,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -2046,7 +2082,7 @@ checksum = "f686d68a09079e63b1d2c64aa305095887ce50565f00a922ebfaeeee0d9ba6ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -2055,6 +2091,12 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + [[package]] name = "native-tls" version = "0.2.11" @@ -2180,11 +2222,11 @@ dependencies = [ [[package]] name = "oci-spec" -version = "0.5.8" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98135224dd4faeb24c05a2fac911ed53ea6b09ecb09d7cada1cb79963ab2ee34" +checksum = "e423c4f827362c0d8d8da4b1f571270f389ebde73bcd3240a3d23c6d6f61d0f0" dependencies = [ - "derive_builder 0.11.2", + "derive_builder 0.20.0", "getset", "serde", "serde_json", @@ -2193,12 +2235,12 @@ dependencies = [ [[package]] name = "ocipkg" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60cf01280832705a4e4c4d046d9e67a54b900297c69191457a8fc6d198ddefa2" +checksum = "9bb3293021f06540803301af45e7ab81693d50e89a7398a3420bdab139e7ba5e" dependencies = [ "base16ct", - "base64 0.13.1", + "base64 0.22.0", "chrono", "directories", "flate2", @@ -2269,7 +2311,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -2280,9 +2322,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.101" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -2318,7 +2360,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.2.5", + "indexmap 2.2.6", "js-sys", "once_cell", "pin-project-lite", @@ -2533,7 +2575,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.5", + "indexmap 2.2.6", ] [[package]] @@ -2553,14 +2595,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2604,12 +2646,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" dependencies = [ "proc-macro2", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -2657,12 +2699,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" dependencies = [ "bytes", - "prost-derive 0.12.3", + "prost-derive 0.12.4", ] [[package]] @@ -2676,7 +2718,7 @@ dependencies = [ "itertools 0.10.5", "lazy_static", "log", - "multimap", + "multimap 0.8.3", "petgraph", "prettyplease 0.1.25", "prost 0.11.9", @@ -2689,24 +2731,23 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" dependencies = [ "bytes", - "heck 0.4.1", - "itertools 0.11.0", + "heck 0.5.0", + "itertools 0.12.1", "log", - "multimap", + "multimap 0.10.0", "once_cell", "petgraph", - "prettyplease 0.2.16", - "prost 0.12.3", - "prost-types 0.12.3", + "prettyplease 0.2.17", + "prost 0.12.4", + "prost-types 0.12.4", "regex", - "syn 2.0.53", + "syn 2.0.58", "tempfile", - "which", ] [[package]] @@ -2724,15 +2765,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -2746,11 +2787,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" dependencies = [ - "prost 0.12.3", + "prost 0.12.4", ] [[package]] @@ -2783,9 +2824,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -2841,9 +2882,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -2887,9 +2928,9 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", @@ -2898,14 +2939,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.6", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -2925,7 +2966,7 @@ checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -2936,9 +2977,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "reqwest" @@ -2951,7 +2992,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.25", + "h2", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", @@ -2968,7 +3009,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", @@ -3015,7 +3056,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.53", + "syn 2.0.58", "walkdir", ] @@ -3050,9 +3091,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" dependencies = [ "log", "ring", @@ -3073,9 +3114,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" [[package]] name = "rustls-webpki" @@ -3090,9 +3131,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "ryu" @@ -3136,9 +3177,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -3149,9 +3190,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", @@ -3180,14 +3221,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -3213,6 +3254,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3227,11 +3277,11 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.33" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "itoa", "ryu", "serde", @@ -3260,7 +3310,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3294,9 +3344,9 @@ dependencies = [ [[package]] name = "similar" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" +checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" [[package]] name = "sketches-ddsketch" @@ -3372,9 +3422,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -3395,9 +3445,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -3410,6 +3460,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + [[package]] name = "synstructure" version = "0.13.1" @@ -3418,7 +3474,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3563,7 +3619,7 @@ version = "1.2.0" dependencies = [ "anyhow", "async-stream", - "axum 0.7.4", + "axum 0.7.5", "axum-tracing-opentelemetry", "clap", "futures", @@ -3578,7 +3634,7 @@ dependencies = [ "num_cpus", "opentelemetry 0.20.0", "opentelemetry-otlp", - "prost 0.12.3", + "prost 0.12.4", "reqwest", "serde", "serde_json", @@ -3619,7 +3675,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3634,9 +3690,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -3657,9 +3713,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -3701,7 +3757,7 @@ dependencies = [ "rayon", "rayon-cond", "regex", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", "serde", "serde_json", "spm_precompiled", @@ -3713,9 +3769,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -3748,7 +3804,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3788,11 +3844,36 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.11" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" dependencies = [ + "indexmap 2.2.6", "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -3807,7 +3888,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2 0.3.25", + "h2", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", @@ -3834,14 +3915,14 @@ dependencies = [ "axum 0.6.20", "base64 0.21.7", "bytes", - "h2 0.3.25", + "h2", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.3", + "prost 0.12.4", "tokio", "tokio-stream", "tower", @@ -3869,11 +3950,11 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" dependencies = [ - "prettyplease 0.2.16", + "prettyplease 0.2.17", "proc-macro2", - "prost-build 0.12.3", + "prost-build 0.12.4", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3883,7 +3964,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cef6e24bc96871001a7e48e820ab240b3de2201e59b517cf52835df2f1d2350" dependencies = [ "async-stream", - "prost 0.12.3", + "prost 0.12.4", "tokio", "tokio-stream", "tonic 0.11.0", @@ -3895,8 +3976,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "548c227bd5c0fae5925812c4ec6c66ffcfced23ea370cb823f4d18f0fc1cb6a7" dependencies = [ - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", "tokio", "tokio-stream", "tonic 0.11.0", @@ -3970,7 +4051,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4227,7 +4308,7 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "272ebdfbc99111033031d2f10e018836056e4d2c8e2acda76450ec7974269fa7" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "serde", "serde_json", "utoipa-gen", @@ -4243,7 +4324,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4252,7 +4333,7 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b39868d43c011961e04b41623e050aedf2cc93652562ff7935ce0f819aaf2da" dependencies = [ - "axum 0.7.4", + "axum 0.7.5", "mime_guess", "regex", "rust-embed", @@ -4301,7 +4382,7 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4368,7 +4449,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", "wasm-bindgen-shared", ] @@ -4402,7 +4483,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4626,6 +4707,15 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +[[package]] +name = "winnow" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -4676,7 +4766,7 @@ checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", "synstructure", ] @@ -4697,7 +4787,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4717,7 +4807,7 @@ checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index 45aedca8..b59f2865 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,10 +18,10 @@ homepage = "https://github.com/huggingface/text-embeddings-inference" [patch.crates-io] cudarc = { git = "https://github.com/coreylowman/cudarc", rev = "c388e724af93a3e8fbe484f5ded2d8b3c1badd8e" } -candle = { git = "https://github.com/OlivierDehaene/candle", rev = "14a716f55f99d3a059f788084b8cb24dcf05b8a0", package = "candle-core" } -candle-nn = { git = "https://github.com/OlivierDehaene/candle", rev = "14a716f55f99d3a059f788084b8cb24dcf05b8a0", package = "candle-nn" } -candle-transformers = { git = "https://github.com/OlivierDehaene/candle", rev = "14a716f55f99d3a059f788084b8cb24dcf05b8a0", package = "candle-transformers" } -candle-flash-attn = { git = "https://github.com/OlivierDehaene/candle", rev = "14a716f55f99d3a059f788084b8cb24dcf05b8a0", package = "candle-flash-attn" } +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" } From 0b07f9b9603f5c5a95794c12e5e8cf04b1863306 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Mon, 15 Apr 2024 10:58:45 +0200 Subject: [PATCH 23/72] fix: fix cuda-all image (#239) --- Dockerfile-cuda-all | 20 ++++++++++---------- backends/candle/src/flash_attn.rs | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 3ef2db27..772650a4 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -48,9 +48,9 @@ FROM builder as builder-75 RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=75 cargo chef cook --release --features google --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo chef cook --release --features google --features candle-cuda-turing --features http --no-default-features --recipe-path recipe.json && sccache -s; \ else \ - CUDA_COMPUTE_CAP=75 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo chef cook --release --features candle-cuda-turing --no-default-features --features http --recipe-path recipe.json && sccache -s; \ fi; COPY backends backends @@ -70,9 +70,9 @@ FROM builder as builder-80 RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=80 cargo chef cook --release --features google --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=80 cargo chef cook --release --features google --features candle-cuda --features http --no-default-features --recipe-path recipe.json && sccache -s; \ else \ - CUDA_COMPUTE_CAP=80 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=80 cargo chef cook --release --features candle-cuda --no-default-features --features http --recipe-path recipe.json && sccache -s; \ fi; COPY backends backends @@ -83,18 +83,18 @@ COPY Cargo.lock ./ RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http -F google --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda -F http -F google --no-default-features && sccache -s; \ else \ - CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s; \ fi; FROM builder as builder-90 RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=90 cargo chef cook --release --features google --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo chef cook --release --features google --features candle-cuda --features http --no-default-features --recipe-path recipe.json && sccache -s; \ else \ - CUDA_COMPUTE_CAP=90 cargo chef cook --release --features candle-cuda-turing --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo chef cook --release --features candle-cuda --features http --no-default-features --recipe-path recipe.json && sccache -s; \ fi; COPY backends backends @@ -105,9 +105,9 @@ COPY Cargo.lock ./ RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http -F google --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda -F http -F google --no-default-features && sccache -s; \ else \ - CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s; \ fi; FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 as base diff --git a/backends/candle/src/flash_attn.rs b/backends/candle/src/flash_attn.rs index d78e2726..556fd375 100644 --- a/backends/candle/src/flash_attn.rs +++ b/backends/candle/src/flash_attn.rs @@ -73,7 +73,7 @@ pub(crate) fn flash_attn_varlen( return attention; } #[cfg(not(feature = "flash-attn"))] - candle::bail!("Flash attention is not installed. Use `flash-attn-v1` feature.") + candle::bail!("Flash attention is not installed. Use `flash-attn` feature.") } candle::bail!( "GPU with CUDA capability {} is not supported", From 1477844a70d7a6215786c12c552f4697fc2c3a38 Mon Sep 17 00:00:00 2001 From: Philipp Schmid <32632186+philschmid@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:54:46 +0200 Subject: [PATCH 24/72] Add SageMaker CPU images and validate (#240) --- Dockerfile | 8 +++++++ Dockerfile-cuda-all | 5 ++--- sagemaker-entrypoint-cuda-all.sh | 36 ++++++++++++++++++++++++++++++++ sagemaker-entrypoint.sh | 25 +--------------------- 4 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 sagemaker-entrypoint-cuda-all.sh diff --git a/Dockerfile b/Dockerfile index 5bbd61da..a04c3e73 100644 --- a/Dockerfile +++ b/Dockerfile @@ -108,3 +108,11 @@ COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/loc ENTRYPOINT ["text-embeddings-router"] CMD ["--json-output"] + +# Amazon SageMaker compatible image +FROM base AS sagemaker + +COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router +COPY --chmod=775 sagemaker-entrypoint.sh entrypoint.sh + +ENTRYPOINT ["./entrypoint.sh"] diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 772650a4..02b4a8b4 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -131,7 +131,6 @@ CMD ["--json-output"] # Amazon SageMaker compatible image FROM base AS sagemaker -COPY sagemaker-entrypoint.sh entrypoint.sh -RUN chmod +x entrypoint.sh +COPY --chmod=775 sagemaker-entrypoint-cuda-all.sh entrypoint.sh -ENTRYPOINT ["./entrypoint.sh"] +ENTRYPOINT ["./entrypoint.sh"] \ No newline at end of file diff --git a/sagemaker-entrypoint-cuda-all.sh b/sagemaker-entrypoint-cuda-all.sh new file mode 100644 index 00000000..16156e8a --- /dev/null +++ b/sagemaker-entrypoint-cuda-all.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +if [[ -z "${HF_MODEL_ID}" ]]; then + echo "HF_MODEL_ID must be set" + exit 1 +fi +export MODEL_ID="${HF_MODEL_ID}" + +if [[ -n "${HF_MODEL_REVISION}" ]]; then + export REVISION="${HF_MODEL_REVISION}" +fi + +if ! command -v nvidia-smi &> /dev/null; then + echo "Error: 'nvidia-smi' command not found." + exit 1 +fi + +if [[ -z "${CUDA_COMPUTE_CAP}" ]] +then + compute_cap=$(nvidia-smi --query-gpu=compute_cap --format=csv | sed -n '2p' | sed 's/\.//g') +else + compute_cap=$CUDA_COMPUTE_CAP +fi + +if [[ ${compute_cap} -eq 75 ]] +then + text-embeddings-router-75 --port 8080 --json-output +elif [[ ${compute_cap} -ge 80 && ${compute_cap} -lt 90 ]] +then + text-embeddings-router-80 --port 8080 --json-output +elif [[ ${compute_cap} -eq 90 ]] +then + text-embeddings-router-90 --port 8080 --json-output +else + echo "cuda compute cap ${compute_cap} is not supported"; exit 1 +fi diff --git a/sagemaker-entrypoint.sh b/sagemaker-entrypoint.sh index 0546e671..8d78a8dc 100644 --- a/sagemaker-entrypoint.sh +++ b/sagemaker-entrypoint.sh @@ -10,27 +10,4 @@ if [[ -n "${HF_MODEL_REVISION}" ]]; then export REVISION="${HF_MODEL_REVISION}" fi -if ! command -v nvidia-smi &> /dev/null; then - echo "Error: 'nvidia-smi' command not found." - exit 1 -fi - -if [[ -z "${CUDA_COMPUTE_CAP}" ]] -then - compute_cap=$(nvidia-smi --query-gpu=compute_cap --format=csv | sed -n '2p' | sed 's/\.//g') -else - compute_cap=$CUDA_COMPUTE_CAP -fi - -if [[ ${compute_cap} -eq 75 ]] -then - text-embeddings-router-75 --port 8080 -elif [[ ${compute_cap} -ge 80 && ${compute_cap} -lt 90 ]] -then - text-embeddings-router-80 --port 8080 -elif [[ ${compute_cap} -eq 90 ]] -then - text-embeddings-router-90 --port 8080 -else - echo "cuda compute cap ${compute_cap} is not supported"; exit 1 -fi +text-embeddings-router --port 8080 --json-output \ No newline at end of file From 8927093ddda438fee975bd43898beb88f24417eb Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:57:08 +0200 Subject: [PATCH 25/72] v1.2.1 --- Cargo.lock | 14 +++++++------- Cargo.toml | 2 +- docs/openapi.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a78de45b..0423d34b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -275,7 +275,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.2.0" +version = "1.2.1" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -3537,7 +3537,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.2.0" +version = "1.2.1" dependencies = [ "clap", "text-embeddings-backend-candle", @@ -3549,7 +3549,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.2.0" +version = "1.2.1" dependencies = [ "accelerate-src", "anyhow", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.2.0" +version = "1.2.1" dependencies = [ "clap", "nohash-hasher", @@ -3588,7 +3588,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.2.0" +version = "1.2.1" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3602,7 +3602,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.2.0" +version = "1.2.1" dependencies = [ "hf-hub", "metrics", @@ -3615,7 +3615,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.2.0" +version = "1.2.1" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index b59f2865..2098fc2e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.2.0" +version = "1.2.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 b0a2a440..6cddf5a9 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.0" + "version": "1.2.1" }, "paths": { "/decode": { From 1108a108f1301e08bfee078dccd1d8e51a30d2ac Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 16 Apr 2024 11:35:14 +0200 Subject: [PATCH 26/72] fix(gke): accept null values for vertex env vars (#243) --- router/src/grpc/server.rs | 1 + router/src/http/server.rs | 19 +++++++++++++------ router/src/lib.rs | 36 ++++++++++++++++-------------------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index df76275e..913455b3 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -1415,6 +1415,7 @@ pub async fn run( }; tracing::info!("Starting gRPC server: {}", &addr); + tracing::info!("Ready"); server.await?; Ok(()) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index d7dc1a6c..6c48ad3e 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1479,12 +1479,16 @@ pub async fn run( #[cfg(feature = "google")] { tracing::info!("Built with `google` feature"); - let env_predict_route = std::env::var("AIP_PREDICT_ROUTE") - .context("`AIP_PREDICT_ROUTE` env var must be set for Google Vertex deployments")?; - app = app.route(&env_predict_route, post(vertex_compatibility)); - let env_health_route = std::env::var("AIP_HEALTH_ROUTE") - .context("`AIP_HEALTH_ROUTE` env var must be set for Google Vertex deployments")?; - app = app.route(&env_health_route, get(health)); + + 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)); + } + + 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)); + } } #[cfg(not(feature = "google"))] { @@ -1546,6 +1550,9 @@ pub async fn run( // Run server let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + tracing::info!("Starting HTTP server: {}", &addr); + tracing::info!("Ready"); + axum::serve(listener, app) // Wait until all requests are finished to shut down .with_graceful_shutdown(shutdown::shutdown_signal()) diff --git a/router/src/lib.rs b/router/src/lib.rs index df0fad4b..3801af8a 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -248,7 +248,11 @@ pub async fn run( std::env::var("AIP_HTTP_PORT") .ok() .and_then(|p| p.parse().ok()) - .context("`AIP_HTTP_PORT` env var must be set for Google Vertex deployments")? + .map(|p| { + tracing::info!("`AIP_HTTP_PORT` is set: overriding port {port} by port {p}"); + p + }) + .unwrap_or(port) } else { port }; @@ -274,20 +278,16 @@ pub async fn run( #[cfg(feature = "http")] { - let server = tokio::spawn(async move { - http::server::run( - infer, - info, - addr, - prom_builder, - payload_limit, - api_key, - cors_allow_origin, - ) - .await - }); - tracing::info!("Ready"); - server.await??; + http::server::run( + infer, + info, + addr, + prom_builder, + payload_limit, + api_key, + cors_allow_origin, + ) + .await?; } #[cfg(feature = "grpc")] @@ -295,11 +295,7 @@ pub async fn run( // cors_allow_origin and payload_limit are not used for gRPC servers let _ = cors_allow_origin; let _ = payload_limit; - let server = tokio::spawn(async move { - grpc::server::run(infer, info, addr, prom_builder, api_key).await - }); - tracing::info!("Ready"); - server.await??; + grpc::server::run(infer, info, addr, prom_builder, api_key).await?; } Ok(()) From 22f6fd7794d26ba88b29919ee7ae92ab87f4f97c Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:23:38 +0200 Subject: [PATCH 27/72] v1.2.2 --- Cargo.lock | 14 +++++++------- Cargo.toml | 2 +- Dockerfile | 15 ++++++++------- Dockerfile-cuda-all | 19 ++++++++++++------- docs/openapi.json | 2 +- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0423d34b..a74b923a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -275,7 +275,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.2.1" +version = "1.2.2" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -3537,7 +3537,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.2.1" +version = "1.2." dependencies = [ "clap", "text-embeddings-backend-candle", @@ -3549,7 +3549,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.2.1" +version = "1.2." dependencies = [ "accelerate-src", "anyhow", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.2.1" +version = "1.2." dependencies = [ "clap", "nohash-hasher", @@ -3588,7 +3588,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.2.1" +version = "1.2." dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3602,7 +3602,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.2.1" +version = "1.2." dependencies = [ "hf-hub", "metrics", @@ -3615,7 +3615,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.2.1" +version = "1.2." dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 2098fc2e..f392fb9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.2.1" +version = "1.2.2" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" diff --git a/Dockerfile b/Dockerfile index a04c3e73..625d165f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -102,17 +102,18 @@ COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/loc ENTRYPOINT ["text-embeddings-router"] CMD ["--json-output"] -FROM base +FROM base AS http COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router -ENTRYPOINT ["text-embeddings-router"] -CMD ["--json-output"] - # Amazon SageMaker compatible image -FROM base AS sagemaker - -COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router +FROM http as sagemaker COPY --chmod=775 sagemaker-entrypoint.sh entrypoint.sh ENTRYPOINT ["./entrypoint.sh"] + +# Default image +FROM http + +ENTRYPOINT ["text-embeddings-router"] +CMD ["--json-output"] diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 02b4a8b4..aa9fe1f9 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -40,6 +40,9 @@ ARG ACTIONS_CACHE_URL ARG ACTIONS_RUNTIME_TOKEN ARG SCCACHE_GHA_ENABLED +# limit the number of kernels built at the same time +ARG RAYON_NUM_THREADS=2 + WORKDIR /usr/src COPY --from=planner /usr/src/recipe.json recipe.json @@ -122,15 +125,17 @@ COPY --from=builder-75 /usr/src/target/release/text-embeddings-router /usr/local COPY --from=builder-80 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-80 COPY --from=builder-90 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-90 -COPY cuda-all-entrypoint.sh entrypoint.sh -RUN chmod +x entrypoint.sh - -ENTRYPOINT ["./entrypoint.sh"] -CMD ["--json-output"] - # Amazon SageMaker compatible image FROM base AS sagemaker COPY --chmod=775 sagemaker-entrypoint-cuda-all.sh entrypoint.sh -ENTRYPOINT ["./entrypoint.sh"] \ No newline at end of file +ENTRYPOINT ["./entrypoint.sh"] + +# Default image +FROM base + +COPY --chmod=775 cuda-all-entrypoint.sh entrypoint.sh + +ENTRYPOINT ["./entrypoint.sh"] +CMD ["--json-output"] diff --git a/docs/openapi.json b/docs/openapi.json index 6cddf5a9..62c2d1c7 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.1" + "version": "1.2." }, "paths": { "/decode": { From d221b99518defac7159c3599f0f1fd435bfab244 Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:47:29 +0200 Subject: [PATCH 28/72] hotfix v1.2.2 --- Cargo.lock | 197 +++++++++++++++++++++++++++-------------------------- 1 file changed, 102 insertions(+), 95 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a74b923a..b8bb1d6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,18 +135,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] name = "async-trait" -version = "0.1.79" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.0", "http-body-util", - "hyper 1.2.0", + "hyper 1.3.1", "hyper-util", "itoa", "matchit", @@ -403,7 +403,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -558,9 +558,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" +checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" [[package]] name = "cfg-if" @@ -570,16 +570,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -613,7 +613,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -789,7 +789,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -811,7 +811,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -875,7 +875,7 @@ dependencies = [ "darling 0.20.8", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -895,7 +895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core 0.20.0", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -950,9 +950,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "encode_unicode" @@ -978,7 +978,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -1084,7 +1084,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -1164,7 +1164,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -1566,9 +1566,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" dependencies = [ "bytes", "futures-channel", @@ -1618,7 +1618,7 @@ dependencies = [ "futures-util", "http 1.1.0", "http-body 1.0.0", - "hyper 1.2.0", + "hyper 1.3.1", "pin-project-lite", "socket2", "tokio", @@ -1995,7 +1995,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -2066,9 +2066,9 @@ dependencies = [ [[package]] name = "monostate" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878c2a1f1c70e5724fa28f101ca787b6a7e8ad5c5e4ae4ca3b0fa4a419fa9075" +checksum = "a20fffcd8ca4c69d31e036a71abc400147b41f90895df4edcb36497a1f8af8bf" dependencies = [ "monostate-impl", "serde", @@ -2076,13 +2076,13 @@ dependencies = [ [[package]] name = "monostate-impl" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f686d68a09079e63b1d2c64aa305095887ce50565f00a922ebfaeeee0d9ba6ce" +checksum = "bf307cbbbd777a9c10cec88ddafee572b3484caad5cce0c9236523c3803105a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -2311,7 +2311,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -2595,7 +2595,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -2646,12 +2646,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" +checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" dependencies = [ "proc-macro2", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -2680,9 +2680,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e" dependencies = [ "unicode-ident", ] @@ -2742,11 +2742,11 @@ dependencies = [ "multimap 0.10.0", "once_cell", "petgraph", - "prettyplease 0.2.17", + "prettyplease 0.2.19", "prost 0.12.4", "prost-types 0.12.4", "regex", - "syn 2.0.58", + "syn 2.0.59", "tempfile", ] @@ -2773,7 +2773,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -2796,9 +2796,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.18.9" +version = "0.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03457ac216146f43f921500bac4e892d5cd32b0479b929cbfc90f95cd6c599c2" +checksum = "e14989307e408d9f4245d4fda09a7b144a08114ba124e26cab60ab83dc98db10" dependencies = [ "bytemuck", "libm", @@ -3056,7 +3056,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.58", + "syn 2.0.59", "walkdir", ] @@ -3143,9 +3143,9 @@ checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "safetensors" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d980e6bfb34436fb0a81e42bc41af43f11805bbbca443e7f68e9faaabe669ed" +checksum = "8ced76b22c7fba1162f11a5a75d9d8405264b467a07ae0c9c29be119b9297db9" dependencies = [ "serde", "serde_json", @@ -3221,14 +3221,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -3310,7 +3310,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -3445,9 +3445,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" dependencies = [ "proc-macro2", "quote", @@ -3474,7 +3474,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -3537,7 +3537,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.2." +version = "1.2.2" dependencies = [ "clap", "text-embeddings-backend-candle", @@ -3549,7 +3549,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.2." +version = "1.2.2" dependencies = [ "accelerate-src", "anyhow", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.2." +version = "1.2.2" dependencies = [ "clap", "nohash-hasher", @@ -3588,7 +3588,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.2." +version = "1.2.2" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3602,7 +3602,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.2." +version = "1.2.2" dependencies = [ "hf-hub", "metrics", @@ -3615,7 +3615,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.2." +version = "1.2.2" dependencies = [ "anyhow", "async-stream", @@ -3675,7 +3675,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -3804,7 +3804,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -3950,11 +3950,11 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" dependencies = [ - "prettyplease 0.2.17", + "prettyplease 0.2.19", "proc-macro2", "prost-build 0.12.4", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -4051,7 +4051,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -4324,7 +4324,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -4382,7 +4382,7 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -4449,7 +4449,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", "wasm-bindgen-shared", ] @@ -4483,7 +4483,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4572,7 +4572,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -4590,7 +4590,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -4610,17 +4610,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "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.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -4631,9 +4632,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -4643,9 +4644,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -4655,9 +4656,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -4667,9 +4674,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -4679,9 +4686,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -4691,9 +4698,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -4703,9 +4710,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -4766,7 +4773,7 @@ checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", "synstructure", ] @@ -4787,7 +4794,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -4807,7 +4814,7 @@ checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", "synstructure", ] From ad16ce26c587e13e4d89729656651c35afa2f185 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 23 Apr 2024 18:31:53 +0200 Subject: [PATCH 29/72] fix: limit peak memory to build cuda-all docker image (#246) --- .github/workflows/build_all.yaml | 2 + Dockerfile-cuda-all | 59 ++++++++++++-------------- backends/candle/Cargo.toml | 1 + backends/candle/src/compute_cap.rs | 58 ++++++++++--------------- backends/candle/src/flash_attn.rs | 20 ++++++++- backends/candle/src/layers/cublaslt.rs | 34 +++++++++------ backends/candle/src/lib.rs | 39 +++++++++++++---- backends/candle/src/models/bert.rs | 8 ++-- router/src/http/server.rs | 4 +- router/tests/common.rs | 1 + sagemaker-entrypoint.sh | 2 +- 11 files changed, 132 insertions(+), 96 deletions(-) diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml index 50e93e14..7e02ba28 100644 --- a/.github/workflows/build_all.yaml +++ b/.github/workflows/build_all.yaml @@ -3,6 +3,8 @@ on: workflow_dispatch: push: + branches: + - 'main' tags: - 'v*' diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index aa9fe1f9..c7ed2e5b 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -33,7 +33,7 @@ FROM base-builder AS builder ARG GIT_SHA ARG DOCKER_LABEL -ARG VERTEX +ARG VERTEX="false" # sccache specific variables ARG ACTIONS_CACHE_URL @@ -41,41 +41,38 @@ ARG ACTIONS_RUNTIME_TOKEN ARG SCCACHE_GHA_ENABLED # limit the number of kernels built at the same time -ARG RAYON_NUM_THREADS=2 +ARG RAYON_NUM_THREADS=4 WORKDIR /usr/src COPY --from=planner /usr/src/recipe.json recipe.json -FROM builder as builder-75 - RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=75 cargo chef cook --release --features google --features candle-cuda-turing --features http --no-default-features --recipe-path recipe.json && sccache -s; \ + cargo chef cook --release --features google --recipe-path recipe.json && sccache -s; \ else \ - CUDA_COMPUTE_CAP=75 cargo chef cook --release --features candle-cuda-turing --no-default-features --features http --recipe-path recipe.json && sccache -s; \ + cargo chef cook --release --recipe-path recipe.json && sccache -s; \ fi; -COPY backends backends -COPY core core -COPY router router -COPY Cargo.toml ./ -COPY Cargo.lock ./ - RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http -F google --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo chef cook --release --features google --features candle-cuda-turing --recipe-path recipe.json && sccache -s; \ else \ - CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo chef cook --release --features candle-cuda-turing --recipe-path recipe.json && sccache -s; \ fi; -FROM builder as builder-80 +RUN if [ $VERTEX = "true" ]; \ + then \ + CUDA_COMPUTE_CAP=80 cargo chef cook --release --features google --features candle-cuda --recipe-path recipe.json && sccache -s; \ + else \ + CUDA_COMPUTE_CAP=80 cargo chef cook --release --features candle-cuda --recipe-path recipe.json && sccache -s; \ + fi; RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=80 cargo chef cook --release --features google --features candle-cuda --features http --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo chef cook --release --features google --features candle-cuda --recipe-path recipe.json && sccache -s; \ else \ - CUDA_COMPUTE_CAP=80 cargo chef cook --release --features candle-cuda --no-default-features --features http --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo chef cook --release --features candle-cuda --recipe-path recipe.json && sccache -s; \ fi; COPY backends backends @@ -86,33 +83,31 @@ COPY Cargo.lock ./ RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda -F http -F google --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F google && sccache -s; \ else \ - CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing && sccache -s; \ fi; -FROM builder as builder-90 +RUN mv /usr/src/target/release/text-embeddings-router /usr/src/target/release/text-embeddings-router-75 RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=90 cargo chef cook --release --features google --features candle-cuda --features http --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda -F google && sccache -s; \ else \ - CUDA_COMPUTE_CAP=90 cargo chef cook --release --features candle-cuda --features http --no-default-features --recipe-path recipe.json && sccache -s; \ + CUDA_COMPUTE_CAP=80 cargo build --release --bin text-embeddings-router -F candle-cuda && sccache -s; \ fi; -COPY backends backends -COPY core core -COPY router router -COPY Cargo.toml ./ -COPY Cargo.lock ./ +RUN mv /usr/src/target/release/text-embeddings-router /usr/src/target/release/text-embeddings-router-80 RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda -F http -F google --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda -F google && sccache -s; \ else \ - CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda -F http --no-default-features && sccache -s; \ + CUDA_COMPUTE_CAP=90 cargo build --release --bin text-embeddings-router -F candle-cuda && sccache -s; \ fi; +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 ARG DEFAULT_USE_FLASH_ATTENTION=True @@ -121,9 +116,9 @@ ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 \ USE_FLASH_ATTENTION=$DEFAULT_USE_FLASH_ATTENTION -COPY --from=builder-75 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-75 -COPY --from=builder-80 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-80 -COPY --from=builder-90 /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router-90 +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 # Amazon SageMaker compatible image FROM base AS sagemaker diff --git a/backends/candle/Cargo.toml b/backends/candle/Cargo.toml index f80998f4..f8967709 100644 --- a/backends/candle/Cargo.toml +++ b/backends/candle/Cargo.toml @@ -6,6 +6,7 @@ authors.workspace = true homepage.workspace = true [dependencies] +anyhow = "^1.0" 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 } diff --git a/backends/candle/src/compute_cap.rs b/backends/candle/src/compute_cap.rs index a1c391ee..ac79fcf1 100644 --- a/backends/candle/src/compute_cap.rs +++ b/backends/candle/src/compute_cap.rs @@ -1,41 +1,26 @@ +use anyhow::Context; +use candle::cuda_backend::cudarc::driver; use candle::cuda_backend::cudarc::driver::sys::CUdevice_attribute::{ CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, }; use candle::cuda_backend::cudarc::driver::CudaDevice; -use std::sync::Once; -static INIT: Once = Once::new(); -static mut RUNTIME_COMPUTE_CAP: usize = 0; -static mut COMPILE_COMPUTE_CAP: usize = 0; - -fn init_compute_caps() { - unsafe { - INIT.call_once(|| { - let device = CudaDevice::new(0).expect("cuda is not available"); - let major = device - .attribute(CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR) - .unwrap(); - let minor = device - .attribute(CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR) - .unwrap(); - RUNTIME_COMPUTE_CAP = (major * 10 + minor) as usize; - COMPILE_COMPUTE_CAP = env!("CUDA_COMPUTE_CAP").parse::().unwrap(); - }); - } -} - -pub fn get_compile_compute_cap() -> usize { - unsafe { - init_compute_caps(); - COMPILE_COMPUTE_CAP - } +pub fn get_compile_compute_cap() -> Result { + env!("CUDA_COMPUTE_CAP") + .parse::() + .context("Could not retrieve compile time CUDA_COMPUTE_CAP") } -pub fn get_runtime_compute_cap() -> usize { - unsafe { - init_compute_caps(); - RUNTIME_COMPUTE_CAP - } +pub fn get_runtime_compute_cap() -> Result { + driver::result::init().context("CUDA is not available")?; + let device = CudaDevice::new(0).context("CUDA is not available")?; + let major = device + .attribute(CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR) + .context("Could not retrieve device compute capability major")?; + let minor = device + .attribute(CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR) + .context("Could not retrieve device compute capability minor")?; + Ok((major * 10 + minor) as usize) } fn compute_cap_matching(runtime_compute_cap: usize, compile_compute_cap: usize) -> bool { @@ -49,10 +34,13 @@ fn compute_cap_matching(runtime_compute_cap: usize, compile_compute_cap: usize) } } -pub fn incompatible_compute_cap() -> bool { - let compile_compute_cap = get_compile_compute_cap(); - let runtime_compute_cap = get_runtime_compute_cap(); - !compute_cap_matching(runtime_compute_cap, compile_compute_cap) +pub fn compatible_compute_cap() -> Result { + let compile_compute_cap = get_compile_compute_cap()?; + let runtime_compute_cap = get_runtime_compute_cap()?; + Ok(compute_cap_matching( + runtime_compute_cap, + compile_compute_cap, + )) } #[cfg(test)] diff --git a/backends/candle/src/flash_attn.rs b/backends/candle/src/flash_attn.rs index 556fd375..3afc6517 100644 --- a/backends/candle/src/flash_attn.rs +++ b/backends/candle/src/flash_attn.rs @@ -1,5 +1,23 @@ -use crate::compute_cap::get_runtime_compute_cap; use candle::Tensor; +use std::sync::Once; + +static INIT: Once = Once::new(); +static mut RUNTIME_COMPUTE_CAP: usize = 0; +fn init_runtime_compute_cap() { + unsafe { + INIT.call_once(|| { + use crate::compute_cap::get_runtime_compute_cap; + RUNTIME_COMPUTE_CAP = get_runtime_compute_cap().unwrap(); + }); + } +} + +pub fn get_runtime_compute_cap() -> usize { + unsafe { + init_runtime_compute_cap(); + RUNTIME_COMPUTE_CAP + } +} #[allow(clippy::too_many_arguments, unused)] pub(crate) fn flash_attn_varlen( diff --git a/backends/candle/src/layers/cublaslt.rs b/backends/candle/src/layers/cublaslt.rs index e35601e8..bfa2d182 100644 --- a/backends/candle/src/layers/cublaslt.rs +++ b/backends/candle/src/layers/cublaslt.rs @@ -11,21 +11,27 @@ static mut CUBLASLT: Option = None; pub fn get_cublas_lt_wrapper() -> Option<&'static CublasLtWrapper> { unsafe { INIT.call_once(|| { - CUBLASLT = match Device::cuda_if_available(0) { - Ok(device) => { - #[cfg(feature = "cuda")] - { - Some(CublasLtWrapper { + #[cfg(not(feature = "cuda"))] + { + CUBLASLT = None; + } + + #[cfg(feature = "cuda")] + { + // Check if we can call the driver + // Then check if we can create a device + // Then check that the device is CUDA + use candle::cuda_backend::cudarc::driver; + CUBLASLT = driver::result::init() + .ok() + .and_then(|_| Device::cuda_if_available(0).ok()) + .and_then(|device| match device { + Device::Cuda(_) => Some(CublasLtWrapper { cublaslt: CublasLt::new(&device).unwrap(), - }) - } - #[cfg(not(feature = "cuda"))] - { - None - } - } - Err(_) => None, - }; + }), + _ => None, + }); + } }); CUBLASLT.as_ref() } diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index 9b9ab832..241504d0 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -8,7 +8,7 @@ mod models; #[cfg(feature = "cuda")] use crate::compute_cap::{ - get_compile_compute_cap, get_runtime_compute_cap, incompatible_compute_cap, + compatible_compute_cap, get_compile_compute_cap, get_runtime_compute_cap, }; use crate::models::{ BertModel, DistilBertConfig, DistilBertModel, JinaBertModel, Model, NomicBertModel, @@ -43,6 +43,7 @@ enum Config { } pub struct CandleBackend { + device: Device, model: Box, } @@ -61,14 +62,23 @@ impl CandleBackend { // Get candle device let device = if candle::utils::cuda_is_available() { #[cfg(feature = "cuda")] - if incompatible_compute_cap() { - return Err(BackendError::Start(format!( - "Runtime compute cap {} is not compatible with compile time compute cap {}", - get_runtime_compute_cap(), - get_compile_compute_cap() - ))); + match compatible_compute_cap() { + Ok(true) => Device::new_cuda(0), + Ok(false) => { + return Err(BackendError::Start(format!( + "Runtime compute cap {} is not compatible with compile time compute cap {}", + get_runtime_compute_cap().unwrap(), + get_compile_compute_cap().unwrap() + ))) + } + Err(err) => { + tracing::warn!("Could not find a compatible CUDA device on host: {err}"); + tracing::warn!("Using CPU instead"); + Ok(Device::Cpu) + } } - Device::new_cuda(0) + #[cfg(not(feature = "cuda"))] + Ok(Device::Cpu) } else if candle::utils::metal_is_available() { Device::new_metal(0) } else { @@ -225,11 +235,22 @@ impl CandleBackend { } }; - Ok(Self { model: model? }) + Ok(Self { + device, + model: model?, + }) } } impl Backend for CandleBackend { + fn max_batch_size(&self) -> Option { + // Limit max batch size to 4 on CPU + if matches!(self.device, Device::Cpu) { + return Some(4); + } + None + } + fn health(&self) -> Result<(), BackendError> { Ok(()) } diff --git a/backends/candle/src/models/bert.rs b/backends/candle/src/models/bert.rs index 200e41de..d12d90d2 100644 --- a/backends/candle/src/models/bert.rs +++ b/backends/candle/src/models/bert.rs @@ -405,13 +405,14 @@ impl ClassificationHead for BertClassificationHead { fn forward(&self, hidden_states: &Tensor) -> Result { let _enter = self.span.enter(); - let mut hidden_states = hidden_states.clone(); + let mut hidden_states = hidden_states.unsqueeze(1)?; if let Some(pooler) = self.pooler.as_ref() { hidden_states = pooler.forward(&hidden_states)?; hidden_states = hidden_states.tanh()?; } let hidden_states = self.output.forward(&hidden_states)?; + let hidden_states = hidden_states.squeeze(1)?; Ok(hidden_states) } } @@ -453,10 +454,11 @@ impl ClassificationHead for RobertaClassificationHead { fn forward(&self, hidden_states: &Tensor) -> Result { let _enter = self.span.enter(); - let hidden_states = self.intermediate.forward(hidden_states)?; + let hidden_states = hidden_states.unsqueeze(1)?; + let hidden_states = self.intermediate.forward(&hidden_states)?; let hidden_states = hidden_states.tanh()?; let hidden_states = self.output.forward(&hidden_states)?; - + let hidden_states = hidden_states.squeeze(1)?; Ok(hidden_states) } } diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 6c48ad3e..1832abf1 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1548,7 +1548,9 @@ pub async fn run( } // Run server - let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + let listener = tokio::net::TcpListener::bind(&addr) + .await + .context(format!("Could not bind TCP Listener on {addr}"))?; tracing::info!("Starting HTTP server: {}", &addr); tracing::info!("Ready"); diff --git a/router/tests/common.rs b/router/tests/common.rs index 29331188..f9c47c94 100644 --- a/router/tests/common.rs +++ b/router/tests/common.rs @@ -55,6 +55,7 @@ pub async fn start_server(model_id: String, revision: Option, dtype: DTy 1024, None, 32, + false, None, None, 8090, diff --git a/sagemaker-entrypoint.sh b/sagemaker-entrypoint.sh index 8d78a8dc..b6cec7bb 100644 --- a/sagemaker-entrypoint.sh +++ b/sagemaker-entrypoint.sh @@ -10,4 +10,4 @@ if [[ -n "${HF_MODEL_REVISION}" ]]; then export REVISION="${HF_MODEL_REVISION}" fi -text-embeddings-router --port 8080 --json-output \ No newline at end of file +text-embeddings-router --port 8080 --json-output From cc1c510e8d8af8447c01e6b14c417473cf2dfda9 Mon Sep 17 00:00:00 2001 From: OlivierDehaene <23298448+OlivierDehaene@users.noreply.github.com> Date: Thu, 25 Apr 2024 10:47:38 +0200 Subject: [PATCH 30/72] v1.2.3 --- Cargo.lock | 150 +++++++++++++++++++++++----------------------- Cargo.toml | 2 +- docs/openapi.json | 2 +- 3 files changed, 77 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8bb1d6a..cbb40bd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,7 +135,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -146,7 +146,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -275,7 +275,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.2.2" +version = "1.2.3" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -403,7 +403,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -558,9 +558,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" [[package]] name = "cfg-if" @@ -613,7 +613,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -789,7 +789,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -811,7 +811,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -875,7 +875,7 @@ dependencies = [ "darling 0.20.8", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -895,7 +895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core 0.20.0", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -978,7 +978,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -1084,7 +1084,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -1164,7 +1164,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -1832,9 +1832,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libmimalloc-sys" -version = "0.1.35" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3979b5c37ece694f1f5e51e7ecc871fdb0f517ed04ee45f88d15d6d553cb9664" +checksum = "81eb4061c0582dedea1cbc7aff2240300dd6982e0239d1c99e65c1dbf4a30ba7" dependencies = [ "cc", "libc", @@ -1995,7 +1995,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -2015,9 +2015,9 @@ dependencies = [ [[package]] name = "mimalloc" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa01922b5ea280a911e323e4d2fd24b7fe5cc4042e0d2cda3c40775cdc4bdc9c" +checksum = "9f41a2280ded0da56c8cf898babb86e8f10651a34adcfff190ae9a1159c6908d" dependencies = [ "libmimalloc-sys", ] @@ -2082,7 +2082,7 @@ checksum = "bf307cbbbd777a9c10cec88ddafee572b3484caad5cce0c9236523c3803105a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -2311,7 +2311,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -2595,7 +2595,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -2651,7 +2651,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" dependencies = [ "proc-macro2", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -2680,9 +2680,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.80" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -2746,7 +2746,7 @@ dependencies = [ "prost 0.12.4", "prost-types 0.12.4", "regex", - "syn 2.0.59", + "syn 2.0.60", "tempfile", ] @@ -2773,7 +2773,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -3056,7 +3056,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.59", + "syn 2.0.60", "walkdir", ] @@ -3078,9 +3078,9 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", @@ -3091,9 +3091,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring", @@ -3114,15 +3114,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" +checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" dependencies = [ "ring", "rustls-pki-types", @@ -3206,22 +3206,22 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -3310,7 +3310,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -3335,9 +3335,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -3445,9 +3445,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.59" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -3474,7 +3474,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -3537,7 +3537,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.2.2" +version = "1.2.3" dependencies = [ "clap", "text-embeddings-backend-candle", @@ -3549,7 +3549,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.2.2" +version = "1.2.3" dependencies = [ "accelerate-src", "anyhow", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.2.2" +version = "1.2.3" dependencies = [ "clap", "nohash-hasher", @@ -3588,7 +3588,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.2.2" +version = "1.2.3" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3602,7 +3602,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.2.2" +version = "1.2.3" dependencies = [ "hf-hub", "metrics", @@ -3615,7 +3615,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.2.2" +version = "1.2.3" dependencies = [ "anyhow", "async-stream", @@ -3660,22 +3660,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -3804,7 +3804,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -3865,9 +3865,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ "indexmap 2.2.6", "serde", @@ -3954,7 +3954,7 @@ dependencies = [ "proc-macro2", "prost-build 0.12.4", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -4051,7 +4051,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -4324,7 +4324,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -4382,7 +4382,7 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -4449,7 +4449,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", "wasm-bindgen-shared", ] @@ -4483,7 +4483,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4553,11 +4553,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4773,7 +4773,7 @@ checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", "synstructure", ] @@ -4794,7 +4794,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", ] [[package]] @@ -4814,15 +4814,15 @@ checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.60", "synstructure", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" [[package]] name = "zip" diff --git a/Cargo.toml b/Cargo.toml index f392fb9b..7d7be46e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.2.2" +version = "1.2.3" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" diff --git a/docs/openapi.json b/docs/openapi.json index 62c2d1c7..7368145e 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." + "version": "1.2.3" }, "paths": { "/decode": { From a7e128b63dc6b08fe6eb3818122e2db1668a60b0 Mon Sep 17 00:00:00 2001 From: Guillaume LEGENDRE Date: Fri, 17 May 2024 08:35:18 +0200 Subject: [PATCH 31/72] Ci migration to K8s (#269) --- .github/workflows/build_75.yaml | 4 ++-- .github/workflows/build_80.yaml | 4 ++-- .github/workflows/build_86.yaml | 4 ++-- .github/workflows/build_89.yaml | 4 ++-- .github/workflows/build_90.yaml | 4 ++-- .github/workflows/build_all.yaml | 4 ++-- .github/workflows/build_cpu.yaml | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build_75.yaml b/.github/workflows/build_75.yaml index 609a73c7..59d592c4 100644 --- a/.github/workflows/build_75.yaml +++ b/.github/workflows/build_75.yaml @@ -13,7 +13,7 @@ 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, tgi-ci] + runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] permissions: contents: write packages: write @@ -37,7 +37,7 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - name: Tailscale - uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + uses: huggingface/tailscale-action@v1 with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - name: Login to GitHub Container Registry diff --git a/.github/workflows/build_80.yaml b/.github/workflows/build_80.yaml index 2b231146..fcee1784 100644 --- a/.github/workflows/build_80.yaml +++ b/.github/workflows/build_80.yaml @@ -25,7 +25,7 @@ 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, tgi-ci] + runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] permissions: contents: write packages: write @@ -49,7 +49,7 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - name: Tailscale - uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + uses: huggingface/tailscale-action@v1 with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - name: Login to GitHub Container Registry diff --git a/.github/workflows/build_86.yaml b/.github/workflows/build_86.yaml index 5c8f0838..4c9cb02f 100644 --- a/.github/workflows/build_86.yaml +++ b/.github/workflows/build_86.yaml @@ -13,7 +13,7 @@ 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, tgi-ci] + runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] permissions: contents: write packages: write @@ -37,7 +37,7 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - name: Tailscale - uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + uses: huggingface/tailscale-action@v1 with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - name: Login to GitHub Container Registry diff --git a/.github/workflows/build_89.yaml b/.github/workflows/build_89.yaml index 7371708f..cc7d171e 100644 --- a/.github/workflows/build_89.yaml +++ b/.github/workflows/build_89.yaml @@ -13,7 +13,7 @@ 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, tgi-ci] + runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] permissions: contents: write packages: write @@ -37,7 +37,7 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - name: Tailscale - uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + uses: huggingface/tailscale-action@v1 with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - name: Login to GitHub Container Registry diff --git a/.github/workflows/build_90.yaml b/.github/workflows/build_90.yaml index a7e8617d..1c468bfa 100644 --- a/.github/workflows/build_90.yaml +++ b/.github/workflows/build_90.yaml @@ -13,7 +13,7 @@ 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, tgi-ci] + runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] permissions: contents: write packages: write @@ -37,7 +37,7 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - name: Tailscale - uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + uses: huggingface/tailscale-action@v1 with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - name: Login to GitHub Container Registry diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml index 7e02ba28..36042cd0 100644 --- a/.github/workflows/build_all.yaml +++ b/.github/workflows/build_all.yaml @@ -13,7 +13,7 @@ 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, tgi-ci] + runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] permissions: contents: write packages: write @@ -31,7 +31,7 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - name: Tailscale - uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + uses: huggingface/tailscale-action@v1 with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - name: Login to GitHub Container Registry diff --git a/.github/workflows/build_cpu.yaml b/.github/workflows/build_cpu.yaml index 205101f2..ce61ef7f 100644 --- a/.github/workflows/build_cpu.yaml +++ b/.github/workflows/build_cpu.yaml @@ -25,7 +25,7 @@ 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, tgi-ci] + runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] permissions: contents: write packages: write @@ -49,7 +49,7 @@ - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v4.4.1 - name: Tailscale - uses: tailscale/github-action@7bd8039bf25c23c4ab1b8d6e2cc2da2280601966 + uses: huggingface/tailscale-action@v1 with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - name: Login to GitHub Container Registry From 96ed3cd63d931f179c1d69177538d79a9c6e3a64 Mon Sep 17 00:00:00 2001 From: Haixin Wang <98612668+haixiw@users.noreply.github.com> Date: Thu, 30 May 2024 01:29:44 -0700 Subject: [PATCH 32/72] chore: map compute_cap from GPU name (#276) --- sagemaker-entrypoint-cuda-all.sh | 51 +++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/sagemaker-entrypoint-cuda-all.sh b/sagemaker-entrypoint-cuda-all.sh index 16156e8a..4cf645ff 100644 --- a/sagemaker-entrypoint-cuda-all.sh +++ b/sagemaker-entrypoint-cuda-all.sh @@ -1,5 +1,26 @@ #!/bin/bash +verlte() { + [ "$1" = "$2" ] && return 1 || [ "$2" = "$(echo -e "$1\n$2" | sort -V | head -n1)" ] +} + +if [ -f /usr/local/cuda/compat/libcuda.so.1 ]; then + CUDA_COMPAT_MAX_DRIVER_VERSION=$(readlink /usr/local/cuda/compat/libcuda.so.1 | cut -d"." -f 3-) + echo "CUDA compat package requires Nvidia driver ≤${CUDA_COMPAT_MAX_DRIVER_VERSION}" + cat /proc/driver/nvidia/version + NVIDIA_DRIVER_VERSION=$(sed -n 's/^NVRM.*Kernel Module *\([0-9.]*\).*$/\1/p' /proc/driver/nvidia/version 2>/dev/null || true) + echo "Current installed Nvidia driver version is ${NVIDIA_DRIVER_VERSION}" + if [ $(verlte "$CUDA_COMPAT_MAX_DRIVER_VERSION" "$NVIDIA_DRIVER_VERSION") ]; then + echo "Setup CUDA compatibility libs path to LD_LIBRARY_PATH" + export LD_LIBRARY_PATH=/usr/local/cuda/compat:$LD_LIBRARY_PATH + echo $LD_LIBRARY_PATH + else + echo "Skip CUDA compat libs setup as newer Nvidia driver is installed" + fi +else + echo "Skip CUDA compat libs setup as package not found" +fi + if [[ -z "${HF_MODEL_ID}" ]]; then echo "HF_MODEL_ID must be set" exit 1 @@ -15,9 +36,37 @@ if ! command -v nvidia-smi &> /dev/null; then exit 1 fi +# Query GPU name using nvidia-smi +gpu_name=$(nvidia-smi --query-gpu=gpu_name --format=csv | awk 'NR==2') +if [ $? -ne 0 ]; then + echo "Error: $gpu_name" + echo "Query gpu_name failed" +else + echo "Query gpu_name succeeded. Printing output: $gpu_name" +fi + +# Function to get compute capability based on GPU name +get_compute_cap() { + gpu_name="$1" + + # Check if the GPU name contains "A10G" + if [[ "$gpu_name" == *"A10G"* ]]; then + echo "86" + # Check if the GPU name contains "A100" + elif [[ "$gpu_name" == *"A100"* ]]; then + echo "80" + # Check if the GPU name contains "H100" + elif [[ "$gpu_name" == *"H100"* ]]; then + echo "90" + else + echo "80" # Default compute capability + fi +} + if [[ -z "${CUDA_COMPUTE_CAP}" ]] then - compute_cap=$(nvidia-smi --query-gpu=compute_cap --format=csv | sed -n '2p' | sed 's/\.//g') + compute_cap=$(get_compute_cap "$gpu_name") + echo "the compute_cap is $compute_cap" else compute_cap=$CUDA_COMPUTE_CAP fi From 32b6df5f75bd0f87ef634a3538658524c77891d6 Mon Sep 17 00:00:00 2001 From: Haixin Wang <98612668+haixiw@users.noreply.github.com> Date: Fri, 7 Jun 2024 01:04:32 -0700 Subject: [PATCH 33/72] chore: cover Nvidia T4/L4 GPU (#284) --- sagemaker-entrypoint-cuda-all.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sagemaker-entrypoint-cuda-all.sh b/sagemaker-entrypoint-cuda-all.sh index 4cf645ff..a3c63cbb 100644 --- a/sagemaker-entrypoint-cuda-all.sh +++ b/sagemaker-entrypoint-cuda-all.sh @@ -58,6 +58,12 @@ get_compute_cap() { # Check if the GPU name contains "H100" elif [[ "$gpu_name" == *"H100"* ]]; then echo "90" + # Cover Nvidia T4 + elif [[ "$gpu_name" == *"T4"* ]]; then + echo "75" + # Cover Nvidia L4 + elif [[ "$gpu_name" == *"L4"* ]]; then + echo "89" else echo "80" # Default compute capability fi From afd09c024a1d5107134b1d29ff08631c4cdb90bb Mon Sep 17 00:00:00 2001 From: Luc Georges Date: Mon, 17 Jun 2024 12:19:34 +0200 Subject: [PATCH 34/72] feat(ci): add trufflehog secrets detection (#286) --- .github/workflows/trufflehog.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/trufflehog.yml diff --git a/.github/workflows/trufflehog.yml b/.github/workflows/trufflehog.yml new file mode 100644 index 00000000..9cbbf680 --- /dev/null +++ b/.github/workflows/trufflehog.yml @@ -0,0 +1,15 @@ +on: + push: + +name: Secret Leaks + +jobs: + trufflehog: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Secret Scanning + uses: trufflesecurity/trufflehog@main From d25104464a31f7ba3788a5d7cec6ce67689c6a01 Mon Sep 17 00:00:00 2001 From: Lysandre Debut Date: Mon, 17 Jun 2024 12:19:47 +0200 Subject: [PATCH 35/72] Community contribution code of conduct (#291) --- CODE_OF_CONDUCT.md | 133 +++++++++++++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 111 +++++++++++++++++++++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..b23f3150 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +feedback@huggingface.co. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..57901164 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,111 @@ + + +# Contribute to text-embeddings-inference + +Everyone is welcome to contribute, and we value everybody's contribution. Code +contributions are not the only way to help the community. Answering questions, helping +others, and improving the documentation are also immensely valuable. + +It also helps us if you spread the word! Reference the library in blog posts +about the awesome projects it made possible, shout out on Twitter every time it has +helped you, or simply ⭐️ the repository to say thank you. + +However you choose to contribute, please be mindful and respect our +[code of conduct](https://github.com/huggingface/text-embeddings-inference/blob/main/CODE_OF_CONDUCT.md). + +**This guide was heavily inspired by the awesome [scikit-learn guide to contributing](https://github.com/scikit-learn/scikit-learn/blob/main/CONTRIBUTING.md).** + +## Ways to contribute + +There are several ways you can contribute to text-embeddings-inference. + +* Fix outstanding issues with the existing code. +* Submit issues related to bugs or desired new features. +* Contribute to the examples or to the documentation. + +> All contributions are equally valuable to the community. 🥰 + +## Fixing outstanding issues + +If you notice an issue with the existing code and have a fix in mind, feel free to [start contributing](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) and open +a Pull Request! + +## Submitting a bug-related issue or feature request + +Do your best to follow these guidelines when submitting a bug-related issue or a feature +request. It will make it easier for us to come back to you quickly and with good +feedback. + +### Did you find a bug? + +The text-embeddings-inference library is robust and reliable thanks to users who report the problems they encounter. + +Before you report an issue, we would really appreciate it if you could **make sure the bug was not +already reported** (use the search bar on GitHub under Issues). Your issue should also be related to bugs in the +library itself, and not your code. + +Once you've confirmed the bug hasn't already been reported, please include the following information in your issue so +we can quickly resolve it: + +* Your **OS type and version**, as well as your environment versions (versions of rust, python, and dependencies). +* A short, self-contained, code snippet that allows us to reproduce the bug. +* The *full* traceback if an exception is raised. +* Attach any other additional information, like screenshots, you think may help. + +### Do you want a new feature? + +If there is a new feature you'd like to see in text-embeddings-inference, please open an issue and describe: + +1. What is the *motivation* behind this feature? Is it related to a problem or frustration with the library? Is it + a feature related to something you need for a project? Is it something you worked on and think it could benefit + the community? + + Whatever it is, we'd love to hear about it! + +2. Describe your requested feature in as much detail as possible. The more you can tell us about it, the better + we'll be able to help you. +3. Provide a *code snippet* that demonstrates the feature's usage. +4. If the feature is related to a paper, please include a link. + +If your issue is well written we're already 80% of the way there by the time you create it. + +We have added [templates](https://github.com/huggingface/text-embeddings-inference/tree/main/.github/ISSUE_TEMPLATE) +to help you get started with your issue. + +## Do you want to implement a new model? + +New models are constantly released and if you want to implement a new model, please provide the following information: + +* A short description of the model and a link to the paper. +* Link to the implementation if it is open-sourced. +* Link to the model weights if they are available. + +If you are willing to contribute the model yourself, let us know so we can help you add it to text-embeddings-inference! + +## Do you want to add documentation? + +We're always looking for improvements to the documentation that make it more clear and accurate. Please let us know +how the documentation can be improved such as typos and any content that is missing, unclear or inaccurate. We'll be +happy to make the changes or help you make a contribution if you're interested! + +## I want to become a maintainer of the project. How do I get there? + +TGI is a project led and managed by Hugging Face as it powers our internal services. However, we are happy to have +motivated individuals from other organizations join us as maintainers with the goal of making TGI the best inference +service. + +If you are such an individual (or organization), please reach out to us and let's collaborate. From dbefcd816ce264036265911441bf14796d4f4ad2 Mon Sep 17 00:00:00 2001 From: Michael Feil <63565275+michaelfeil@users.noreply.github.com> Date: Mon, 17 Jun 2024 03:20:18 -0700 Subject: [PATCH 36/72] Update README.md (#277) --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cf08a3b8..aacc9459 100644 --- a/README.md +++ b/README.md @@ -87,11 +87,11 @@ models [here](https://huggingface.co/spaces/mteb/leaderboard). Example of supported sequence classification 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 From 1a5525c59fe6386a0515285213897023c2a302f5 Mon Sep 17 00:00:00 2001 From: Johannes Vass Date: Mon, 17 Jun 2024 17:07:05 +0200 Subject: [PATCH 37/72] Upgrade tokenizers to 0.19.1 to deal with breaking change in tokenizers (#266) Co-authored-by: Johannes Vass --- Cargo.lock | 86 +++++--------------------------------- backends/candle/Cargo.toml | 2 +- core/Cargo.toml | 2 +- router/Cargo.toml | 2 +- 4 files changed, 13 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cbb40bd1..e0424a3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -744,38 +744,14 @@ dependencies = [ "half", ] -[[package]] -name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] - [[package]] name = "darling" version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", -] - -[[package]] -name = "darling_core" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] @@ -792,24 +768,13 @@ dependencies = [ "syn 2.0.60", ] -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", -] - [[package]] name = "darling_macro" version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ - "darling_core 0.20.8", + "darling_core", "quote", "syn 2.0.60", ] @@ -836,34 +801,13 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "derive_builder" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" -dependencies = [ - "derive_builder_macro 0.12.0", -] - [[package]] name = "derive_builder" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" dependencies = [ - "derive_builder_macro 0.20.0", -] - -[[package]] -name = "derive_builder_core" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" -dependencies = [ - "darling 0.14.4", - "proc-macro2", - "quote", - "syn 1.0.109", + "derive_builder_macro", ] [[package]] @@ -872,29 +816,19 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" dependencies = [ - "darling 0.20.8", + "darling", "proc-macro2", "quote", "syn 2.0.60", ] -[[package]] -name = "derive_builder_macro" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" -dependencies = [ - "derive_builder_core 0.12.0", - "syn 1.0.109", -] - [[package]] name = "derive_builder_macro" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ - "derive_builder_core 0.20.0", + "derive_builder_core", "syn 2.0.60", ] @@ -2226,7 +2160,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e423c4f827362c0d8d8da4b1f571270f389ebde73bcd3240a3d23c6d6f61d0f0" dependencies = [ - "derive_builder 0.20.0", + "derive_builder", "getset", "serde", "serde_json", @@ -3738,12 +3672,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokenizers" -version = "0.15.2" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dd47962b0ba36e7fd33518fbf1754d136fd1474000162bbf2a8b5fcb2d3654d" +checksum = "e500fad1dd3af3d626327e6a3fe5050e664a6eaa4708b8ca92f1794aaf73e6fd" dependencies = [ "aho-corasick", - "derive_builder 0.12.0", + "derive_builder", "esaxx-rs", "getrandom", "itertools 0.12.1", diff --git a/backends/candle/Cargo.toml b/backends/candle/Cargo.toml index f8967709..9fb300b9 100644 --- a/backends/candle/Cargo.toml +++ b/backends/candle/Cargo.toml @@ -31,7 +31,7 @@ insta = { git = "https://github.com/OlivierDehaene/insta", rev = "f4f98c0410b91f is_close = "0.1.3" hf-hub = "0.3.2" anyhow = "1.0.75" -tokenizers = { version = "^0.15.0", default-features = false, features = ["onig", "esaxx_fast"] } +tokenizers = { version = "^0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } serial_test = "2.0.0" [build-dependencies] diff --git a/core/Cargo.toml b/core/Cargo.toml index de269bf4..0e83c744 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -10,6 +10,6 @@ hf-hub = { version = "^0.3.0", features = ["tokio"], default-features = false } metrics = "^0.21" text-embeddings-backend = { path = "../backends" } thiserror = "^1.0" -tokenizers = { version = "^0.15.2", default-features = false, features = ["onig", "esaxx_fast"] } +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"] } diff --git a/router/Cargo.toml b/router/Cargo.toml index ae10065c..84d5a2ca 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -32,7 +32,7 @@ reqwest = { version = "0.11.14", features = [] } serde = "1.0.152" serde_json = "1.0.93" thiserror = "1.0.38" -tokenizers = { version = "0.15.2", default-features=false, features=["onig", "esaxx_fast"] } +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" From 7e55c61c2a39612ade5db9b929ffc883913ae0f3 Mon Sep 17 00:00:00 2001 From: Hyeongchan Kim Date: Tue, 18 Jun 2024 00:30:18 +0900 Subject: [PATCH 38/72] Add env for OTLP service name (#285) --- README.md | 6 ++++++ .../server/text_embeddings_server/cli.py | 3 ++- .../text_embeddings_server/utils/tracing.py | 6 ++---- backends/python/src/lib.rs | 10 ++++++++-- backends/python/src/management.rs | 20 +++++++++++-------- backends/src/lib.rs | 4 ++++ docs/source/en/cli_arguments.md | 6 ++++++ router/src/lib.rs | 2 ++ router/src/logging.rs | 8 ++++++-- router/src/main.rs | 13 ++++++++++-- router/tests/common.rs | 1 + 11 files changed, 60 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index aacc9459..30960206 100644 --- a/README.md +++ b/README.md @@ -252,6 +252,12 @@ Options: [env: OTLP_ENDPOINT=] + --otlp-service-name + The service name for opentelemetry. + + [env: OTLP_SERVICE_NAME=] + [default: text-embeddings-inference.server] + --cors-allow-origin [env: CORS_ALLOW_ORIGIN=] ``` diff --git a/backends/python/server/text_embeddings_server/cli.py b/backends/python/server/text_embeddings_server/cli.py index 4c627515..9497dc20 100644 --- a/backends/python/server/text_embeddings_server/cli.py +++ b/backends/python/server/text_embeddings_server/cli.py @@ -23,6 +23,7 @@ def serve( logger_level: str = "INFO", json_output: bool = False, otlp_endpoint: Optional[str] = None, + otlp_service_name: str = "text-embeddings-inference.server", ): # Remove default handler logger.remove() @@ -42,7 +43,7 @@ def serve( # Setup OpenTelemetry distributed tracing if otlp_endpoint is not None: - setup_tracing(otlp_endpoint=otlp_endpoint) + setup_tracing(otlp_endpoint=otlp_endpoint, otlp_service_name=otlp_service_name) # Downgrade enum into str for easier management later on dtype = None if dtype is None else dtype.value diff --git a/backends/python/server/text_embeddings_server/utils/tracing.py b/backends/python/server/text_embeddings_server/utils/tracing.py index 5a2bb3f7..9299e719 100644 --- a/backends/python/server/text_embeddings_server/utils/tracing.py +++ b/backends/python/server/text_embeddings_server/utils/tracing.py @@ -54,10 +54,8 @@ def _start_span(self, handler_call_details, context, set_status_on_exception=Fal ) -def setup_tracing(otlp_endpoint: str): - resource = Resource.create( - attributes={"service.name": f"text-embeddings-inference.server"} - ) +def setup_tracing(otlp_endpoint: str, otlp_service_name: str): + resource = Resource.create(attributes={"service.name": otlp_service_name}) span_exporter = OTLPSpanExporter(endpoint=otlp_endpoint, insecure=True) span_processor = BatchSpanProcessor(span_exporter) diff --git a/backends/python/src/lib.rs b/backends/python/src/lib.rs index f3519ee5..195f1d37 100644 --- a/backends/python/src/lib.rs +++ b/backends/python/src/lib.rs @@ -22,6 +22,7 @@ impl PythonBackend { model_type: ModelType, uds_path: String, otlp_endpoint: Option, + otlp_service_name: String, ) -> Result { match model_type { ModelType::Classifier => { @@ -37,8 +38,13 @@ impl PythonBackend { } }; - let backend_process = - management::BackendProcess::new(model_path, dtype, &uds_path, otlp_endpoint)?; + let backend_process = management::BackendProcess::new( + model_path, + dtype, + &uds_path, + otlp_endpoint, + otlp_service_name, + )?; let tokio_runtime = tokio::runtime::Builder::new_current_thread() .enable_all() .build() diff --git a/backends/python/src/management.rs b/backends/python/src/management.rs index ed0c851e..911c6984 100644 --- a/backends/python/src/management.rs +++ b/backends/python/src/management.rs @@ -21,6 +21,7 @@ impl BackendProcess { dtype: String, uds_path: &str, otlp_endpoint: Option, + otlp_service_name: String, ) -> Result { // Get UDS path let uds = Path::new(uds_path); @@ -33,21 +34,24 @@ impl BackendProcess { // Process args let mut python_server_args = vec![ model_path, - "--dtype".to_string(), + "--dtype".to_owned(), dtype, - "--uds-path".to_string(), - uds_path.to_string(), - "--logger-level".to_string(), - "INFO".to_string(), - "--json-output".to_string(), + "--uds-path".to_owned(), + uds_path.to_owned(), + "--logger-level".to_owned(), + "INFO".to_owned(), + "--json-output".to_owned(), ]; // OpenTelemetry if let Some(otlp_endpoint) = otlp_endpoint { - python_server_args.push("--otlp-endpoint".to_string()); + python_server_args.push("--otlp-endpoint".to_owned()); python_server_args.push(otlp_endpoint); } + python_server_args.push("--otlp-service-name".to_owned()); + python_server_args.push(otlp_service_name); + // Copy current process env let envs: Vec<(OsString, OsString)> = env::vars_os().collect(); @@ -64,7 +68,7 @@ impl BackendProcess { Err(err) => { if err.kind() == io::ErrorKind::NotFound { return Err(BackendError::Start( - "python-text-embeddings-server not found in PATH".to_string(), + "python-text-embeddings-server not found in PATH".to_owned(), )); } return Err(BackendError::Start(err.to_string())); diff --git a/backends/src/lib.rs b/backends/src/lib.rs index d7d271ee..d332b4a7 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -38,6 +38,7 @@ impl Backend { model_type: ModelType, uds_path: String, otlp_endpoint: Option, + otlp_service_name: String, ) -> Result { let (backend_sender, backend_receiver) = mpsc::unbounded_channel(); @@ -47,6 +48,7 @@ impl Backend { model_type.clone(), uds_path, otlp_endpoint, + otlp_service_name, )?; let padded_model = backend.is_padded(); let max_batch_size = backend.max_batch_size(); @@ -135,6 +137,7 @@ fn init_backend( model_type: ModelType, uds_path: String, otlp_endpoint: Option, + otlp_service_name: String, ) -> Result, BackendError> { if cfg!(feature = "candle") { #[cfg(feature = "candle")] @@ -154,6 +157,7 @@ fn init_backend( model_type, uds_path, otlp_endpoint, + otlp_service_name, ) }) .join() diff --git a/docs/source/en/cli_arguments.md b/docs/source/en/cli_arguments.md index c79b7f9c..5efa63cf 100644 --- a/docs/source/en/cli_arguments.md +++ b/docs/source/en/cli_arguments.md @@ -153,6 +153,12 @@ Options: [env: OTLP_ENDPOINT=] + --otlp-service-name + The service name for opentelemetry. + + [env: OTLP_SERVICE_NAME=] + [default: text-embeddings-inference.server] + --cors-allow-origin [env: CORS_ALLOW_ORIGIN=] ``` diff --git a/router/src/lib.rs b/router/src/lib.rs index 3801af8a..d2023515 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -60,6 +60,7 @@ pub async fn run( payload_limit: usize, api_key: Option, otlp_endpoint: Option, + otlp_service_name: String, cors_allow_origin: Option>, ) -> Result<()> { let model_id_path = Path::new(&model_id); @@ -198,6 +199,7 @@ pub async fn run( backend_model_type, uds_path.unwrap_or("/tmp/text-embeddings-inference-server".to_string()), otlp_endpoint.clone(), + otlp_service_name.clone(), ) .context("Could not create backend")?; backend diff --git a/router/src/logging.rs b/router/src/logging.rs index f8a6f0aa..7d5eb11e 100644 --- a/router/src/logging.rs +++ b/router/src/logging.rs @@ -10,7 +10,11 @@ use tracing_subscriber::{EnvFilter, Layer}; /// Init logging using env variables LOG_LEVEL and LOG_FORMAT: /// - otlp_endpoint is an optional URL to an Open Telemetry collector /// - LOG_LEVEL may be TRACE, DEBUG, INFO, WARN or ERROR (default to INFO) -pub fn init_logging(otlp_endpoint: Option<&String>, json_output: bool) -> bool { +pub fn init_logging( + otlp_endpoint: Option<&String>, + otlp_service_name: String, + json_output: bool, +) -> bool { let mut layers = Vec::new(); // STDOUT/STDERR layer @@ -40,7 +44,7 @@ pub fn init_logging(otlp_endpoint: Option<&String>, json_output: bool) -> bool { trace::config() .with_resource(Resource::new(vec![KeyValue::new( "service.name", - "text-embeddings-inference.router", + otlp_service_name, )])) .with_sampler(Sampler::AlwaysOn), ) diff --git a/router/src/main.rs b/router/src/main.rs index 06cd576a..2cdc7095 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -123,6 +123,11 @@ struct Args { #[clap(long, env)] otlp_endpoint: Option, + /// The service name for opentelemetry. + /// e.g. `text-embeddings-inference.server` + #[clap(default_value = "text-embeddings-inference.server", long, env)] + otlp_service_name: String, + /// Unused for gRPC servers #[clap(long, env)] cors_allow_origin: Option>, @@ -134,8 +139,11 @@ async fn main() -> Result<()> { let args: Args = Args::parse(); // Initialize logging and telemetry - let global_tracer = - text_embeddings_router::init_logging(args.otlp_endpoint.as_ref(), args.json_output); + let global_tracer = text_embeddings_router::init_logging( + args.otlp_endpoint.as_ref(), + args.otlp_service_name.clone(), + args.json_output, + ); tracing::info!("{args:?}"); @@ -158,6 +166,7 @@ async fn main() -> Result<()> { args.payload_limit, args.api_key, args.otlp_endpoint, + args.otlp_service_name, args.cors_allow_origin, ) .await?; diff --git a/router/tests/common.rs b/router/tests/common.rs index f9c47c94..c8669c12 100644 --- a/router/tests/common.rs +++ b/router/tests/common.rs @@ -64,6 +64,7 @@ pub async fn start_server(model_id: String, revision: Option, dtype: DTy 2_000_000, None, None, + "text-embeddings-inference.server".to_owned(), None, ) }); From a7043227d6bcc9c6ad3aa717281980a350986264 Mon Sep 17 00:00:00 2001 From: fxmarty <9808326+fxmarty@users.noreply.github.com> Date: Thu, 20 Jun 2024 17:31:39 +0200 Subject: [PATCH 39/72] Fix CI build timeout (#296) --- .github/workflows/build_75.yaml | 21 +++++++++++++++++---- .github/workflows/build_80.yaml | 21 +++++++++++++++++---- .github/workflows/build_86.yaml | 21 +++++++++++++++++---- .github/workflows/build_89.yaml | 21 +++++++++++++++++---- .github/workflows/build_90.yaml | 21 +++++++++++++++++---- .github/workflows/build_all.yaml | 20 ++++++++++++++++---- .github/workflows/build_cpu.yaml | 23 ++++++++++++++++++----- Dockerfile | 2 +- README.md | 4 ++-- 9 files changed, 122 insertions(+), 32 deletions(-) diff --git a/.github/workflows/build_75.yaml b/.github/workflows/build_75.yaml index 59d592c4..6d941d03 100644 --- a/.github/workflows/build_75.yaml +++ b/.github/workflows/build_75.yaml @@ -24,22 +24,30 @@ steps: - 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: 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: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v2 @@ -47,12 +55,14 @@ registry: ghcr.io 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 @@ -67,6 +77,7 @@ 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 @@ -87,6 +98,7 @@ 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 + - name: Extract metadata (tags, labels) for Docker id: meta-75-grpc uses: docker/metadata-action@v4.3.0 @@ -101,6 +113,7 @@ 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 diff --git a/.github/workflows/build_80.yaml b/.github/workflows/build_80.yaml index fcee1784..7a41c117 100644 --- a/.github/workflows/build_80.yaml +++ b/.github/workflows/build_80.yaml @@ -36,22 +36,30 @@ steps: - 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: 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: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v2 @@ -59,12 +67,14 @@ registry: ghcr.io 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 @@ -79,6 +89,7 @@ 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 @@ -98,6 +109,7 @@ 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 + - name: Extract metadata (tags, labels) for Docker id: meta-80-grpc uses: docker/metadata-action@v4.3.0 @@ -112,6 +124,7 @@ 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 diff --git a/.github/workflows/build_86.yaml b/.github/workflows/build_86.yaml index 4c9cb02f..16c182ec 100644 --- a/.github/workflows/build_86.yaml +++ b/.github/workflows/build_86.yaml @@ -24,22 +24,30 @@ steps: - 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: 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: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v2 @@ -47,12 +55,14 @@ registry: ghcr.io 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 @@ -67,6 +77,7 @@ 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 @@ -86,6 +97,7 @@ 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 + - name: Extract metadata (tags, labels) for Docker id: meta-86-grpc uses: docker/metadata-action@v4.3.0 @@ -100,6 +112,7 @@ 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 diff --git a/.github/workflows/build_89.yaml b/.github/workflows/build_89.yaml index cc7d171e..689838f6 100644 --- a/.github/workflows/build_89.yaml +++ b/.github/workflows/build_89.yaml @@ -24,22 +24,30 @@ steps: - 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: 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: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v2 @@ -47,12 +55,14 @@ registry: ghcr.io 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 @@ -67,6 +77,7 @@ 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 @@ -86,6 +97,7 @@ 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 + - name: Extract metadata (tags, labels) for Docker id: meta-89-grpc uses: docker/metadata-action@v4.3.0 @@ -100,6 +112,7 @@ 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 diff --git a/.github/workflows/build_90.yaml b/.github/workflows/build_90.yaml index 1c468bfa..40f05235 100644 --- a/.github/workflows/build_90.yaml +++ b/.github/workflows/build_90.yaml @@ -24,22 +24,30 @@ steps: - 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: 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: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v2 @@ -47,12 +55,14 @@ registry: ghcr.io 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 @@ -67,6 +77,7 @@ 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 @@ -86,6 +97,7 @@ 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 + - name: Extract metadata (tags, labels) for Docker id: meta-90-grpc uses: docker/metadata-action@v4.3.0 @@ -100,6 +112,7 @@ 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 diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml index 36042cd0..58aa7b09 100644 --- a/.github/workflows/build_all.yaml +++ b/.github/workflows/build_all.yaml @@ -24,16 +24,23 @@ steps: - 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: 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: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + - name: Login to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v2 @@ -41,12 +48,14 @@ registry: ghcr.io 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 @@ -61,6 +70,7 @@ 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 @@ -76,6 +86,7 @@ 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 @@ -89,6 +100,7 @@ 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 diff --git a/.github/workflows/build_cpu.yaml b/.github/workflows/build_cpu.yaml index ce61ef7f..3cf87f5a 100644 --- a/.github/workflows/build_cpu.yaml +++ b/.github/workflows/build_cpu.yaml @@ -36,22 +36,30 @@ steps: - name: Checkout repository uses: actions/checkout@v3 - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true + - 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: Tailscale - uses: huggingface/tailscale-action@v1 + uses: huggingface/tailscale-action@main with: authkey: ${{ secrets.TAILSCALE_AUTHKEY }} + + - 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 @@ -59,12 +67,14 @@ registry: ghcr.io 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 @@ -79,6 +89,7 @@ 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 @@ -97,6 +108,7 @@ 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 + - name: Extract metadata (tags, labels) for Docker id: meta-cpu-grpc uses: docker/metadata-action@v4.3.0 @@ -111,6 +123,7 @@ 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 diff --git a/Dockerfile b/Dockerfile index 625d165f..8c1368c0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /usr/src ENV SCCACHE=0.5.4 ENV RUSTC_WRAPPER=/usr/local/bin/sccache -# Donwload and configure sccache +# Donwload, 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 diff --git a/README.md b/README.md index 30960206..d7d2486a 100644 --- a/README.md +++ b/README.md @@ -89,9 +89,9 @@ Example of supported sequence classification 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-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) | +| Sentiment Analysis | RoBERTa | [SamLowe/roberta-base-go_emotions](https://huggingface.co/SamLowe/roberta-base-go_emotions) | ### Docker From 901a0d41648a8f58dc29ee78b41bd1aebe02c639 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 21 Jun 2024 11:45:29 +0200 Subject: [PATCH 40/72] fix(router): payload limit was not correctly applied (#298) --- router/src/http/server.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 1832abf1..ddf5d2bd 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1451,7 +1451,6 @@ pub async fn run( // Create router let mut app = Router::new() - .layer(DefaultBodyLimit::max(payload_limit)) .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", doc)) // Base routes .route("/info", get(get_model_info)) @@ -1474,7 +1473,9 @@ pub async fn run( // AWS Sagemaker health route .route("/ping", get(health)) // Prometheus metrics route - .route("/metrics", get(metrics)); + .route("/metrics", get(metrics)) + // Update payload limit + .layer(DefaultBodyLimit::max(payload_limit)); #[cfg(feature = "google")] { From 30a5f7e2a33010bf648dd6b86b371a1978a75b87 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 21 Jun 2024 14:03:42 +0200 Subject: [PATCH 41/72] feat(candle): better cuda error (#300) --- backends/candle/src/lib.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index 241504d0..11c9731e 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -18,6 +18,7 @@ use crate::models::{ use crate::models::{ FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashNomicBertModel, }; +use anyhow::Context; use candle::{DType, Device}; use candle_nn::VarBuilder; use models::BertConfig; @@ -55,9 +56,11 @@ impl CandleBackend { ) -> Result { // Load config let config: String = std::fs::read_to_string(model_path.join("config.json")) - .map_err(|err| BackendError::Start(err.to_string()))?; + .context("Unable to read config file") + .map_err(|err| BackendError::Start(format!("{err:?}")))?; let config: Config = serde_json::from_str(&config) - .map_err(|err| BackendError::Start(format!("Model is not supported: {}", err)))?; + .context("Model is not supported") + .map_err(|err| BackendError::Start(format!("{err:?}")))?; // Get candle device let device = if candle::utils::cuda_is_available() { @@ -72,7 +75,7 @@ impl CandleBackend { ))) } Err(err) => { - tracing::warn!("Could not find a compatible CUDA device on host: {err}"); + tracing::warn!("Could not find a compatible CUDA device on host: {err:?}"); tracing::warn!("Using CPU instead"); Ok(Device::Cpu) } From ce2f21009695df892abb60b19fba2f42646ad74e Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 21 Jun 2024 14:04:38 +0200 Subject: [PATCH 42/72] feat(router): add truncation direction parameter (#299) --- Cargo.toml | 10 +++- Dockerfile-cuda | 5 ++ Dockerfile-cuda-all | 4 +- core/src/infer.rs | 37 +++++++++++-- core/src/tokenization.rs | 15 ++++- proto/tei.proto | 12 ++++ router/src/grpc/server.rs | 112 +++++++++++++++++++++++++++++++++----- router/src/http/server.rs | 69 ++++++++++++++--------- router/src/http/types.rs | 16 ++++++ 9 files changed, 228 insertions(+), 52 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7d7be46e..2338c6f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,12 +24,18 @@ candle-transformers = { git = "https://github.com/OlivierDehaene/candle", rev = 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 -incremental = true lto = "fat" opt-level = 3 codegen-units = 1 strip = "symbols" panic = "abort" + +[profile.release-debug] +inherits = "release" +debug = 1 +lto = "thin" +codegen-units = 16 +strip = "none" +incremental = true diff --git a/Dockerfile-cuda b/Dockerfile-cuda index 990e4261..d67eba93 100644 --- a/Dockerfile-cuda +++ b/Dockerfile-cuda @@ -35,6 +35,11 @@ ARG CUDA_COMPUTE_CAP=80 ARG GIT_SHA ARG DOCKER_LABEL +# Limit parallelism +ARG RAYON_NUM_THREADS +ARG CARGO_BUILD_JOBS +ARG CARGO_BUILD_INCREMENTAL + # sccache specific variables ARG ACTIONS_CACHE_URL ARG ACTIONS_RUNTIME_TOKEN diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index c7ed2e5b..71321705 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -40,8 +40,10 @@ ARG ACTIONS_CACHE_URL ARG ACTIONS_RUNTIME_TOKEN ARG SCCACHE_GHA_ENABLED -# limit the number of kernels built at the same time +# Limit parallelism ARG RAYON_NUM_THREADS=4 +ARG CARGO_BUILD_JOBS +ARG CARGO_BUILD_INCREMENTAL WORKDIR /usr/src diff --git a/core/src/infer.rs b/core/src/infer.rs index 54f755d9..0f95ff8b 100644 --- a/core/src/infer.rs +++ b/core/src/infer.rs @@ -4,6 +4,7 @@ use crate::TextEmbeddingsError; use std::sync::Arc; use std::time::{Duration, Instant}; use text_embeddings_backend::{Backend, BackendError, Embedding, ModelType}; +use tokenizers::TruncationDirection; use tokio::sync::{mpsc, oneshot, watch, Notify, OwnedSemaphorePermit, Semaphore}; use tracing::instrument; @@ -117,6 +118,7 @@ impl Infer { &self, inputs: I, truncate: bool, + truncation_direction: TruncationDirection, permit: OwnedSemaphorePermit, ) -> Result { let start_time = Instant::now(); @@ -131,7 +133,14 @@ impl Infer { } let results = self - .embed(inputs, truncate, false, &start_time, permit) + .embed( + inputs, + truncate, + truncation_direction, + false, + &start_time, + permit, + ) .await?; let InferResult::AllEmbedding(response) = results else { @@ -165,6 +174,7 @@ impl Infer { &self, inputs: I, truncate: bool, + truncation_direction: TruncationDirection, permit: OwnedSemaphorePermit, ) -> Result { let start_time = Instant::now(); @@ -179,7 +189,14 @@ impl Infer { } let results = self - .embed(inputs, truncate, true, &start_time, permit) + .embed( + inputs, + truncate, + truncation_direction, + true, + &start_time, + permit, + ) .await?; let InferResult::PooledEmbedding(response) = results else { @@ -213,6 +230,7 @@ impl Infer { &self, inputs: I, truncate: bool, + truncation_direction: TruncationDirection, normalize: bool, permit: OwnedSemaphorePermit, ) -> Result { @@ -228,7 +246,14 @@ impl Infer { } let results = self - .embed(inputs, truncate, true, &start_time, permit) + .embed( + inputs, + truncate, + truncation_direction, + true, + &start_time, + permit, + ) .await?; let InferResult::PooledEmbedding(mut response) = results else { @@ -278,6 +303,7 @@ impl Infer { &self, inputs: I, truncate: bool, + truncation_direction: TruncationDirection, pooling: bool, start_time: &Instant, _permit: OwnedSemaphorePermit, @@ -296,7 +322,7 @@ impl Infer { // Tokenization let encoding = self .tokenization - .encode(inputs.into(), truncate) + .encode(inputs.into(), truncate, truncation_direction) .await .map_err(|err| { metrics::increment_counter!("te_request_failure", "err" => "tokenization"); @@ -340,6 +366,7 @@ impl Infer { &self, inputs: I, truncate: bool, + truncation_direction: TruncationDirection, raw_scores: bool, _permit: OwnedSemaphorePermit, ) -> Result { @@ -357,7 +384,7 @@ impl Infer { // Tokenization let encoding = self .tokenization - .encode(inputs.into(), truncate) + .encode(inputs.into(), truncate, truncation_direction) .await .map_err(|err| { metrics::increment_counter!("te_request_failure", "err" => "tokenization"); diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index 46f1411e..07226823 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -64,6 +64,7 @@ impl Tokenization { &self, inputs: EncodingInput, truncate: bool, + truncation_direction: TruncationDirection, ) -> Result { // Check if inputs is empty if inputs.is_empty() { @@ -80,6 +81,7 @@ impl Tokenization { .send(TokenizerRequest::Encode( inputs, truncate, + truncation_direction, response_sender, Span::current(), )) @@ -163,7 +165,13 @@ fn tokenizer_worker( // Loop over requests while let Some(request) = receiver.blocking_recv() { match request { - TokenizerRequest::Encode(inputs, truncate, response_tx, parent_span) => { + TokenizerRequest::Encode( + inputs, + truncate, + truncation_direction, + response_tx, + parent_span, + ) => { parent_span.in_scope(|| { if !response_tx.is_closed() { // It's possible that the user dropped its request resulting in a send error. @@ -171,6 +179,7 @@ fn tokenizer_worker( let _ = response_tx.send(encode_input( inputs, truncate, + truncation_direction, max_input_length, position_offset, &mut tokenizer, @@ -247,13 +256,14 @@ fn tokenize_input( fn encode_input( inputs: EncodingInput, truncate: bool, + truncation_direction: TruncationDirection, max_input_length: usize, position_offset: usize, tokenizer: &mut Tokenizer, ) -> Result { // Default truncation params let truncate_params = truncate.then_some(TruncationParams { - direction: TruncationDirection::Right, + direction: truncation_direction, max_length: max_input_length, strategy: TruncationStrategy::LongestFirst, stride: 0, @@ -316,6 +326,7 @@ enum TokenizerRequest { Encode( EncodingInput, bool, + TruncationDirection, oneshot::Sender>, Span, ), diff --git a/proto/tei.proto b/proto/tei.proto index 6538e34a..394c0262 100644 --- a/proto/tei.proto +++ b/proto/tei.proto @@ -69,10 +69,16 @@ message Metadata { uint64 inference_time_ns = 6; } +enum TruncationDirection { + TRUNCATION_DIRECTION_RIGHT = 0; + TRUNCATION_DIRECTION_LEFT = 1; +} + message EmbedRequest { string inputs = 1; bool truncate = 2; bool normalize = 3; + TruncationDirection truncation_direction = 4; } message EmbedResponse { @@ -83,6 +89,7 @@ message EmbedResponse { message EmbedSparseRequest { string inputs = 1; bool truncate = 2; + TruncationDirection truncation_direction = 3; } message SparseValue { @@ -98,6 +105,7 @@ message EmbedSparseResponse { message EmbedAllRequest { string inputs = 1; bool truncate = 2; + TruncationDirection truncation_direction = 3; } message TokenEmbedding { @@ -113,12 +121,14 @@ message PredictRequest { string inputs = 1; bool truncate = 2; bool raw_scores = 3; + TruncationDirection truncation_direction = 4; } message PredictPairRequest { repeated string inputs = 1; bool truncate = 2; bool raw_scores = 3; + TruncationDirection truncation_direction = 4; } message Prediction { @@ -137,6 +147,7 @@ message RerankRequest { bool truncate = 3; bool raw_scores = 4; bool return_text = 5; + TruncationDirection truncation_direction = 6; } message RerankStreamRequest{ @@ -147,6 +158,7 @@ message RerankStreamRequest{ bool raw_scores = 4; // The server will only consider the first value bool return_text = 5; + TruncationDirection truncation_direction = 6; } message Rank { diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index 913455b3..98ee5601 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -1,7 +1,7 @@ use crate::grpc::pb::tei::v1::{ EmbedAllRequest, EmbedAllResponse, EmbedSparseRequest, EmbedSparseResponse, EncodeRequest, EncodeResponse, PredictPairRequest, RerankStreamRequest, SimpleToken, SparseValue, - TokenEmbedding, + TokenEmbedding, TruncationDirection, }; use crate::grpc::{ DecodeRequest, DecodeResponse, EmbedRequest, EmbedResponse, InfoRequest, InfoResponse, @@ -80,9 +80,16 @@ impl TextEmbeddingsService { let start_time = Instant::now(); let compute_chars = request.inputs.chars().count(); + let truncation_direction = convert_truncation_direction(request.truncation_direction); let response = self .infer - .embed_pooled(request.inputs, request.truncate, request.normalize, permit) + .embed_pooled( + request.inputs, + request.truncate, + truncation_direction, + request.normalize, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -128,9 +135,15 @@ impl TextEmbeddingsService { let start_time = Instant::now(); let compute_chars = request.inputs.chars().count(); + let truncation_direction = convert_truncation_direction(request.truncation_direction); let response = self .infer - .embed_sparse(request.inputs, request.truncate, permit) + .embed_sparse( + request.inputs, + request.truncate, + truncation_direction, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -187,9 +200,15 @@ impl TextEmbeddingsService { let start_time = Instant::now(); let compute_chars = request.inputs.chars().count(); + let truncation_direction = convert_truncation_direction(request.truncation_direction); let response = self .infer - .embed_all(request.inputs, request.truncate, permit) + .embed_all( + request.inputs, + request.truncate, + truncation_direction, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -236,6 +255,7 @@ impl TextEmbeddingsService { &self, inputs: I, truncate: bool, + truncation_direction: tokenizers::TruncationDirection, raw_scores: bool, permit: OwnedSemaphorePermit, ) -> Result<(PredictResponse, ResponseMetadata), Status> { @@ -251,7 +271,7 @@ impl TextEmbeddingsService { let response = self .infer - .predict(inputs, truncate, raw_scores, permit) + .predict(inputs, truncate, truncation_direction, raw_scores, permit) .await .map_err(ErrorResponse::from)?; @@ -701,8 +721,15 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { .map_err(ErrorResponse::from)?; let request = request.into_inner(); + let truncation_direction = convert_truncation_direction(request.truncation_direction); let (response, metadata) = self - .predict_inner(request.inputs, request.truncate, request.raw_scores, permit) + .predict_inner( + request.inputs, + request.truncate, + truncation_direction, + request.raw_scores, + permit, + ) .await?; let headers = HeaderMap::from(metadata); @@ -743,8 +770,15 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { .try_acquire_permit() .map_err(ErrorResponse::from)?; + let truncation_direction = convert_truncation_direction(request.truncation_direction); let (response, metadata) = self - .predict_inner(inputs, request.truncate, request.raw_scores, permit) + .predict_inner( + inputs, + request.truncate, + truncation_direction, + request.raw_scores, + permit, + ) .await?; let headers = HeaderMap::from(metadata); @@ -767,8 +801,15 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { // Clone for move below let clone = self.clone(); let function = |req: PredictRequest, permit: OwnedSemaphorePermit| async move { + let truncation_direction = convert_truncation_direction(req.truncation_direction); clone - .predict_inner(req.inputs, req.truncate, req.raw_scores, permit) + .predict_inner( + req.inputs, + req.truncate, + truncation_direction, + req.raw_scores, + permit, + ) .await }; @@ -800,8 +841,15 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { } }; + let truncation_direction = convert_truncation_direction(req.truncation_direction); clone - .predict_inner(inputs, req.truncate, req.raw_scores, permit) + .predict_inner( + inputs, + req.truncate, + truncation_direction, + req.raw_scores, + permit, + ) .await }; @@ -862,12 +910,19 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { let rerank_inner = move |query: String, text: String, truncate: bool, + truncation_direction: tokenizers::TruncationDirection, raw_scores: bool, infer: Infer| async move { let permit = infer.acquire_permit().await; let response = infer - .predict((query, text), truncate, raw_scores, permit) + .predict( + (query, text), + truncate, + truncation_direction, + raw_scores, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -902,6 +957,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { let mut futures = Vec::with_capacity(batch_size); let query_chars = request.query.chars().count(); let mut total_compute_chars = query_chars * batch_size; + let truncation_direction = convert_truncation_direction(request.truncation_direction); for text in &request.texts { total_compute_chars += text.chars().count(); @@ -910,6 +966,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { request.query.clone(), text.clone(), request.truncate, + truncation_direction, request.raw_scores, local_infer, )) @@ -1027,11 +1084,18 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { query: String, text: String, truncate: bool, + truncation_direction: tokenizers::TruncationDirection, raw_scores: bool, infer: Infer, permit: OwnedSemaphorePermit| async move { let response = infer - .predict((query, text.clone()), truncate, raw_scores, permit) + .predict( + (query, text.clone()), + truncate, + truncation_direction, + raw_scores, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -1055,7 +1119,14 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { // Create bounded channel to have an upper bound of spawned tasks // We will have at most `max_parallel_stream_requests` messages from this stream in the queue let (rerank_sender, mut rerank_receiver) = mpsc::channel::<( - (usize, String, String, bool, bool), + ( + usize, + String, + String, + bool, + tokenizers::TruncationDirection, + bool, + ), oneshot::Sender< Result<(usize, usize, Duration, Duration, Duration, f32, String), ErrorResponse>, >, @@ -1066,8 +1137,10 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { // Background task that uses the bounded channel tokio::spawn(async move { - while let Some(((index, query, text, truncate, raw_scores), mut sender)) = - rerank_receiver.recv().await + while let Some(( + (index, query, text, truncate, truncation_direction, raw_scores), + mut sender, + )) = rerank_receiver.recv().await { // Wait on permit before spawning the task to avoid creating more tasks than needed let permit = local_infer.acquire_permit().await; @@ -1079,7 +1152,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { tokio::spawn(async move { // Select on closed to cancel work if the stream was closed tokio::select! { - result = rerank_inner(index, query, text, truncate, raw_scores, task_infer, permit) => { + result = rerank_inner(index, query, text, truncate, truncation_direction, raw_scores, task_infer, permit) => { let _ = sender.send(result); } _ = sender.closed() => {} @@ -1118,6 +1191,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { total_compute_chars += request.query.chars().count(); total_compute_chars += request.text.chars().count(); + let truncation_direction = convert_truncation_direction(request.truncation_direction); rerank_sender .send(( ( @@ -1125,6 +1199,7 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { request.query, request.text, request.truncate, + truncation_direction, raw_scores.unwrap(), ), result_sender, @@ -1434,3 +1509,10 @@ impl From for Status { Status::new(code, value.error) } } + +fn convert_truncation_direction(value: i32) -> tokenizers::TruncationDirection { + match TruncationDirection::try_from(value).expect("Unexpected enum value") { + TruncationDirection::Right => tokenizers::TruncationDirection::Right, + TruncationDirection::Left => tokenizers::TruncationDirection::Left, + } +} diff --git a/router/src/http/server.rs b/router/src/http/server.rs index ddf5d2bd..3e23991f 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -30,6 +30,7 @@ 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; @@ -103,7 +104,6 @@ async fn predict( // Closure for predict let predict_inner = move |inputs: Sequence, truncate: bool, - raw_scores: bool, infer: Infer, info: Info, permit: Option| async move { @@ -113,7 +113,13 @@ async fn predict( }; let response = infer - .predict(inputs, truncate, raw_scores, permit) + .predict( + inputs, + truncate, + req.truncation_direction, + req.raw_scores, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -159,15 +165,8 @@ async fn predict( 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, - req.raw_scores, - infer.0, - info.0, - Some(permit), - ) - .await?; + 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"); @@ -211,7 +210,6 @@ async fn predict( futures.push(predict_inner( input, truncate, - req.raw_scores, local_infer.0, local_info.0, None, @@ -321,15 +319,17 @@ async fn rerank( })?; // Closure for rerank - let rerank_inner = move |query: String, - text: String, - truncate: bool, - raw_scores: bool, - infer: Infer| async move { + let rerank_inner = move |query: String, text: String, truncate: bool, infer: Infer| async move { let permit = infer.acquire_permit().await; let response = infer - .predict((query, text), truncate, raw_scores, permit) + .predict( + (query, text), + truncate, + req.truncation_direction, + req.raw_scores, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -375,7 +375,6 @@ async fn rerank( req.query.clone(), text.clone(), truncate, - req.raw_scores, local_infer.0, )) } @@ -484,7 +483,13 @@ async fn embed( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_pooled(input, truncate, req.normalize, permit) + .embed_pooled( + input, + truncate, + req.truncation_direction, + req.normalize, + permit, + ) .await .map_err(ErrorResponse::from)?; @@ -541,7 +546,13 @@ async fn embed( futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer - .embed_pooled(input, truncate, req.normalize, permit) + .embed_pooled( + input, + truncate, + req.truncation_direction, + req.normalize, + permit, + ) .await }) } @@ -641,7 +652,7 @@ async fn embed_sparse( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_sparse(input, truncate, permit) + .embed_sparse(input, truncate, req.truncation_direction, permit) .await .map_err(ErrorResponse::from)?; @@ -697,7 +708,9 @@ async fn embed_sparse( let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; - let response = local_infer.embed_sparse(input, truncate, permit).await?; + let response = local_infer + .embed_sparse(input, truncate, req.truncation_direction, permit) + .await?; Ok((sparsify(response.results), response.metadata)) }) } @@ -789,7 +802,7 @@ async fn embed_all( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_all(input, truncate, permit) + .embed_all(input, truncate, req.truncation_direction, permit) .await .map_err(ErrorResponse::from)?; @@ -845,7 +858,9 @@ async fn embed_all( let local_infer = infer.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; - local_infer.embed_all(input, truncate, permit).await + local_infer + .embed_all(input, truncate, req.truncation_direction, permit) + .await }) } let results = join_all(futures) @@ -936,7 +951,7 @@ async fn openai_embed( let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_pooled(input, truncate, true, permit) + .embed_pooled(input, truncate, TruncationDirection::Right, true, permit) .await .map_err(ErrorResponse::from)?; @@ -997,7 +1012,7 @@ async fn openai_embed( futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer - .embed_pooled(input, truncate, true, permit) + .embed_pooled(input, truncate, TruncationDirection::Right, true, permit) .await }) } diff --git a/router/src/http/types.rs b/router/src/http/types.rs index be514d40..8655d00d 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -4,6 +4,7 @@ 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; @@ -199,6 +200,9 @@ pub(crate) struct PredictRequest { #[schema(default = "false", example = "false", nullable = true)] pub truncate: Option, #[serde(default)] + #[schema(default = "right", example = "right")] + pub truncation_direction: TruncationDirection, + #[serde(default)] #[schema(default = "false", example = "false")] pub raw_scores: bool, } @@ -228,6 +232,9 @@ pub(crate) struct RerankRequest { #[schema(default = "false", example = "false", nullable = true)] pub truncate: Option, #[serde(default)] + #[schema(default = "right", example = "right")] + pub truncation_direction: TruncationDirection, + #[serde(default)] #[schema(default = "false", example = "false")] pub raw_scores: bool, #[serde(default)] @@ -323,6 +330,9 @@ pub(crate) struct EmbedRequest { #[serde(default)] #[schema(default = "false", example = "false", nullable = true)] pub truncate: Option, + #[serde(default)] + #[schema(default = "right", example = "right")] + pub truncation_direction: TruncationDirection, #[serde(default = "default_normalize")] #[schema(default = "true", example = "true")] pub normalize: bool, @@ -342,6 +352,9 @@ pub(crate) struct EmbedSparseRequest { #[serde(default)] #[schema(default = "false", example = "false", nullable = true)] pub truncate: Option, + #[serde(default)] + #[schema(default = "right", example = "right")] + pub truncation_direction: TruncationDirection, } #[derive(Serialize, ToSchema)] @@ -359,6 +372,9 @@ pub(crate) struct EmbedAllRequest { #[serde(default)] #[schema(default = "false", example = "false", nullable = true)] pub truncate: Option, + #[serde(default)] + #[schema(default = "right", example = "right")] + pub truncation_direction: TruncationDirection, } #[derive(Serialize, ToSchema)] From b8f6c78cd832e1f25cc147edc20b59909978122b Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 21 Jun 2024 06:39:51 -0600 Subject: [PATCH 43/72] feat(candle): Support for Jina Code model (#292) --- README.md | 1 + backends/candle/src/lib.rs | 67 +- backends/candle/src/models.rs | 10 +- backends/candle/src/models/flash_jina.rs | 3 +- backends/candle/src/models/flash_jina_code.rs | 458 +++++++++++ backends/candle/src/models/jina.rs | 37 +- backends/candle/src/models/jina_code.rs | 728 +++++++++++++++++ ...test_flash_jina_code__jina_code_batch.snap | 772 ++++++++++++++++++ ...est_flash_jina_code__jina_code_single.snap | 772 ++++++++++++++++++ .../test_jina_code__jina_code_batch.snap | 772 ++++++++++++++++++ .../test_jina_code__jina_code_single.snap | 772 ++++++++++++++++++ backends/candle/tests/test_flash_jina.rs | 4 +- backends/candle/tests/test_flash_jina_code.rs | 53 ++ backends/candle/tests/test_jina_code.rs | 50 ++ docs/source/en/supported_models.md | 15 +- 15 files changed, 4477 insertions(+), 37 deletions(-) create mode 100644 backends/candle/src/models/flash_jina_code.rs create mode 100644 backends/candle/src/models/jina_code.rs create mode 100644 backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap create mode 100644 backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap create mode 100644 backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap create mode 100644 backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap create mode 100644 backends/candle/tests/test_flash_jina_code.rs create mode 100644 backends/candle/tests/test_jina_code.rs diff --git a/README.md b/README.md index d7d2486a..e9306fda 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Examples of supported models: | 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). diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index 11c9731e..27c5d843 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -11,12 +11,12 @@ use crate::compute_cap::{ compatible_compute_cap, get_compile_compute_cap, get_runtime_compute_cap, }; use crate::models::{ - BertModel, DistilBertConfig, DistilBertModel, JinaBertModel, Model, NomicBertModel, - NomicConfig, PositionEmbeddingType, + BertConfig, BertModel, DistilBertConfig, DistilBertModel, JinaConfig, JinaBertModel, JinaCodeConfig, JinaCodeBertModel, + Model, NomicBertModel, NomicConfig, }; #[cfg(feature = "cuda")] use crate::models::{ - FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashNomicBertModel, + FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashJinaCodeBertModel, FlashNomicBertModel, }; use anyhow::Context; use candle::{DType, Device}; @@ -37,6 +37,10 @@ enum Config { XlmRoberta(BertConfig), Camembert(BertConfig), Roberta(BertConfig), + #[serde(rename(deserialize = "jina_bert"))] + JinaBert(JinaConfig), + #[serde(rename(deserialize = "jina_code_bert"))] + JinaCodeBert(JinaCodeConfig), #[serde(rename(deserialize = "distilbert"))] DistilBert(DistilBertConfig), #[serde(rename(deserialize = "nomic_bert"))] @@ -120,13 +124,16 @@ impl CandleBackend { "`cuda` feature is not enabled".to_string(), )), (Config::Bert(config), Device::Cpu | Device::Metal(_)) => { - if config.position_embedding_type == PositionEmbeddingType::Alibi { - tracing::info!("Starting JinaBertModel model on {:?}", device); - Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) - } else { - tracing::info!("Starting Bert model on {:?}", device); - Ok(Box::new(BertModel::load(vb, &config, model_type).s()?)) - } + tracing::info!("Starting Bert model on {:?}", device); + Ok(Box::new(BertModel::load(vb, &config, model_type).s()?)) + } + (Config::JinaBert(config), Device::Cpu | Device::Metal(_)) => { + tracing::info!("Starting JinaBertModel model on {:?}", device); + Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) + } + (Config::JinaCodeBert(config), Device::Cpu | Device::Metal(_)) => { + tracing::info!("Starting JinaCodeBertModel model on {:?}", device); + Ok(Box::new(JinaCodeBertModel::load(vb, &config, model_type).s()?)) } ( Config::XlmRoberta(config) | Config::Camembert(config) | Config::Roberta(config), @@ -157,23 +164,43 @@ impl CandleBackend { && &std::env::var("USE_FLASH_ATTENTION").unwrap_or("True".to_string()).to_lowercase() == "true" { if config.position_embedding_type == PositionEmbeddingType::Alibi { - tracing::info!("Starting FlashJinaBertModel model on {:?}", device); - Ok(Box::new( - FlashJinaBertModel::load(vb, &config, model_type).s()?, - )) - } else { tracing::info!("Starting FlashBert model on {:?}", device); Ok(Box::new(FlashBertModel::load(vb, &config, model_type).s()?)) - } - } else { - if config.position_embedding_type == PositionEmbeddingType::Alibi { - tracing::info!("Starting JinaBertModel model on {:?}", device); - Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) } else { tracing::info!("Starting Bert model on {:?}", device); Ok(Box::new(BertModel::load(vb, &config, model_type).s()?)) } } + #[cfg(feature = "cuda")] + (Config::JinaBert(config), Device::Cuda(_)) => { + if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) + && dtype == DType::F16 + && ((config.position_embedding_type == PositionEmbeddingType::Absolute) | (config.position_embedding_type == PositionEmbeddingType::Alibi)) + // Allow disabling because of flash attention v1 precision problems + // See: https://github.com/huggingface/text-embeddings-inference/issues/37 + && &std::env::var("USE_FLASH_ATTENTION").unwrap_or("True".to_string()).to_lowercase() == "true" + { + tracing::info!("Starting FlashJinaBertModel model on {:?}", device); + Ok(Box::new(FlashJinaBertModel::load(vb, &config, model_type).s()?,)) + } else { + tracing::info!("Starting JinaBertModel model on {:?}", device); + Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) + } + #[cfg(feature = "cuda")] + (Config::JinaCodeBert(config), Device::Cuda(_)) => { + if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) + && dtype == DType::F16 + && ((config.position_embedding_type == PositionEmbeddingType::Absolute) | (config.position_embedding_type == PositionEmbeddingType::Alibi)) + // Allow disabling because of flash attention v1 precision problems + // See: https://github.com/huggingface/text-embeddings-inference/issues/37 + && &std::env::var("USE_FLASH_ATTENTION").unwrap_or("True".to_string()).to_lowercase() == "true" + { + tracing::info!("Starting FlashJinaCodeBertModel model on {:?}", device); + Ok(Box::new(FlashJinaCodeBertModel::load(vb, &config, model_type).s()?,)) + } else { + tracing::info!("Starting JinaCodeBertModel model on {:?}", device); + Ok(Box::new(JinaCodeBertModel::load(vb, &config, model_type).s()?)) + } } #[cfg(feature = "cuda")] ( diff --git a/backends/candle/src/models.rs b/backends/candle/src/models.rs index ed89482e..7f098cfb 100644 --- a/backends/candle/src/models.rs +++ b/backends/candle/src/models.rs @@ -15,6 +15,9 @@ mod flash_bert; #[cfg(feature = "cuda")] mod flash_jina; +#[cfg(feature = "cuda")] +mod flash_jina_code; + #[cfg(feature = "cuda")] mod flash_nomic; @@ -24,7 +27,8 @@ mod flash_distilbert; pub use bert::{BertConfig, BertModel, PositionEmbeddingType}; use candle::{Result, Tensor}; pub use distilbert::{DistilBertConfig, DistilBertModel}; -pub use jina::JinaBertModel; +pub use jina::{JinaConfig, JinaBertModel}; +pub use jina_code::{JinaCodeConfig, JinaCodeBertModel}; pub use nomic::{NomicBertModel, NomicConfig}; use text_embeddings_backend_core::Batch; @@ -34,6 +38,10 @@ pub use flash_bert::FlashBertModel; #[cfg(feature = "cuda")] pub use flash_jina::FlashJinaBertModel; +#[cfg(feature = "cuda")] +pub use flash_jina_code::FlashJinaCodeBertModel; + + #[cfg(feature = "cuda")] pub use flash_nomic::FlashNomicBertModel; diff --git a/backends/candle/src/models/flash_jina.rs b/backends/candle/src/models/flash_jina.rs index ebf2c292..e128252a 100644 --- a/backends/candle/src/models/flash_jina.rs +++ b/backends/candle/src/models/flash_jina.rs @@ -1,7 +1,8 @@ use crate::alibi::alibi_head_slopes; use crate::flash_attn::flash_attn_varlen; use crate::layers::{HiddenAct, LayerNorm, Linear}; -use crate::models::bert::{BertConfig, PositionEmbeddingType}; +use crate::models::bert::PositionEmbeddingType; +use crate::models::jina::{JinaConfig, BertEmbeddings}; use crate::models::jina::BertEmbeddings; use crate::models::Model; use candle::{DType, Device, IndexOp, Result, Tensor}; diff --git a/backends/candle/src/models/flash_jina_code.rs b/backends/candle/src/models/flash_jina_code.rs new file mode 100644 index 00000000..97ca5fc0 --- /dev/null +++ b/backends/candle/src/models/flash_jina_code.rs @@ -0,0 +1,458 @@ +use crate::alibi::alibi_head_slopes; +use crate::flash_attn::flash_attn_varlen; +use crate::layers::{HiddenAct, LayerNorm, Linear}; +use crate::models::bert::PositionEmbeddingType; +use crate::models::jina::{JinaCodeConfig, BertEmbeddings}; +use crate::models::Model; +use candle::{DType, Device, IndexOp, Result, Tensor}; +use candle_nn::VarBuilder; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +struct AlibiBertAttention { + query_linear: Linear, + key_linear: Linear, + value_linear: Linear, + + dense: Linear, + layer_norm_q: LayerNorm, + layer_norm_k: LayerNorm, + layer_norm_out: LayerNorm, + + alibi_slopes: Option, + + num_attention_heads: usize, + attention_head_size: usize, + softmax_scale: f32, + + span: tracing::Span, +} + +impl AlibiBertAttention { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig, alibi_slopes: Option) -> Result { + let attention_head_size = config.hidden_size / config.num_attention_heads; + let all_head_size = config.num_attention_heads * attention_head_size; + let hidden_size = config.hidden_size; + + let query_weight = vb + .pp("self.query") + .get((all_head_size, hidden_size), "weight")?; + let query_bias = vb.pp("self.query").get(all_head_size, "bias")?; + let key_weight = vb + .pp("self.key") + .get((all_head_size, hidden_size), "weight")?; + let key_bias = vb.pp("self.key").get(all_head_size, "bias")?; + let value_weight = vb + .pp("self.value") + .get((all_head_size, hidden_size), "weight")?; + let value_bias = vb.pp("self.value").get(all_head_size, "bias")?; + + let layer_norm_q = LayerNorm::load( + vp.pp("self").pp("layer_norm_q"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + let layer_norm_k = LayerNorm::load( + vp.pp("self").pp("layer_norm_k"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + let query_linear = Linear::new(query_weight, Some(query_bias), None); + let key_linear = Linear::new(key_weight, Some(key_bias), None); + let value_linear = Linear::new(value_weight, Some(value_bias), None); + + let dense_weight = vb + .pp("output") + .pp("dense") + .get((hidden_size, hidden_size), "weight")?; + let dense_bias = vb.pp("output").pp("dense").get(hidden_size, "bias")?; + + let dense = Linear::new(dense_weight, Some(dense_bias), None); + + let layer_norm_out = LayerNorm::load( + vb.pp("output").pp("LayerNorm"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; + + Ok(Self { + query_linear, + key_linear, + value_linear, + dense, + layer_norm_q, + layer_norm_k, + layer_norm_out, + alibi_slopes, + num_attention_heads: config.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, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let residual = hidden_states.clone(); + + let query_layer = self.query_linear.forward(hidden_states)?; + let query_layer = self.layer_norm_q.forward(&query_layer, None)?; + + let key_layer = self.key_linear.forward(hidden_states)?; + let key_layer = self.layer_norm_k.forward(&key_layer, None)?; + + let value_layer = self.value_linear.forward(hidden_states)?; + + let mut new_qkv_shape = qkv.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads); + new_qkv_shape.push(self.attention_head_size); + + let query_layer = query_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + let key_layer = key_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + let value_layer = value_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + + let attention = flash_attn_varlen( + query_layer, + key_layer, + value_layer, + self.alibi_slopes.as_ref(), + cu_seqlens, + cu_seqlens, + max_s, + max_s, + self.softmax_scale, + false, + )?; + let attention = attention.flatten_from(candle::D::Minus2)?; + + let hidden_states = self.dense.forward(&attention)?; + let hidden_states = self.layer_norm_out.forward(&hidden_states, Some(&residual))?; + + Ok(hidden_states) + } +} + +struct JinaBertLayer { + attention: AlibiBertAttention, + up_gated_layer: Linear, + down_layer: Linear, + layer_norm_1: LayerNorm, + layer_norm_2: LayerNorm, + act: HiddenAct, + + intermediate_size: usize, + + span: tracing::Span, +} + +impl JinaBertLayer { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig, alibi: Option) -> Result { + let attention = AlibiBertAttention::load(vb.pp("attention"), config, alibi)?; + + let up_gated_weight = vb + .pp("mlp") + .pp("up_gated_layer") + .get((config.intermediate_size * 2, config.hidden_size), "weight")?; + let up_gated_layer = Linear::new(up_gated_weight, None, None); + + let down_weight = vb + .pp("mlp") + .pp("down_layer") + .get((config.hidden_size, config.intermediate_size), "weight")?; + let down_bias = vb.pp("mlp").pp("down_layer").get(config.hidden_size, "bias")?; + let down_layer = Linear::new(down_weight, Some(down_bias), None); + + let layer_norm_1 = LayerNorm::load( + vb.pp("layer_norm_1"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + let layer_norm_2 = LayerNorm::load( + vb.pp("layer_norm_2"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + Ok(Self { + attention, + up_gated_layer, + down_layer, + layer_norm_1, + layer_norm_2, + act: config.hidden_act.clone(), + intermediate_size: config.intermediate_size, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let residual = hidden_states.clone(); + let hidden_states = self.attention.forward(hidden_states, cu_seqlens, max_s)?; + + // Pre-MLP LayerNorm + let hidden_states = self.layer_norm_1.forward(&hidden_states, Some(&residual))?; + + // MLP block + let residual = hidden_states.clone(); + let hidden_states = self.up_gated_layer.forward(&hidden_states)?; + let non_gated = hidden_states.i((.., .., 0..self.intermediate_size))?; + let gated = hidden_states.i((.., .., self.intermediate_size..))?; + let gated = match self.act { + HiddenAct::Gelu => gated.gelu(), + HiddenAct::Relu => gated.relu(), + HiddenAct::Swiglu => gated.silu(), + }?; + let hidden_states = (non_gated * gated)?; + let hidden_states = self.down_layer.forward(&hidden_states)?; + + // Post-MLP LayerNorm + let hidden_states = self.layer_norm_2.forward(&hidden_states, Some(&residual))?; + + Ok(hidden_states) + } +} + +struct BertEncoder { + layers: Vec, + span: tracing::Span, +} + +impl BertEncoder { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig, alibi: Option) -> Result { + let layers = (0..config.num_hidden_layers) + .map(|index| { + JinaBertLayer::load(vb.pp(format!("layer.{index}")), config, alibi.clone()) + }) + .collect::>>()?; + let span = tracing::span!(tracing::Level::TRACE, "encoder"); + + Ok(BertEncoder { layers, span }) + } + + fn forward(&self, hidden_states: &Tensor, cu_seqlens: &Tensor, max_s: usize) -> Result { + let _enter = self.span.enter(); + + let mut hidden_states = hidden_states.clone(); + + // Use a loop rather than a fold as it's easier to modify when adding debug/... + for layer in self.layers.iter() { + hidden_states = layer.forward(&hidden_states, cu_seqlens, max_s)? + } + + Ok(hidden_states) + } +} + +pub struct FlashJinaCodeBertModel { + embeddings: BertEmbeddings, + encoder: BertEncoder, + pool: Pool, + pub device: Device, + + span: tracing::Span, +} + +impl FlashJinaCodeBertModel { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig, model_type: ModelType) -> Result { + let alibi = match config.position_embedding_type { + PositionEmbeddingType::Alibi => { + let alibi_slopes = alibi_head_slopes(config.num_attention_heads); + Some( + Tensor::from_vec(alibi_slopes, config.num_attention_heads, vb.device())? + .to_dtype(DType::F32)?, + ) + } + PositionEmbeddingType::Absolute => None, + }; + + match vb.device() { + Device::Cuda(_) => {} + _ => candle::bail!("FlashJinaCodeBertModel requires Cuda"), + } + + if vb.dtype() != DType::F16 { + candle::bail!("FlashJinaCodeBertModel requires DType::F16") + } + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for Jina Code") + } + ModelType::Embedding(pool) => { + if pool == Pool::Splade { + candle::bail!("`splade` is not supported for Jina Code") + } + pool + } + }; + + let (embeddings, encoder) = match ( + BertEmbeddings::load(vb.pp("embeddings"), config), + BertEncoder::load(vb.pp("encoder"), config, alibi.clone()), + ) { + (Ok(embeddings), Ok(encoder)) => (embeddings, encoder), + (Err(err), _) | (_, Err(err)) => { + if let (Ok(embeddings), Ok(encoder)) = ( + BertEmbeddings::load(vb.pp("bert.embeddings"), config), + BertEncoder::load(vb.pp("bert.encoder"), config, alibi.clone()), + ) { + (embeddings, encoder) + } else { + return Err(err); + } + } + }; + + Ok(Self { + embeddings, + encoder, + 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.len(); + let shape = batch.input_ids.len(); + + // Create Cuda tensors + let input_ids = Tensor::from_vec(batch.input_ids, shape, &self.device)?; + let 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 embedding_output = self + .embeddings + .forward(&input_ids, &type_ids, &position_ids)?; + + let outputs = + self.encoder + .forward(&embedding_output, &cu_seqlens, batch.max_length as usize)?; + + 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 pooling + Pool::Cls => { + 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)?; + + // 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)? + } + + // Select cls tokens + Some(outputs.index_select(&cls_indices, 0)?) + } else { + Some(outputs.i(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 FlashJinaCodeBertModel { + fn is_padded(&self) -> bool { + false + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} \ No newline at end of file diff --git a/backends/candle/src/models/jina.rs b/backends/candle/src/models/jina.rs index 97bc7f96..3f5d5916 100644 --- a/backends/candle/src/models/jina.rs +++ b/backends/candle/src/models/jina.rs @@ -1,11 +1,36 @@ use crate::alibi::build_alibi_tensor; use crate::layers::{get_cublas_lt_wrapper, HiddenAct, LayerNorm, Linear}; use crate::models::Model; -use crate::models::{BertConfig, PositionEmbeddingType}; +use crate::models::PositionEmbeddingType; use candle::{DType, Device, IndexOp, Module, Result, Tensor, D}; use candle_nn::{Embedding, VarBuilder}; +use serde::Deserialize; +use std::collections::HashMap; use text_embeddings_backend_core::{Batch, ModelType, Pool}; +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct JinaConfig { + 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 hidden_dropout_prob: f64, + pub max_position_embeddings: usize, + pub type_vocab_size: usize, + pub initializer_range: f64, + pub layer_norm_eps: f64, + pub pad_token_id: usize, + #[serde(default)] + pub position_embedding_type: PositionEmbeddingType, + #[serde(default)] + pub use_cache: bool, + pub classifier_dropout: Option, + pub id2label: Option>, +} + + #[derive(Debug)] pub struct BertEmbeddings { word_embeddings: Embedding, @@ -16,7 +41,7 @@ pub struct BertEmbeddings { } impl BertEmbeddings { - pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { + pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { let position_embeddings = if config.position_embedding_type == PositionEmbeddingType::Absolute { Some(Embedding::new( @@ -88,7 +113,7 @@ struct BertAttention { } impl BertAttention { - pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { + pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { let attention_head_size = config.hidden_size / config.num_attention_heads; let all_head_size = config.num_attention_heads * attention_head_size; let hidden_size = config.hidden_size; @@ -249,7 +274,7 @@ struct JinaBertLayer { } impl JinaBertLayer { - pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { + pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { let attention = BertAttention::load(vb.pp("attention"), config)?; let gated_weight = vb @@ -316,7 +341,7 @@ struct BertEncoder { } impl BertEncoder { - pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { + pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { let layers = (0..config.num_hidden_layers) .map(|index| JinaBertLayer::load(vb.pp(format!("layer.{index}")), config)) .collect::>>()?; @@ -354,7 +379,7 @@ pub struct JinaBertModel { } impl JinaBertModel { - pub fn load(vb: VarBuilder, config: &BertConfig, model_type: ModelType) -> Result { + pub fn load(vb: VarBuilder, config: &JinaConfig, model_type: ModelType) -> Result { let alibi = match config.position_embedding_type { PositionEmbeddingType::Alibi => Some(build_alibi_tensor( config.max_position_embeddings, diff --git a/backends/candle/src/models/jina_code.rs b/backends/candle/src/models/jina_code.rs new file mode 100644 index 00000000..cb4084d7 --- /dev/null +++ b/backends/candle/src/models/jina_code.rs @@ -0,0 +1,728 @@ +use crate::alibi::build_alibi_tensor; +use crate::layers::{get_cublas_lt_wrapper, HiddenAct, LayerNorm, Linear}; +use crate::models::Model; +use crate::models::PositionEmbeddingType; +use candle::{DType, Device, IndexOp, Module, Result, Tensor, D}; +use candle_nn::{Embedding, VarBuilder}; +use serde::Deserialize; +use std::collections::HashMap; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct JinaCodeConfig { + 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 hidden_dropout_prob: f64, + pub max_position_embeddings: usize, + pub type_vocab_size: usize, + pub initializer_range: f64, + pub layer_norm_eps: f64, + pub pad_token_id: usize, + #[serde(default)] + pub position_embedding_type: PositionEmbeddingType, + #[serde(default)] + pub use_cache: bool, + pub classifier_dropout: Option, + pub id2label: Option>, +} + + +#[derive(Debug)] +pub struct BertEmbeddings { + word_embeddings: Embedding, + token_type_embeddings: Embedding, + position_embeddings: Option, + layer_norm: LayerNorm, + span: tracing::Span, +} + +impl BertEmbeddings { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { + let position_embeddings = + if config.position_embedding_type == PositionEmbeddingType::Absolute { + Some(Embedding::new( + vb.pp("position_embeddings").get( + (config.max_position_embeddings, config.hidden_size), + "weight", + )?, + config.hidden_size, + )) + } else { + None + }; + + Ok(Self { + word_embeddings: Embedding::new( + vb.pp("word_embeddings") + .get((config.vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ), + token_type_embeddings: Embedding::new( + vb.pp("token_type_embeddings") + .get((config.type_vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ), + position_embeddings, + layer_norm: LayerNorm::load( + vb.pp("LayerNorm"), + config.hidden_size, + config.layer_norm_eps as f32, + )?, + span: tracing::span!(tracing::Level::TRACE, "embeddings"), + }) + } + + pub fn forward( + &self, + input_ids: &Tensor, + token_type_ids: &Tensor, + position_ids: &Tensor, + ) -> Result { + let _enter = self.span.enter(); + + let input_embeddings = self.word_embeddings.forward(input_ids)?; + let token_type_embeddings = self.token_type_embeddings.forward(token_type_ids)?; + + if let Some(position_embeddings) = &self.position_embeddings { + let position_embeddings = position_embeddings.forward(position_ids)?; + let embeddings = input_embeddings.add(&token_type_embeddings)?; + self.layer_norm + .forward(&embeddings, Some(&position_embeddings)) + } else { + self.layer_norm + .forward(&input_embeddings, Some(&token_type_embeddings)) + } + } +} + +struct BertAttention { + query_linear: Linear, + key_linear: Linear, + value_linear: Linear, + + dense: Linear, + layer_norm_q: LayerNorm, + layer_norm_k: LayerNorm, + layer_norm_out: LayerNorm, + + num_attention_heads: usize, + attention_head_size: usize, + softmax_scale: f64, + + span: tracing::Span, +} + +impl BertAttention { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { + let attention_head_size = config.hidden_size / config.num_attention_heads; + let all_head_size = config.num_attention_heads * attention_head_size; + let hidden_size = config.hidden_size; + + let query_weight = vb + .pp("self.query") + .get((all_head_size, hidden_size), "weight")?; + let query_bias = vb.pp("self.query").get(all_head_size, "bias")?; + + let key_weight = vb + .pp("self.key") + .get((all_head_size, hidden_size), "weight")?; + let key_bias = vb.pp("self.key").get(all_head_size, "bias")?; + + let value_weight = vb + .pp("self.value") + .get((all_head_size, hidden_size), "weight")?; + let value_bias = vb.pp("self.value").get(all_head_size, "bias")?; + + let layer_norm_q = LayerNorm::load( + vb.pp("self").pp("layer_norm_q"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + let layer_norm_k = LayerNorm::load( + vb.pp("self").pp("layer_norm_k"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + let query_linear = Linear::new(query_weight, Some(query_bias), None); + let key_linear = Linear::new(key_weight, Some(key_bias), None); + let value_linear = Linear::new(value_weight, Some(value_bias), None); + + let dense_weight = vb + .pp("output") + .pp("dense") + .get((hidden_size, hidden_size), "weight")?; + let dense_bias = vb.pp("output").pp("dense").get(hidden_size, "bias")?; + + let dense = Linear::new(dense_weight, Some(dense_bias), None); + + let layer_norm_out = LayerNorm::load( + vb.pp("output").pp("LayerNorm"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + let softmax_scale = 1. / (attention_head_size as f64).sqrt(); + + Ok(Self { + query_linear, + key_linear, + value_linear, + dense, + layer_norm_q, + layer_norm_k, + layer_norm_out, + num_attention_heads: config.num_attention_heads, + attention_head_size, + softmax_scale, + span: tracing::span!(tracing::Level::TRACE, "attention"), + }) + } + + fn forward(&self, hidden_states: &Tensor, attention_bias: Option<&Tensor>) -> Result { + let _enter = self.span.enter(); + let device = hidden_states.device(); + let residual = hidden_states.clone(); + + let query_layer = self.query_linear.forward(hidden_states)?; + let query_layer = self.layer_norm_q.forward(&query_layer, None)?; + + let key_layer = self.key_linear.forward(hidden_states)?; + let key_layer = self.layer_norm_k.forward(&key_layer, None)?; + + let value_layer = self.value_linear.forward(hidden_states)?; + + let mut new_qkv_shape = query_layer.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads); + new_qkv_shape.push(self.attention_head_size); + + let query_layer = query_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + let key_layer = key_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + let value_layer = value_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + + #[allow(unused_variables)] + let context_layer = if let (Device::Cuda(_), Some(cublaslt)) = + (device, get_cublas_lt_wrapper()) + { + #[cfg(feature = "cuda")] + { + // cuBLASLt batch matmul implementation requires inputs to be dims3 + let (batch_size, _, seq_len, _) = key_layer.shape().dims4()?; + let key_layer = key_layer.flatten(0, 1)?; + let query_layer = query_layer.flatten(0, 1)?; + let value_layer = value_layer.flatten(0, 1)?; + let attention_bias = attention_bias.map(|mask| mask.flatten(0, 1)).transpose()?; + + // If attention_bias is set, we fuse the add by giving it as the output matrix + // and setting beta to 1.0 + let beta = match attention_bias.is_some() { + true => Some(1.0), + false => None, + }; + + // Batch matrix multiplication + // Fuse softmax scale and attention_bias add + let attention_scores = cublaslt.batch_matmul( + &key_layer, + &query_layer, + attention_bias.as_ref(), + Some(self.softmax_scale as f32), + beta, + None, + None, + )?; + let attention_probs = candle_nn::ops::softmax_last_dim(&attention_scores)?; + + let context_layer = cublaslt.batch_matmul( + &value_layer.t()?.contiguous()?, + &attention_probs, + // We save one allocation + Some(&query_layer), + None, + None, + None, + None, + )?; + + // Reshape to dims4 + context_layer.reshape(( + batch_size, + self.num_attention_heads, + seq_len, + self.attention_head_size, + )) + } + #[cfg(not(feature = "cuda"))] + { + candle::bail!("`cuda` feature is not enabled") + } + } else { + let attention_scores = query_layer.matmul(&key_layer.t()?)?; + let mut attention_scores = (attention_scores * self.softmax_scale)?; + + if let Some(attention_bias) = attention_bias { + attention_scores = attention_scores.add(attention_bias)?; + } + + let attention_probs = candle_nn::ops::softmax_last_dim(&attention_scores)?; + attention_probs.matmul(&value_layer.contiguous()?) + }?; + + let context_layer = context_layer.transpose(1, 2)?.flatten_from(D::Minus2)?; + + let hidden_states = self.dense.forward(&context_layer)?; + let hidden_states = self.layer_norm_out.forward(&hidden_states, Some(&residual))?; + + Ok(hidden_states) + } +} + +struct JinaCodeBertLayer { + attention: BertAttention, + up_gated_layer: Linear, + down_layer: Linear, + layer_norm_1: LayerNorm, + layer_norm_2: LayerNorm, + act: HiddenAct, + + intermediate_size: usize, + + span: tracing::Span, +} + +impl JinaCodeBertLayer { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { + let attention = BertAttention::load(vb.pp("attention"), config)?; + + let up_gated_weight = vb + .pp("mlp") + .pp("up_gated_layer") + .get((config.intermediate_size * 2, config.hidden_size), "weight")?; + let up_gated_layer = Linear::new(up_gated_weight, None, None); + + let down_weight = vb + .pp("mlp") + .pp("down_layer") + .get((config.hidden_size, config.intermediate_size), "weight")?; + let down_bias = vb.pp("mlp").pp("down_layer").get(config.hidden_size, "bias")?; + let down_layer = Linear::new(down_weight, Some(down_bias), None); + + let layer_norm_1 = LayerNorm::load( + vb.pp("layer_norm_1"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + let layer_norm_2 = LayerNorm::load( + vb.pp("layer_norm_2"), + config.hidden_size, + config.layer_norm_eps as f32, + )?; + + Ok(Self { + attention, + up_gated_layer, + down_layer, + layer_norm_1, + layer_norm_2, + act: config.hidden_act.clone(), + intermediate_size: config.intermediate_size, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + attention_bias: Option<&Tensor>, + ) -> Result { + let _enter = self.span.enter(); + + // Pre-Norm + let residual = hidden_states.clone(); + + // Self-Attention block + let hidden_states = self.attention.forward(hidden_states, attention_bias)?; + + // Pre-MLP LayerNorm + let hidden_states = self.layer_norm_1.forward(&hidden_states, Some(&residual))?; + + // MLP block + let residual = hidden_states.clone(); + let hidden_states = self.up_gated_layer.forward(&hidden_states)?; + let non_gated = hidden_states.i((.., .., 0..self.intermediate_size))?; + let gated = hidden_states.i((.., .., self.intermediate_size..))?; + let gated = match self.act { + HiddenAct::Gelu => gated.gelu(), + HiddenAct::Relu => gated.relu(), + HiddenAct::Swiglu => gated.silu(), + }?; + let hidden_states = (non_gated * gated)?; + let hidden_states = self.down_layer.forward(&hidden_states)?; + + // Post-MLP LayerNorm + let hidden_states = self.layer_norm_2.forward(&hidden_states, Some(&residual))?; + + Ok(hidden_states) + } +} + +struct BertEncoder { + layers: Vec, + span: tracing::Span, +} + +impl BertEncoder { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { + let layers = (0..config.num_hidden_layers) + .map(|index| JinaCodeBertLayer::load(vb.pp(format!("layer.{index}")), config)) + .collect::>>()?; + let span = tracing::span!(tracing::Level::TRACE, "encoder"); + + Ok(BertEncoder { layers, span }) + } + + fn forward(&self, hidden_states: &Tensor, attention_bias: Option<&Tensor>) -> Result { + let _enter = self.span.enter(); + + let mut hidden_states = hidden_states.clone(); + + // Use a loop rather than a fold as it's easier to modify when adding debug/... + for layer in self.layers.iter() { + hidden_states = layer.forward(&hidden_states, attention_bias)?; + } + + Ok(hidden_states) + } +} + +pub struct JinaCodeBertModel { + embeddings: BertEmbeddings, + encoder: BertEncoder, + pool: Pool, + alibi: Option, + + num_attention_heads: usize, + + device: Device, + dtype: DType, + + span: tracing::Span, +} + +impl JinaCodeBertModel { + pub fn load(vb: VarBuilder, config: &JinaCodeConfig, model_type: ModelType) -> Result { + let alibi = match config.position_embedding_type { + PositionEmbeddingType::Alibi => Some(build_alibi_tensor( + config.max_position_embeddings, + config.num_attention_heads, + vb.device(), + vb.dtype(), + )?), + PositionEmbeddingType::Absolute => None, + }; + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for Jina") + } + ModelType::Embedding(pool) => { + if pool == Pool::Splade { + candle::bail!("`splade` is not supported for Jina") + } + pool + } + }; + + let (embeddings, encoder) = match ( + BertEmbeddings::load(vb.pp("embeddings"), config), + BertEncoder::load(vb.pp("encoder"), config), + ) { + (Ok(embeddings), Ok(encoder)) => (embeddings, encoder), + (Err(err), _) | (_, Err(err)) => { + if let (Ok(embeddings), Ok(encoder)) = ( + BertEmbeddings::load(vb.pp("bert.embeddings"), config), + BertEncoder::load(vb.pp("bert.encoder"), config), + ) { + (embeddings, encoder) + } else { + return Err(err); + } + } + }; + + Ok(Self { + embeddings, + encoder, + pool, + alibi, + num_attention_heads: config.num_attention_heads, + device: vb.device().clone(), + dtype: vb.dtype(), + 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.len(); + let max_length = batch.max_length as usize; + + let shape = (batch_size, max_length); + + let (input_ids, type_ids, position_ids, input_lengths, attention_bias, attention_mask) = + if batch_size > 1 { + // Prepare padded batch + let elems = batch_size * max_length; + + let mut input_ids = Vec::with_capacity(elems); + let mut type_ids = Vec::with_capacity(elems); + let mut position_ids = Vec::with_capacity(elems); + let mut attention_mask = Vec::with_capacity(elems); + let mut attention_bias = Vec::with_capacity(elems); + let mut input_lengths = Vec::with_capacity(batch_size); + // Bool to know if we need to use the attention mask + let mut masking = false; + + 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]); + type_ids.push(batch.token_type_ids[j]); + position_ids.push(batch.position_ids[j]); + attention_mask.push(1.0_f32); + attention_bias.push(0.0); + } + + // 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); + position_ids.push(0); + attention_mask.push(0.0_f32); + attention_bias.push(f32::NEG_INFINITY); + } + } + } + + let (attention_bias, attention_mask) = match masking { + true => { + // We only need the mask if we use mean pooling + // For CLS pooling, the bias is enough + let attention_mask = if self.pool == Pool::Mean { + let attention_mask = Tensor::from_vec( + attention_mask, + (batch_size, max_length, 1), + &self.device, + )? + .to_dtype(self.dtype)?; + + Some(attention_mask) + } else { + None + }; + + let attention_bias = Tensor::from_vec( + attention_bias, + (batch_size, 1, 1, max_length), + &self.device, + )? + .to_dtype(self.dtype)?; + + // Broadcast once instead of at every layer + let mut attention_bias = attention_bias.broadcast_as(( + batch_size, + self.num_attention_heads, + max_length, + max_length, + ))?; + + // Add alibi tensor + if let Some(alibi) = &self.alibi { + let alibi = alibi + .i((.., .., 0..max_length, 0..max_length))? + .broadcast_as(( + batch_size, + self.num_attention_heads, + max_length, + max_length, + ))?; + + attention_bias = attention_bias.add(&alibi)?; + } + + (Some(attention_bias.contiguous()?), attention_mask) + } + false => { + if let Some(alibi) = &self.alibi { + ( + Some( + alibi + .i((.., .., 0..max_length, 0..max_length))? + .broadcast_as(( + batch_size, + self.num_attention_heads, + max_length, + max_length, + ))? + .contiguous()?, + ), + None, + ) + } else { + (None, None) + } + } + }; + + ( + input_ids, + type_ids, + position_ids, + input_lengths, + attention_bias, + attention_mask, + ) + } else { + let attention_bias = if let Some(alibi) = &self.alibi { + Some( + alibi + .i((.., .., 0..max_length, 0..max_length))? + .contiguous()?, + ) + } else { + None + }; + + ( + batch.input_ids, + batch.token_type_ids, + batch.position_ids, + vec![batch.max_length as f32], + attention_bias, + None, + ) + }; + + // Create CPU tensors + 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 = + Tensor::from_vec(input_lengths, (batch_size, 1), &self.device)?.to_dtype(self.dtype)?; + + let embedding_output = self + .embeddings + .forward(&input_ids, &type_ids, &position_ids)?; + + let outputs = self + .encoder + .forward(&embedding_output, attention_bias.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 { + let pooled_indices_length = batch.pooled_indices.len(); + let mut outputs = outputs.clone(); + + // Only use pooled_indices if at least one member of the batch ask for raw embeddings + let pooled_indices = if has_raw_requests { + let pooled_indices = + Tensor::from_vec(batch.pooled_indices, pooled_indices_length, &self.device)?; + + // Select values in the batch + outputs = outputs.index_select(&pooled_indices, 0)?; + Some(pooled_indices) + } else { + None + }; + + let pooled_embeddings = match self.pool { + // CLS pooling + Pool::Cls => outputs.i((.., 0))?, + // Mean pooling + Pool::Mean => { + if let Some(ref attention_mask) = attention_mask { + let mut attention_mask = attention_mask.clone(); + + if let Some(pooled_indices) = pooled_indices { + // Select values in the batch + attention_mask = attention_mask.index_select(&pooled_indices, 0)?; + }; + + // Mask padded values + outputs = outputs.broadcast_mul(&attention_mask)?; + } + + (outputs.sum(1)?.broadcast_div(&input_lengths))? + } + Pool::Splade => unreachable!(), + }; + Some(pooled_embeddings) + } else { + None + }; + + let raw_embeddings = if has_raw_requests { + // Reshape outputs + let (b, l, h) = outputs.shape().dims3()?; + let outputs = outputs.reshape((b * l, h))?; + + // 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 + if (attention_mask.is_some() || has_pooling_requests) && batch_size > 1 { + let mut final_indices: Vec = Vec::with_capacity(batch_size * max_length); + + for i in batch.raw_indices.into_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); + } + } + + 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 JinaCodeBertModel { + fn is_padded(&self) -> bool { + true + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} diff --git a/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap new file mode 100644 index 00000000..3441cb71 --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap @@ -0,0 +1,772 @@ +--- +source: backends/candle/tests/test_flash_jina_code.rs +expression: embeddings_batch +--- +- - -0.011624558 + - -0.0016926473 + - -0.006434922 + - -0.009909191 + - 0.027506275 + - 0.022786874 + - -0.059169117 + - -0.047887173 + - 0.038912594 + - 0.025214802 + - -0.014350341 + - 0.039117776 + - 0.03485464 + - 0.05296896 + - 0.034907352 + - 0.0013971328 + - 0.0019907136 + - 0.052471623 + - -0.014562107 + - 0.00030206257 + - -0.02770458 + - 0.02685756 + - -0.015385578 + - -0.012668428 + - -0.025259107 + - 0.00836893 + - 0.028925523 + - -0.035507426 + - -0.04220648 + - 0.047328673 + - -0.083232224 + - -0.02608385 + - -0.012809777 + - -0.0140402755 + - -0.013649549 + - -0.013641793 + - 0.02880054 + - 0.04465023 + - -0.0274121 + - -0.03170939 + - -0.047180377 + - -0.0349574 + - -0.037762504 + - 0.024104225 + - -0.039361924 + - -0.024559166 + - -0.0138650155 + - -0.049862508 + - -0.0507675 + - -0.07775355 + - -0.055519626 + - -0.025151063 + - 0.040781654 + - 0.0039354665 + - 0.015940087 + - -0.022214677 + - -0.013484792 + - -0.00070730236 + - -0.009409981 + - 0.0016682384 + - 0.016079267 + - -0.032368172 + - 0.024572799 + - 0.026780155 + - -0.025954 + - 0.021282032 + - -0.047395118 + - 0.044386413 + - -0.023020437 + - 0.0056320634 + - -0.017416032 + - -0.024118245 + - 0.05878816 + - 0.00059366866 + - -0.018553924 + - 0.003762008 + - 0.0035026476 + - -0.0077498616 + - -0.004517831 + - 0.008116448 + - -0.010922055 + - 0.037391223 + - -0.03318112 + - -0.07876148 + - -0.0018068684 + - -0.0484656 + - -0.038104814 + - -0.0070756334 + - -0.015427567 + - -0.04499487 + - 0.008910639 + - 0.029193114 + - 0.032674707 + - 0.0305758 + - -0.017541302 + - 0.028164856 + - -0.0344121 + - 0.016969312 + - 0.04108575 + - -0.054463603 + - -0.005427823 + - -0.008252881 + - -0.024992533 + - 0.048412405 + - -0.05769221 + - -0.08227673 + - -0.0523458 + - 0.025244992 + - -0.016289622 + - -0.049253095 + - -0.03999235 + - 0.05642755 + - -0.010015731 + - 0.04892553 + - -0.02504831 + - -0.014305144 + - 0.04907702 + - -0.0096177375 + - -0.0854665 + - 0.017617436 + - -0.014481601 + - 0.046187755 + - -0.030009247 + - -0.049553443 + - -0.006797771 + - -0.034234725 + - 0.06525787 + - 0.017298417 + - -0.018988462 + - -0.08520813 + - -0.011840521 + - -0.042942975 + - -0.056341827 + - 0.08071612 + - 0.028146833 + - -0.0141261155 + - 0.04001012 + - 0.018236378 + - 0.01583886 + - 0.0058086845 + - 0.0005290361 + - 0.0045259795 + - 0.024873685 + - 0.018050008 + - 0.02440984 + - -0.057676647 + - -0.022263395 + - -0.033016473 + - 0.014353932 + - -0.010189813 + - 0.018424626 + - -0.018238619 + - 0.07698089 + - -0.015595315 + - 0.007074499 + - 0.027340613 + - -0.02035102 + - -0.073149584 + - -0.0061021335 + - 0.0209061 + - -0.024985746 + - -0.020401739 + - -0.0048702923 + - 0.0444933 + - -0.02158648 + - 0.010312202 + - 0.009883107 + - 0.022790415 + - -0.01893943 + - 0.017615119 + - 0.023000762 + - -0.051276624 + - 0.019835759 + - 0.016675396 + - 0.021532865 + - 0.023097536 + - 0.01091247 + - 0.007642041 + - 0.0385409 + - 0.044193454 + - 0.003319116 + - 0.019355802 + - -0.055695307 + - -0.07680676 + - -0.035279598 + - -0.0070618573 + - -0.01408385 + - 0.03107026 + - 0.011547187 + - 0.04217532 + - 0.048034772 + - -0.014330861 + - -0.0007901662 + - 0.009103947 + - 0.011091706 + - -0.008960474 + - -0.009301379 + - 0.032424763 + - 0.09180531 + - 0.015491586 + - 0.031114861 + - 0.013289549 + - 0.03616163 + - 0.031084707 + - -0.021437835 + - 0.011905716 + - -0.104623 + - 0.033417992 + - -0.04683295 + - -0.05382028 + - 0.025979578 + - -0.003795323 + - 0.094473585 + - 0.09126942 + - 0.067700386 + - -0.002935823 + - -0.031604428 + - 0.0045677535 + - 0.014042491 + - -0.02969786 + - -0.012263599 + - -0.05807616 + - -0.0107510965 + - 0.022099612 + - 0.02685798 + - -0.048912797 + - 0.020464186 + - 0.011517319 + - -0.0016606319 + - -0.033255223 + - 0.02488959 + - -0.043240122 + - 0.00013934783 + - 0.037608404 + - 0.0748658 + - 0.061115693 + - -0.01670558 + - 0.037827995 + - -0.004162286 + - -0.00011341072 + - -0.031436242 + - -0.040532686 + - -0.0096016815 + - -0.065639205 + - -0.030070387 + - 0.05715196 + - 0.024338327 + - -0.008972259 + - -0.013220871 + - -0.07115904 + - -0.03446362 + - -0.010893238 + - 0.011950567 + - 0.0143028535 + - 0.0022963681 + - -0.060428943 + - 0.047038406 + - -0.017493663 + - 0.0208505 + - -0.010212147 + - -0.03337894 + - 0.026969628 + - -0.019734934 + - 0.0922163 + - -0.056534916 + - 0.017255465 + - 0.021692138 + - 0.023583038 + - 0.017224979 + - -0.0689936 + - 0.23665377 + - 0.04984247 + - -0.0039337534 + - -0.010740561 + - 0.00313393 + - -0.02665381 + - 0.013037893 + - 0.020565815 + - -0.002266256 + - 0.03748113 + - 0.018353125 + - -0.048318923 + - -0.06522075 + - -0.021460611 + - -0.029665926 + - -0.025507431 + - 0.0033435076 + - -0.0071087605 + - 0.001970083 + - -0.0025331723 + - 0.061776515 + - 0.017747495 + - 0.04396135 + - 0.0011617352 + - 0.02509327 + - 0.039078914 + - -0.03762337 + - 0.021575885 + - 0.015548619 + - 0.043990802 + - -0.024633111 + - -0.0013324996 + - 0.063795656 + - -0.02035371 + - -0.0440217 + - -0.033049908 + - 0.031034056 + - -0.004495562 + - -0.0044647786 + - -0.033148468 + - 0.0025072312 + - 0.009637453 + - 0.04357035 + - 0.044546504 + - -0.08865154 + - -0.08487347 + - 0.00205395 + - 0.0060572727 + - 0.023767816 + - 0.051007573 + - 0.0057035745 + - 0.040539596 + - -0.035988905 + - -0.01824621 + - 0.007887274 + - -0.052848075 + - 0.08228733 + - 0.0015825987 + - 0.0004136183 + - 0.018108545 + - 0.040081892 + - -0.035405345 + - 0.050933696 + - 0.036154125 + - -0.03947257 + - -0.0018412384 + - -0.005589829 + - 0.03620321 + - 0.012144826 + - -0.008619581 + - -0.0043279063 + - 0.016455552 + - -0.015757388 + - 0.047043085 + - 0.08675011 + - -0.009986743 + - 0.022379123 + - 0.009470605 + - 0.034120724 + - 0.009922824 + - -0.014435422 + - 0.017998574 + - -0.03849387 + - 0.042357396 + - -0.010053916 + - 0.057034835 + - -0.027412737 + - 0.017308975 + - 0.02185228 + - -0.048017155 + - -0.025138885 + - 0.016482655 + - -0.01756698 + - 0.031146016 + - 0.021930695 + - -0.00075341173 + - -0.015085438 + - 0.0146785155 + - 0.028547939 + - -0.036677707 + - -0.022699077 + - -0.045135103 + - -0.02802744 + - 0.071454674 + - -0.009201392 + - -0.051717956 + - -0.019421624 + - 0.0034821872 + - 0.06667364 + - 0.09145379 + - -0.068826884 + - 0.053568542 + - 0.01160062 + - -0.025829546 + - 0.04487214 + - 0.030954553 + - -0.022543794 + - -0.009475118 + - -0.014623143 + - -0.02070793 + - -0.02656788 + - 0.009701591 + - -0.025120718 + - -0.018472325 + - -0.027967019 + - -0.021122226 + - -0.009891716 + - 0.018696679 + - -0.068876855 + - -0.023419108 + - -0.025495855 + - 0.016256742 + - 0.00064859784 + - 0.037749656 + - -0.046321914 + - 0.065936595 + - -0.008921658 + - 0.07497468 + - -0.05094385 + - -0.052860104 + - 0.022196138 + - -0.0140462285 + - -0.03562305 + - 0.024858234 + - 0.021310989 + - 0.014657512 + - 0.07767391 + - -0.027777392 + - 0.057577316 + - 0.055513144 + - 0.06322926 + - -0.026312957 + - 0.010970987 + - -0.0057475767 + - 0.0028267235 + - 0.051367335 + - -0.022320578 + - 0.009050165 + - 0.016952222 + - -0.032026373 + - -0.074292615 + - -0.02315535 + - 0.025375988 + - -0.041241057 + - -0.032157563 + - -0.015576387 + - -0.015834223 + - 0.02224181 + - 0.017586967 + - -0.029070066 + - 0.0030065721 + - -0.051857695 + - 0.04008828 + - -0.007960872 + - -0.061745025 + - -0.00086617953 + - 0.026723113 + - 0.008719714 + - -0.049826868 + - -0.0046574236 + - 0.018954279 + - -0.007935451 + - 0.053987946 + - 0.022795292 + - 0.029722994 + - -0.010146585 + - -0.019956842 + - -0.014686722 + - 0.01708331 + - 0.020001508 + - 0.016564105 + - 0.011379248 + - -0.011843253 + - 0.04056168 + - 0.004384286 + - -0.049596023 + - 0.02674251 + - 0.0076475106 + - -0.0064563937 + - -0.014233138 + - 0.014224383 + - 0.0052741244 + - 0.049964864 + - -0.016286546 + - -0.001200327 + - 0.041904222 + - -0.0010395087 + - -0.05105399 + - 0.022099879 + - -0.019455278 + - 0.009444127 + - -0.081325725 + - 0.015994828 + - 0.0010952728 + - 0.0008373874 + - -0.0016424303 + - -0.05096469 + - 0.045976803 + - 0.024695056 + - -0.031656373 + - -0.0013138534 + - -0.0060524447 + - 0.060276203 + - -0.016745795 + - -0.029930653 + - -0.0222771 + - 0.012314711 + - 0.038991332 + - -0.006665343 + - 0.041694533 + - 0.0076992502 + - -0.014353178 + - 0.0025135442 + - -0.0498445 + - 0.020322764 + - 0.0575802 + - -0.006096128 + - -0.010841882 + - -0.024337102 + - 0.021975596 + - 0.0064031687 + - -0.026746146 + - 0.03455729 + - -0.011909055 + - 0.016994143 + - 0.026053395 + - -0.020393625 + - 0.06403403 + - 0.042590734 + - 0.009193913 + - 0.04016698 + - 0.028304791 + - 0.022147119 + - -0.030121539 + - -0.0037334429 + - 0.03235819 + - -0.020825844 + - 0.0009766509 + - -0.012216568 + - 0.07944978 + - 0.04177374 + - -0.008281654 + - -0.008908983 + - 0.04799388 + - -0.012743454 + - -0.00076762337 + - 0.012673029 + - -0.018283572 + - 0.022068778 + - -0.009605337 + - 0.0030652087 + - -0.036517244 + - -0.006263211 + - 0.0194632 + - 0.009333852 + - 0.02350168 + - -0.0008530139 + - 0.018934859 + - -0.013986168 + - -0.010833636 + - -0.011189203 + - 0.011567913 + - -0.07253544 + - -0.005748846 + - 0.11930293 + - 0.060044624 + - -0.023167728 + - -0.015781552 + - -0.010494401 + - 0.01930528 + - -0.039608266 + - -0.073587865 + - 0.0019034932 + - -0.0013838339 + - 0.026257295 + - 0.004433007 + - -0.051545423 + - -0.033456888 + - -0.06401291 + - -0.08664347 + - 0.010781564 + - 0.0408775 + - 0.021475399 + - 0.017633006 + - -0.02186024 + - 0.047795497 + - -0.006370007 + - 0.01792626 + - 0.005195737 + - 0.0026206016 + - -0.008816542 + - 0.009266863 + - -0.018453414 + - 0.0040575014 + - 0.0047053 + - -0.0197809 + - -0.01580334 + - 0.007821501 + - -0.06296649 + - -0.06274416 + - -0.0031381177 + - -0.024228694 + - -0.002459634 + - 0.00034323192 + - -0.02430543 + - -0.029262288 + - -0.04606642 + - -0.013138838 + - 0.040473 + - 0.012308485 + - 0.0020701357 + - -0.007718021 + - -0.0064122216 + - -0.024890581 + - 0.014665469 + - -0.0028788927 + - -0.047072053 + - -0.014959743 + - 0.004587824 + - -0.07462158 + - -0.008558996 + - 0.019324543 + - -0.02247574 + - -0.07721102 + - 0.007920586 + - -0.020274863 + - 0.028696692 + - 0.024707401 + - 0.016905285 + - 0.012742534 + - 0.018577736 + - -0.05768951 + - 0.03203929 + - 0.018105863 + - -0.03917534 + - -0.026208939 + - -0.038492158 + - -0.043517314 + - -0.008031121 + - -0.016162876 + - -0.0010640965 + - -0.004164019 + - 0.005193703 + - -0.0058410293 + - 0.029311381 + - -0.016533207 + - 0.05005747 + - 0.012600715 + - 0.016292874 + - -0.008300225 + - -0.08953819 + - 0.06544125 + - -0.010512851 + - -0.021443438 + - 0.030277776 + - -0.06502247 + - 0.004850903 + - -0.013137611 + - 0.0506941 + - 0.0072725127 + - -0.025755724 + - 0.008224718 + - 0.013813313 + - 0.037197027 + - 0.0023671025 + - 0.00763629 + - 0.011905766 + - 0.033143394 + - 0.007750765 + - -0.07725993 + - -0.03193554 + - -0.016900484 + - 0.06256093 + - 0.015902048 + - 0.062251173 + - 0.07478062 + - -0.009171957 + - -0.025452917 + - -0.015754124 + - -0.004426243 + - -0.0873611 + - 0.0077999695 + - 0.061026644 + - 0.016489599 + - 0.0066420045 + - -0.0062355455 + - 0.00345123 + - -0.022935547 + - 0.03939866 + - -0.0037231673 + - 0.0033949488 + - 0.029471302 + - 0.023097953 + - -0.0237214 + - 0.046621986 + - 0.029790087 + - -0.030113066 + - -0.012432801 + - 0.036813233 + - 0.01785254 + - -0.08032645 + - 0.051262226 + - 0.04222712 + - -0.023358794 + - -0.03602671 + - 0.0092950305 + - -0.015663076 + - -0.023873692 + - 0.009383877 + - -0.056770466 + - 0.032832243 + - 0.019920528 + - -0.04734062 + - -0.03368295 + - 0.0041841906 + - 0.03257228 + - -0.07387151 + - 0.011083565 + - 0.008633363 + - -0.04694844 + - 0.0027943242 + - -0.009078945 + - -0.011981829 + - -0.026407028 + - 0.033040557 + - -0.025803888 + - -0.021555608 + - 0.0042838412 + - -0.04263439 + - 0.0465685 + - 0.070476055 + - -0.02560814 + - 0.060619954 + - 0.0071254023 + - -0.062549844 + - -0.021544673 + - -0.03598606 + - -0.04904548 + - 0.04631042 + - -0.029345924 + - -0.015404836 + - 0.0063473387 + - -0.023926385 + - 0.022935716 + - -0.1004558 + - -0.007012574 + - 0.049480513 + - -0.02592937 + - 0.057209775 + - -0.010056263 + - -0.02236333 + - 0.008163001 + - 0.0036735693 + - -0.008406754 + - -0.0029980235 + - -0.0052409745 + - -0.014090007 + - -0.025248934 + - 0.022062942 + - -0.019766279 + - 0.07160526 + - -0.00075892545 + - -0.0096911425 + - -0.019483106 + - 0.042904716 + - -0.0013572425 + - 0.04353212 + - -0.07759716 + - -0.011731261 + - -0.10602095 + - 0.0010180247 + - -0.07403971 + - 0.043784548 + - -0.010357722 + - -0.009020027 + - 0.026289912 + - 0.053744033 + - 0.009665143 diff --git a/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap new file mode 100644 index 00000000..5db1bc22 --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap @@ -0,0 +1,772 @@ +--- +source: backends/candle/tests/test_flash_jina_code.rs +expression: embeddings_single +--- +- - -0.011624558 + - -0.0016926473 + - -0.006434922 + - -0.009909191 + - 0.027506275 + - 0.022786874 + - -0.059169117 + - -0.047887173 + - 0.038912594 + - 0.025214802 + - -0.014350341 + - 0.039117776 + - 0.03485464 + - 0.05296896 + - 0.034907352 + - 0.0013971328 + - 0.0019907136 + - 0.052471623 + - -0.014562107 + - 0.00030206257 + - -0.02770458 + - 0.02685756 + - -0.015385578 + - -0.012668428 + - -0.025259107 + - 0.00836893 + - 0.028925523 + - -0.035507426 + - -0.04220648 + - 0.047328673 + - -0.083232224 + - -0.02608385 + - -0.012809777 + - -0.0140402755 + - -0.013649549 + - -0.013641793 + - 0.02880054 + - 0.04465023 + - -0.0274121 + - -0.03170939 + - -0.047180377 + - -0.0349574 + - -0.037762504 + - 0.024104225 + - -0.039361924 + - -0.024559166 + - -0.0138650155 + - -0.049862508 + - -0.0507675 + - -0.07775355 + - -0.055519626 + - -0.025151063 + - 0.040781654 + - 0.0039354665 + - 0.015940087 + - -0.022214677 + - -0.013484792 + - -0.00070730236 + - -0.009409981 + - 0.0016682384 + - 0.016079267 + - -0.032368172 + - 0.024572799 + - 0.026780155 + - -0.025954 + - 0.021282032 + - -0.047395118 + - 0.044386413 + - -0.023020437 + - 0.0056320634 + - -0.017416032 + - -0.024118245 + - 0.05878816 + - 0.00059366866 + - -0.018553924 + - 0.003762008 + - 0.0035026476 + - -0.0077498616 + - -0.004517831 + - 0.008116448 + - -0.010922055 + - 0.037391223 + - -0.03318112 + - -0.07876148 + - -0.0018068684 + - -0.0484656 + - -0.038104814 + - -0.0070756334 + - -0.015427567 + - -0.04499487 + - 0.008910639 + - 0.029193114 + - 0.032674707 + - 0.0305758 + - -0.017541302 + - 0.028164856 + - -0.0344121 + - 0.016969312 + - 0.04108575 + - -0.054463603 + - -0.005427823 + - -0.008252881 + - -0.024992533 + - 0.048412405 + - -0.05769221 + - -0.08227673 + - -0.0523458 + - 0.025244992 + - -0.016289622 + - -0.049253095 + - -0.03999235 + - 0.05642755 + - -0.010015731 + - 0.04892553 + - -0.02504831 + - -0.014305144 + - 0.04907702 + - -0.0096177375 + - -0.0854665 + - 0.017617436 + - -0.014481601 + - 0.046187755 + - -0.030009247 + - -0.049553443 + - -0.006797771 + - -0.034234725 + - 0.06525787 + - 0.017298417 + - -0.018988462 + - -0.08520813 + - -0.011840521 + - -0.042942975 + - -0.056341827 + - 0.08071612 + - 0.028146833 + - -0.0141261155 + - 0.04001012 + - 0.018236378 + - 0.01583886 + - 0.0058086845 + - 0.0005290361 + - 0.0045259795 + - 0.024873685 + - 0.018050008 + - 0.02440984 + - -0.057676647 + - -0.022263395 + - -0.033016473 + - 0.014353932 + - -0.010189813 + - 0.018424626 + - -0.018238619 + - 0.07698089 + - -0.015595315 + - 0.007074499 + - 0.027340613 + - -0.02035102 + - -0.073149584 + - -0.0061021335 + - 0.0209061 + - -0.024985746 + - -0.020401739 + - -0.0048702923 + - 0.0444933 + - -0.02158648 + - 0.010312202 + - 0.009883107 + - 0.022790415 + - -0.01893943 + - 0.017615119 + - 0.023000762 + - -0.051276624 + - 0.019835759 + - 0.016675396 + - 0.021532865 + - 0.023097536 + - 0.01091247 + - 0.007642041 + - 0.0385409 + - 0.044193454 + - 0.003319116 + - 0.019355802 + - -0.055695307 + - -0.07680676 + - -0.035279598 + - -0.0070618573 + - -0.01408385 + - 0.03107026 + - 0.011547187 + - 0.04217532 + - 0.048034772 + - -0.014330861 + - -0.0007901662 + - 0.009103947 + - 0.011091706 + - -0.008960474 + - -0.009301379 + - 0.032424763 + - 0.09180531 + - 0.015491586 + - 0.031114861 + - 0.013289549 + - 0.03616163 + - 0.031084707 + - -0.021437835 + - 0.011905716 + - -0.104623 + - 0.033417992 + - -0.04683295 + - -0.05382028 + - 0.025979578 + - -0.003795323 + - 0.094473585 + - 0.09126942 + - 0.067700386 + - -0.002935823 + - -0.031604428 + - 0.0045677535 + - 0.014042491 + - -0.02969786 + - -0.012263599 + - -0.05807616 + - -0.0107510965 + - 0.022099612 + - 0.02685798 + - -0.048912797 + - 0.020464186 + - 0.011517319 + - -0.0016606319 + - -0.033255223 + - 0.02488959 + - -0.043240122 + - 0.00013934783 + - 0.037608404 + - 0.0748658 + - 0.061115693 + - -0.01670558 + - 0.037827995 + - -0.004162286 + - -0.00011341072 + - -0.031436242 + - -0.040532686 + - -0.0096016815 + - -0.065639205 + - -0.030070387 + - 0.05715196 + - 0.024338327 + - -0.008972259 + - -0.013220871 + - -0.07115904 + - -0.03446362 + - -0.010893238 + - 0.011950567 + - 0.0143028535 + - 0.0022963681 + - -0.060428943 + - 0.047038406 + - -0.017493663 + - 0.0208505 + - -0.010212147 + - -0.03337894 + - 0.026969628 + - -0.019734934 + - 0.0922163 + - -0.056534916 + - 0.017255465 + - 0.021692138 + - 0.023583038 + - 0.017224979 + - -0.0689936 + - 0.23665377 + - 0.04984247 + - -0.0039337534 + - -0.010740561 + - 0.00313393 + - -0.02665381 + - 0.013037893 + - 0.020565815 + - -0.002266256 + - 0.03748113 + - 0.018353125 + - -0.048318923 + - -0.06522075 + - -0.021460611 + - -0.029665926 + - -0.025507431 + - 0.0033435076 + - -0.0071087605 + - 0.001970083 + - -0.0025331723 + - 0.061776515 + - 0.017747495 + - 0.04396135 + - 0.0011617352 + - 0.02509327 + - 0.039078914 + - -0.03762337 + - 0.021575885 + - 0.015548619 + - 0.043990802 + - -0.024633111 + - -0.0013324996 + - 0.063795656 + - -0.02035371 + - -0.0440217 + - -0.033049908 + - 0.031034056 + - -0.004495562 + - -0.0044647786 + - -0.033148468 + - 0.0025072312 + - 0.009637453 + - 0.04357035 + - 0.044546504 + - -0.08865154 + - -0.08487347 + - 0.00205395 + - 0.0060572727 + - 0.023767816 + - 0.051007573 + - 0.0057035745 + - 0.040539596 + - -0.035988905 + - -0.01824621 + - 0.007887274 + - -0.052848075 + - 0.08228733 + - 0.0015825987 + - 0.0004136183 + - 0.018108545 + - 0.040081892 + - -0.035405345 + - 0.050933696 + - 0.036154125 + - -0.03947257 + - -0.0018412384 + - -0.005589829 + - 0.03620321 + - 0.012144826 + - -0.008619581 + - -0.0043279063 + - 0.016455552 + - -0.015757388 + - 0.047043085 + - 0.08675011 + - -0.009986743 + - 0.022379123 + - 0.009470605 + - 0.034120724 + - 0.009922824 + - -0.014435422 + - 0.017998574 + - -0.03849387 + - 0.042357396 + - -0.010053916 + - 0.057034835 + - -0.027412737 + - 0.017308975 + - 0.02185228 + - -0.048017155 + - -0.025138885 + - 0.016482655 + - -0.01756698 + - 0.031146016 + - 0.021930695 + - -0.00075341173 + - -0.015085438 + - 0.0146785155 + - 0.028547939 + - -0.036677707 + - -0.022699077 + - -0.045135103 + - -0.02802744 + - 0.071454674 + - -0.009201392 + - -0.051717956 + - -0.019421624 + - 0.0034821872 + - 0.06667364 + - 0.09145379 + - -0.068826884 + - 0.053568542 + - 0.01160062 + - -0.025829546 + - 0.04487214 + - 0.030954553 + - -0.022543794 + - -0.009475118 + - -0.014623143 + - -0.02070793 + - -0.02656788 + - 0.009701591 + - -0.025120718 + - -0.018472325 + - -0.027967019 + - -0.021122226 + - -0.009891716 + - 0.018696679 + - -0.068876855 + - -0.023419108 + - -0.025495855 + - 0.016256742 + - 0.00064859784 + - 0.037749656 + - -0.046321914 + - 0.065936595 + - -0.008921658 + - 0.07497468 + - -0.05094385 + - -0.052860104 + - 0.022196138 + - -0.0140462285 + - -0.03562305 + - 0.024858234 + - 0.021310989 + - 0.014657512 + - 0.07767391 + - -0.027777392 + - 0.057577316 + - 0.055513144 + - 0.06322926 + - -0.026312957 + - 0.010970987 + - -0.0057475767 + - 0.0028267235 + - 0.051367335 + - -0.022320578 + - 0.009050165 + - 0.016952222 + - -0.032026373 + - -0.074292615 + - -0.02315535 + - 0.025375988 + - -0.041241057 + - -0.032157563 + - -0.015576387 + - -0.015834223 + - 0.02224181 + - 0.017586967 + - -0.029070066 + - 0.0030065721 + - -0.051857695 + - 0.04008828 + - -0.007960872 + - -0.061745025 + - -0.00086617953 + - 0.026723113 + - 0.008719714 + - -0.049826868 + - -0.0046574236 + - 0.018954279 + - -0.007935451 + - 0.053987946 + - 0.022795292 + - 0.029722994 + - -0.010146585 + - -0.019956842 + - -0.014686722 + - 0.01708331 + - 0.020001508 + - 0.016564105 + - 0.011379248 + - -0.011843253 + - 0.04056168 + - 0.004384286 + - -0.049596023 + - 0.02674251 + - 0.0076475106 + - -0.0064563937 + - -0.014233138 + - 0.014224383 + - 0.0052741244 + - 0.049964864 + - -0.016286546 + - -0.001200327 + - 0.041904222 + - -0.0010395087 + - -0.05105399 + - 0.022099879 + - -0.019455278 + - 0.009444127 + - -0.081325725 + - 0.015994828 + - 0.0010952728 + - 0.0008373874 + - -0.0016424303 + - -0.05096469 + - 0.045976803 + - 0.024695056 + - -0.031656373 + - -0.0013138534 + - -0.0060524447 + - 0.060276203 + - -0.016745795 + - -0.029930653 + - -0.0222771 + - 0.012314711 + - 0.038991332 + - -0.006665343 + - 0.041694533 + - 0.0076992502 + - -0.014353178 + - 0.0025135442 + - -0.0498445 + - 0.020322764 + - 0.0575802 + - -0.006096128 + - -0.010841882 + - -0.024337102 + - 0.021975596 + - 0.0064031687 + - -0.026746146 + - 0.03455729 + - -0.011909055 + - 0.016994143 + - 0.026053395 + - -0.020393625 + - 0.06403403 + - 0.042590734 + - 0.009193913 + - 0.04016698 + - 0.028304791 + - 0.022147119 + - -0.030121539 + - -0.0037334429 + - 0.03235819 + - -0.020825844 + - 0.0009766509 + - -0.012216568 + - 0.07944978 + - 0.04177374 + - -0.008281654 + - -0.008908983 + - 0.04799388 + - -0.012743454 + - -0.00076762337 + - 0.012673029 + - -0.018283572 + - 0.022068778 + - -0.009605337 + - 0.0030652087 + - -0.036517244 + - -0.006263211 + - 0.0194632 + - 0.009333852 + - 0.02350168 + - -0.0008530139 + - 0.018934859 + - -0.013986168 + - -0.010833636 + - -0.011189203 + - 0.011567913 + - -0.07253544 + - -0.005748846 + - 0.11930293 + - 0.060044624 + - -0.023167728 + - -0.015781552 + - -0.010494401 + - 0.01930528 + - -0.039608266 + - -0.073587865 + - 0.0019034932 + - -0.0013838339 + - 0.026257295 + - 0.004433007 + - -0.051545423 + - -0.033456888 + - -0.06401291 + - -0.08664347 + - 0.010781564 + - 0.0408775 + - 0.021475399 + - 0.017633006 + - -0.02186024 + - 0.047795497 + - -0.006370007 + - 0.01792626 + - 0.005195737 + - 0.0026206016 + - -0.008816542 + - 0.009266863 + - -0.018453414 + - 0.0040575014 + - 0.0047053 + - -0.0197809 + - -0.01580334 + - 0.007821501 + - -0.06296649 + - -0.06274416 + - -0.0031381177 + - -0.024228694 + - -0.002459634 + - 0.00034323192 + - -0.02430543 + - -0.029262288 + - -0.04606642 + - -0.013138838 + - 0.040473 + - 0.012308485 + - 0.0020701357 + - -0.007718021 + - -0.0064122216 + - -0.024890581 + - 0.014665469 + - -0.0028788927 + - -0.047072053 + - -0.014959743 + - 0.004587824 + - -0.07462158 + - -0.008558996 + - 0.019324543 + - -0.02247574 + - -0.07721102 + - 0.007920586 + - -0.020274863 + - 0.028696692 + - 0.024707401 + - 0.016905285 + - 0.012742534 + - 0.018577736 + - -0.05768951 + - 0.03203929 + - 0.018105863 + - -0.03917534 + - -0.026208939 + - -0.038492158 + - -0.043517314 + - -0.008031121 + - -0.016162876 + - -0.0010640965 + - -0.004164019 + - 0.005193703 + - -0.0058410293 + - 0.029311381 + - -0.016533207 + - 0.05005747 + - 0.012600715 + - 0.016292874 + - -0.008300225 + - -0.08953819 + - 0.06544125 + - -0.010512851 + - -0.021443438 + - 0.030277776 + - -0.06502247 + - 0.004850903 + - -0.013137611 + - 0.0506941 + - 0.0072725127 + - -0.025755724 + - 0.008224718 + - 0.013813313 + - 0.037197027 + - 0.0023671025 + - 0.00763629 + - 0.011905766 + - 0.033143394 + - 0.007750765 + - -0.07725993 + - -0.03193554 + - -0.016900484 + - 0.06256093 + - 0.015902048 + - 0.062251173 + - 0.07478062 + - -0.009171957 + - -0.025452917 + - -0.015754124 + - -0.004426243 + - -0.0873611 + - 0.0077999695 + - 0.061026644 + - 0.016489599 + - 0.0066420045 + - -0.0062355455 + - 0.00345123 + - -0.022935547 + - 0.03939866 + - -0.0037231673 + - 0.0033949488 + - 0.029471302 + - 0.023097953 + - -0.0237214 + - 0.046621986 + - 0.029790087 + - -0.030113066 + - -0.012432801 + - 0.036813233 + - 0.01785254 + - -0.08032645 + - 0.051262226 + - 0.04222712 + - -0.023358794 + - -0.03602671 + - 0.0092950305 + - -0.015663076 + - -0.023873692 + - 0.009383877 + - -0.056770466 + - 0.032832243 + - 0.019920528 + - -0.04734062 + - -0.03368295 + - 0.0041841906 + - 0.03257228 + - -0.07387151 + - 0.011083565 + - 0.008633363 + - -0.04694844 + - 0.0027943242 + - -0.009078945 + - -0.011981829 + - -0.026407028 + - 0.033040557 + - -0.025803888 + - -0.021555608 + - 0.0042838412 + - -0.04263439 + - 0.0465685 + - 0.070476055 + - -0.02560814 + - 0.060619954 + - 0.0071254023 + - -0.062549844 + - -0.021544673 + - -0.03598606 + - -0.04904548 + - 0.04631042 + - -0.029345924 + - -0.015404836 + - 0.0063473387 + - -0.023926385 + - 0.022935716 + - -0.1004558 + - -0.007012574 + - 0.049480513 + - -0.02592937 + - 0.057209775 + - -0.010056263 + - -0.02236333 + - 0.008163001 + - 0.0036735693 + - -0.008406754 + - -0.0029980235 + - -0.0052409745 + - -0.014090007 + - -0.025248934 + - 0.022062942 + - -0.019766279 + - 0.07160526 + - -0.00075892545 + - -0.0096911425 + - -0.019483106 + - 0.042904716 + - -0.0013572425 + - 0.04353212 + - -0.07759716 + - -0.011731261 + - -0.10602095 + - 0.0010180247 + - -0.07403971 + - 0.043784548 + - -0.010357722 + - -0.009020027 + - 0.026289912 + - 0.053744033 + - 0.009665143 diff --git a/backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap b/backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap new file mode 100644 index 00000000..87f5bbd6 --- /dev/null +++ b/backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap @@ -0,0 +1,772 @@ +--- +source: backends/candle/tests/test_jina_code.rs +expression: embeddings_batch +--- +- - -0.011624558 + - -0.0016926473 + - -0.006434922 + - -0.009909191 + - 0.027506275 + - 0.022786874 + - -0.059169117 + - -0.047887173 + - 0.038912594 + - 0.025214802 + - -0.014350341 + - 0.039117776 + - 0.03485464 + - 0.05296896 + - 0.034907352 + - 0.0013971328 + - 0.0019907136 + - 0.052471623 + - -0.014562107 + - 0.00030206257 + - -0.02770458 + - 0.02685756 + - -0.015385578 + - -0.012668428 + - -0.025259107 + - 0.00836893 + - 0.028925523 + - -0.035507426 + - -0.04220648 + - 0.047328673 + - -0.083232224 + - -0.02608385 + - -0.012809777 + - -0.0140402755 + - -0.013649549 + - -0.013641793 + - 0.02880054 + - 0.04465023 + - -0.0274121 + - -0.03170939 + - -0.047180377 + - -0.0349574 + - -0.037762504 + - 0.024104225 + - -0.039361924 + - -0.024559166 + - -0.0138650155 + - -0.049862508 + - -0.0507675 + - -0.07775355 + - -0.055519626 + - -0.025151063 + - 0.040781654 + - 0.0039354665 + - 0.015940087 + - -0.022214677 + - -0.013484792 + - -0.00070730236 + - -0.009409981 + - 0.0016682384 + - 0.016079267 + - -0.032368172 + - 0.024572799 + - 0.026780155 + - -0.025954 + - 0.021282032 + - -0.047395118 + - 0.044386413 + - -0.023020437 + - 0.0056320634 + - -0.017416032 + - -0.024118245 + - 0.05878816 + - 0.00059366866 + - -0.018553924 + - 0.003762008 + - 0.0035026476 + - -0.0077498616 + - -0.004517831 + - 0.008116448 + - -0.010922055 + - 0.037391223 + - -0.03318112 + - -0.07876148 + - -0.0018068684 + - -0.0484656 + - -0.038104814 + - -0.0070756334 + - -0.015427567 + - -0.04499487 + - 0.008910639 + - 0.029193114 + - 0.032674707 + - 0.0305758 + - -0.017541302 + - 0.028164856 + - -0.0344121 + - 0.016969312 + - 0.04108575 + - -0.054463603 + - -0.005427823 + - -0.008252881 + - -0.024992533 + - 0.048412405 + - -0.05769221 + - -0.08227673 + - -0.0523458 + - 0.025244992 + - -0.016289622 + - -0.049253095 + - -0.03999235 + - 0.05642755 + - -0.010015731 + - 0.04892553 + - -0.02504831 + - -0.014305144 + - 0.04907702 + - -0.0096177375 + - -0.0854665 + - 0.017617436 + - -0.014481601 + - 0.046187755 + - -0.030009247 + - -0.049553443 + - -0.006797771 + - -0.034234725 + - 0.06525787 + - 0.017298417 + - -0.018988462 + - -0.08520813 + - -0.011840521 + - -0.042942975 + - -0.056341827 + - 0.08071612 + - 0.028146833 + - -0.0141261155 + - 0.04001012 + - 0.018236378 + - 0.01583886 + - 0.0058086845 + - 0.0005290361 + - 0.0045259795 + - 0.024873685 + - 0.018050008 + - 0.02440984 + - -0.057676647 + - -0.022263395 + - -0.033016473 + - 0.014353932 + - -0.010189813 + - 0.018424626 + - -0.018238619 + - 0.07698089 + - -0.015595315 + - 0.007074499 + - 0.027340613 + - -0.02035102 + - -0.073149584 + - -0.0061021335 + - 0.0209061 + - -0.024985746 + - -0.020401739 + - -0.0048702923 + - 0.0444933 + - -0.02158648 + - 0.010312202 + - 0.009883107 + - 0.022790415 + - -0.01893943 + - 0.017615119 + - 0.023000762 + - -0.051276624 + - 0.019835759 + - 0.016675396 + - 0.021532865 + - 0.023097536 + - 0.01091247 + - 0.007642041 + - 0.0385409 + - 0.044193454 + - 0.003319116 + - 0.019355802 + - -0.055695307 + - -0.07680676 + - -0.035279598 + - -0.0070618573 + - -0.01408385 + - 0.03107026 + - 0.011547187 + - 0.04217532 + - 0.048034772 + - -0.014330861 + - -0.0007901662 + - 0.009103947 + - 0.011091706 + - -0.008960474 + - -0.009301379 + - 0.032424763 + - 0.09180531 + - 0.015491586 + - 0.031114861 + - 0.013289549 + - 0.03616163 + - 0.031084707 + - -0.021437835 + - 0.011905716 + - -0.104623 + - 0.033417992 + - -0.04683295 + - -0.05382028 + - 0.025979578 + - -0.003795323 + - 0.094473585 + - 0.09126942 + - 0.067700386 + - -0.002935823 + - -0.031604428 + - 0.0045677535 + - 0.014042491 + - -0.02969786 + - -0.012263599 + - -0.05807616 + - -0.0107510965 + - 0.022099612 + - 0.02685798 + - -0.048912797 + - 0.020464186 + - 0.011517319 + - -0.0016606319 + - -0.033255223 + - 0.02488959 + - -0.043240122 + - 0.00013934783 + - 0.037608404 + - 0.0748658 + - 0.061115693 + - -0.01670558 + - 0.037827995 + - -0.004162286 + - -0.00011341072 + - -0.031436242 + - -0.040532686 + - -0.0096016815 + - -0.065639205 + - -0.030070387 + - 0.05715196 + - 0.024338327 + - -0.008972259 + - -0.013220871 + - -0.07115904 + - -0.03446362 + - -0.010893238 + - 0.011950567 + - 0.0143028535 + - 0.0022963681 + - -0.060428943 + - 0.047038406 + - -0.017493663 + - 0.0208505 + - -0.010212147 + - -0.03337894 + - 0.026969628 + - -0.019734934 + - 0.0922163 + - -0.056534916 + - 0.017255465 + - 0.021692138 + - 0.023583038 + - 0.017224979 + - -0.0689936 + - 0.23665377 + - 0.04984247 + - -0.0039337534 + - -0.010740561 + - 0.00313393 + - -0.02665381 + - 0.013037893 + - 0.020565815 + - -0.002266256 + - 0.03748113 + - 0.018353125 + - -0.048318923 + - -0.06522075 + - -0.021460611 + - -0.029665926 + - -0.025507431 + - 0.0033435076 + - -0.0071087605 + - 0.001970083 + - -0.0025331723 + - 0.061776515 + - 0.017747495 + - 0.04396135 + - 0.0011617352 + - 0.02509327 + - 0.039078914 + - -0.03762337 + - 0.021575885 + - 0.015548619 + - 0.043990802 + - -0.024633111 + - -0.0013324996 + - 0.063795656 + - -0.02035371 + - -0.0440217 + - -0.033049908 + - 0.031034056 + - -0.004495562 + - -0.0044647786 + - -0.033148468 + - 0.0025072312 + - 0.009637453 + - 0.04357035 + - 0.044546504 + - -0.08865154 + - -0.08487347 + - 0.00205395 + - 0.0060572727 + - 0.023767816 + - 0.051007573 + - 0.0057035745 + - 0.040539596 + - -0.035988905 + - -0.01824621 + - 0.007887274 + - -0.052848075 + - 0.08228733 + - 0.0015825987 + - 0.0004136183 + - 0.018108545 + - 0.040081892 + - -0.035405345 + - 0.050933696 + - 0.036154125 + - -0.03947257 + - -0.0018412384 + - -0.005589829 + - 0.03620321 + - 0.012144826 + - -0.008619581 + - -0.0043279063 + - 0.016455552 + - -0.015757388 + - 0.047043085 + - 0.08675011 + - -0.009986743 + - 0.022379123 + - 0.009470605 + - 0.034120724 + - 0.009922824 + - -0.014435422 + - 0.017998574 + - -0.03849387 + - 0.042357396 + - -0.010053916 + - 0.057034835 + - -0.027412737 + - 0.017308975 + - 0.02185228 + - -0.048017155 + - -0.025138885 + - 0.016482655 + - -0.01756698 + - 0.031146016 + - 0.021930695 + - -0.00075341173 + - -0.015085438 + - 0.0146785155 + - 0.028547939 + - -0.036677707 + - -0.022699077 + - -0.045135103 + - -0.02802744 + - 0.071454674 + - -0.009201392 + - -0.051717956 + - -0.019421624 + - 0.0034821872 + - 0.06667364 + - 0.09145379 + - -0.068826884 + - 0.053568542 + - 0.01160062 + - -0.025829546 + - 0.04487214 + - 0.030954553 + - -0.022543794 + - -0.009475118 + - -0.014623143 + - -0.02070793 + - -0.02656788 + - 0.009701591 + - -0.025120718 + - -0.018472325 + - -0.027967019 + - -0.021122226 + - -0.009891716 + - 0.018696679 + - -0.068876855 + - -0.023419108 + - -0.025495855 + - 0.016256742 + - 0.00064859784 + - 0.037749656 + - -0.046321914 + - 0.065936595 + - -0.008921658 + - 0.07497468 + - -0.05094385 + - -0.052860104 + - 0.022196138 + - -0.0140462285 + - -0.03562305 + - 0.024858234 + - 0.021310989 + - 0.014657512 + - 0.07767391 + - -0.027777392 + - 0.057577316 + - 0.055513144 + - 0.06322926 + - -0.026312957 + - 0.010970987 + - -0.0057475767 + - 0.0028267235 + - 0.051367335 + - -0.022320578 + - 0.009050165 + - 0.016952222 + - -0.032026373 + - -0.074292615 + - -0.02315535 + - 0.025375988 + - -0.041241057 + - -0.032157563 + - -0.015576387 + - -0.015834223 + - 0.02224181 + - 0.017586967 + - -0.029070066 + - 0.0030065721 + - -0.051857695 + - 0.04008828 + - -0.007960872 + - -0.061745025 + - -0.00086617953 + - 0.026723113 + - 0.008719714 + - -0.049826868 + - -0.0046574236 + - 0.018954279 + - -0.007935451 + - 0.053987946 + - 0.022795292 + - 0.029722994 + - -0.010146585 + - -0.019956842 + - -0.014686722 + - 0.01708331 + - 0.020001508 + - 0.016564105 + - 0.011379248 + - -0.011843253 + - 0.04056168 + - 0.004384286 + - -0.049596023 + - 0.02674251 + - 0.0076475106 + - -0.0064563937 + - -0.014233138 + - 0.014224383 + - 0.0052741244 + - 0.049964864 + - -0.016286546 + - -0.001200327 + - 0.041904222 + - -0.0010395087 + - -0.05105399 + - 0.022099879 + - -0.019455278 + - 0.009444127 + - -0.081325725 + - 0.015994828 + - 0.0010952728 + - 0.0008373874 + - -0.0016424303 + - -0.05096469 + - 0.045976803 + - 0.024695056 + - -0.031656373 + - -0.0013138534 + - -0.0060524447 + - 0.060276203 + - -0.016745795 + - -0.029930653 + - -0.0222771 + - 0.012314711 + - 0.038991332 + - -0.006665343 + - 0.041694533 + - 0.0076992502 + - -0.014353178 + - 0.0025135442 + - -0.0498445 + - 0.020322764 + - 0.0575802 + - -0.006096128 + - -0.010841882 + - -0.024337102 + - 0.021975596 + - 0.0064031687 + - -0.026746146 + - 0.03455729 + - -0.011909055 + - 0.016994143 + - 0.026053395 + - -0.020393625 + - 0.06403403 + - 0.042590734 + - 0.009193913 + - 0.04016698 + - 0.028304791 + - 0.022147119 + - -0.030121539 + - -0.0037334429 + - 0.03235819 + - -0.020825844 + - 0.0009766509 + - -0.012216568 + - 0.07944978 + - 0.04177374 + - -0.008281654 + - -0.008908983 + - 0.04799388 + - -0.012743454 + - -0.00076762337 + - 0.012673029 + - -0.018283572 + - 0.022068778 + - -0.009605337 + - 0.0030652087 + - -0.036517244 + - -0.006263211 + - 0.0194632 + - 0.009333852 + - 0.02350168 + - -0.0008530139 + - 0.018934859 + - -0.013986168 + - -0.010833636 + - -0.011189203 + - 0.011567913 + - -0.07253544 + - -0.005748846 + - 0.11930293 + - 0.060044624 + - -0.023167728 + - -0.015781552 + - -0.010494401 + - 0.01930528 + - -0.039608266 + - -0.073587865 + - 0.0019034932 + - -0.0013838339 + - 0.026257295 + - 0.004433007 + - -0.051545423 + - -0.033456888 + - -0.06401291 + - -0.08664347 + - 0.010781564 + - 0.0408775 + - 0.021475399 + - 0.017633006 + - -0.02186024 + - 0.047795497 + - -0.006370007 + - 0.01792626 + - 0.005195737 + - 0.0026206016 + - -0.008816542 + - 0.009266863 + - -0.018453414 + - 0.0040575014 + - 0.0047053 + - -0.0197809 + - -0.01580334 + - 0.007821501 + - -0.06296649 + - -0.06274416 + - -0.0031381177 + - -0.024228694 + - -0.002459634 + - 0.00034323192 + - -0.02430543 + - -0.029262288 + - -0.04606642 + - -0.013138838 + - 0.040473 + - 0.012308485 + - 0.0020701357 + - -0.007718021 + - -0.0064122216 + - -0.024890581 + - 0.014665469 + - -0.0028788927 + - -0.047072053 + - -0.014959743 + - 0.004587824 + - -0.07462158 + - -0.008558996 + - 0.019324543 + - -0.02247574 + - -0.07721102 + - 0.007920586 + - -0.020274863 + - 0.028696692 + - 0.024707401 + - 0.016905285 + - 0.012742534 + - 0.018577736 + - -0.05768951 + - 0.03203929 + - 0.018105863 + - -0.03917534 + - -0.026208939 + - -0.038492158 + - -0.043517314 + - -0.008031121 + - -0.016162876 + - -0.0010640965 + - -0.004164019 + - 0.005193703 + - -0.0058410293 + - 0.029311381 + - -0.016533207 + - 0.05005747 + - 0.012600715 + - 0.016292874 + - -0.008300225 + - -0.08953819 + - 0.06544125 + - -0.010512851 + - -0.021443438 + - 0.030277776 + - -0.06502247 + - 0.004850903 + - -0.013137611 + - 0.0506941 + - 0.0072725127 + - -0.025755724 + - 0.008224718 + - 0.013813313 + - 0.037197027 + - 0.0023671025 + - 0.00763629 + - 0.011905766 + - 0.033143394 + - 0.007750765 + - -0.07725993 + - -0.03193554 + - -0.016900484 + - 0.06256093 + - 0.015902048 + - 0.062251173 + - 0.07478062 + - -0.009171957 + - -0.025452917 + - -0.015754124 + - -0.004426243 + - -0.0873611 + - 0.0077999695 + - 0.061026644 + - 0.016489599 + - 0.0066420045 + - -0.0062355455 + - 0.00345123 + - -0.022935547 + - 0.03939866 + - -0.0037231673 + - 0.0033949488 + - 0.029471302 + - 0.023097953 + - -0.0237214 + - 0.046621986 + - 0.029790087 + - -0.030113066 + - -0.012432801 + - 0.036813233 + - 0.01785254 + - -0.08032645 + - 0.051262226 + - 0.04222712 + - -0.023358794 + - -0.03602671 + - 0.0092950305 + - -0.015663076 + - -0.023873692 + - 0.009383877 + - -0.056770466 + - 0.032832243 + - 0.019920528 + - -0.04734062 + - -0.03368295 + - 0.0041841906 + - 0.03257228 + - -0.07387151 + - 0.011083565 + - 0.008633363 + - -0.04694844 + - 0.0027943242 + - -0.009078945 + - -0.011981829 + - -0.026407028 + - 0.033040557 + - -0.025803888 + - -0.021555608 + - 0.0042838412 + - -0.04263439 + - 0.0465685 + - 0.070476055 + - -0.02560814 + - 0.060619954 + - 0.0071254023 + - -0.062549844 + - -0.021544673 + - -0.03598606 + - -0.04904548 + - 0.04631042 + - -0.029345924 + - -0.015404836 + - 0.0063473387 + - -0.023926385 + - 0.022935716 + - -0.1004558 + - -0.007012574 + - 0.049480513 + - -0.02592937 + - 0.057209775 + - -0.010056263 + - -0.02236333 + - 0.008163001 + - 0.0036735693 + - -0.008406754 + - -0.0029980235 + - -0.0052409745 + - -0.014090007 + - -0.025248934 + - 0.022062942 + - -0.019766279 + - 0.07160526 + - -0.00075892545 + - -0.0096911425 + - -0.019483106 + - 0.042904716 + - -0.0013572425 + - 0.04353212 + - -0.07759716 + - -0.011731261 + - -0.10602095 + - 0.0010180247 + - -0.07403971 + - 0.043784548 + - -0.010357722 + - -0.009020027 + - 0.026289912 + - 0.053744033 + - 0.009665143 diff --git a/backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap b/backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap new file mode 100644 index 00000000..ee1cdfa1 --- /dev/null +++ b/backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap @@ -0,0 +1,772 @@ +--- +source: backends/candle/tests/test_jina_code.rs +expression: embeddings_single +--- +- - -0.011624558 + - -0.0016926473 + - -0.006434922 + - -0.009909191 + - 0.027506275 + - 0.022786874 + - -0.059169117 + - -0.047887173 + - 0.038912594 + - 0.025214802 + - -0.014350341 + - 0.039117776 + - 0.03485464 + - 0.05296896 + - 0.034907352 + - 0.0013971328 + - 0.0019907136 + - 0.052471623 + - -0.014562107 + - 0.00030206257 + - -0.02770458 + - 0.02685756 + - -0.015385578 + - -0.012668428 + - -0.025259107 + - 0.00836893 + - 0.028925523 + - -0.035507426 + - -0.04220648 + - 0.047328673 + - -0.083232224 + - -0.02608385 + - -0.012809777 + - -0.0140402755 + - -0.013649549 + - -0.013641793 + - 0.02880054 + - 0.04465023 + - -0.0274121 + - -0.03170939 + - -0.047180377 + - -0.0349574 + - -0.037762504 + - 0.024104225 + - -0.039361924 + - -0.024559166 + - -0.0138650155 + - -0.049862508 + - -0.0507675 + - -0.07775355 + - -0.055519626 + - -0.025151063 + - 0.040781654 + - 0.0039354665 + - 0.015940087 + - -0.022214677 + - -0.013484792 + - -0.00070730236 + - -0.009409981 + - 0.0016682384 + - 0.016079267 + - -0.032368172 + - 0.024572799 + - 0.026780155 + - -0.025954 + - 0.021282032 + - -0.047395118 + - 0.044386413 + - -0.023020437 + - 0.0056320634 + - -0.017416032 + - -0.024118245 + - 0.05878816 + - 0.00059366866 + - -0.018553924 + - 0.003762008 + - 0.0035026476 + - -0.0077498616 + - -0.004517831 + - 0.008116448 + - -0.010922055 + - 0.037391223 + - -0.03318112 + - -0.07876148 + - -0.0018068684 + - -0.0484656 + - -0.038104814 + - -0.0070756334 + - -0.015427567 + - -0.04499487 + - 0.008910639 + - 0.029193114 + - 0.032674707 + - 0.0305758 + - -0.017541302 + - 0.028164856 + - -0.0344121 + - 0.016969312 + - 0.04108575 + - -0.054463603 + - -0.005427823 + - -0.008252881 + - -0.024992533 + - 0.048412405 + - -0.05769221 + - -0.08227673 + - -0.0523458 + - 0.025244992 + - -0.016289622 + - -0.049253095 + - -0.03999235 + - 0.05642755 + - -0.010015731 + - 0.04892553 + - -0.02504831 + - -0.014305144 + - 0.04907702 + - -0.0096177375 + - -0.0854665 + - 0.017617436 + - -0.014481601 + - 0.046187755 + - -0.030009247 + - -0.049553443 + - -0.006797771 + - -0.034234725 + - 0.06525787 + - 0.017298417 + - -0.018988462 + - -0.08520813 + - -0.011840521 + - -0.042942975 + - -0.056341827 + - 0.08071612 + - 0.028146833 + - -0.0141261155 + - 0.04001012 + - 0.018236378 + - 0.01583886 + - 0.0058086845 + - 0.0005290361 + - 0.0045259795 + - 0.024873685 + - 0.018050008 + - 0.02440984 + - -0.057676647 + - -0.022263395 + - -0.033016473 + - 0.014353932 + - -0.010189813 + - 0.018424626 + - -0.018238619 + - 0.07698089 + - -0.015595315 + - 0.007074499 + - 0.027340613 + - -0.02035102 + - -0.073149584 + - -0.0061021335 + - 0.0209061 + - -0.024985746 + - -0.020401739 + - -0.0048702923 + - 0.0444933 + - -0.02158648 + - 0.010312202 + - 0.009883107 + - 0.022790415 + - -0.01893943 + - 0.017615119 + - 0.023000762 + - -0.051276624 + - 0.019835759 + - 0.016675396 + - 0.021532865 + - 0.023097536 + - 0.01091247 + - 0.007642041 + - 0.0385409 + - 0.044193454 + - 0.003319116 + - 0.019355802 + - -0.055695307 + - -0.07680676 + - -0.035279598 + - -0.0070618573 + - -0.01408385 + - 0.03107026 + - 0.011547187 + - 0.04217532 + - 0.048034772 + - -0.014330861 + - -0.0007901662 + - 0.009103947 + - 0.011091706 + - -0.008960474 + - -0.009301379 + - 0.032424763 + - 0.09180531 + - 0.015491586 + - 0.031114861 + - 0.013289549 + - 0.03616163 + - 0.031084707 + - -0.021437835 + - 0.011905716 + - -0.104623 + - 0.033417992 + - -0.04683295 + - -0.05382028 + - 0.025979578 + - -0.003795323 + - 0.094473585 + - 0.09126942 + - 0.067700386 + - -0.002935823 + - -0.031604428 + - 0.0045677535 + - 0.014042491 + - -0.02969786 + - -0.012263599 + - -0.05807616 + - -0.0107510965 + - 0.022099612 + - 0.02685798 + - -0.048912797 + - 0.020464186 + - 0.011517319 + - -0.0016606319 + - -0.033255223 + - 0.02488959 + - -0.043240122 + - 0.00013934783 + - 0.037608404 + - 0.0748658 + - 0.061115693 + - -0.01670558 + - 0.037827995 + - -0.004162286 + - -0.00011341072 + - -0.031436242 + - -0.040532686 + - -0.0096016815 + - -0.065639205 + - -0.030070387 + - 0.05715196 + - 0.024338327 + - -0.008972259 + - -0.013220871 + - -0.07115904 + - -0.03446362 + - -0.010893238 + - 0.011950567 + - 0.0143028535 + - 0.0022963681 + - -0.060428943 + - 0.047038406 + - -0.017493663 + - 0.0208505 + - -0.010212147 + - -0.03337894 + - 0.026969628 + - -0.019734934 + - 0.0922163 + - -0.056534916 + - 0.017255465 + - 0.021692138 + - 0.023583038 + - 0.017224979 + - -0.0689936 + - 0.23665377 + - 0.04984247 + - -0.0039337534 + - -0.010740561 + - 0.00313393 + - -0.02665381 + - 0.013037893 + - 0.020565815 + - -0.002266256 + - 0.03748113 + - 0.018353125 + - -0.048318923 + - -0.06522075 + - -0.021460611 + - -0.029665926 + - -0.025507431 + - 0.0033435076 + - -0.0071087605 + - 0.001970083 + - -0.0025331723 + - 0.061776515 + - 0.017747495 + - 0.04396135 + - 0.0011617352 + - 0.02509327 + - 0.039078914 + - -0.03762337 + - 0.021575885 + - 0.015548619 + - 0.043990802 + - -0.024633111 + - -0.0013324996 + - 0.063795656 + - -0.02035371 + - -0.0440217 + - -0.033049908 + - 0.031034056 + - -0.004495562 + - -0.0044647786 + - -0.033148468 + - 0.0025072312 + - 0.009637453 + - 0.04357035 + - 0.044546504 + - -0.08865154 + - -0.08487347 + - 0.00205395 + - 0.0060572727 + - 0.023767816 + - 0.051007573 + - 0.0057035745 + - 0.040539596 + - -0.035988905 + - -0.01824621 + - 0.007887274 + - -0.052848075 + - 0.08228733 + - 0.0015825987 + - 0.0004136183 + - 0.018108545 + - 0.040081892 + - -0.035405345 + - 0.050933696 + - 0.036154125 + - -0.03947257 + - -0.0018412384 + - -0.005589829 + - 0.03620321 + - 0.012144826 + - -0.008619581 + - -0.0043279063 + - 0.016455552 + - -0.015757388 + - 0.047043085 + - 0.08675011 + - -0.009986743 + - 0.022379123 + - 0.009470605 + - 0.034120724 + - 0.009922824 + - -0.014435422 + - 0.017998574 + - -0.03849387 + - 0.042357396 + - -0.010053916 + - 0.057034835 + - -0.027412737 + - 0.017308975 + - 0.02185228 + - -0.048017155 + - -0.025138885 + - 0.016482655 + - -0.01756698 + - 0.031146016 + - 0.021930695 + - -0.00075341173 + - -0.015085438 + - 0.0146785155 + - 0.028547939 + - -0.036677707 + - -0.022699077 + - -0.045135103 + - -0.02802744 + - 0.071454674 + - -0.009201392 + - -0.051717956 + - -0.019421624 + - 0.0034821872 + - 0.06667364 + - 0.09145379 + - -0.068826884 + - 0.053568542 + - 0.01160062 + - -0.025829546 + - 0.04487214 + - 0.030954553 + - -0.022543794 + - -0.009475118 + - -0.014623143 + - -0.02070793 + - -0.02656788 + - 0.009701591 + - -0.025120718 + - -0.018472325 + - -0.027967019 + - -0.021122226 + - -0.009891716 + - 0.018696679 + - -0.068876855 + - -0.023419108 + - -0.025495855 + - 0.016256742 + - 0.00064859784 + - 0.037749656 + - -0.046321914 + - 0.065936595 + - -0.008921658 + - 0.07497468 + - -0.05094385 + - -0.052860104 + - 0.022196138 + - -0.0140462285 + - -0.03562305 + - 0.024858234 + - 0.021310989 + - 0.014657512 + - 0.07767391 + - -0.027777392 + - 0.057577316 + - 0.055513144 + - 0.06322926 + - -0.026312957 + - 0.010970987 + - -0.0057475767 + - 0.0028267235 + - 0.051367335 + - -0.022320578 + - 0.009050165 + - 0.016952222 + - -0.032026373 + - -0.074292615 + - -0.02315535 + - 0.025375988 + - -0.041241057 + - -0.032157563 + - -0.015576387 + - -0.015834223 + - 0.02224181 + - 0.017586967 + - -0.029070066 + - 0.0030065721 + - -0.051857695 + - 0.04008828 + - -0.007960872 + - -0.061745025 + - -0.00086617953 + - 0.026723113 + - 0.008719714 + - -0.049826868 + - -0.0046574236 + - 0.018954279 + - -0.007935451 + - 0.053987946 + - 0.022795292 + - 0.029722994 + - -0.010146585 + - -0.019956842 + - -0.014686722 + - 0.01708331 + - 0.020001508 + - 0.016564105 + - 0.011379248 + - -0.011843253 + - 0.04056168 + - 0.004384286 + - -0.049596023 + - 0.02674251 + - 0.0076475106 + - -0.0064563937 + - -0.014233138 + - 0.014224383 + - 0.0052741244 + - 0.049964864 + - -0.016286546 + - -0.001200327 + - 0.041904222 + - -0.0010395087 + - -0.05105399 + - 0.022099879 + - -0.019455278 + - 0.009444127 + - -0.081325725 + - 0.015994828 + - 0.0010952728 + - 0.0008373874 + - -0.0016424303 + - -0.05096469 + - 0.045976803 + - 0.024695056 + - -0.031656373 + - -0.0013138534 + - -0.0060524447 + - 0.060276203 + - -0.016745795 + - -0.029930653 + - -0.0222771 + - 0.012314711 + - 0.038991332 + - -0.006665343 + - 0.041694533 + - 0.0076992502 + - -0.014353178 + - 0.0025135442 + - -0.0498445 + - 0.020322764 + - 0.0575802 + - -0.006096128 + - -0.010841882 + - -0.024337102 + - 0.021975596 + - 0.0064031687 + - -0.026746146 + - 0.03455729 + - -0.011909055 + - 0.016994143 + - 0.026053395 + - -0.020393625 + - 0.06403403 + - 0.042590734 + - 0.009193913 + - 0.04016698 + - 0.028304791 + - 0.022147119 + - -0.030121539 + - -0.0037334429 + - 0.03235819 + - -0.020825844 + - 0.0009766509 + - -0.012216568 + - 0.07944978 + - 0.04177374 + - -0.008281654 + - -0.008908983 + - 0.04799388 + - -0.012743454 + - -0.00076762337 + - 0.012673029 + - -0.018283572 + - 0.022068778 + - -0.009605337 + - 0.0030652087 + - -0.036517244 + - -0.006263211 + - 0.0194632 + - 0.009333852 + - 0.02350168 + - -0.0008530139 + - 0.018934859 + - -0.013986168 + - -0.010833636 + - -0.011189203 + - 0.011567913 + - -0.07253544 + - -0.005748846 + - 0.11930293 + - 0.060044624 + - -0.023167728 + - -0.015781552 + - -0.010494401 + - 0.01930528 + - -0.039608266 + - -0.073587865 + - 0.0019034932 + - -0.0013838339 + - 0.026257295 + - 0.004433007 + - -0.051545423 + - -0.033456888 + - -0.06401291 + - -0.08664347 + - 0.010781564 + - 0.0408775 + - 0.021475399 + - 0.017633006 + - -0.02186024 + - 0.047795497 + - -0.006370007 + - 0.01792626 + - 0.005195737 + - 0.0026206016 + - -0.008816542 + - 0.009266863 + - -0.018453414 + - 0.0040575014 + - 0.0047053 + - -0.0197809 + - -0.01580334 + - 0.007821501 + - -0.06296649 + - -0.06274416 + - -0.0031381177 + - -0.024228694 + - -0.002459634 + - 0.00034323192 + - -0.02430543 + - -0.029262288 + - -0.04606642 + - -0.013138838 + - 0.040473 + - 0.012308485 + - 0.0020701357 + - -0.007718021 + - -0.0064122216 + - -0.024890581 + - 0.014665469 + - -0.0028788927 + - -0.047072053 + - -0.014959743 + - 0.004587824 + - -0.07462158 + - -0.008558996 + - 0.019324543 + - -0.02247574 + - -0.07721102 + - 0.007920586 + - -0.020274863 + - 0.028696692 + - 0.024707401 + - 0.016905285 + - 0.012742534 + - 0.018577736 + - -0.05768951 + - 0.03203929 + - 0.018105863 + - -0.03917534 + - -0.026208939 + - -0.038492158 + - -0.043517314 + - -0.008031121 + - -0.016162876 + - -0.0010640965 + - -0.004164019 + - 0.005193703 + - -0.0058410293 + - 0.029311381 + - -0.016533207 + - 0.05005747 + - 0.012600715 + - 0.016292874 + - -0.008300225 + - -0.08953819 + - 0.06544125 + - -0.010512851 + - -0.021443438 + - 0.030277776 + - -0.06502247 + - 0.004850903 + - -0.013137611 + - 0.0506941 + - 0.0072725127 + - -0.025755724 + - 0.008224718 + - 0.013813313 + - 0.037197027 + - 0.0023671025 + - 0.00763629 + - 0.011905766 + - 0.033143394 + - 0.007750765 + - -0.07725993 + - -0.03193554 + - -0.016900484 + - 0.06256093 + - 0.015902048 + - 0.062251173 + - 0.07478062 + - -0.009171957 + - -0.025452917 + - -0.015754124 + - -0.004426243 + - -0.0873611 + - 0.0077999695 + - 0.061026644 + - 0.016489599 + - 0.0066420045 + - -0.0062355455 + - 0.00345123 + - -0.022935547 + - 0.03939866 + - -0.0037231673 + - 0.0033949488 + - 0.029471302 + - 0.023097953 + - -0.0237214 + - 0.046621986 + - 0.029790087 + - -0.030113066 + - -0.012432801 + - 0.036813233 + - 0.01785254 + - -0.08032645 + - 0.051262226 + - 0.04222712 + - -0.023358794 + - -0.03602671 + - 0.0092950305 + - -0.015663076 + - -0.023873692 + - 0.009383877 + - -0.056770466 + - 0.032832243 + - 0.019920528 + - -0.04734062 + - -0.03368295 + - 0.0041841906 + - 0.03257228 + - -0.07387151 + - 0.011083565 + - 0.008633363 + - -0.04694844 + - 0.0027943242 + - -0.009078945 + - -0.011981829 + - -0.026407028 + - 0.033040557 + - -0.025803888 + - -0.021555608 + - 0.0042838412 + - -0.04263439 + - 0.0465685 + - 0.070476055 + - -0.02560814 + - 0.060619954 + - 0.0071254023 + - -0.062549844 + - -0.021544673 + - -0.03598606 + - -0.04904548 + - 0.04631042 + - -0.029345924 + - -0.015404836 + - 0.0063473387 + - -0.023926385 + - 0.022935716 + - -0.1004558 + - -0.007012574 + - 0.049480513 + - -0.02592937 + - 0.057209775 + - -0.010056263 + - -0.02236333 + - 0.008163001 + - 0.0036735693 + - -0.008406754 + - -0.0029980235 + - -0.0052409745 + - -0.014090007 + - -0.025248934 + - 0.022062942 + - -0.019766279 + - 0.07160526 + - -0.00075892545 + - -0.0096911425 + - -0.019483106 + - 0.042904716 + - -0.0013572425 + - 0.04353212 + - -0.07759716 + - -0.011731261 + - -0.10602095 + - 0.0010180247 + - -0.07403971 + - 0.043784548 + - -0.010357722 + - -0.009020027 + - 0.026289912 + - 0.053744033 + - 0.009665143 diff --git a/backends/candle/tests/test_flash_jina.rs b/backends/candle/tests/test_flash_jina.rs index 4a5f8276..4e42428a 100644 --- a/backends/candle/tests/test_flash_jina.rs +++ b/backends/candle/tests/test_flash_jina.rs @@ -34,7 +34,7 @@ fn test_flash_jina_small() -> Result<()> { let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); let embeddings_batch = SnapshotScores::from(pooled_embeddings); - insta::assert_yaml_snapshot!("jina_batch", embeddings_batch, &matcher); + insta::assert_yaml_snapshot!("flash_jina_batch", embeddings_batch, &matcher); let input_single = batch( vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], @@ -45,7 +45,7 @@ fn test_flash_jina_small() -> Result<()> { let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); let embeddings_single = SnapshotScores::from(pooled_embeddings); - insta::assert_yaml_snapshot!("jina_single", embeddings_single, &matcher); + insta::assert_yaml_snapshot!("flash_jina_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); assert_eq!(embeddings_batch[2], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_jina_code.rs b/backends/candle/tests/test_flash_jina_code.rs new file mode 100644 index 00000000..74035117 --- /dev/null +++ b/backends/candle/tests/test_flash_jina_code.rs @@ -0,0 +1,53 @@ +#![allow(dead_code, unused_imports)] +mod common; + +use crate::common::{sort_embeddings, SnapshotScores}; +use anyhow::Result; +use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +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_jina_code_base() -> Result<()> { + let model_root = download_artifacts("jinaai/jina-embeddings-v2-base-code", 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 = relative_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotScores::from(pooled_embeddings); + insta::assert_yaml_snapshot!("flash_jina_code_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 = SnapshotScores::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("flash_jina_code_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_jina_code.rs b/backends/candle/tests/test_jina_code.rs new file mode 100644 index 00000000..70248e1a --- /dev/null +++ b/backends/candle/tests/test_jina_code.rs @@ -0,0 +1,50 @@ +mod common; + +use crate::common::{sort_embeddings, SnapshotScores}; +use anyhow::Result; +use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use text_embeddings_backend_candle::CandleBackend; +use text_embeddings_backend_core::{Backend, ModelType, Pool}; + +#[test] +fn test_jina_code_base() -> Result<()> { + let model_root = download_artifacts("jinaai/jina-embeddings-v2-base-code", None)?; + let tokenizer = load_tokenizer(&model_root)?; + + let backend = CandleBackend::new( + model_root, + "float32".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 = relative_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotScores::from(pooled_embeddings); + insta::assert_yaml_snapshot!("jina_code_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 = SnapshotScores::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("jina_code_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 64ecbc1f..876e5d06 100644 --- a/docs/source/en/supported_models.md +++ b/docs/source/en/supported_models.md @@ -25,13 +25,14 @@ model with Alibi 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) | +| 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) | To explore the list of best performing text embeddings models, visit the From 1718a7a007fd887dd881d587163581cb5afa169e Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 21 Jun 2024 14:40:28 +0200 Subject: [PATCH 44/72] feat(router): add base64 encoding_format for OpenAI API (#301) --- Cargo.lock | 1 + Cargo.toml | 1 - router/Cargo.toml | 3 ++- router/src/http/server.rs | 33 ++++++++++++++++++++++++++------- router/src/http/types.rs | 20 +++++++++++++++++++- 5 files changed, 48 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0424a3b..2b494010 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3555,6 +3555,7 @@ dependencies = [ "async-stream", "axum 0.7.5", "axum-tracing-opentelemetry", + "base64 0.21.7", "clap", "futures", "hf-hub", diff --git a/Cargo.toml b/Cargo.toml index 2338c6f3..f8198679 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,4 +38,3 @@ debug = 1 lto = "thin" codegen-units = 16 strip = "none" -incremental = true diff --git a/router/Cargo.toml b/router/Cargo.toml index 84d5a2ca..2f2b0815 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -43,6 +43,7 @@ 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 } 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 } @@ -66,7 +67,7 @@ tonic-build = { version = "0.10.2", optional = true } [features] default = ["candle", "http"] -http = ["dep:axum", "dep:axum-tracing-opentelemetry", "dep:tower-http", "dep:utoipa", "dep:utoipa-swagger-ui"] +http = ["dep:axum", "dep:axum-tracing-opentelemetry", "dep:base64", "dep:tower-http", "dep:utoipa", "dep:utoipa-swagger-ui"] grpc = ["metrics-exporter-prometheus/http-listener", "dep:prost", "dep:tonic", "dep:tonic-health", "dep:tonic-reflection", "dep:tonic-build", "dep:async-stream", "dep:tokio-stream"] metal = ["text-embeddings-backend/metal"] mkl = ["text-embeddings-backend/mkl"] diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 3e23991f..11b3a521 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -1,11 +1,11 @@ /// HTTP Server logic use crate::http::types::{ DecodeRequest, DecodeResponse, EmbedAllRequest, EmbedAllResponse, EmbedRequest, EmbedResponse, - EmbedSparseRequest, EmbedSparseResponse, Input, InputIds, InputType, OpenAICompatEmbedding, - OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, - PredictInput, PredictRequest, PredictResponse, Prediction, Rank, RerankRequest, RerankResponse, - Sequence, SimpleToken, SparseValue, TokenizeInput, TokenizeRequest, TokenizeResponse, - VertexPrediction, VertexRequest, VertexResponse, + EmbedSparseRequest, EmbedSparseResponse, Embedding, EncodingFormat, Input, InputIds, InputType, + OpenAICompatEmbedding, OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, + OpenAICompatUsage, PredictInput, PredictRequest, PredictResponse, Prediction, Rank, + RerankRequest, RerankResponse, Sequence, SimpleToken, SparseValue, TokenizeInput, + TokenizeRequest, TokenizeResponse, VertexPrediction, VertexRequest, VertexResponse, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -19,6 +19,8 @@ use axum::http::{Method, StatusCode}; use axum::routing::{get, post}; use axum::{http, Json, Router}; use axum_tracing_opentelemetry::middleware::OtelAxumLayer; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use futures::future::join_all; use futures::FutureExt; use http::header::AUTHORIZATION; @@ -938,6 +940,21 @@ async fn openai_embed( Json(req): Json, ) -> Result<(HeaderMap, Json), (StatusCode, Json)> { + let encode_embedding = |array: Vec| { + match req.encoding_format { + EncodingFormat::Float => Embedding::Float(array), + EncodingFormat::Base64 => { + // Unsafe is fine here since we do not violate memory ownership: bytes + // is only used in this scope and we return an owned string + let bytes = unsafe { + std::slice::from_raw_parts(array.as_ptr() as *const u8, array.len() * 4) + }; + + Embedding::Base64(BASE64_STANDARD.encode(bytes)) + } + } + }; + let span = tracing::Span::current(); let start_time = Instant::now(); @@ -957,10 +974,11 @@ async fn openai_embed( metrics::increment_counter!("te_request_success", "method" => "single"); + let embedding = encode_embedding(response.results); ( vec![OpenAICompatEmbedding { object: "embedding", - embedding: response.results, + embedding, index: 0, }], ResponseMetadata::new( @@ -1033,9 +1051,10 @@ async fn openai_embed( total_queue_time += r.metadata.queue.as_nanos() as u64; total_inference_time += r.metadata.inference.as_nanos() as u64; total_compute_tokens += r.metadata.prompt_tokens; + let embedding = encode_embedding(r.results); embeddings.push(OpenAICompatEmbedding { object: "embedding", - embedding: r.results, + embedding, index: i, }); } diff --git a/router/src/http/types.rs b/router/src/http/types.rs index 8655d00d..a2a773e8 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -285,6 +285,14 @@ pub(crate) enum Input { Batch(Vec), } +#[derive(Deserialize, ToSchema, Default)] +#[serde(rename_all = "snake_case")] +pub(crate) enum EncodingFormat { + #[default] + Float, + Base64, +} + #[derive(Deserialize, ToSchema)] pub(crate) struct OpenAICompatRequest { pub input: Input, @@ -294,6 +302,16 @@ pub(crate) struct OpenAICompatRequest { #[allow(dead_code)] #[schema(nullable = true, example = "null")] pub user: Option, + #[schema(default = "float", example = "float")] + #[serde(default)] + pub encoding_format: EncodingFormat, +} + +#[derive(Serialize, ToSchema)] +#[serde(untagged)] +pub(crate) enum Embedding { + Float(Vec), + Base64(String), } #[derive(Serialize, ToSchema)] @@ -301,7 +319,7 @@ pub(crate) struct OpenAICompatEmbedding { #[schema(example = "embedding")] pub object: &'static str, #[schema(example = json!([0.0, 1.0, 2.0]))] - pub embedding: Vec, + pub embedding: Embedding, #[schema(example = "0")] pub index: usize, } From 46de6a49802edd87811163486233fdc6502ccdb1 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Fri, 21 Jun 2024 18:57:11 +0200 Subject: [PATCH 45/72] fix(candle): fix FlashJinaCodeModel (#302) --- Makefile | 8 +- .../candle/src/{layers.rs => layers/mod.rs} | 0 backends/candle/src/lib.rs | 127 +- backends/candle/src/models/flash_jina.rs | 35 +- backends/candle/src/models/flash_jina_code.rs | 121 +- backends/candle/src/models/jina.rs | 67 +- backends/candle/src/models/jina_code.rs | 202 +- .../candle/src/{models.rs => models/mod.rs} | 6 +- backends/candle/tests/common.rs | 2 +- ...test_flash_jina_code__jina_code_batch.snap | 3073 +++++++++++++---- ...est_flash_jina_code__jina_code_single.snap | 1537 +++++---- .../test_jina_code__jina_code_batch.snap | 3073 +++++++++++++---- .../test_jina_code__jina_code_single.snap | 1537 +++++---- backends/candle/tests/test_flash_jina.rs | 4 +- backends/candle/tests/test_flash_jina_code.rs | 4 +- 15 files changed, 6400 insertions(+), 3396 deletions(-) rename backends/candle/src/{layers.rs => layers/mod.rs} (100%) rename backends/candle/src/{models.rs => models/mod.rs} (93%) diff --git a/Makefile b/Makefile index 1af63144..99a5ff59 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ integration-tests: - cargo test --release + cargo test cuda-integration-tests: - cargo test -F text-embeddings-backend-candle/cuda -F text-embeddings-backend-candle/flash-attn -F text-embeddings-router/candle-cuda --release + cargo test -F text-embeddings-backend-candle/cuda -F text-embeddings-backend-candle/flash-attn -F text-embeddings-router/candle-cuda --profile release-debug integration-tests-review: - cargo insta test --review --release + cargo insta test --review cuda-integration-tests-review: - cargo insta test --review --features "text-embeddings-backend-candle/cuda text-embeddings-backend-candle/flash-attn text-embeddings-router/candle-cuda" --release + cargo insta test --review --features "text-embeddings-backend-candle/cuda text-embeddings-backend-candle/flash-attn text-embeddings-router/candle-cuda" --profile release-debug diff --git a/backends/candle/src/layers.rs b/backends/candle/src/layers/mod.rs similarity index 100% rename from backends/candle/src/layers.rs rename to backends/candle/src/layers/mod.rs diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index 27c5d843..a7a5dcf0 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -11,17 +11,17 @@ use crate::compute_cap::{ compatible_compute_cap, get_compile_compute_cap, get_runtime_compute_cap, }; use crate::models::{ - BertConfig, BertModel, DistilBertConfig, DistilBertModel, JinaConfig, JinaBertModel, JinaCodeConfig, JinaCodeBertModel, + BertConfig, BertModel, DistilBertConfig, DistilBertModel, JinaBertModel, JinaCodeBertModel, Model, NomicBertModel, NomicConfig, }; #[cfg(feature = "cuda")] use crate::models::{ - FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashJinaCodeBertModel, FlashNomicBertModel, + FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashJinaCodeBertModel, + FlashNomicBertModel, }; use anyhow::Context; use candle::{DType, Device}; use candle_nn::VarBuilder; -use models::BertConfig; use nohash_hasher::BuildNoHashHasher; use serde::Deserialize; use std::collections::HashMap; @@ -30,17 +30,28 @@ use text_embeddings_backend_core::{ Backend, BackendError, Batch, Embedding, Embeddings, ModelType, Predictions, }; +/// This enum is needed to be able to differentiate between jina models that also use +/// the `bert` model type and valid Bert models. +/// We use the `_name_or_path` field in the config to do so. This might not be robust in the long +/// run but is still better than the other options... +#[derive(Debug, Clone, PartialEq, Deserialize)] +#[serde(tag = "_name_or_path")] +pub enum BertConfigWrapper { + #[serde(rename = "jinaai/jina-bert-implementation")] + JinaBert(BertConfig), + #[serde(rename = "jinaai/jina-bert-v2-qk-post-norm")] + JinaCodeBert(BertConfig), + #[serde(untagged)] + Bert(BertConfig), +} + #[derive(Deserialize)] #[serde(tag = "model_type", rename_all = "kebab-case")] enum Config { - Bert(BertConfig), + Bert(BertConfigWrapper), XlmRoberta(BertConfig), Camembert(BertConfig), Roberta(BertConfig), - #[serde(rename(deserialize = "jina_bert"))] - JinaBert(JinaConfig), - #[serde(rename(deserialize = "jina_code_bert"))] - JinaCodeBert(JinaCodeConfig), #[serde(rename(deserialize = "distilbert"))] DistilBert(DistilBertConfig), #[serde(rename(deserialize = "nomic_bert"))] @@ -76,7 +87,7 @@ impl CandleBackend { "Runtime compute cap {} is not compatible with compile time compute cap {}", get_runtime_compute_cap().unwrap(), get_compile_compute_cap().unwrap() - ))) + ))); } Err(err) => { tracing::warn!("Could not find a compatible CUDA device on host: {err:?}"); @@ -123,18 +134,22 @@ impl CandleBackend { (_, Device::Cuda(_)) => Err(BackendError::Start( "`cuda` feature is not enabled".to_string(), )), - (Config::Bert(config), Device::Cpu | Device::Metal(_)) => { - tracing::info!("Starting Bert model on {:?}", device); - Ok(Box::new(BertModel::load(vb, &config, model_type).s()?)) - } - (Config::JinaBert(config), Device::Cpu | Device::Metal(_)) => { - tracing::info!("Starting JinaBertModel model on {:?}", device); - Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) - } - (Config::JinaCodeBert(config), Device::Cpu | Device::Metal(_)) => { - tracing::info!("Starting JinaCodeBertModel model on {:?}", device); - Ok(Box::new(JinaCodeBertModel::load(vb, &config, model_type).s()?)) - } + (Config::Bert(config), Device::Cpu | Device::Metal(_)) => match config { + BertConfigWrapper::JinaBert(config) => { + tracing::info!("Starting JinaBertModel model on {:?}", device); + Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) + } + BertConfigWrapper::JinaCodeBert(config) => { + tracing::info!("Starting JinaCodeBert model on {:?}", device); + Ok(Box::new( + JinaCodeBertModel::load(vb, &config, model_type).s()?, + )) + } + BertConfigWrapper::Bert(config) => { + tracing::info!("Starting Bert model on {:?}", device); + Ok(Box::new(BertModel::load(vb, &config, model_type).s()?)) + } + }, ( Config::XlmRoberta(config) | Config::Camembert(config) | Config::Roberta(config), Device::Cpu | Device::Metal(_), @@ -158,48 +173,45 @@ impl CandleBackend { (Config::Bert(config), Device::Cuda(_)) => { if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) && dtype == DType::F16 - && ((config.position_embedding_type == PositionEmbeddingType::Absolute) | (config.position_embedding_type == PositionEmbeddingType::Alibi)) // Allow disabling because of flash attention v1 precision problems // See: https://github.com/huggingface/text-embeddings-inference/issues/37 && &std::env::var("USE_FLASH_ATTENTION").unwrap_or("True".to_string()).to_lowercase() == "true" { - if config.position_embedding_type == PositionEmbeddingType::Alibi { - tracing::info!("Starting FlashBert model on {:?}", device); - Ok(Box::new(FlashBertModel::load(vb, &config, model_type).s()?)) - } else { - tracing::info!("Starting Bert model on {:?}", device); - Ok(Box::new(BertModel::load(vb, &config, model_type).s()?)) + match config { + BertConfigWrapper::JinaBert(config) => { + tracing::info!("Starting FlashJinaBert model on {:?}", device); + Ok(Box::new( + FlashJinaBertModel::load(vb, &config, model_type).s()?, + )) + } + BertConfigWrapper::JinaCodeBert(config) => { + tracing::info!("Starting FlashJinaCodeBert model on {:?}", device); + Ok(Box::new( + FlashJinaCodeBertModel::load(vb, &config, model_type).s()?, + )) + } + BertConfigWrapper::Bert(config) => { + tracing::info!("Starting FlashBert model on {:?}", device); + Ok(Box::new(FlashBertModel::load(vb, &config, model_type).s()?)) + } } - } - #[cfg(feature = "cuda")] - (Config::JinaBert(config), Device::Cuda(_)) => { - if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) - && dtype == DType::F16 - && ((config.position_embedding_type == PositionEmbeddingType::Absolute) | (config.position_embedding_type == PositionEmbeddingType::Alibi)) - // Allow disabling because of flash attention v1 precision problems - // See: https://github.com/huggingface/text-embeddings-inference/issues/37 - && &std::env::var("USE_FLASH_ATTENTION").unwrap_or("True".to_string()).to_lowercase() == "true" - { - tracing::info!("Starting FlashJinaBertModel model on {:?}", device); - Ok(Box::new(FlashJinaBertModel::load(vb, &config, model_type).s()?,)) } else { - tracing::info!("Starting JinaBertModel model on {:?}", device); - Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) - } - #[cfg(feature = "cuda")] - (Config::JinaCodeBert(config), Device::Cuda(_)) => { - if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) - && dtype == DType::F16 - && ((config.position_embedding_type == PositionEmbeddingType::Absolute) | (config.position_embedding_type == PositionEmbeddingType::Alibi)) - // Allow disabling because of flash attention v1 precision problems - // See: https://github.com/huggingface/text-embeddings-inference/issues/37 - && &std::env::var("USE_FLASH_ATTENTION").unwrap_or("True".to_string()).to_lowercase() == "true" - { - tracing::info!("Starting FlashJinaCodeBertModel model on {:?}", device); - Ok(Box::new(FlashJinaCodeBertModel::load(vb, &config, model_type).s()?,)) - } else { - tracing::info!("Starting JinaCodeBertModel model on {:?}", device); - Ok(Box::new(JinaCodeBertModel::load(vb, &config, model_type).s()?)) + match config { + BertConfigWrapper::JinaBert(config) => { + tracing::info!("Starting JinaBertModel model on {:?}", device); + Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) + } + BertConfigWrapper::JinaCodeBert(config) => { + tracing::info!("Starting JinaCodeBert model on {:?}", device); + Ok(Box::new( + JinaCodeBertModel::load(vb, &config, model_type).s()?, + )) + } + BertConfigWrapper::Bert(config) => { + tracing::info!("Starting Bert model on {:?}", device); + Ok(Box::new(BertModel::load(vb, &config, model_type).s()?)) + } + } } } #[cfg(feature = "cuda")] @@ -209,7 +221,6 @@ impl CandleBackend { ) => { if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) && dtype == DType::F16 - && ((config.position_embedding_type == PositionEmbeddingType::Absolute) | (config.position_embedding_type == PositionEmbeddingType::Alibi)) // Allow disabling because of flash attention v1 precision problems // See: https://github.com/huggingface/text-embeddings-inference/issues/37 && &std::env::var("USE_FLASH_ATTENTION").unwrap_or("True".to_string()).to_lowercase() == "true" diff --git a/backends/candle/src/models/flash_jina.rs b/backends/candle/src/models/flash_jina.rs index e128252a..b2d47e51 100644 --- a/backends/candle/src/models/flash_jina.rs +++ b/backends/candle/src/models/flash_jina.rs @@ -2,14 +2,13 @@ use crate::alibi::alibi_head_slopes; use crate::flash_attn::flash_attn_varlen; use crate::layers::{HiddenAct, LayerNorm, Linear}; use crate::models::bert::PositionEmbeddingType; -use crate::models::jina::{JinaConfig, BertEmbeddings}; -use crate::models::jina::BertEmbeddings; -use crate::models::Model; +use crate::models::jina::JinaEmbeddings; +use crate::models::{BertConfig, Model}; use candle::{DType, Device, IndexOp, Result, Tensor}; use candle_nn::VarBuilder; use text_embeddings_backend_core::{Batch, ModelType, Pool}; -struct AlibiBertAttention { +struct JinaAttention { qkv_linear: Linear, dense: Linear, layer_norm: LayerNorm, @@ -23,7 +22,7 @@ struct AlibiBertAttention { span: tracing::Span, } -impl AlibiBertAttention { +impl JinaAttention { pub fn load(vb: VarBuilder, config: &BertConfig, alibi_slopes: Option) -> Result { let attention_head_size = config.hidden_size / config.num_attention_heads; let all_head_size = config.num_attention_heads * attention_head_size; @@ -117,7 +116,7 @@ impl AlibiBertAttention { } struct JinaBertLayer { - attention: AlibiBertAttention, + attention: JinaAttention, gated: Linear, output: Linear, layer_norm: LayerNorm, @@ -130,7 +129,7 @@ struct JinaBertLayer { impl JinaBertLayer { pub fn load(vb: VarBuilder, config: &BertConfig, alibi: Option) -> Result { - let attention = AlibiBertAttention::load(vb.pp("attention"), config, alibi)?; + let attention = JinaAttention::load(vb.pp("attention"), config, alibi)?; let gated_weight = vb .pp("mlp") @@ -174,14 +173,14 @@ impl JinaBertLayer { let residual = hidden_states.clone(); let hidden_states = self.gated.forward(&hidden_states)?; - let gated = hidden_states.i((.., 0..self.intermediate_size))?; + let gated = hidden_states.narrow(1, 0, self.intermediate_size)?; let gated = match self.act { HiddenAct::Gelu => gated.gelu(), HiddenAct::Relu => gated.relu(), HiddenAct::Swiglu => gated.silu(), }?; - let non_gated = hidden_states.i((.., self.intermediate_size..))?; + let non_gated = hidden_states.narrow(1, self.intermediate_size, self.intermediate_size)?; let hidden_states = (gated * non_gated)?; let hidden_states = self.output.forward(&hidden_states)?; @@ -191,12 +190,12 @@ impl JinaBertLayer { } } -struct BertEncoder { +struct JinaBertEncoder { layers: Vec, span: tracing::Span, } -impl BertEncoder { +impl JinaBertEncoder { pub fn load(vb: VarBuilder, config: &BertConfig, alibi: Option) -> Result { let layers = (0..config.num_hidden_layers) .map(|index| { @@ -205,7 +204,7 @@ impl BertEncoder { .collect::>>()?; let span = tracing::span!(tracing::Level::TRACE, "encoder"); - Ok(BertEncoder { layers, span }) + Ok(JinaBertEncoder { layers, span }) } fn forward(&self, hidden_states: &Tensor, cu_seqlens: &Tensor, max_s: usize) -> Result { @@ -223,8 +222,8 @@ impl BertEncoder { } pub struct FlashJinaBertModel { - embeddings: BertEmbeddings, - encoder: BertEncoder, + embeddings: JinaEmbeddings, + encoder: JinaBertEncoder, pool: Pool, pub device: Device, @@ -266,14 +265,14 @@ impl FlashJinaBertModel { }; let (embeddings, encoder) = match ( - BertEmbeddings::load(vb.pp("embeddings"), config), - BertEncoder::load(vb.pp("encoder"), config, alibi.clone()), + JinaEmbeddings::load(vb.pp("embeddings"), config), + JinaBertEncoder::load(vb.pp("encoder"), config, alibi.clone()), ) { (Ok(embeddings), Ok(encoder)) => (embeddings, encoder), (Err(err), _) | (_, Err(err)) => { if let (Ok(embeddings), Ok(encoder)) = ( - BertEmbeddings::load(vb.pp("bert.embeddings"), config), - BertEncoder::load(vb.pp("bert.encoder"), config, alibi.clone()), + JinaEmbeddings::load(vb.pp("bert.embeddings"), config), + JinaBertEncoder::load(vb.pp("bert.encoder"), config, alibi.clone()), ) { (embeddings, encoder) } else { diff --git a/backends/candle/src/models/flash_jina_code.rs b/backends/candle/src/models/flash_jina_code.rs index 97ca5fc0..5df80be2 100644 --- a/backends/candle/src/models/flash_jina_code.rs +++ b/backends/candle/src/models/flash_jina_code.rs @@ -2,16 +2,14 @@ use crate::alibi::alibi_head_slopes; use crate::flash_attn::flash_attn_varlen; use crate::layers::{HiddenAct, LayerNorm, Linear}; use crate::models::bert::PositionEmbeddingType; -use crate::models::jina::{JinaCodeConfig, BertEmbeddings}; -use crate::models::Model; +use crate::models::jina::JinaEmbeddings; +use crate::models::{BertConfig, Model}; use candle::{DType, Device, IndexOp, Result, Tensor}; use candle_nn::VarBuilder; use text_embeddings_backend_core::{Batch, ModelType, Pool}; -struct AlibiBertAttention { - query_linear: Linear, - key_linear: Linear, - value_linear: Linear, +struct JinaCodeAttention { + qkv_linear: Linear, dense: Linear, layer_norm_q: LayerNorm, @@ -27,8 +25,8 @@ struct AlibiBertAttention { span: tracing::Span, } -impl AlibiBertAttention { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig, alibi_slopes: Option) -> Result { +impl JinaCodeAttention { + pub fn load(vb: VarBuilder, config: &BertConfig, alibi_slopes: Option) -> Result { let attention_head_size = config.hidden_size / config.num_attention_heads; let all_head_size = config.num_attention_heads * attention_head_size; let hidden_size = config.hidden_size; @@ -46,21 +44,22 @@ impl AlibiBertAttention { .get((all_head_size, hidden_size), "weight")?; let value_bias = vb.pp("self.value").get(all_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 layer_norm_q = LayerNorm::load( - vp.pp("self").pp("layer_norm_q"), + vb.pp("self").pp("layer_norm_q"), config.hidden_size, config.layer_norm_eps as f32, )?; let layer_norm_k = LayerNorm::load( - vp.pp("self").pp("layer_norm_k"), + vb.pp("self").pp("layer_norm_k"), config.hidden_size, config.layer_norm_eps as f32, )?; - let query_linear = Linear::new(query_weight, Some(query_bias), None); - let key_linear = Linear::new(key_weight, Some(key_bias), None); - let value_linear = Linear::new(value_weight, Some(value_bias), None); - let dense_weight = vb .pp("output") .pp("dense") @@ -78,9 +77,7 @@ impl AlibiBertAttention { let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; Ok(Self { - query_linear, - key_linear, - value_linear, + qkv_linear, dense, layer_norm_q, layer_norm_k, @@ -103,26 +100,39 @@ impl AlibiBertAttention { let residual = hidden_states.clone(); - let query_layer = self.query_linear.forward(hidden_states)?; - let query_layer = self.layer_norm_q.forward(&query_layer, None)?; - - let key_layer = self.key_linear.forward(hidden_states)?; - let key_layer = self.layer_norm_k.forward(&key_layer, None)?; - - let value_layer = self.value_linear.forward(hidden_states)?; + let qkv = self.qkv_linear.forward(hidden_states)?; let mut new_qkv_shape = qkv.dims().to_vec(); new_qkv_shape.pop(); - new_qkv_shape.push(self.num_attention_heads); + new_qkv_shape.push(self.num_attention_heads * 3); new_qkv_shape.push(self.attention_head_size); - let query_layer = query_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; - let key_layer = key_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; - let value_layer = value_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + let qkv = qkv.reshape(new_qkv_shape.as_slice())?; + // Splits heads + let qkv = qkv.chunk(3, 1)?; + + // Flatten last dims again to go through the layer norm + let query_layer = &qkv[0].flatten_from(candle::D::Minus2)?; + let key_layer = &qkv[1].flatten_from(candle::D::Minus2)?; + + // Layer norm on q and k + let query_layer = self.layer_norm_q.forward(&query_layer, None)?; + let key_layer = self.layer_norm_k.forward(&key_layer, None)?; + + // Reshape back + let mut new_qk_shape = query_layer.dims().to_vec(); + new_qk_shape.pop(); + new_qk_shape.push(self.num_attention_heads); + new_qk_shape.push(self.attention_head_size); + + let query_layer = query_layer.reshape(new_qk_shape.as_slice())?; + let key_layer = key_layer.reshape(new_qk_shape.as_slice())?; + + let value_layer = &qkv[2]; let attention = flash_attn_varlen( - query_layer, - key_layer, + &query_layer, + &key_layer, value_layer, self.alibi_slopes.as_ref(), cu_seqlens, @@ -135,14 +145,16 @@ impl AlibiBertAttention { let attention = attention.flatten_from(candle::D::Minus2)?; let hidden_states = self.dense.forward(&attention)?; - let hidden_states = self.layer_norm_out.forward(&hidden_states, Some(&residual))?; + let hidden_states = self + .layer_norm_out + .forward(&hidden_states, Some(&residual))?; Ok(hidden_states) } } -struct JinaBertLayer { - attention: AlibiBertAttention, +struct JinaCodeBertLayer { + attention: JinaCodeAttention, up_gated_layer: Linear, down_layer: Linear, layer_norm_1: LayerNorm, @@ -154,9 +166,9 @@ struct JinaBertLayer { span: tracing::Span, } -impl JinaBertLayer { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig, alibi: Option) -> Result { - let attention = AlibiBertAttention::load(vb.pp("attention"), config, alibi)?; +impl JinaCodeBertLayer { + pub fn load(vb: VarBuilder, config: &BertConfig, alibi: Option) -> Result { + let attention = JinaCodeAttention::load(vb.pp("attention"), config, alibi)?; let up_gated_weight = vb .pp("mlp") @@ -168,7 +180,10 @@ impl JinaBertLayer { .pp("mlp") .pp("down_layer") .get((config.hidden_size, config.intermediate_size), "weight")?; - let down_bias = vb.pp("mlp").pp("down_layer").get(config.hidden_size, "bias")?; + let down_bias = vb + .pp("mlp") + .pp("down_layer") + .get(config.hidden_size, "bias")?; let down_layer = Linear::new(down_weight, Some(down_bias), None); let layer_norm_1 = LayerNorm::load( @@ -211,8 +226,8 @@ impl JinaBertLayer { // MLP block let residual = hidden_states.clone(); let hidden_states = self.up_gated_layer.forward(&hidden_states)?; - let non_gated = hidden_states.i((.., .., 0..self.intermediate_size))?; - let gated = hidden_states.i((.., .., self.intermediate_size..))?; + let non_gated = hidden_states.narrow(1, 0, self.intermediate_size)?; + let gated = hidden_states.narrow(1, self.intermediate_size, self.intermediate_size)?; let gated = match self.act { HiddenAct::Gelu => gated.gelu(), HiddenAct::Relu => gated.relu(), @@ -228,21 +243,21 @@ impl JinaBertLayer { } } -struct BertEncoder { - layers: Vec, +struct JinaCodeBertEncoder { + layers: Vec, span: tracing::Span, } -impl BertEncoder { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig, alibi: Option) -> Result { +impl JinaCodeBertEncoder { + pub fn load(vb: VarBuilder, config: &BertConfig, alibi: Option) -> Result { let layers = (0..config.num_hidden_layers) .map(|index| { - JinaBertLayer::load(vb.pp(format!("layer.{index}")), config, alibi.clone()) + JinaCodeBertLayer::load(vb.pp(format!("layer.{index}")), config, alibi.clone()) }) .collect::>>()?; let span = tracing::span!(tracing::Level::TRACE, "encoder"); - Ok(BertEncoder { layers, span }) + Ok(JinaCodeBertEncoder { layers, span }) } fn forward(&self, hidden_states: &Tensor, cu_seqlens: &Tensor, max_s: usize) -> Result { @@ -260,8 +275,8 @@ impl BertEncoder { } pub struct FlashJinaCodeBertModel { - embeddings: BertEmbeddings, - encoder: BertEncoder, + embeddings: JinaEmbeddings, + encoder: JinaCodeBertEncoder, pool: Pool, pub device: Device, @@ -269,7 +284,7 @@ pub struct FlashJinaCodeBertModel { } impl FlashJinaCodeBertModel { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig, model_type: ModelType) -> Result { + pub fn load(vb: VarBuilder, config: &BertConfig, model_type: ModelType) -> Result { let alibi = match config.position_embedding_type { PositionEmbeddingType::Alibi => { let alibi_slopes = alibi_head_slopes(config.num_attention_heads); @@ -303,14 +318,14 @@ impl FlashJinaCodeBertModel { }; let (embeddings, encoder) = match ( - BertEmbeddings::load(vb.pp("embeddings"), config), - BertEncoder::load(vb.pp("encoder"), config, alibi.clone()), + JinaEmbeddings::load(vb.pp("embeddings"), config), + JinaCodeBertEncoder::load(vb.pp("encoder"), config, alibi.clone()), ) { (Ok(embeddings), Ok(encoder)) => (embeddings, encoder), (Err(err), _) | (_, Err(err)) => { if let (Ok(embeddings), Ok(encoder)) = ( - BertEmbeddings::load(vb.pp("bert.embeddings"), config), - BertEncoder::load(vb.pp("bert.encoder"), config, alibi.clone()), + JinaEmbeddings::load(vb.pp("bert.embeddings"), config), + JinaCodeBertEncoder::load(vb.pp("bert.encoder"), config, alibi.clone()), ) { (embeddings, encoder) } else { @@ -455,4 +470,4 @@ impl Model for FlashJinaCodeBertModel { fn embed(&self, batch: Batch) -> Result<(Option, Option)> { self.forward(batch) } -} \ No newline at end of file +} diff --git a/backends/candle/src/models/jina.rs b/backends/candle/src/models/jina.rs index 3f5d5916..768e1a6f 100644 --- a/backends/candle/src/models/jina.rs +++ b/backends/candle/src/models/jina.rs @@ -1,38 +1,13 @@ use crate::alibi::build_alibi_tensor; use crate::layers::{get_cublas_lt_wrapper, HiddenAct, LayerNorm, Linear}; -use crate::models::Model; use crate::models::PositionEmbeddingType; +use crate::models::{BertConfig, Model}; use candle::{DType, Device, IndexOp, Module, Result, Tensor, D}; use candle_nn::{Embedding, VarBuilder}; -use serde::Deserialize; -use std::collections::HashMap; use text_embeddings_backend_core::{Batch, ModelType, Pool}; -#[derive(Debug, Clone, PartialEq, Deserialize)] -pub struct JinaConfig { - 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 hidden_dropout_prob: f64, - pub max_position_embeddings: usize, - pub type_vocab_size: usize, - pub initializer_range: f64, - pub layer_norm_eps: f64, - pub pad_token_id: usize, - #[serde(default)] - pub position_embedding_type: PositionEmbeddingType, - #[serde(default)] - pub use_cache: bool, - pub classifier_dropout: Option, - pub id2label: Option>, -} - - #[derive(Debug)] -pub struct BertEmbeddings { +pub struct JinaEmbeddings { word_embeddings: Embedding, token_type_embeddings: Embedding, position_embeddings: Option, @@ -40,8 +15,8 @@ pub struct BertEmbeddings { span: tracing::Span, } -impl BertEmbeddings { - pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { +impl JinaEmbeddings { + pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { let position_embeddings = if config.position_embedding_type == PositionEmbeddingType::Absolute { Some(Embedding::new( @@ -99,7 +74,7 @@ impl BertEmbeddings { } } -struct BertAttention { +struct JinaAttention { qkv_linear: Linear, dense: Linear, @@ -112,8 +87,8 @@ struct BertAttention { span: tracing::Span, } -impl BertAttention { - pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { +impl JinaAttention { + pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { let attention_head_size = config.hidden_size / config.num_attention_heads; let all_head_size = config.num_attention_heads * attention_head_size; let hidden_size = config.hidden_size; @@ -262,7 +237,7 @@ impl BertAttention { } struct JinaBertLayer { - attention: BertAttention, + attention: JinaAttention, gated: Linear, output: Linear, layer_norm: LayerNorm, @@ -274,8 +249,8 @@ struct JinaBertLayer { } impl JinaBertLayer { - pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { - let attention = BertAttention::load(vb.pp("attention"), config)?; + pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { + let attention = JinaAttention::load(vb.pp("attention"), config)?; let gated_weight = vb .pp("mlp") @@ -335,19 +310,19 @@ impl JinaBertLayer { } } -struct BertEncoder { +struct JinaBertEncoder { layers: Vec, span: tracing::Span, } -impl BertEncoder { - pub fn load(vb: VarBuilder, config: &JinaConfig) -> Result { +impl JinaBertEncoder { + pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { let layers = (0..config.num_hidden_layers) .map(|index| JinaBertLayer::load(vb.pp(format!("layer.{index}")), config)) .collect::>>()?; let span = tracing::span!(tracing::Level::TRACE, "encoder"); - Ok(BertEncoder { layers, span }) + Ok(JinaBertEncoder { layers, span }) } fn forward(&self, hidden_states: &Tensor, attention_bias: Option<&Tensor>) -> Result { @@ -365,8 +340,8 @@ impl BertEncoder { } pub struct JinaBertModel { - embeddings: BertEmbeddings, - encoder: BertEncoder, + embeddings: JinaEmbeddings, + encoder: JinaBertEncoder, pool: Pool, alibi: Option, @@ -379,7 +354,7 @@ pub struct JinaBertModel { } impl JinaBertModel { - pub fn load(vb: VarBuilder, config: &JinaConfig, model_type: ModelType) -> Result { + pub fn load(vb: VarBuilder, config: &BertConfig, model_type: ModelType) -> Result { let alibi = match config.position_embedding_type { PositionEmbeddingType::Alibi => Some(build_alibi_tensor( config.max_position_embeddings, @@ -403,14 +378,14 @@ impl JinaBertModel { }; let (embeddings, encoder) = match ( - BertEmbeddings::load(vb.pp("embeddings"), config), - BertEncoder::load(vb.pp("encoder"), config), + JinaEmbeddings::load(vb.pp("embeddings"), config), + JinaBertEncoder::load(vb.pp("encoder"), config), ) { (Ok(embeddings), Ok(encoder)) => (embeddings, encoder), (Err(err), _) | (_, Err(err)) => { if let (Ok(embeddings), Ok(encoder)) = ( - BertEmbeddings::load(vb.pp("bert.embeddings"), config), - BertEncoder::load(vb.pp("bert.encoder"), config), + JinaEmbeddings::load(vb.pp("bert.embeddings"), config), + JinaBertEncoder::load(vb.pp("bert.encoder"), config), ) { (embeddings, encoder) } else { diff --git a/backends/candle/src/models/jina_code.rs b/backends/candle/src/models/jina_code.rs index cb4084d7..348f5892 100644 --- a/backends/candle/src/models/jina_code.rs +++ b/backends/candle/src/models/jina_code.rs @@ -1,108 +1,14 @@ use crate::alibi::build_alibi_tensor; use crate::layers::{get_cublas_lt_wrapper, HiddenAct, LayerNorm, Linear}; -use crate::models::Model; +use crate::models::jina::JinaEmbeddings; use crate::models::PositionEmbeddingType; -use candle::{DType, Device, IndexOp, Module, Result, Tensor, D}; -use candle_nn::{Embedding, VarBuilder}; -use serde::Deserialize; -use std::collections::HashMap; +use crate::models::{BertConfig, Model}; +use candle::{DType, Device, IndexOp, Result, Tensor, D}; +use candle_nn::VarBuilder; use text_embeddings_backend_core::{Batch, ModelType, Pool}; -#[derive(Debug, Clone, PartialEq, Deserialize)] -pub struct JinaCodeConfig { - 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 hidden_dropout_prob: f64, - pub max_position_embeddings: usize, - pub type_vocab_size: usize, - pub initializer_range: f64, - pub layer_norm_eps: f64, - pub pad_token_id: usize, - #[serde(default)] - pub position_embedding_type: PositionEmbeddingType, - #[serde(default)] - pub use_cache: bool, - pub classifier_dropout: Option, - pub id2label: Option>, -} - - -#[derive(Debug)] -pub struct BertEmbeddings { - word_embeddings: Embedding, - token_type_embeddings: Embedding, - position_embeddings: Option, - layer_norm: LayerNorm, - span: tracing::Span, -} - -impl BertEmbeddings { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { - let position_embeddings = - if config.position_embedding_type == PositionEmbeddingType::Absolute { - Some(Embedding::new( - vb.pp("position_embeddings").get( - (config.max_position_embeddings, config.hidden_size), - "weight", - )?, - config.hidden_size, - )) - } else { - None - }; - - Ok(Self { - word_embeddings: Embedding::new( - vb.pp("word_embeddings") - .get((config.vocab_size, config.hidden_size), "weight")?, - config.hidden_size, - ), - token_type_embeddings: Embedding::new( - vb.pp("token_type_embeddings") - .get((config.type_vocab_size, config.hidden_size), "weight")?, - config.hidden_size, - ), - position_embeddings, - layer_norm: LayerNorm::load( - vb.pp("LayerNorm"), - config.hidden_size, - config.layer_norm_eps as f32, - )?, - span: tracing::span!(tracing::Level::TRACE, "embeddings"), - }) - } - - pub fn forward( - &self, - input_ids: &Tensor, - token_type_ids: &Tensor, - position_ids: &Tensor, - ) -> Result { - let _enter = self.span.enter(); - - let input_embeddings = self.word_embeddings.forward(input_ids)?; - let token_type_embeddings = self.token_type_embeddings.forward(token_type_ids)?; - - if let Some(position_embeddings) = &self.position_embeddings { - let position_embeddings = position_embeddings.forward(position_ids)?; - let embeddings = input_embeddings.add(&token_type_embeddings)?; - self.layer_norm - .forward(&embeddings, Some(&position_embeddings)) - } else { - self.layer_norm - .forward(&input_embeddings, Some(&token_type_embeddings)) - } - } -} - -struct BertAttention { - query_linear: Linear, - key_linear: Linear, - value_linear: Linear, +struct JinaCodeAttention { + qkv_linear: Linear, dense: Linear, layer_norm_q: LayerNorm, @@ -116,8 +22,8 @@ struct BertAttention { span: tracing::Span, } -impl BertAttention { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { +impl JinaCodeAttention { + pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { let attention_head_size = config.hidden_size / config.num_attention_heads; let all_head_size = config.num_attention_heads * attention_head_size; let hidden_size = config.hidden_size; @@ -137,6 +43,11 @@ impl BertAttention { .get((all_head_size, hidden_size), "weight")?; let value_bias = vb.pp("self.value").get(all_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 layer_norm_q = LayerNorm::load( vb.pp("self").pp("layer_norm_q"), config.hidden_size, @@ -148,10 +59,6 @@ impl BertAttention { config.layer_norm_eps as f32, )?; - let query_linear = Linear::new(query_weight, Some(query_bias), None); - let key_linear = Linear::new(key_weight, Some(key_bias), None); - let value_linear = Linear::new(value_weight, Some(value_bias), None); - let dense_weight = vb .pp("output") .pp("dense") @@ -169,9 +76,7 @@ impl BertAttention { let softmax_scale = 1. / (attention_head_size as f64).sqrt(); Ok(Self { - query_linear, - key_linear, - value_linear, + qkv_linear, dense, layer_norm_q, layer_norm_k, @@ -188,22 +93,40 @@ impl BertAttention { let device = hidden_states.device(); let residual = hidden_states.clone(); - let query_layer = self.query_linear.forward(hidden_states)?; - let query_layer = self.layer_norm_q.forward(&query_layer, None)?; + let qkv = self.qkv_linear.forward(hidden_states)?; - let key_layer = self.key_linear.forward(hidden_states)?; - let key_layer = self.layer_norm_k.forward(&key_layer, None)?; - - let value_layer = self.value_linear.forward(hidden_states)?; - - let mut new_qkv_shape = query_layer.dims().to_vec(); + let mut new_qkv_shape = qkv.dims().to_vec(); new_qkv_shape.pop(); - new_qkv_shape.push(self.num_attention_heads); + new_qkv_shape.push(self.num_attention_heads * 3); new_qkv_shape.push(self.attention_head_size); - let query_layer = query_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; - let key_layer = key_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; - let value_layer = value_layer.reshape(new_qkv_shape.as_slice())?.transpose(1, 2)?; + let qkv = qkv.reshape(new_qkv_shape.as_slice())?; + + // Split heads + let qkv = qkv.chunk(3, 2)?; + + // Flatten last dims again to go through the layer norm + let query_layer = &qkv[0].flatten_from(D::Minus2)?; + let key_layer = &qkv[1].flatten_from(D::Minus2)?; + + // Layer norm on q and k + let query_layer = self.layer_norm_q.forward(query_layer, None)?; + let key_layer = self.layer_norm_k.forward(key_layer, None)?; + + let mut new_qk_shape = query_layer.dims().to_vec(); + new_qk_shape.pop(); + new_qk_shape.push(self.num_attention_heads); + new_qk_shape.push(self.attention_head_size); + + let query_layer = query_layer + .reshape(new_qk_shape.as_slice())? + .transpose(1, 2)? + .contiguous()?; + let key_layer = key_layer + .reshape(new_qk_shape.as_slice())? + .transpose(1, 2)? + .contiguous()?; + let value_layer = &qkv[2].transpose(1, 2)?.contiguous()?; #[allow(unused_variables)] let context_layer = if let (Device::Cuda(_), Some(cublaslt)) = @@ -276,14 +199,16 @@ impl BertAttention { let context_layer = context_layer.transpose(1, 2)?.flatten_from(D::Minus2)?; let hidden_states = self.dense.forward(&context_layer)?; - let hidden_states = self.layer_norm_out.forward(&hidden_states, Some(&residual))?; + let hidden_states = self + .layer_norm_out + .forward(&hidden_states, Some(&residual))?; Ok(hidden_states) } } struct JinaCodeBertLayer { - attention: BertAttention, + attention: JinaCodeAttention, up_gated_layer: Linear, down_layer: Linear, layer_norm_1: LayerNorm, @@ -296,8 +221,8 @@ struct JinaCodeBertLayer { } impl JinaCodeBertLayer { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { - let attention = BertAttention::load(vb.pp("attention"), config)?; + pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { + let attention = JinaCodeAttention::load(vb.pp("attention"), config)?; let up_gated_weight = vb .pp("mlp") @@ -309,7 +234,10 @@ impl JinaCodeBertLayer { .pp("mlp") .pp("down_layer") .get((config.hidden_size, config.intermediate_size), "weight")?; - let down_bias = vb.pp("mlp").pp("down_layer").get(config.hidden_size, "bias")?; + let down_bias = vb + .pp("mlp") + .pp("down_layer") + .get(config.hidden_size, "bias")?; let down_layer = Linear::new(down_weight, Some(down_bias), None); let layer_norm_1 = LayerNorm::load( @@ -371,19 +299,19 @@ impl JinaCodeBertLayer { } } -struct BertEncoder { +struct JinaCodeBertEncoder { layers: Vec, span: tracing::Span, } -impl BertEncoder { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig) -> Result { +impl JinaCodeBertEncoder { + pub fn load(vb: VarBuilder, config: &BertConfig) -> Result { let layers = (0..config.num_hidden_layers) .map(|index| JinaCodeBertLayer::load(vb.pp(format!("layer.{index}")), config)) .collect::>>()?; let span = tracing::span!(tracing::Level::TRACE, "encoder"); - Ok(BertEncoder { layers, span }) + Ok(JinaCodeBertEncoder { layers, span }) } fn forward(&self, hidden_states: &Tensor, attention_bias: Option<&Tensor>) -> Result { @@ -401,8 +329,8 @@ impl BertEncoder { } pub struct JinaCodeBertModel { - embeddings: BertEmbeddings, - encoder: BertEncoder, + embeddings: JinaEmbeddings, + encoder: JinaCodeBertEncoder, pool: Pool, alibi: Option, @@ -415,7 +343,7 @@ pub struct JinaCodeBertModel { } impl JinaCodeBertModel { - pub fn load(vb: VarBuilder, config: &JinaCodeConfig, model_type: ModelType) -> Result { + pub fn load(vb: VarBuilder, config: &BertConfig, model_type: ModelType) -> Result { let alibi = match config.position_embedding_type { PositionEmbeddingType::Alibi => Some(build_alibi_tensor( config.max_position_embeddings, @@ -439,14 +367,14 @@ impl JinaCodeBertModel { }; let (embeddings, encoder) = match ( - BertEmbeddings::load(vb.pp("embeddings"), config), - BertEncoder::load(vb.pp("encoder"), config), + JinaEmbeddings::load(vb.pp("embeddings"), config), + JinaCodeBertEncoder::load(vb.pp("encoder"), config), ) { (Ok(embeddings), Ok(encoder)) => (embeddings, encoder), (Err(err), _) | (_, Err(err)) => { if let (Ok(embeddings), Ok(encoder)) = ( - BertEmbeddings::load(vb.pp("bert.embeddings"), config), - BertEncoder::load(vb.pp("bert.encoder"), config), + JinaEmbeddings::load(vb.pp("bert.embeddings"), config), + JinaCodeBertEncoder::load(vb.pp("bert.encoder"), config), ) { (embeddings, encoder) } else { diff --git a/backends/candle/src/models.rs b/backends/candle/src/models/mod.rs similarity index 93% rename from backends/candle/src/models.rs rename to backends/candle/src/models/mod.rs index 7f098cfb..a7d6b267 100644 --- a/backends/candle/src/models.rs +++ b/backends/candle/src/models/mod.rs @@ -7,6 +7,7 @@ extern crate accelerate_src; mod bert; mod distilbert; mod jina; +mod jina_code; mod nomic; #[cfg(feature = "cuda")] @@ -27,8 +28,8 @@ mod flash_distilbert; pub use bert::{BertConfig, BertModel, PositionEmbeddingType}; use candle::{Result, Tensor}; pub use distilbert::{DistilBertConfig, DistilBertModel}; -pub use jina::{JinaConfig, JinaBertModel}; -pub use jina_code::{JinaCodeConfig, JinaCodeBertModel}; +pub use jina::JinaBertModel; +pub use jina_code::JinaCodeBertModel; pub use nomic::{NomicBertModel, NomicConfig}; use text_embeddings_backend_core::Batch; @@ -41,7 +42,6 @@ pub use flash_jina::FlashJinaBertModel; #[cfg(feature = "cuda")] pub use flash_jina_code::FlashJinaCodeBertModel; - #[cfg(feature = "cuda")] pub use flash_nomic::FlashNomicBertModel; diff --git a/backends/candle/tests/common.rs b/backends/candle/tests/common.rs index b9d23995..d7ebc67d 100644 --- a/backends/candle/tests/common.rs +++ b/backends/candle/tests/common.rs @@ -25,7 +25,7 @@ impl Score { impl PartialEq for Score { fn eq(&self, other: &Self) -> bool { // Default tolerance for equality - self.is_close(other, 5e-3) + self.is_close(other, 6e-3) } } diff --git a/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap index 3441cb71..0ad889a9 100644 --- a/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap +++ b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_batch.snap @@ -1,772 +1,2309 @@ --- source: backends/candle/tests/test_flash_jina_code.rs +assertion_line: 37 expression: embeddings_batch --- -- - -0.011624558 - - -0.0016926473 - - -0.006434922 - - -0.009909191 - - 0.027506275 - - 0.022786874 - - -0.059169117 - - -0.047887173 - - 0.038912594 - - 0.025214802 - - -0.014350341 - - 0.039117776 - - 0.03485464 - - 0.05296896 - - 0.034907352 - - 0.0013971328 - - 0.0019907136 - - 0.052471623 - - -0.014562107 - - 0.00030206257 - - -0.02770458 - - 0.02685756 - - -0.015385578 - - -0.012668428 - - -0.025259107 - - 0.00836893 - - 0.028925523 - - -0.035507426 - - -0.04220648 - - 0.047328673 - - -0.083232224 - - -0.02608385 - - -0.012809777 - - -0.0140402755 - - -0.013649549 - - -0.013641793 - - 0.02880054 - - 0.04465023 - - -0.0274121 - - -0.03170939 - - -0.047180377 - - -0.0349574 - - -0.037762504 - - 0.024104225 - - -0.039361924 - - -0.024559166 - - -0.0138650155 - - -0.049862508 - - -0.0507675 - - -0.07775355 - - -0.055519626 - - -0.025151063 - - 0.040781654 - - 0.0039354665 - - 0.015940087 - - -0.022214677 - - -0.013484792 - - -0.00070730236 - - -0.009409981 - - 0.0016682384 - - 0.016079267 - - -0.032368172 - - 0.024572799 - - 0.026780155 - - -0.025954 - - 0.021282032 - - -0.047395118 - - 0.044386413 - - -0.023020437 - - 0.0056320634 - - -0.017416032 - - -0.024118245 - - 0.05878816 - - 0.00059366866 - - -0.018553924 - - 0.003762008 - - 0.0035026476 - - -0.0077498616 - - -0.004517831 - - 0.008116448 - - -0.010922055 - - 0.037391223 - - -0.03318112 - - -0.07876148 - - -0.0018068684 - - -0.0484656 - - -0.038104814 - - -0.0070756334 - - -0.015427567 - - -0.04499487 - - 0.008910639 - - 0.029193114 - - 0.032674707 - - 0.0305758 - - -0.017541302 - - 0.028164856 - - -0.0344121 - - 0.016969312 - - 0.04108575 - - -0.054463603 - - -0.005427823 - - -0.008252881 - - -0.024992533 - - 0.048412405 - - -0.05769221 - - -0.08227673 - - -0.0523458 - - 0.025244992 - - -0.016289622 - - -0.049253095 - - -0.03999235 - - 0.05642755 - - -0.010015731 - - 0.04892553 - - -0.02504831 - - -0.014305144 - - 0.04907702 - - -0.0096177375 - - -0.0854665 - - 0.017617436 - - -0.014481601 - - 0.046187755 - - -0.030009247 - - -0.049553443 - - -0.006797771 - - -0.034234725 - - 0.06525787 - - 0.017298417 - - -0.018988462 - - -0.08520813 - - -0.011840521 - - -0.042942975 - - -0.056341827 - - 0.08071612 - - 0.028146833 - - -0.0141261155 - - 0.04001012 - - 0.018236378 - - 0.01583886 - - 0.0058086845 - - 0.0005290361 - - 0.0045259795 - - 0.024873685 - - 0.018050008 - - 0.02440984 - - -0.057676647 - - -0.022263395 - - -0.033016473 - - 0.014353932 - - -0.010189813 - - 0.018424626 - - -0.018238619 - - 0.07698089 - - -0.015595315 - - 0.007074499 - - 0.027340613 - - -0.02035102 - - -0.073149584 - - -0.0061021335 - - 0.0209061 - - -0.024985746 - - -0.020401739 - - -0.0048702923 - - 0.0444933 - - -0.02158648 - - 0.010312202 - - 0.009883107 - - 0.022790415 - - -0.01893943 - - 0.017615119 - - 0.023000762 - - -0.051276624 - - 0.019835759 - - 0.016675396 - - 0.021532865 - - 0.023097536 - - 0.01091247 - - 0.007642041 - - 0.0385409 - - 0.044193454 - - 0.003319116 - - 0.019355802 - - -0.055695307 - - -0.07680676 - - -0.035279598 - - -0.0070618573 - - -0.01408385 - - 0.03107026 - - 0.011547187 - - 0.04217532 - - 0.048034772 - - -0.014330861 - - -0.0007901662 - - 0.009103947 - - 0.011091706 - - -0.008960474 - - -0.009301379 - - 0.032424763 - - 0.09180531 - - 0.015491586 - - 0.031114861 - - 0.013289549 - - 0.03616163 - - 0.031084707 - - -0.021437835 - - 0.011905716 - - -0.104623 - - 0.033417992 - - -0.04683295 - - -0.05382028 - - 0.025979578 - - -0.003795323 - - 0.094473585 - - 0.09126942 - - 0.067700386 - - -0.002935823 - - -0.031604428 - - 0.0045677535 - - 0.014042491 - - -0.02969786 - - -0.012263599 - - -0.05807616 - - -0.0107510965 - - 0.022099612 - - 0.02685798 - - -0.048912797 - - 0.020464186 - - 0.011517319 - - -0.0016606319 - - -0.033255223 - - 0.02488959 - - -0.043240122 - - 0.00013934783 - - 0.037608404 - - 0.0748658 - - 0.061115693 - - -0.01670558 - - 0.037827995 - - -0.004162286 - - -0.00011341072 - - -0.031436242 - - -0.040532686 - - -0.0096016815 - - -0.065639205 - - -0.030070387 - - 0.05715196 - - 0.024338327 - - -0.008972259 - - -0.013220871 - - -0.07115904 - - -0.03446362 - - -0.010893238 - - 0.011950567 - - 0.0143028535 - - 0.0022963681 - - -0.060428943 - - 0.047038406 - - -0.017493663 - - 0.0208505 - - -0.010212147 - - -0.03337894 - - 0.026969628 - - -0.019734934 - - 0.0922163 - - -0.056534916 - - 0.017255465 - - 0.021692138 - - 0.023583038 - - 0.017224979 - - -0.0689936 - - 0.23665377 - - 0.04984247 - - -0.0039337534 - - -0.010740561 - - 0.00313393 - - -0.02665381 - - 0.013037893 - - 0.020565815 - - -0.002266256 - - 0.03748113 - - 0.018353125 - - -0.048318923 - - -0.06522075 - - -0.021460611 - - -0.029665926 - - -0.025507431 - - 0.0033435076 - - -0.0071087605 - - 0.001970083 - - -0.0025331723 - - 0.061776515 - - 0.017747495 - - 0.04396135 - - 0.0011617352 - - 0.02509327 - - 0.039078914 - - -0.03762337 - - 0.021575885 - - 0.015548619 - - 0.043990802 - - -0.024633111 - - -0.0013324996 - - 0.063795656 - - -0.02035371 - - -0.0440217 - - -0.033049908 - - 0.031034056 - - -0.004495562 - - -0.0044647786 - - -0.033148468 - - 0.0025072312 - - 0.009637453 - - 0.04357035 - - 0.044546504 - - -0.08865154 - - -0.08487347 - - 0.00205395 - - 0.0060572727 - - 0.023767816 - - 0.051007573 - - 0.0057035745 - - 0.040539596 - - -0.035988905 - - -0.01824621 - - 0.007887274 - - -0.052848075 - - 0.08228733 - - 0.0015825987 - - 0.0004136183 - - 0.018108545 - - 0.040081892 - - -0.035405345 - - 0.050933696 - - 0.036154125 - - -0.03947257 - - -0.0018412384 - - -0.005589829 - - 0.03620321 - - 0.012144826 - - -0.008619581 - - -0.0043279063 - - 0.016455552 - - -0.015757388 - - 0.047043085 - - 0.08675011 - - -0.009986743 - - 0.022379123 - - 0.009470605 - - 0.034120724 - - 0.009922824 - - -0.014435422 - - 0.017998574 - - -0.03849387 - - 0.042357396 - - -0.010053916 - - 0.057034835 - - -0.027412737 - - 0.017308975 - - 0.02185228 - - -0.048017155 - - -0.025138885 - - 0.016482655 - - -0.01756698 - - 0.031146016 - - 0.021930695 - - -0.00075341173 - - -0.015085438 - - 0.0146785155 - - 0.028547939 - - -0.036677707 - - -0.022699077 - - -0.045135103 - - -0.02802744 - - 0.071454674 - - -0.009201392 - - -0.051717956 - - -0.019421624 - - 0.0034821872 - - 0.06667364 - - 0.09145379 - - -0.068826884 - - 0.053568542 - - 0.01160062 - - -0.025829546 - - 0.04487214 - - 0.030954553 - - -0.022543794 - - -0.009475118 - - -0.014623143 - - -0.02070793 - - -0.02656788 - - 0.009701591 - - -0.025120718 - - -0.018472325 - - -0.027967019 - - -0.021122226 - - -0.009891716 - - 0.018696679 - - -0.068876855 - - -0.023419108 - - -0.025495855 - - 0.016256742 - - 0.00064859784 - - 0.037749656 - - -0.046321914 - - 0.065936595 - - -0.008921658 - - 0.07497468 - - -0.05094385 - - -0.052860104 - - 0.022196138 - - -0.0140462285 - - -0.03562305 - - 0.024858234 - - 0.021310989 - - 0.014657512 - - 0.07767391 - - -0.027777392 - - 0.057577316 - - 0.055513144 - - 0.06322926 - - -0.026312957 - - 0.010970987 - - -0.0057475767 - - 0.0028267235 - - 0.051367335 - - -0.022320578 - - 0.009050165 - - 0.016952222 - - -0.032026373 - - -0.074292615 - - -0.02315535 - - 0.025375988 - - -0.041241057 - - -0.032157563 - - -0.015576387 - - -0.015834223 - - 0.02224181 - - 0.017586967 - - -0.029070066 - - 0.0030065721 - - -0.051857695 - - 0.04008828 - - -0.007960872 - - -0.061745025 - - -0.00086617953 - - 0.026723113 - - 0.008719714 - - -0.049826868 - - -0.0046574236 - - 0.018954279 - - -0.007935451 - - 0.053987946 - - 0.022795292 - - 0.029722994 - - -0.010146585 - - -0.019956842 - - -0.014686722 - - 0.01708331 - - 0.020001508 - - 0.016564105 - - 0.011379248 - - -0.011843253 - - 0.04056168 - - 0.004384286 - - -0.049596023 - - 0.02674251 - - 0.0076475106 - - -0.0064563937 - - -0.014233138 - - 0.014224383 - - 0.0052741244 - - 0.049964864 - - -0.016286546 - - -0.001200327 - - 0.041904222 - - -0.0010395087 - - -0.05105399 - - 0.022099879 - - -0.019455278 - - 0.009444127 - - -0.081325725 - - 0.015994828 - - 0.0010952728 - - 0.0008373874 - - -0.0016424303 - - -0.05096469 - - 0.045976803 - - 0.024695056 - - -0.031656373 - - -0.0013138534 - - -0.0060524447 - - 0.060276203 - - -0.016745795 - - -0.029930653 - - -0.0222771 - - 0.012314711 - - 0.038991332 - - -0.006665343 - - 0.041694533 - - 0.0076992502 - - -0.014353178 - - 0.0025135442 - - -0.0498445 - - 0.020322764 - - 0.0575802 - - -0.006096128 - - -0.010841882 - - -0.024337102 - - 0.021975596 - - 0.0064031687 - - -0.026746146 - - 0.03455729 - - -0.011909055 - - 0.016994143 - - 0.026053395 - - -0.020393625 - - 0.06403403 - - 0.042590734 - - 0.009193913 - - 0.04016698 - - 0.028304791 - - 0.022147119 - - -0.030121539 - - -0.0037334429 - - 0.03235819 - - -0.020825844 - - 0.0009766509 - - -0.012216568 - - 0.07944978 - - 0.04177374 - - -0.008281654 - - -0.008908983 - - 0.04799388 - - -0.012743454 - - -0.00076762337 - - 0.012673029 - - -0.018283572 - - 0.022068778 - - -0.009605337 - - 0.0030652087 - - -0.036517244 - - -0.006263211 - - 0.0194632 - - 0.009333852 - - 0.02350168 - - -0.0008530139 - - 0.018934859 - - -0.013986168 - - -0.010833636 - - -0.011189203 - - 0.011567913 - - -0.07253544 - - -0.005748846 - - 0.11930293 - - 0.060044624 - - -0.023167728 - - -0.015781552 - - -0.010494401 - - 0.01930528 - - -0.039608266 - - -0.073587865 - - 0.0019034932 - - -0.0013838339 - - 0.026257295 - - 0.004433007 - - -0.051545423 - - -0.033456888 - - -0.06401291 - - -0.08664347 - - 0.010781564 - - 0.0408775 - - 0.021475399 - - 0.017633006 - - -0.02186024 - - 0.047795497 - - -0.006370007 - - 0.01792626 - - 0.005195737 - - 0.0026206016 - - -0.008816542 - - 0.009266863 - - -0.018453414 - - 0.0040575014 - - 0.0047053 - - -0.0197809 - - -0.01580334 - - 0.007821501 - - -0.06296649 - - -0.06274416 - - -0.0031381177 - - -0.024228694 - - -0.002459634 - - 0.00034323192 - - -0.02430543 - - -0.029262288 - - -0.04606642 - - -0.013138838 - - 0.040473 - - 0.012308485 - - 0.0020701357 - - -0.007718021 - - -0.0064122216 - - -0.024890581 - - 0.014665469 - - -0.0028788927 - - -0.047072053 - - -0.014959743 - - 0.004587824 - - -0.07462158 - - -0.008558996 - - 0.019324543 - - -0.02247574 - - -0.07721102 - - 0.007920586 - - -0.020274863 - - 0.028696692 - - 0.024707401 - - 0.016905285 - - 0.012742534 - - 0.018577736 - - -0.05768951 - - 0.03203929 - - 0.018105863 - - -0.03917534 - - -0.026208939 - - -0.038492158 - - -0.043517314 - - -0.008031121 - - -0.016162876 - - -0.0010640965 - - -0.004164019 - - 0.005193703 - - -0.0058410293 - - 0.029311381 - - -0.016533207 - - 0.05005747 - - 0.012600715 - - 0.016292874 - - -0.008300225 - - -0.08953819 - - 0.06544125 - - -0.010512851 - - -0.021443438 - - 0.030277776 - - -0.06502247 - - 0.004850903 - - -0.013137611 - - 0.0506941 - - 0.0072725127 - - -0.025755724 - - 0.008224718 - - 0.013813313 - - 0.037197027 - - 0.0023671025 - - 0.00763629 - - 0.011905766 - - 0.033143394 - - 0.007750765 - - -0.07725993 - - -0.03193554 - - -0.016900484 - - 0.06256093 - - 0.015902048 - - 0.062251173 - - 0.07478062 - - -0.009171957 - - -0.025452917 - - -0.015754124 - - -0.004426243 - - -0.0873611 - - 0.0077999695 - - 0.061026644 - - 0.016489599 - - 0.0066420045 - - -0.0062355455 - - 0.00345123 - - -0.022935547 - - 0.03939866 - - -0.0037231673 - - 0.0033949488 - - 0.029471302 - - 0.023097953 - - -0.0237214 - - 0.046621986 - - 0.029790087 - - -0.030113066 - - -0.012432801 - - 0.036813233 - - 0.01785254 - - -0.08032645 - - 0.051262226 - - 0.04222712 - - -0.023358794 - - -0.03602671 - - 0.0092950305 - - -0.015663076 - - -0.023873692 - - 0.009383877 - - -0.056770466 - - 0.032832243 - - 0.019920528 - - -0.04734062 - - -0.03368295 - - 0.0041841906 - - 0.03257228 - - -0.07387151 - - 0.011083565 - - 0.008633363 - - -0.04694844 - - 0.0027943242 - - -0.009078945 - - -0.011981829 - - -0.026407028 - - 0.033040557 - - -0.025803888 - - -0.021555608 - - 0.0042838412 - - -0.04263439 - - 0.0465685 - - 0.070476055 - - -0.02560814 - - 0.060619954 - - 0.0071254023 - - -0.062549844 - - -0.021544673 - - -0.03598606 - - -0.04904548 - - 0.04631042 - - -0.029345924 - - -0.015404836 - - 0.0063473387 - - -0.023926385 - - 0.022935716 - - -0.1004558 - - -0.007012574 - - 0.049480513 - - -0.02592937 - - 0.057209775 - - -0.010056263 - - -0.02236333 - - 0.008163001 - - 0.0036735693 - - -0.008406754 - - -0.0029980235 - - -0.0052409745 - - -0.014090007 - - -0.025248934 - - 0.022062942 - - -0.019766279 - - 0.07160526 - - -0.00075892545 - - -0.0096911425 - - -0.019483106 - - 0.042904716 - - -0.0013572425 - - 0.04353212 - - -0.07759716 - - -0.011731261 - - -0.10602095 - - 0.0010180247 - - -0.07403971 - - 0.043784548 - - -0.010357722 - - -0.009020027 - - 0.026289912 - - 0.053744033 - - 0.009665143 +- - -0.1508789 + - -0.021652222 + - -0.083984375 + - -0.12890625 + - 0.3581543 + - 0.29663086 + - -0.7705078 + - -0.6225586 + - 0.5058594 + - 0.32861328 + - -0.18688965 + - 0.50927734 + - 0.45458984 + - 0.6899414 + - 0.45410156 + - 0.018234253 + - 0.025665283 + - 0.68310547 + - -0.18969727 + - 0.0047683716 + - -0.36035156 + - 0.34887695 + - -0.19995117 + - -0.16455078 + - -0.32885742 + - 0.109375 + - 0.3762207 + - -0.46166992 + - -0.5488281 + - 0.61572266 + - -1.0830078 + - -0.33911133 + - -0.16662598 + - -0.18261719 + - -0.17785645 + - -0.17773438 + - 0.375 + - 0.5800781 + - -0.3564453 + - -0.41235352 + - -0.61376953 + - -0.45410156 + - -0.49023438 + - 0.31347656 + - -0.51220703 + - -0.3203125 + - -0.18005371 + - -0.64941406 + - -0.66015625 + - -1.0107422 + - -0.72265625 + - -0.3269043 + - 0.53125 + - 0.051116943 + - 0.20776367 + - -0.28881836 + - -0.17541504 + - -0.008453369 + - -0.12207031 + - 0.021240234 + - 0.20898438 + - -0.4206543 + - 0.32006836 + - 0.3486328 + - -0.33764648 + - 0.27734375 + - -0.6171875 + - 0.57666016 + - -0.29956055 + - 0.07330322 + - -0.22668457 + - -0.31298828 + - 0.7661133 + - 0.0076026917 + - -0.24084473 + - 0.049438477 + - 0.044830322 + - -0.10070801 + - -0.058135986 + - 0.10571289 + - -0.14196777 + - 0.48706055 + - -0.4309082 + - -1.0244141 + - -0.023452759 + - -0.63134766 + - -0.4963379 + - -0.092163086 + - -0.19934082 + - -0.5859375 + - 0.11639404 + - 0.3798828 + - 0.42504883 + - 0.39770508 + - -0.2290039 + - 0.3659668 + - -0.4477539 + - 0.22143555 + - 0.53466797 + - -0.7084961 + - -0.07098389 + - -0.1071167 + - -0.3251953 + - 0.6298828 + - -0.75097656 + - -1.0712891 + - -0.68115234 + - 0.32861328 + - -0.21203613 + - -0.6411133 + - -0.5205078 + - 0.734375 + - -0.1307373 + - 0.63720703 + - -0.32641602 + - -0.18579102 + - 0.6386719 + - -0.12561035 + - -1.1132813 + - 0.22912598 + - -0.18908691 + - 0.6010742 + - -0.390625 + - -0.64501953 + - -0.08770752 + - -0.44580078 + - 0.8491211 + - 0.22497559 + - -0.24682617 + - -1.1083984 + - -0.1541748 + - -0.55859375 + - -0.73291016 + - 1.0507813 + - 0.3659668 + - -0.18383789 + - 0.5214844 + - 0.23706055 + - 0.20666504 + - 0.07550049 + - 0.0065345764 + - 0.058654785 + - 0.32348633 + - 0.23474121 + - 0.31713867 + - -0.75097656 + - -0.2902832 + - -0.42895508 + - 0.18774414 + - -0.13208008 + - 0.24035645 + - -0.2376709 + - 1.0029297 + - -0.20349121 + - 0.09234619 + - 0.3557129 + - -0.2644043 + - -0.95166016 + - -0.07922363 + - 0.27246094 + - -0.3244629 + - -0.265625 + - -0.062927246 + - 0.57958984 + - -0.28027344 + - 0.13391113 + - 0.12854004 + - 0.29614258 + - -0.24584961 + - 0.2290039 + - 0.29907227 + - -0.66748047 + - 0.25756836 + - 0.21704102 + - 0.28051758 + - 0.3005371 + - 0.14172363 + - 0.09967041 + - 0.5019531 + - 0.5756836 + - 0.043060303 + - 0.25219727 + - -0.7246094 + - -1 + - -0.45947266 + - -0.091552734 + - -0.18322754 + - 0.40478516 + - 0.15002441 + - 0.5493164 + - 0.62597656 + - -0.18688965 + - -0.010215759 + - 0.11853027 + - 0.1439209 + - -0.11621094 + - -0.12097168 + - 0.42236328 + - 1.1953125 + - 0.2019043 + - 0.40551758 + - 0.17321777 + - 0.47021484 + - 0.40454102 + - -0.2788086 + - 0.15478516 + - -1.3613281 + - 0.4345703 + - -0.60791016 + - -0.7006836 + - 0.33862305 + - -0.04901123 + - 1.2285156 + - 1.1884766 + - 0.8808594 + - -0.038116455 + - -0.41137695 + - 0.059417725 + - 0.18322754 + - -0.38623047 + - -0.16040039 + - -0.7553711 + - -0.13977051 + - 0.2878418 + - 0.34960938 + - -0.63671875 + - 0.26660156 + - 0.1496582 + - -0.021224976 + - -0.43286133 + - 0.32348633 + - -0.5629883 + - 0.0019836426 + - 0.4897461 + - 0.9741211 + - 0.7949219 + - -0.21728516 + - 0.49267578 + - -0.05432129 + - -0.0016565323 + - -0.40942383 + - -0.5283203 + - -0.12475586 + - -0.8540039 + - -0.39111328 + - 0.7441406 + - 0.31640625 + - -0.1171875 + - -0.17236328 + - -0.9267578 + - -0.44848633 + - -0.14160156 + - 0.15588379 + - 0.1862793 + - 0.02947998 + - -0.78564453 + - 0.61279297 + - -0.22766113 + - 0.27075195 + - -0.13293457 + - -0.4345703 + - 0.3515625 + - -0.25708008 + - 1.2001953 + - -0.73535156 + - 0.22473145 + - 0.28198242 + - 0.3071289 + - 0.22460938 + - -0.8984375 + - 3.0742188 + - 0.6484375 + - -0.05090332 + - -0.13964844 + - 0.040527344 + - -0.34643555 + - 0.16931152 + - 0.26733398 + - -0.029632568 + - 0.4873047 + - 0.23852539 + - -0.62841797 + - -0.8491211 + - -0.27905273 + - -0.38623047 + - -0.33276367 + - 0.0435791 + - -0.09240723 + - 0.025894165 + - -0.03277588 + - 0.80322266 + - 0.23010254 + - 0.57128906 + - 0.014907837 + - 0.3269043 + - 0.50927734 + - -0.4892578 + - 0.28051758 + - 0.2019043 + - 0.5722656 + - -0.31958008 + - -0.017333984 + - 0.8300781 + - -0.26489258 + - -0.5722656 + - -0.4296875 + - 0.4033203 + - -0.05871582 + - -0.057495117 + - -0.43188477 + - 0.032196045 + - 0.124572754 + - 0.56689453 + - 0.5800781 + - -1.1533203 + - -1.1044922 + - 0.026779175 + - 0.079711914 + - 0.30908203 + - 0.6635742 + - 0.07446289 + - 0.52783203 + - -0.46826172 + - -0.2368164 + - 0.103149414 + - -0.6875 + - 1.0712891 + - 0.02104187 + - 0.005466461 + - 0.23547363 + - 0.52197266 + - -0.4609375 + - 0.66259766 + - 0.47021484 + - -0.51416016 + - -0.024749756 + - -0.0725708 + - 0.47143555 + - 0.15820313 + - -0.111450195 + - -0.055847168 + - 0.21459961 + - -0.2055664 + - 0.61279297 + - 1.1289063 + - -0.12939453 + - 0.29101563 + - 0.123046875 + - 0.44360352 + - 0.12878418 + - -0.1875 + - 0.23376465 + - -0.50146484 + - 0.55029297 + - -0.13134766 + - 0.7426758 + - -0.35620117 + - 0.22460938 + - 0.2841797 + - -0.6254883 + - -0.32788086 + - 0.21362305 + - -0.22875977 + - 0.40551758 + - 0.2849121 + - -0.01008606 + - -0.19689941 + - 0.19104004 + - 0.37158203 + - -0.4765625 + - -0.29541016 + - -0.58691406 + - -0.36523438 + - 0.9301758 + - -0.11981201 + - -0.6738281 + - -0.2524414 + - 0.045837402 + - 0.86816406 + - 1.1904297 + - -0.8959961 + - 0.6972656 + - 0.15039063 + - -0.33618164 + - 0.58447266 + - 0.4025879 + - -0.29370117 + - -0.123413086 + - -0.19104004 + - -0.2697754 + - -0.34545898 + - 0.12683105 + - -0.32641602 + - -0.24072266 + - -0.3642578 + - -0.27441406 + - -0.1282959 + - 0.24328613 + - -0.8959961 + - -0.30493164 + - -0.3317871 + - 0.21130371 + - 0.008087158 + - 0.49145508 + - -0.60253906 + - 0.85791016 + - -0.11578369 + - 0.97558594 + - -0.66259766 + - -0.6879883 + - 0.28881836 + - -0.1829834 + - -0.46411133 + - 0.32348633 + - 0.27734375 + - 0.19104004 + - 1.0107422 + - -0.3618164 + - 0.74902344 + - 0.7216797 + - 0.8227539 + - -0.34301758 + - 0.1430664 + - -0.07513428 + - 0.03668213 + - 0.66748047 + - -0.2902832 + - 0.11785889 + - 0.22033691 + - -0.41625977 + - -0.9667969 + - -0.3017578 + - 0.33032227 + - -0.5371094 + - -0.4189453 + - -0.203125 + - -0.20581055 + - 0.28979492 + - 0.22973633 + - -0.37890625 + - 0.039154053 + - -0.6743164 + - 0.52197266 + - -0.103881836 + - -0.80322266 + - -0.011245728 + - 0.34814453 + - 0.112976074 + - -0.6484375 + - -0.06048584 + - 0.24633789 + - -0.10266113 + - 0.703125 + - 0.29614258 + - 0.38720703 + - -0.13232422 + - -0.2602539 + - -0.1907959 + - 0.22265625 + - 0.26098633 + - 0.21582031 + - 0.14697266 + - -0.15429688 + - 0.52783203 + - 0.056488037 + - -0.64501953 + - 0.34765625 + - 0.09918213 + - -0.08380127 + - -0.18518066 + - 0.18469238 + - 0.068115234 + - 0.6503906 + - -0.21166992 + - -0.0158844 + - 0.5449219 + - -0.014122009 + - -0.6640625 + - 0.2878418 + - -0.2524414 + - 0.122558594 + - -1.0585938 + - 0.20898438 + - 0.014175415 + - 0.010635376 + - -0.021636963 + - -0.6635742 + - 0.59765625 + - 0.3203125 + - -0.41210938 + - -0.016555786 + - -0.0791626 + - 0.7841797 + - -0.21826172 + - -0.38964844 + - -0.29003906 + - 0.16027832 + - 0.50634766 + - -0.08703613 + - 0.54248047 + - 0.10015869 + - -0.18688965 + - 0.032928467 + - -0.6484375 + - 0.26489258 + - 0.75 + - -0.07922363 + - -0.14099121 + - -0.31689453 + - 0.28588867 + - 0.08282471 + - -0.3479004 + - 0.44995117 + - -0.15490723 + - 0.22106934 + - 0.33862305 + - -0.26586914 + - 0.8334961 + - 0.5541992 + - 0.11999512 + - 0.5229492 + - 0.36791992 + - 0.28881836 + - -0.3918457 + - -0.048461914 + - 0.42089844 + - -0.2709961 + - 0.012794495 + - -0.15930176 + - 1.0332031 + - 0.5439453 + - -0.107788086 + - -0.115600586 + - 0.625 + - -0.16564941 + - -0.0096588135 + - 0.16430664 + - -0.23791504 + - 0.28735352 + - -0.12408447 + - 0.040100098 + - -0.47485352 + - -0.08154297 + - 0.25341797 + - 0.12176514 + - 0.30566406 + - -0.011238098 + - 0.24633789 + - -0.18188477 + - -0.14099121 + - -0.14538574 + - 0.15039063 + - -0.94384766 + - -0.07421875 + - 1.5527344 + - 0.78222656 + - -0.3017578 + - -0.20532227 + - -0.13684082 + - 0.25073242 + - -0.515625 + - -0.9580078 + - 0.024337769 + - -0.01763916 + - 0.34155273 + - 0.057678223 + - -0.6713867 + - -0.43554688 + - -0.83251953 + - -1.1269531 + - 0.13977051 + - 0.53271484 + - 0.27978516 + - 0.22961426 + - -0.2849121 + - 0.6220703 + - -0.08258057 + - 0.23291016 + - 0.06719971 + - 0.034179688 + - -0.1149292 + - 0.12084961 + - -0.24023438 + - 0.053009033 + - 0.061309814 + - -0.25805664 + - -0.2055664 + - 0.10223389 + - -0.81884766 + - -0.81689453 + - -0.04055786 + - -0.31567383 + - -0.032348633 + - 0.0046539307 + - -0.31689453 + - -0.38134766 + - -0.5996094 + - -0.17150879 + - 0.52734375 + - 0.15979004 + - 0.026611328 + - -0.10040283 + - -0.08319092 + - -0.32470703 + - 0.19091797 + - -0.036254883 + - -0.61279297 + - -0.19555664 + - 0.059570313 + - -0.9707031 + - -0.111694336 + - 0.2512207 + - -0.2927246 + - -1.0048828 + - 0.103271484 + - -0.26391602 + - 0.37402344 + - 0.32128906 + - 0.21911621 + - 0.16589355 + - 0.2421875 + - -0.75097656 + - 0.41674805 + - 0.23510742 + - -0.50927734 + - -0.34106445 + - -0.50097656 + - -0.56591797 + - -0.103881836 + - -0.21020508 + - -0.013923645 + - -0.054473877 + - 0.06738281 + - -0.075927734 + - 0.38110352 + - -0.21484375 + - 0.65185547 + - 0.16369629 + - 0.21191406 + - -0.107666016 + - -1.1650391 + - 0.8515625 + - -0.13635254 + - -0.27905273 + - 0.39453125 + - -0.8457031 + - 0.06304932 + - -0.17053223 + - 0.65966797 + - 0.095214844 + - -0.3347168 + - 0.10699463 + - 0.1796875 + - 0.484375 + - 0.030273438 + - 0.099731445 + - 0.15527344 + - 0.43066406 + - 0.10058594 + - -1.0058594 + - -0.41601563 + - -0.21936035 + - 0.81396484 + - 0.2064209 + - 0.81103516 + - 0.9736328 + - -0.119018555 + - -0.3305664 + - -0.20544434 + - -0.05718994 + - -1.1367188 + - 0.101623535 + - 0.7944336 + - 0.21484375 + - 0.085998535 + - -0.08129883 + - 0.045288086 + - -0.29858398 + - 0.51220703 + - -0.04888916 + - 0.0440979 + - 0.38378906 + - 0.3005371 + - -0.30908203 + - 0.6064453 + - 0.38793945 + - -0.3918457 + - -0.16247559 + - 0.4794922 + - 0.23278809 + - -1.0449219 + - 0.66748047 + - 0.5488281 + - -0.3034668 + - -0.46923828 + - 0.12036133 + - -0.20410156 + - -0.30981445 + - 0.12219238 + - -0.7397461 + - 0.4272461 + - 0.25952148 + - -0.61572266 + - -0.43798828 + - 0.054473877 + - 0.42407227 + - -0.96191406 + - 0.14440918 + - 0.11218262 + - -0.6113281 + - 0.036499023 + - -0.11791992 + - -0.15588379 + - -0.34375 + - 0.43115234 + - -0.33691406 + - -0.28027344 + - 0.05569458 + - -0.5546875 + - 0.6064453 + - 0.91796875 + - -0.33398438 + - 0.7890625 + - 0.09197998 + - -0.81396484 + - -0.2800293 + - -0.46923828 + - -0.6381836 + - 0.60253906 + - -0.38183594 + - -0.20080566 + - 0.08258057 + - -0.31103516 + - 0.2980957 + - -1.3076172 + - -0.09106445 + - 0.64453125 + - -0.33764648 + - 0.7446289 + - -0.13098145 + - -0.29125977 + - 0.10571289 + - 0.04763794 + - -0.10992432 + - -0.03842163 + - -0.06781006 + - -0.18359375 + - -0.32861328 + - 0.28686523 + - -0.2565918 + - 0.9316406 + - -0.01007843 + - -0.12573242 + - -0.2536621 + - 0.55859375 + - -0.018066406 + - 0.56640625 + - -1.0087891 + - -0.15197754 + - -1.3789063 + - 0.012916565 + - -0.9628906 + - 0.56884766 + - -0.13439941 + - -0.117370605 + - 0.3425293 + - 0.69970703 + - 0.12585449 +- - -0.07684326 + - -0.45336914 + - -0.045166016 + - 0.4572754 + - 0.13598633 + - 0.48535156 + - -0.7133789 + - -0.4572754 + - 1.0371094 + - 0.4543457 + - -0.18078613 + - 0.15136719 + - 0.55615234 + - 0.3256836 + - 0.12670898 + - -0.17358398 + - 0.2076416 + - 0.7626953 + - -0.32983398 + - 0.061279297 + - -0.6508789 + - 0.2553711 + - -0.30322266 + - -0.015174866 + - -0.2043457 + - 0.07531738 + - 0.31958008 + - -0.49267578 + - -0.39892578 + - 0.48388672 + - -1.1298828 + - -0.72265625 + - 0.14453125 + - -0.014625549 + - 0.26611328 + - 0.019256592 + - 0.28198242 + - 0.63671875 + - -0.6953125 + - -0.42089844 + - -0.34960938 + - -1.1347656 + - -0.4321289 + - 0.63378906 + - -0.54345703 + - -0.19091797 + - -0.21008301 + - -0.38012695 + - -0.40185547 + - -0.93603516 + - -0.67041016 + - -0.54248047 + - 0.5708008 + - 0.4921875 + - 0.01071167 + - -0.10498047 + - -0.099243164 + - 0.30981445 + - -0.014038086 + - 0.15991211 + - 0.17944336 + - -0.52490234 + - 0.5332031 + - 0.54589844 + - -0.19824219 + - 0.3408203 + - -0.82128906 + - 0.64160156 + - -0.18188477 + - 0.26489258 + - -0.07513428 + - -0.25732422 + - 0.9355469 + - 0.35888672 + - -0.26513672 + - -0.15356445 + - -0.27172852 + - -0.09844971 + - -0.06793213 + - -0.10864258 + - 0.015029907 + - 0.65478516 + - -0.20629883 + - -0.59375 + - 0.044952393 + - -0.6015625 + - -0.30664063 + - 0.12084961 + - -0.21105957 + - -0.44677734 + - -0.3166504 + - 0.40429688 + - 0.7138672 + - 0.56103516 + - 0.25830078 + - 0.6308594 + - -0.29492188 + - -0.034362793 + - 0.42626953 + - -1.1005859 + - -0.02961731 + - 0.003824234 + - -0.015380859 + - 0.49536133 + - -0.38012695 + - -0.9711914 + - -0.49658203 + - 0.08947754 + - -0.11212158 + - -0.5488281 + - -0.8173828 + - 0.64160156 + - -0.2890625 + - 0.46728516 + - -0.15673828 + - -0.6176758 + - 0.49267578 + - -0.2758789 + - -1.1425781 + - 0.46704102 + - 0.0006914139 + - 0.6357422 + - -0.45239258 + - -0.30688477 + - 0.061523438 + - 0.09112549 + - 0.9189453 + - 0.46923828 + - 0.33081055 + - -1.2421875 + - -0.0073547363 + - -0.29882813 + - -0.9111328 + - 0.7783203 + - 0.28076172 + - -0.38232422 + - 0.1529541 + - -0.049957275 + - 0.22229004 + - 0.18908691 + - 0.18261719 + - 0.37548828 + - 0.47583008 + - 0.088256836 + - 0.2626953 + - -0.41210938 + - -0.3154297 + - -0.2442627 + - 0.24145508 + - -0.25634766 + - 0.27734375 + - -0.09899902 + - 0.73535156 + - -0.5058594 + - -0.15637207 + - 0.07080078 + - -0.0038852692 + - -0.9511719 + - 0.17053223 + - 0.11456299 + - -0.19689941 + - -0.5126953 + - -0.41992188 + - 0.32763672 + - -0.19140625 + - 0.37353516 + - -0.23449707 + - 0.5908203 + - -0.28027344 + - 0.296875 + - 0.2590332 + - -0.89941406 + - -0.13476563 + - 0.4086914 + - -0.22192383 + - 0.7192383 + - 0.15637207 + - 0.12390137 + - 0.20373535 + - 0.8383789 + - 0.09625244 + - 0.23791504 + - -0.6513672 + - -0.55566406 + - -0.27246094 + - -0.13635254 + - 0.140625 + - 0.22875977 + - 0.12939453 + - 0.40429688 + - 0.18566895 + - 0.068725586 + - -0.11022949 + - 0.10284424 + - 0.3515625 + - -0.10772705 + - 0.05166626 + - 0.6982422 + - 0.6645508 + - 0.10266113 + - 0.49560547 + - -0.20214844 + - 0.07244873 + - -0.046142578 + - -0.33691406 + - 0.0067749023 + - -1.0234375 + - 0.7626953 + - -0.6040039 + - -0.4375 + - 0.33081055 + - -0.4086914 + - 0.9477539 + - 1.1972656 + - 0.9658203 + - -0.036987305 + - -0.36743164 + - 0.21582031 + - -0.029006958 + - -0.20214844 + - -0.29785156 + - -0.5209961 + - -0.006122589 + - -0.07672119 + - 0.30297852 + - -0.68359375 + - 0.5175781 + - 0.1628418 + - -0.14660645 + - -0.45703125 + - 0.3540039 + - -0.35742188 + - 0.09790039 + - 0.36132813 + - 0.78808594 + - 0.84375 + - -0.09484863 + - 0.63623047 + - -0.5332031 + - 0.08526611 + - -0.32421875 + - -0.58154297 + - -0.16015625 + - -1.0761719 + - -0.24829102 + - 0.6533203 + - 0.8520508 + - 0.01159668 + - -0.45263672 + - -0.52246094 + - -0.46679688 + - -0.101867676 + - -0.079711914 + - -0.21142578 + - -0.14794922 + - -0.90283203 + - 0.16772461 + - -0.37109375 + - 0.6821289 + - -0.27514648 + - -0.22143555 + - 0.35083008 + - -0.24804688 + - 1.0195313 + - -0.92822266 + - 0.5629883 + - 0.34765625 + - 0.4309082 + - 0.20666504 + - -0.69921875 + - 3.03125 + - 0.7783203 + - -0.5102539 + - -0.14929199 + - -0.19580078 + - -0.3857422 + - -0.084350586 + - 0.011024475 + - -0.47705078 + - 0.6640625 + - 0.55908203 + - -0.5703125 + - -0.75097656 + - -0.49145508 + - -0.6743164 + - -0.36865234 + - 0.20129395 + - -0.28710938 + - -0.11767578 + - -0.38916016 + - 0.32348633 + - 0.25585938 + - 0.6123047 + - -0.047027588 + - 0.16369629 + - 0.19543457 + - -0.08062744 + - 0.1262207 + - 0.10803223 + - 0.60595703 + - -0.28173828 + - -0.24902344 + - 0.35205078 + - -0.36645508 + - -0.3173828 + - -0.37109375 + - 0.6484375 + - 0.032226563 + - 0.1920166 + - -0.35595703 + - -0.022369385 + - 0.21264648 + - 0.6191406 + - 0.5527344 + - -0.8486328 + - -0.76660156 + - 0.05206299 + - 0.121398926 + - 0.5097656 + - 1.0517578 + - 0.011734009 + - 0.25585938 + - -0.4621582 + - -0.1743164 + - -0.08227539 + - -0.83203125 + - 1.1035156 + - -0.04083252 + - -0.23217773 + - 0.13378906 + - 0.24511719 + - -0.53515625 + - 0.68603516 + - 0.3623047 + - -0.29101563 + - 0.16333008 + - -0.18432617 + - 0.2512207 + - 0.24682617 + - -0.25830078 + - 0.079589844 + - -0.107910156 + - -0.6665039 + - 0.71191406 + - 0.9609375 + - 0.08935547 + - -0.10089111 + - 0.13635254 + - 0.8828125 + - 0.18127441 + - -0.6435547 + - 0.6904297 + - -0.22338867 + - 0.92871094 + - 0.22851563 + - 0.9223633 + - -0.49145508 + - 0.080200195 + - 0.25683594 + - -0.6020508 + - -0.1862793 + - 0.06756592 + - -0.359375 + - 0.76171875 + - 0.47314453 + - 0.06665039 + - -0.0335083 + - 0.3515625 + - 0.35864258 + - -0.50634766 + - -0.5058594 + - -0.47851563 + - -0.5126953 + - 0.34716797 + - -0.16564941 + - -0.34326172 + - -0.8051758 + - -0.30444336 + - 0.56640625 + - 1.0761719 + - -0.85839844 + - 0.70947266 + - 0.061065674 + - -0.12963867 + - 0.48168945 + - -0.053710938 + - -0.29907227 + - 0.024917603 + - -0.06933594 + - -0.5493164 + - 0.034057617 + - -0.015388489 + - -0.5493164 + - -0.34594727 + - -0.29614258 + - -0.23461914 + - 0.010261536 + - 0.41357422 + - -0.7402344 + - -0.15673828 + - -0.57421875 + - -0.027618408 + - -0.12548828 + - 0.6142578 + - -0.71728516 + - 0.51953125 + - -0.119628906 + - 1.0810547 + - -0.66308594 + - -0.5595703 + - 0.05178833 + - -0.1694336 + - -0.48486328 + - 0.22363281 + - -0.12512207 + - 0.31958008 + - 0.8125 + - -0.15795898 + - 0.6640625 + - 0.85791016 + - 0.77978516 + - 0.3322754 + - 0.50878906 + - 0.1418457 + - 0.014320374 + - 0.4975586 + - -0.5205078 + - -0.094055176 + - 0.26904297 + - -0.16662598 + - -1.1806641 + - -0.5317383 + - 0.18066406 + - -0.66796875 + - -0.125 + - 0.05303955 + - -0.40673828 + - 0.07775879 + - 0.117004395 + - -0.22509766 + - 0.3984375 + - -0.6381836 + - 0.4243164 + - 0.20092773 + - -0.32958984 + - -0.20947266 + - -0.0060310364 + - 0.058532715 + - -0.82128906 + - -0.23010254 + - 0.20178223 + - -0.025299072 + - 0.5644531 + - 0.012268066 + - 0.49072266 + - 0.13830566 + - -0.39013672 + - -0.24182129 + - 0.35864258 + - 0.56396484 + - 0.16577148 + - 0.29785156 + - -0.8540039 + - 0.71972656 + - 0.25585938 + - -1.1914063 + - 0.14172363 + - 0.2607422 + - -0.31152344 + - -0.31030273 + - 0.014717102 + - -0.38671875 + - 0.51953125 + - -0.5810547 + - 0.0052261353 + - 0.28320313 + - 0.024932861 + - -0.0970459 + - 0.16369629 + - -0.26367188 + - -0.45898438 + - -0.98535156 + - 0.15270996 + - 0.09692383 + - 0.0049934387 + - 0.0010166168 + - -0.71875 + - 0.06732178 + - 0.20275879 + - -0.46020508 + - -0.107910156 + - 0.06628418 + - 0.5439453 + - 0.11694336 + - -0.12963867 + - -0.25097656 + - 0.20373535 + - 0.703125 + - 0.052124023 + - 0.33813477 + - 0.091918945 + - 0.20727539 + - -0.114746094 + - -0.36767578 + - 0.19238281 + - 0.6821289 + - -0.2109375 + - -0.38891602 + - -0.39648438 + - 0.31079102 + - 0.013122559 + - -0.328125 + - 0.14038086 + - 0.06713867 + - 0.26586914 + - -0.296875 + - -0.17053223 + - 0.73046875 + - 0.41845703 + - 0.10119629 + - 0.64941406 + - 0.12939453 + - 0.123291016 + - -0.44848633 + - -0.119140625 + - 0.7636719 + - -0.22424316 + - -0.2130127 + - -0.27197266 + - 1.078125 + - 0.36450195 + - -0.50927734 + - 0.09753418 + - 0.8930664 + - -0.20373535 + - 0.09033203 + - 0.375 + - -0.57128906 + - 0.086242676 + - -0.023269653 + - 0.12207031 + - -0.64453125 + - -0.026519775 + - 0.037475586 + - 0.0715332 + - 0.8330078 + - -0.08654785 + - 0.41137695 + - -0.049682617 + - 0.08428955 + - -0.25146484 + - 0.22851563 + - -0.40234375 + - 0.021240234 + - 1.8242188 + - 1.0332031 + - -0.11645508 + - -0.24536133 + - 0.022003174 + - 0.18811035 + - -0.33154297 + - -0.9140625 + - 0.23291016 + - 0.16040039 + - -0.14123535 + - -0.24084473 + - -0.63720703 + - -0.07336426 + - -0.67285156 + - -1.0292969 + - 0.13647461 + - 0.21606445 + - -0.52441406 + - -0.084106445 + - -0.20727539 + - 0.33496094 + - 0.11553955 + - 0.04067993 + - -0.010292053 + - -0.031066895 + - -0.10620117 + - 0.05810547 + - 0.23046875 + - 0.005207062 + - 0.26733398 + - 0.08557129 + - -0.5810547 + - 0.34326172 + - -0.36669922 + - -0.44750977 + - -0.35668945 + - 0.25341797 + - -0.2019043 + - -0.24414063 + - -0.4182129 + - -0.24560547 + - -0.08404541 + - -0.22167969 + - 0.42016602 + - 0.2998047 + - 0.103637695 + - -0.021453857 + - -0.029067993 + - 0.10412598 + - -0.1038208 + - -0.19262695 + - -0.5830078 + - 0.028030396 + - -0.16503906 + - -0.41845703 + - 0.061676025 + - 0.33789063 + - 0.10644531 + - -0.9692383 + - -0.16479492 + - -0.171875 + - 0.25048828 + - 0.2705078 + - 0.28515625 + - 0.29785156 + - 0.34594727 + - -0.515625 + - 0.33251953 + - 0.21936035 + - -0.3359375 + - -0.51953125 + - -0.19677734 + - -0.67626953 + - 0.2578125 + - -0.51416016 + - -0.019973755 + - -0.32470703 + - 0.18127441 + - -0.50097656 + - 0.4699707 + - -0.1953125 + - 0.51953125 + - 0.3449707 + - -0.3137207 + - -0.125 + - -0.94140625 + - 0.6201172 + - -0.027832031 + - -0.47705078 + - 0.25756836 + - -0.9248047 + - -0.029296875 + - 0.012832642 + - 0.7451172 + - 0.041534424 + - -0.16796875 + - 0.06585693 + - 0.17285156 + - 0.43969727 + - 0.079956055 + - -0.29248047 + - 0.15820313 + - 0.6972656 + - 0.1850586 + - -1.0703125 + - -0.7216797 + - -0.038085938 + - 0.48486328 + - 0.049072266 + - 0.59765625 + - 0.69433594 + - 0.09350586 + - -0.5917969 + - -0.18164063 + - -0.03286743 + - -1.109375 + - 0.15148926 + - 0.1295166 + - 0.040802002 + - 0.39379883 + - -0.32910156 + - -0.048736572 + - -0.66259766 + - 0.70703125 + - 0.029968262 + - -0.040405273 + - 0.44067383 + - 0.079589844 + - -0.23742676 + - 0.51953125 + - 0.4790039 + - -0.41796875 + - 0.08068848 + - 0.5883789 + - -0.04714966 + - -1.453125 + - 0.36450195 + - 0.7426758 + - -0.06616211 + - -0.2565918 + - 0.32958984 + - -0.42504883 + - -0.23803711 + - -0.18286133 + - -0.15161133 + - 0.21972656 + - -0.031280518 + - -0.80566406 + - -0.36645508 + - 0.012939453 + - 0.38330078 + - -0.7421875 + - 0.12109375 + - -0.5102539 + - -0.4074707 + - -0.15136719 + - -0.0579834 + - -0.09741211 + - -0.33203125 + - 0.096191406 + - 0.33154297 + - -0.43359375 + - 0.35766602 + - -0.3215332 + - 0.38720703 + - 0.6254883 + - -0.08117676 + - 0.69628906 + - 0.41064453 + - -1.0136719 + - -0.1817627 + - -0.29638672 + - -0.6254883 + - 0.5004883 + - -0.22265625 + - -0.25878906 + - 0.04425049 + - -0.45947266 + - 0.55322266 + - -1.3837891 + - -0.24609375 + - 0.69921875 + - -0.2680664 + - 0.2939453 + - -0.2788086 + - 0.023895264 + - -0.05718994 + - -0.035308838 + - 0.18811035 + - 0.16760254 + - -0.14880371 + - 0.19787598 + - -0.40942383 + - 0.057434082 + - -0.64990234 + - 0.9423828 + - 0.5175781 + - 0.05886841 + - -0.071899414 + - 0.7036133 + - 0.024658203 + - 0.6123047 + - -0.6035156 + - -0.19885254 + - -1.0585938 + - -0.07305908 + - -0.6459961 + - 0.4946289 + - 0.26367188 + - -0.030181885 + - 0.46411133 + - 0.7114258 + - 0.12915039 +- - -0.1508789 + - -0.021652222 + - -0.083984375 + - -0.12890625 + - 0.3581543 + - 0.29663086 + - -0.7705078 + - -0.6225586 + - 0.5058594 + - 0.32861328 + - -0.18688965 + - 0.50927734 + - 0.45458984 + - 0.6899414 + - 0.45410156 + - 0.018234253 + - 0.025665283 + - 0.68310547 + - -0.18969727 + - 0.0047683716 + - -0.36035156 + - 0.34887695 + - -0.19995117 + - -0.16455078 + - -0.32885742 + - 0.109375 + - 0.3762207 + - -0.46166992 + - -0.5488281 + - 0.61572266 + - -1.0830078 + - -0.33911133 + - -0.16662598 + - -0.18261719 + - -0.17785645 + - -0.17773438 + - 0.375 + - 0.5800781 + - -0.3564453 + - -0.41235352 + - -0.61376953 + - -0.45410156 + - -0.49023438 + - 0.31347656 + - -0.51220703 + - -0.3203125 + - -0.18005371 + - -0.64941406 + - -0.66015625 + - -1.0107422 + - -0.72265625 + - -0.3269043 + - 0.53125 + - 0.051116943 + - 0.20776367 + - -0.28881836 + - -0.17541504 + - -0.008453369 + - -0.12207031 + - 0.021240234 + - 0.20898438 + - -0.4206543 + - 0.32006836 + - 0.3486328 + - -0.33764648 + - 0.27734375 + - -0.6171875 + - 0.57666016 + - -0.29956055 + - 0.07330322 + - -0.22668457 + - -0.31298828 + - 0.7661133 + - 0.0076026917 + - -0.24084473 + - 0.049438477 + - 0.044830322 + - -0.10070801 + - -0.058135986 + - 0.10571289 + - -0.14196777 + - 0.48706055 + - -0.4309082 + - -1.0244141 + - -0.023452759 + - -0.63134766 + - -0.4963379 + - -0.092163086 + - -0.19934082 + - -0.5859375 + - 0.11639404 + - 0.3798828 + - 0.42504883 + - 0.39770508 + - -0.2290039 + - 0.3659668 + - -0.4477539 + - 0.22143555 + - 0.53466797 + - -0.7084961 + - -0.07098389 + - -0.1071167 + - -0.3251953 + - 0.6298828 + - -0.75097656 + - -1.0712891 + - -0.68115234 + - 0.32861328 + - -0.21203613 + - -0.6411133 + - -0.5205078 + - 0.734375 + - -0.1307373 + - 0.63720703 + - -0.32641602 + - -0.18579102 + - 0.6386719 + - -0.12561035 + - -1.1132813 + - 0.22912598 + - -0.18908691 + - 0.6010742 + - -0.390625 + - -0.64501953 + - -0.08770752 + - -0.44580078 + - 0.8491211 + - 0.22497559 + - -0.24682617 + - -1.1083984 + - -0.1541748 + - -0.55859375 + - -0.73291016 + - 1.0507813 + - 0.3659668 + - -0.18383789 + - 0.5214844 + - 0.23706055 + - 0.20666504 + - 0.07550049 + - 0.0065345764 + - 0.058654785 + - 0.32348633 + - 0.23474121 + - 0.31713867 + - -0.75097656 + - -0.2902832 + - -0.42895508 + - 0.18774414 + - -0.13208008 + - 0.24035645 + - -0.2376709 + - 1.0029297 + - -0.20349121 + - 0.09234619 + - 0.3557129 + - -0.2644043 + - -0.95166016 + - -0.07922363 + - 0.27246094 + - -0.3244629 + - -0.265625 + - -0.062927246 + - 0.57958984 + - -0.28027344 + - 0.13391113 + - 0.12854004 + - 0.29614258 + - -0.24584961 + - 0.2290039 + - 0.29907227 + - -0.66748047 + - 0.25756836 + - 0.21704102 + - 0.28051758 + - 0.3005371 + - 0.14172363 + - 0.09967041 + - 0.5019531 + - 0.5756836 + - 0.043060303 + - 0.25219727 + - -0.7246094 + - -1 + - -0.45947266 + - -0.091552734 + - -0.18322754 + - 0.40478516 + - 0.15002441 + - 0.5493164 + - 0.62597656 + - -0.18688965 + - -0.010215759 + - 0.11853027 + - 0.1439209 + - -0.11621094 + - -0.12097168 + - 0.42236328 + - 1.1953125 + - 0.2019043 + - 0.40551758 + - 0.17321777 + - 0.47021484 + - 0.40454102 + - -0.2788086 + - 0.15478516 + - -1.3613281 + - 0.4345703 + - -0.60791016 + - -0.7006836 + - 0.33862305 + - -0.04901123 + - 1.2285156 + - 1.1884766 + - 0.8808594 + - -0.038116455 + - -0.41137695 + - 0.059417725 + - 0.18322754 + - -0.38623047 + - -0.16040039 + - -0.7553711 + - -0.13977051 + - 0.2878418 + - 0.34960938 + - -0.63671875 + - 0.26660156 + - 0.1496582 + - -0.021224976 + - -0.43286133 + - 0.32348633 + - -0.5629883 + - 0.0019836426 + - 0.4897461 + - 0.9741211 + - 0.7949219 + - -0.21728516 + - 0.49267578 + - -0.05432129 + - -0.0016565323 + - -0.40942383 + - -0.5283203 + - -0.12475586 + - -0.8540039 + - -0.39111328 + - 0.7441406 + - 0.31640625 + - -0.1171875 + - -0.17236328 + - -0.9267578 + - -0.44848633 + - -0.14160156 + - 0.15588379 + - 0.1862793 + - 0.02947998 + - -0.78564453 + - 0.61279297 + - -0.22766113 + - 0.27075195 + - -0.13293457 + - -0.4345703 + - 0.3515625 + - -0.25708008 + - 1.2001953 + - -0.73535156 + - 0.22473145 + - 0.28198242 + - 0.3071289 + - 0.22460938 + - -0.8984375 + - 3.0742188 + - 0.6484375 + - -0.05090332 + - -0.13964844 + - 0.040527344 + - -0.34643555 + - 0.16931152 + - 0.26733398 + - -0.029632568 + - 0.4873047 + - 0.23852539 + - -0.62841797 + - -0.8491211 + - -0.27905273 + - -0.38623047 + - -0.33276367 + - 0.0435791 + - -0.09240723 + - 0.025894165 + - -0.03277588 + - 0.80322266 + - 0.23010254 + - 0.57128906 + - 0.014907837 + - 0.3269043 + - 0.50927734 + - -0.4892578 + - 0.28051758 + - 0.2019043 + - 0.5722656 + - -0.31958008 + - -0.017333984 + - 0.8300781 + - -0.26489258 + - -0.5722656 + - -0.4296875 + - 0.4033203 + - -0.05871582 + - -0.057495117 + - -0.43188477 + - 0.032196045 + - 0.124572754 + - 0.56689453 + - 0.5800781 + - -1.1533203 + - -1.1044922 + - 0.026779175 + - 0.079711914 + - 0.30908203 + - 0.6635742 + - 0.07446289 + - 0.52783203 + - -0.46826172 + - -0.2368164 + - 0.103149414 + - -0.6875 + - 1.0712891 + - 0.02104187 + - 0.005466461 + - 0.23547363 + - 0.52197266 + - -0.4609375 + - 0.66259766 + - 0.47021484 + - -0.51416016 + - -0.024749756 + - -0.0725708 + - 0.47143555 + - 0.15820313 + - -0.111450195 + - -0.055847168 + - 0.21459961 + - -0.2055664 + - 0.61279297 + - 1.1289063 + - -0.12939453 + - 0.29101563 + - 0.123046875 + - 0.44360352 + - 0.12878418 + - -0.1875 + - 0.23376465 + - -0.50146484 + - 0.55029297 + - -0.13134766 + - 0.7426758 + - -0.35620117 + - 0.22460938 + - 0.2841797 + - -0.6254883 + - -0.32788086 + - 0.21362305 + - -0.22875977 + - 0.40551758 + - 0.2849121 + - -0.01008606 + - -0.19689941 + - 0.19104004 + - 0.37158203 + - -0.4765625 + - -0.29541016 + - -0.58691406 + - -0.36523438 + - 0.9301758 + - -0.11981201 + - -0.6738281 + - -0.2524414 + - 0.045837402 + - 0.86816406 + - 1.1904297 + - -0.8959961 + - 0.6972656 + - 0.15039063 + - -0.33618164 + - 0.58447266 + - 0.4025879 + - -0.29370117 + - -0.123413086 + - -0.19104004 + - -0.2697754 + - -0.34545898 + - 0.12683105 + - -0.32641602 + - -0.24072266 + - -0.3642578 + - -0.27441406 + - -0.1282959 + - 0.24328613 + - -0.8959961 + - -0.30493164 + - -0.3317871 + - 0.21130371 + - 0.008087158 + - 0.49145508 + - -0.60253906 + - 0.85791016 + - -0.11578369 + - 0.97558594 + - -0.66259766 + - -0.6879883 + - 0.28881836 + - -0.1829834 + - -0.46411133 + - 0.32348633 + - 0.27734375 + - 0.19104004 + - 1.0107422 + - -0.3618164 + - 0.74902344 + - 0.7216797 + - 0.8227539 + - -0.34301758 + - 0.1430664 + - -0.07513428 + - 0.03668213 + - 0.66748047 + - -0.2902832 + - 0.11785889 + - 0.22033691 + - -0.41625977 + - -0.9667969 + - -0.3017578 + - 0.33032227 + - -0.5371094 + - -0.4189453 + - -0.203125 + - -0.20581055 + - 0.28979492 + - 0.22973633 + - -0.37890625 + - 0.039154053 + - -0.6743164 + - 0.52197266 + - -0.103881836 + - -0.80322266 + - -0.011245728 + - 0.34814453 + - 0.112976074 + - -0.6484375 + - -0.06048584 + - 0.24633789 + - -0.10266113 + - 0.703125 + - 0.29614258 + - 0.38720703 + - -0.13232422 + - -0.2602539 + - -0.1907959 + - 0.22265625 + - 0.26098633 + - 0.21582031 + - 0.14697266 + - -0.15429688 + - 0.52783203 + - 0.056488037 + - -0.64501953 + - 0.34765625 + - 0.09918213 + - -0.08380127 + - -0.18518066 + - 0.18469238 + - 0.068115234 + - 0.6503906 + - -0.21166992 + - -0.0158844 + - 0.5449219 + - -0.014122009 + - -0.6640625 + - 0.2878418 + - -0.2524414 + - 0.122558594 + - -1.0585938 + - 0.20898438 + - 0.014175415 + - 0.010635376 + - -0.021636963 + - -0.6635742 + - 0.59765625 + - 0.3203125 + - -0.41210938 + - -0.016555786 + - -0.0791626 + - 0.7841797 + - -0.21826172 + - -0.38964844 + - -0.29003906 + - 0.16027832 + - 0.50634766 + - -0.08703613 + - 0.54248047 + - 0.10015869 + - -0.18688965 + - 0.032928467 + - -0.6484375 + - 0.26489258 + - 0.75 + - -0.07922363 + - -0.14099121 + - -0.31689453 + - 0.28588867 + - 0.08282471 + - -0.3479004 + - 0.44995117 + - -0.15490723 + - 0.22106934 + - 0.33862305 + - -0.26586914 + - 0.8334961 + - 0.5541992 + - 0.11999512 + - 0.5229492 + - 0.36791992 + - 0.28881836 + - -0.3918457 + - -0.048461914 + - 0.42089844 + - -0.2709961 + - 0.012794495 + - -0.15930176 + - 1.0332031 + - 0.5439453 + - -0.107788086 + - -0.115600586 + - 0.625 + - -0.16564941 + - -0.0096588135 + - 0.16430664 + - -0.23791504 + - 0.28735352 + - -0.12408447 + - 0.040100098 + - -0.47485352 + - -0.08154297 + - 0.25341797 + - 0.12176514 + - 0.30566406 + - -0.011238098 + - 0.24633789 + - -0.18188477 + - -0.14099121 + - -0.14538574 + - 0.15039063 + - -0.94384766 + - -0.07421875 + - 1.5527344 + - 0.78222656 + - -0.3017578 + - -0.20532227 + - -0.13684082 + - 0.25073242 + - -0.515625 + - -0.9580078 + - 0.024337769 + - -0.01763916 + - 0.34155273 + - 0.057678223 + - -0.6713867 + - -0.43554688 + - -0.83251953 + - -1.1269531 + - 0.13977051 + - 0.53271484 + - 0.27978516 + - 0.22961426 + - -0.2849121 + - 0.6220703 + - -0.08258057 + - 0.23291016 + - 0.06719971 + - 0.034179688 + - -0.1149292 + - 0.12084961 + - -0.24023438 + - 0.053009033 + - 0.061309814 + - -0.25805664 + - -0.2055664 + - 0.10223389 + - -0.81884766 + - -0.81689453 + - -0.04055786 + - -0.31567383 + - -0.032348633 + - 0.0046539307 + - -0.31689453 + - -0.38134766 + - -0.5996094 + - -0.17150879 + - 0.52734375 + - 0.15979004 + - 0.026611328 + - -0.10040283 + - -0.08319092 + - -0.32470703 + - 0.19091797 + - -0.036254883 + - -0.61279297 + - -0.19555664 + - 0.059570313 + - -0.9707031 + - -0.111694336 + - 0.2512207 + - -0.2927246 + - -1.0048828 + - 0.103271484 + - -0.26391602 + - 0.37402344 + - 0.32128906 + - 0.21911621 + - 0.16589355 + - 0.2421875 + - -0.75097656 + - 0.41674805 + - 0.23510742 + - -0.50927734 + - -0.34106445 + - -0.50097656 + - -0.56591797 + - -0.103881836 + - -0.21020508 + - -0.013923645 + - -0.054473877 + - 0.06738281 + - -0.075927734 + - 0.38110352 + - -0.21484375 + - 0.65185547 + - 0.16369629 + - 0.21191406 + - -0.107666016 + - -1.1650391 + - 0.8515625 + - -0.13635254 + - -0.27905273 + - 0.39453125 + - -0.8457031 + - 0.06304932 + - -0.17053223 + - 0.65966797 + - 0.095214844 + - -0.3347168 + - 0.10699463 + - 0.1796875 + - 0.484375 + - 0.030273438 + - 0.099731445 + - 0.15527344 + - 0.43066406 + - 0.10058594 + - -1.0058594 + - -0.41601563 + - -0.21936035 + - 0.81396484 + - 0.2064209 + - 0.81103516 + - 0.9736328 + - -0.119018555 + - -0.3305664 + - -0.20544434 + - -0.05718994 + - -1.1367188 + - 0.101623535 + - 0.7944336 + - 0.21484375 + - 0.085998535 + - -0.08129883 + - 0.045288086 + - -0.29858398 + - 0.51220703 + - -0.04888916 + - 0.0440979 + - 0.38378906 + - 0.3005371 + - -0.30908203 + - 0.6064453 + - 0.38793945 + - -0.3918457 + - -0.16247559 + - 0.4794922 + - 0.23278809 + - -1.0449219 + - 0.66748047 + - 0.5488281 + - -0.3034668 + - -0.46923828 + - 0.12036133 + - -0.20410156 + - -0.30981445 + - 0.12219238 + - -0.7397461 + - 0.4272461 + - 0.25952148 + - -0.61572266 + - -0.43798828 + - 0.054473877 + - 0.42407227 + - -0.96191406 + - 0.14440918 + - 0.11218262 + - -0.6113281 + - 0.036499023 + - -0.11791992 + - -0.15588379 + - -0.34375 + - 0.43115234 + - -0.33691406 + - -0.28027344 + - 0.05569458 + - -0.5546875 + - 0.6064453 + - 0.91796875 + - -0.33398438 + - 0.7890625 + - 0.09197998 + - -0.81396484 + - -0.2800293 + - -0.46923828 + - -0.6381836 + - 0.60253906 + - -0.38183594 + - -0.20080566 + - 0.08258057 + - -0.31103516 + - 0.2980957 + - -1.3076172 + - -0.09106445 + - 0.64453125 + - -0.33764648 + - 0.7446289 + - -0.13098145 + - -0.29125977 + - 0.10571289 + - 0.04763794 + - -0.10992432 + - -0.03842163 + - -0.06781006 + - -0.18359375 + - -0.32861328 + - 0.28686523 + - -0.2565918 + - 0.9316406 + - -0.01007843 + - -0.12573242 + - -0.2536621 + - 0.55859375 + - -0.018066406 + - 0.56640625 + - -1.0087891 + - -0.15197754 + - -1.3789063 + - 0.012916565 + - -0.9628906 + - 0.56884766 + - -0.13439941 + - -0.117370605 + - 0.3425293 + - 0.69970703 + - 0.12585449 diff --git a/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap index 5db1bc22..7d7d6819 100644 --- a/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap +++ b/backends/candle/tests/snapshots/test_flash_jina_code__jina_code_single.snap @@ -1,772 +1,773 @@ --- source: backends/candle/tests/test_flash_jina_code.rs +assertion_line: 48 expression: embeddings_single --- -- - -0.011624558 - - -0.0016926473 - - -0.006434922 - - -0.009909191 - - 0.027506275 - - 0.022786874 - - -0.059169117 - - -0.047887173 - - 0.038912594 - - 0.025214802 - - -0.014350341 - - 0.039117776 - - 0.03485464 - - 0.05296896 - - 0.034907352 - - 0.0013971328 - - 0.0019907136 - - 0.052471623 - - -0.014562107 - - 0.00030206257 - - -0.02770458 - - 0.02685756 - - -0.015385578 - - -0.012668428 - - -0.025259107 - - 0.00836893 - - 0.028925523 - - -0.035507426 - - -0.04220648 - - 0.047328673 - - -0.083232224 - - -0.02608385 - - -0.012809777 - - -0.0140402755 - - -0.013649549 - - -0.013641793 - - 0.02880054 - - 0.04465023 - - -0.0274121 - - -0.03170939 - - -0.047180377 - - -0.0349574 - - -0.037762504 - - 0.024104225 - - -0.039361924 - - -0.024559166 - - -0.0138650155 - - -0.049862508 - - -0.0507675 - - -0.07775355 - - -0.055519626 - - -0.025151063 - - 0.040781654 - - 0.0039354665 - - 0.015940087 - - -0.022214677 - - -0.013484792 - - -0.00070730236 - - -0.009409981 - - 0.0016682384 - - 0.016079267 - - -0.032368172 - - 0.024572799 - - 0.026780155 - - -0.025954 - - 0.021282032 - - -0.047395118 - - 0.044386413 - - -0.023020437 - - 0.0056320634 - - -0.017416032 - - -0.024118245 - - 0.05878816 - - 0.00059366866 - - -0.018553924 - - 0.003762008 - - 0.0035026476 - - -0.0077498616 - - -0.004517831 - - 0.008116448 - - -0.010922055 - - 0.037391223 - - -0.03318112 - - -0.07876148 - - -0.0018068684 - - -0.0484656 - - -0.038104814 - - -0.0070756334 - - -0.015427567 - - -0.04499487 - - 0.008910639 - - 0.029193114 - - 0.032674707 - - 0.0305758 - - -0.017541302 - - 0.028164856 - - -0.0344121 - - 0.016969312 - - 0.04108575 - - -0.054463603 - - -0.005427823 - - -0.008252881 - - -0.024992533 - - 0.048412405 - - -0.05769221 - - -0.08227673 - - -0.0523458 - - 0.025244992 - - -0.016289622 - - -0.049253095 - - -0.03999235 - - 0.05642755 - - -0.010015731 - - 0.04892553 - - -0.02504831 - - -0.014305144 - - 0.04907702 - - -0.0096177375 - - -0.0854665 - - 0.017617436 - - -0.014481601 - - 0.046187755 - - -0.030009247 - - -0.049553443 - - -0.006797771 - - -0.034234725 - - 0.06525787 - - 0.017298417 - - -0.018988462 - - -0.08520813 - - -0.011840521 - - -0.042942975 - - -0.056341827 - - 0.08071612 - - 0.028146833 - - -0.0141261155 - - 0.04001012 - - 0.018236378 - - 0.01583886 - - 0.0058086845 - - 0.0005290361 - - 0.0045259795 - - 0.024873685 - - 0.018050008 - - 0.02440984 - - -0.057676647 - - -0.022263395 - - -0.033016473 - - 0.014353932 - - -0.010189813 - - 0.018424626 - - -0.018238619 - - 0.07698089 - - -0.015595315 - - 0.007074499 - - 0.027340613 - - -0.02035102 - - -0.073149584 - - -0.0061021335 - - 0.0209061 - - -0.024985746 - - -0.020401739 - - -0.0048702923 - - 0.0444933 - - -0.02158648 - - 0.010312202 - - 0.009883107 - - 0.022790415 - - -0.01893943 - - 0.017615119 - - 0.023000762 - - -0.051276624 - - 0.019835759 - - 0.016675396 - - 0.021532865 - - 0.023097536 - - 0.01091247 - - 0.007642041 - - 0.0385409 - - 0.044193454 - - 0.003319116 - - 0.019355802 - - -0.055695307 - - -0.07680676 - - -0.035279598 - - -0.0070618573 - - -0.01408385 - - 0.03107026 - - 0.011547187 - - 0.04217532 - - 0.048034772 - - -0.014330861 - - -0.0007901662 - - 0.009103947 - - 0.011091706 - - -0.008960474 - - -0.009301379 - - 0.032424763 - - 0.09180531 - - 0.015491586 - - 0.031114861 - - 0.013289549 - - 0.03616163 - - 0.031084707 - - -0.021437835 - - 0.011905716 - - -0.104623 - - 0.033417992 - - -0.04683295 - - -0.05382028 - - 0.025979578 - - -0.003795323 - - 0.094473585 - - 0.09126942 - - 0.067700386 - - -0.002935823 - - -0.031604428 - - 0.0045677535 - - 0.014042491 - - -0.02969786 - - -0.012263599 - - -0.05807616 - - -0.0107510965 - - 0.022099612 - - 0.02685798 - - -0.048912797 - - 0.020464186 - - 0.011517319 - - -0.0016606319 - - -0.033255223 - - 0.02488959 - - -0.043240122 - - 0.00013934783 - - 0.037608404 - - 0.0748658 - - 0.061115693 - - -0.01670558 - - 0.037827995 - - -0.004162286 - - -0.00011341072 - - -0.031436242 - - -0.040532686 - - -0.0096016815 - - -0.065639205 - - -0.030070387 - - 0.05715196 - - 0.024338327 - - -0.008972259 - - -0.013220871 - - -0.07115904 - - -0.03446362 - - -0.010893238 - - 0.011950567 - - 0.0143028535 - - 0.0022963681 - - -0.060428943 - - 0.047038406 - - -0.017493663 - - 0.0208505 - - -0.010212147 - - -0.03337894 - - 0.026969628 - - -0.019734934 - - 0.0922163 - - -0.056534916 - - 0.017255465 - - 0.021692138 - - 0.023583038 - - 0.017224979 - - -0.0689936 - - 0.23665377 - - 0.04984247 - - -0.0039337534 - - -0.010740561 - - 0.00313393 - - -0.02665381 - - 0.013037893 - - 0.020565815 - - -0.002266256 - - 0.03748113 - - 0.018353125 - - -0.048318923 - - -0.06522075 - - -0.021460611 - - -0.029665926 - - -0.025507431 - - 0.0033435076 - - -0.0071087605 - - 0.001970083 - - -0.0025331723 - - 0.061776515 - - 0.017747495 - - 0.04396135 - - 0.0011617352 - - 0.02509327 - - 0.039078914 - - -0.03762337 - - 0.021575885 - - 0.015548619 - - 0.043990802 - - -0.024633111 - - -0.0013324996 - - 0.063795656 - - -0.02035371 - - -0.0440217 - - -0.033049908 - - 0.031034056 - - -0.004495562 - - -0.0044647786 - - -0.033148468 - - 0.0025072312 - - 0.009637453 - - 0.04357035 - - 0.044546504 - - -0.08865154 - - -0.08487347 - - 0.00205395 - - 0.0060572727 - - 0.023767816 - - 0.051007573 - - 0.0057035745 - - 0.040539596 - - -0.035988905 - - -0.01824621 - - 0.007887274 - - -0.052848075 - - 0.08228733 - - 0.0015825987 - - 0.0004136183 - - 0.018108545 - - 0.040081892 - - -0.035405345 - - 0.050933696 - - 0.036154125 - - -0.03947257 - - -0.0018412384 - - -0.005589829 - - 0.03620321 - - 0.012144826 - - -0.008619581 - - -0.0043279063 - - 0.016455552 - - -0.015757388 - - 0.047043085 - - 0.08675011 - - -0.009986743 - - 0.022379123 - - 0.009470605 - - 0.034120724 - - 0.009922824 - - -0.014435422 - - 0.017998574 - - -0.03849387 - - 0.042357396 - - -0.010053916 - - 0.057034835 - - -0.027412737 - - 0.017308975 - - 0.02185228 - - -0.048017155 - - -0.025138885 - - 0.016482655 - - -0.01756698 - - 0.031146016 - - 0.021930695 - - -0.00075341173 - - -0.015085438 - - 0.0146785155 - - 0.028547939 - - -0.036677707 - - -0.022699077 - - -0.045135103 - - -0.02802744 - - 0.071454674 - - -0.009201392 - - -0.051717956 - - -0.019421624 - - 0.0034821872 - - 0.06667364 - - 0.09145379 - - -0.068826884 - - 0.053568542 - - 0.01160062 - - -0.025829546 - - 0.04487214 - - 0.030954553 - - -0.022543794 - - -0.009475118 - - -0.014623143 - - -0.02070793 - - -0.02656788 - - 0.009701591 - - -0.025120718 - - -0.018472325 - - -0.027967019 - - -0.021122226 - - -0.009891716 - - 0.018696679 - - -0.068876855 - - -0.023419108 - - -0.025495855 - - 0.016256742 - - 0.00064859784 - - 0.037749656 - - -0.046321914 - - 0.065936595 - - -0.008921658 - - 0.07497468 - - -0.05094385 - - -0.052860104 - - 0.022196138 - - -0.0140462285 - - -0.03562305 - - 0.024858234 - - 0.021310989 - - 0.014657512 - - 0.07767391 - - -0.027777392 - - 0.057577316 - - 0.055513144 - - 0.06322926 - - -0.026312957 - - 0.010970987 - - -0.0057475767 - - 0.0028267235 - - 0.051367335 - - -0.022320578 - - 0.009050165 - - 0.016952222 - - -0.032026373 - - -0.074292615 - - -0.02315535 - - 0.025375988 - - -0.041241057 - - -0.032157563 - - -0.015576387 - - -0.015834223 - - 0.02224181 - - 0.017586967 - - -0.029070066 - - 0.0030065721 - - -0.051857695 - - 0.04008828 - - -0.007960872 - - -0.061745025 - - -0.00086617953 - - 0.026723113 - - 0.008719714 - - -0.049826868 - - -0.0046574236 - - 0.018954279 - - -0.007935451 - - 0.053987946 - - 0.022795292 - - 0.029722994 - - -0.010146585 - - -0.019956842 - - -0.014686722 - - 0.01708331 - - 0.020001508 - - 0.016564105 - - 0.011379248 - - -0.011843253 - - 0.04056168 - - 0.004384286 - - -0.049596023 - - 0.02674251 - - 0.0076475106 - - -0.0064563937 - - -0.014233138 - - 0.014224383 - - 0.0052741244 - - 0.049964864 - - -0.016286546 - - -0.001200327 - - 0.041904222 - - -0.0010395087 - - -0.05105399 - - 0.022099879 - - -0.019455278 - - 0.009444127 - - -0.081325725 - - 0.015994828 - - 0.0010952728 - - 0.0008373874 - - -0.0016424303 - - -0.05096469 - - 0.045976803 - - 0.024695056 - - -0.031656373 - - -0.0013138534 - - -0.0060524447 - - 0.060276203 - - -0.016745795 - - -0.029930653 - - -0.0222771 - - 0.012314711 - - 0.038991332 - - -0.006665343 - - 0.041694533 - - 0.0076992502 - - -0.014353178 - - 0.0025135442 - - -0.0498445 - - 0.020322764 - - 0.0575802 - - -0.006096128 - - -0.010841882 - - -0.024337102 - - 0.021975596 - - 0.0064031687 - - -0.026746146 - - 0.03455729 - - -0.011909055 - - 0.016994143 - - 0.026053395 - - -0.020393625 - - 0.06403403 - - 0.042590734 - - 0.009193913 - - 0.04016698 - - 0.028304791 - - 0.022147119 - - -0.030121539 - - -0.0037334429 - - 0.03235819 - - -0.020825844 - - 0.0009766509 - - -0.012216568 - - 0.07944978 - - 0.04177374 - - -0.008281654 - - -0.008908983 - - 0.04799388 - - -0.012743454 - - -0.00076762337 - - 0.012673029 - - -0.018283572 - - 0.022068778 - - -0.009605337 - - 0.0030652087 - - -0.036517244 - - -0.006263211 - - 0.0194632 - - 0.009333852 - - 0.02350168 - - -0.0008530139 - - 0.018934859 - - -0.013986168 - - -0.010833636 - - -0.011189203 - - 0.011567913 - - -0.07253544 - - -0.005748846 - - 0.11930293 - - 0.060044624 - - -0.023167728 - - -0.015781552 - - -0.010494401 - - 0.01930528 - - -0.039608266 - - -0.073587865 - - 0.0019034932 - - -0.0013838339 - - 0.026257295 - - 0.004433007 - - -0.051545423 - - -0.033456888 - - -0.06401291 - - -0.08664347 - - 0.010781564 - - 0.0408775 - - 0.021475399 - - 0.017633006 - - -0.02186024 - - 0.047795497 - - -0.006370007 - - 0.01792626 - - 0.005195737 - - 0.0026206016 - - -0.008816542 - - 0.009266863 - - -0.018453414 - - 0.0040575014 - - 0.0047053 - - -0.0197809 - - -0.01580334 - - 0.007821501 - - -0.06296649 - - -0.06274416 - - -0.0031381177 - - -0.024228694 - - -0.002459634 - - 0.00034323192 - - -0.02430543 - - -0.029262288 - - -0.04606642 - - -0.013138838 - - 0.040473 - - 0.012308485 - - 0.0020701357 - - -0.007718021 - - -0.0064122216 - - -0.024890581 - - 0.014665469 - - -0.0028788927 - - -0.047072053 - - -0.014959743 - - 0.004587824 - - -0.07462158 - - -0.008558996 - - 0.019324543 - - -0.02247574 - - -0.07721102 - - 0.007920586 - - -0.020274863 - - 0.028696692 - - 0.024707401 - - 0.016905285 - - 0.012742534 - - 0.018577736 - - -0.05768951 - - 0.03203929 - - 0.018105863 - - -0.03917534 - - -0.026208939 - - -0.038492158 - - -0.043517314 - - -0.008031121 - - -0.016162876 - - -0.0010640965 - - -0.004164019 - - 0.005193703 - - -0.0058410293 - - 0.029311381 - - -0.016533207 - - 0.05005747 - - 0.012600715 - - 0.016292874 - - -0.008300225 - - -0.08953819 - - 0.06544125 - - -0.010512851 - - -0.021443438 - - 0.030277776 - - -0.06502247 - - 0.004850903 - - -0.013137611 - - 0.0506941 - - 0.0072725127 - - -0.025755724 - - 0.008224718 - - 0.013813313 - - 0.037197027 - - 0.0023671025 - - 0.00763629 - - 0.011905766 - - 0.033143394 - - 0.007750765 - - -0.07725993 - - -0.03193554 - - -0.016900484 - - 0.06256093 - - 0.015902048 - - 0.062251173 - - 0.07478062 - - -0.009171957 - - -0.025452917 - - -0.015754124 - - -0.004426243 - - -0.0873611 - - 0.0077999695 - - 0.061026644 - - 0.016489599 - - 0.0066420045 - - -0.0062355455 - - 0.00345123 - - -0.022935547 - - 0.03939866 - - -0.0037231673 - - 0.0033949488 - - 0.029471302 - - 0.023097953 - - -0.0237214 - - 0.046621986 - - 0.029790087 - - -0.030113066 - - -0.012432801 - - 0.036813233 - - 0.01785254 - - -0.08032645 - - 0.051262226 - - 0.04222712 - - -0.023358794 - - -0.03602671 - - 0.0092950305 - - -0.015663076 - - -0.023873692 - - 0.009383877 - - -0.056770466 - - 0.032832243 - - 0.019920528 - - -0.04734062 - - -0.03368295 - - 0.0041841906 - - 0.03257228 - - -0.07387151 - - 0.011083565 - - 0.008633363 - - -0.04694844 - - 0.0027943242 - - -0.009078945 - - -0.011981829 - - -0.026407028 - - 0.033040557 - - -0.025803888 - - -0.021555608 - - 0.0042838412 - - -0.04263439 - - 0.0465685 - - 0.070476055 - - -0.02560814 - - 0.060619954 - - 0.0071254023 - - -0.062549844 - - -0.021544673 - - -0.03598606 - - -0.04904548 - - 0.04631042 - - -0.029345924 - - -0.015404836 - - 0.0063473387 - - -0.023926385 - - 0.022935716 - - -0.1004558 - - -0.007012574 - - 0.049480513 - - -0.02592937 - - 0.057209775 - - -0.010056263 - - -0.02236333 - - 0.008163001 - - 0.0036735693 - - -0.008406754 - - -0.0029980235 - - -0.0052409745 - - -0.014090007 - - -0.025248934 - - 0.022062942 - - -0.019766279 - - 0.07160526 - - -0.00075892545 - - -0.0096911425 - - -0.019483106 - - 0.042904716 - - -0.0013572425 - - 0.04353212 - - -0.07759716 - - -0.011731261 - - -0.10602095 - - 0.0010180247 - - -0.07403971 - - 0.043784548 - - -0.010357722 - - -0.009020027 - - 0.026289912 - - 0.053744033 - - 0.009665143 +- - -0.15026855 + - -0.02079773 + - -0.08392334 + - -0.12878418 + - 0.3581543 + - 0.29589844 + - -0.7709961 + - -0.6225586 + - 0.5053711 + - 0.32861328 + - -0.18591309 + - 0.50878906 + - 0.45361328 + - 0.6894531 + - 0.45410156 + - 0.0178833 + - 0.025802612 + - 0.68359375 + - -0.19018555 + - 0.0036315918 + - -0.36035156 + - 0.34814453 + - -0.20031738 + - -0.16503906 + - -0.32836914 + - 0.109191895 + - 0.37646484 + - -0.46142578 + - -0.5493164 + - 0.61572266 + - -1.0820313 + - -0.33984375 + - -0.16638184 + - -0.1821289 + - -0.17797852 + - -0.17797852 + - 0.375 + - 0.5800781 + - -0.3569336 + - -0.41235352 + - -0.61328125 + - -0.45410156 + - -0.4909668 + - 0.31323242 + - -0.51171875 + - -0.3190918 + - -0.18078613 + - -0.6484375 + - -0.66064453 + - -1.0107422 + - -0.7216797 + - -0.32739258 + - 0.53027344 + - 0.051116943 + - 0.20812988 + - -0.28833008 + - -0.17492676 + - -0.008338928 + - -0.12188721 + - 0.021240234 + - 0.20898438 + - -0.4206543 + - 0.32080078 + - 0.34936523 + - -0.33813477 + - 0.2763672 + - -0.6166992 + - 0.57666016 + - -0.29956055 + - 0.07366943 + - -0.22631836 + - -0.31323242 + - 0.765625 + - 0.0072364807 + - -0.2397461 + - 0.04937744 + - 0.04473877 + - -0.101379395 + - -0.058746338 + - 0.1060791 + - -0.14245605 + - 0.48583984 + - -0.43188477 + - -1.0244141 + - -0.023361206 + - -0.6303711 + - -0.49487305 + - -0.09185791 + - -0.20056152 + - -0.5859375 + - 0.1159668 + - 0.37939453 + - 0.42456055 + - 0.39746094 + - -0.22875977 + - 0.36572266 + - -0.44677734 + - 0.22094727 + - 0.5336914 + - -0.7080078 + - -0.07043457 + - -0.10650635 + - -0.3251953 + - 0.62939453 + - -0.75097656 + - -1.0703125 + - -0.68115234 + - 0.32861328 + - -0.21203613 + - -0.6411133 + - -0.5205078 + - 0.73339844 + - -0.12988281 + - 0.63623047 + - -0.32641602 + - -0.18652344 + - 0.6381836 + - -0.12463379 + - -1.1123047 + - 0.22851563 + - -0.18786621 + - 0.60009766 + - -0.39111328 + - -0.6430664 + - -0.08868408 + - -0.44580078 + - 0.8491211 + - 0.22497559 + - -0.2467041 + - -1.1083984 + - -0.1538086 + - -0.5571289 + - -0.73291016 + - 1.0498047 + - 0.36572266 + - -0.18359375 + - 0.52001953 + - 0.23632813 + - 0.20581055 + - 0.07562256 + - 0.007335663 + - 0.058746338 + - 0.3244629 + - 0.23486328 + - 0.31689453 + - -0.74902344 + - -0.29003906 + - -0.42895508 + - 0.18676758 + - -0.13269043 + - 0.24035645 + - -0.23742676 + - 1.0009766 + - -0.20336914 + - 0.09246826 + - 0.3552246 + - -0.2644043 + - -0.9506836 + - -0.07928467 + - 0.27246094 + - -0.3251953 + - -0.265625 + - -0.06274414 + - 0.57958984 + - -0.28051758 + - 0.13427734 + - 0.12878418 + - 0.29589844 + - -0.24621582 + - 0.22961426 + - 0.29907227 + - -0.66748047 + - 0.25683594 + - 0.21679688 + - 0.27929688 + - 0.30004883 + - 0.1418457 + - 0.0993042 + - 0.50146484 + - 0.57470703 + - 0.042877197 + - 0.25146484 + - -0.72509766 + - -0.9980469 + - -0.45922852 + - -0.09136963 + - -0.18359375 + - 0.40454102 + - 0.15063477 + - 0.54785156 + - 0.625 + - -0.18603516 + - -0.011123657 + - 0.11816406 + - 0.14453125 + - -0.11633301 + - -0.12097168 + - 0.42114258 + - 1.1943359 + - 0.20251465 + - 0.4050293 + - 0.17285156 + - 0.47021484 + - 0.40307617 + - -0.27954102 + - 0.15515137 + - -1.3603516 + - 0.4350586 + - -0.609375 + - -0.69970703 + - 0.3388672 + - -0.049316406 + - 1.2294922 + - 1.1884766 + - 0.88134766 + - -0.03918457 + - -0.41064453 + - 0.059448242 + - 0.18310547 + - -0.38598633 + - -0.15966797 + - -0.7553711 + - -0.13989258 + - 0.2878418 + - 0.34887695 + - -0.63671875 + - 0.26660156 + - 0.14953613 + - -0.022140503 + - -0.43359375 + - 0.32421875 + - -0.5629883 + - 0.0014381409 + - 0.4892578 + - 0.9741211 + - 0.79541016 + - -0.21728516 + - 0.4921875 + - -0.054351807 + - -0.0012207031 + - -0.4091797 + - -0.52783203 + - -0.125 + - -0.8535156 + - -0.38989258 + - 0.7441406 + - 0.31713867 + - -0.11645508 + - -0.171875 + - -0.92578125 + - -0.44799805 + - -0.14160156 + - 0.15527344 + - 0.1862793 + - 0.029571533 + - -0.7866211 + - 0.6118164 + - -0.22692871 + - 0.27148438 + - -0.1328125 + - -0.4345703 + - 0.35083008 + - -0.25756836 + - 1.1982422 + - -0.73535156 + - 0.22436523 + - 0.28173828 + - 0.3071289 + - 0.22375488 + - -0.89746094 + - 3.0800781 + - 0.6489258 + - -0.05178833 + - -0.14013672 + - 0.04055786 + - -0.34765625 + - 0.17004395 + - 0.26757813 + - -0.030090332 + - 0.48754883 + - 0.23852539 + - -0.62890625 + - -0.84814453 + - -0.27905273 + - -0.38598633 + - -0.3317871 + - 0.043518066 + - -0.092163086 + - 0.0256958 + - -0.032928467 + - 0.80322266 + - 0.23022461 + - 0.57177734 + - 0.015327454 + - 0.32714844 + - 0.50878906 + - -0.4892578 + - 0.28051758 + - 0.2019043 + - 0.5722656 + - -0.32080078 + - -0.017028809 + - 0.82910156 + - -0.26489258 + - -0.57373047 + - -0.4296875 + - 0.40356445 + - -0.058441162 + - -0.057373047 + - -0.43115234 + - 0.032684326 + - 0.12438965 + - 0.5678711 + - 0.5800781 + - -1.1533203 + - -1.1035156 + - 0.02670288 + - 0.07891846 + - 0.30908203 + - 0.6640625 + - 0.07446289 + - 0.52783203 + - -0.46801758 + - -0.23742676 + - 0.10357666 + - -0.6875 + - 1.0703125 + - 0.020080566 + - 0.005847931 + - 0.23657227 + - 0.5209961 + - -0.46020508 + - 0.6621094 + - 0.47021484 + - -0.51220703 + - -0.024047852 + - -0.07293701 + - 0.46972656 + - 0.15820313 + - -0.11248779 + - -0.056915283 + - 0.21398926 + - -0.20471191 + - 0.61279297 + - 1.1289063 + - -0.12988281 + - 0.29077148 + - 0.123046875 + - 0.44262695 + - 0.12963867 + - -0.1875 + - 0.23413086 + - -0.50146484 + - 0.55126953 + - -0.13061523 + - 0.7421875 + - -0.35620117 + - 0.22485352 + - 0.28393555 + - -0.625 + - -0.32861328 + - 0.21496582 + - -0.22851563 + - 0.4050293 + - 0.2841797 + - -0.010108948 + - -0.19689941 + - 0.19055176 + - 0.37158203 + - -0.4765625 + - -0.29516602 + - -0.58691406 + - -0.36523438 + - 0.9296875 + - -0.1194458 + - -0.67285156 + - -0.25195313 + - 0.045318604 + - 0.8671875 + - 1.1884766 + - -0.8955078 + - 0.69628906 + - 0.15075684 + - -0.3359375 + - 0.5834961 + - 0.4025879 + - -0.29296875 + - -0.122680664 + - -0.1899414 + - -0.26953125 + - -0.34594727 + - 0.1262207 + - -0.32617188 + - -0.24023438 + - -0.3642578 + - -0.27441406 + - -0.12841797 + - 0.24353027 + - -0.89697266 + - -0.30395508 + - -0.33129883 + - 0.2109375 + - 0.007217407 + - 0.49145508 + - -0.60253906 + - 0.8574219 + - -0.115234375 + - 0.9741211 + - -0.6621094 + - -0.6875 + - 0.2878418 + - -0.18322754 + - -0.46240234 + - 0.32348633 + - 0.2770996 + - 0.19104004 + - 1.0097656 + - -0.36083984 + - 0.74853516 + - 0.7216797 + - 0.8222656 + - -0.3425293 + - 0.1430664 + - -0.0748291 + - 0.03677368 + - 0.66845703 + - -0.29003906 + - 0.11755371 + - 0.22009277 + - -0.4165039 + - -0.9663086 + - -0.30151367 + - 0.32910156 + - -0.53564453 + - -0.41796875 + - -0.203125 + - -0.20617676 + - 0.28955078 + - 0.22888184 + - -0.3779297 + - 0.038085938 + - -0.67529297 + - 0.52246094 + - -0.103637695 + - -0.8027344 + - -0.011352539 + - 0.3479004 + - 0.11303711 + - -0.6484375 + - -0.060577393 + - 0.24658203 + - -0.10333252 + - 0.70166016 + - 0.29711914 + - 0.38720703 + - -0.13244629 + - -0.26000977 + - -0.19091797 + - 0.22265625 + - 0.26000977 + - 0.2154541 + - 0.14807129 + - -0.15393066 + - 0.52783203 + - 0.05621338 + - -0.64501953 + - 0.3479004 + - 0.099731445 + - -0.08416748 + - -0.18566895 + - 0.18457031 + - 0.06817627 + - 0.64990234 + - -0.21203613 + - -0.015991211 + - 0.5449219 + - -0.013648987 + - -0.6640625 + - 0.28686523 + - -0.2536621 + - 0.12261963 + - -1.0585938 + - 0.20776367 + - 0.014122009 + - 0.010620117 + - -0.021469116 + - -0.66259766 + - 0.59765625 + - 0.32080078 + - -0.4116211 + - -0.01739502 + - -0.078063965 + - 0.7832031 + - -0.21850586 + - -0.38964844 + - -0.28930664 + - 0.1595459 + - 0.50683594 + - -0.08673096 + - 0.54248047 + - 0.099853516 + - -0.18664551 + - 0.03253174 + - -0.6484375 + - 0.2644043 + - 0.74853516 + - -0.07952881 + - -0.14099121 + - -0.31689453 + - 0.2861328 + - 0.08300781 + - -0.34814453 + - 0.4501953 + - -0.15454102 + - 0.2220459 + - 0.33911133 + - -0.265625 + - 0.8330078 + - 0.55322266 + - 0.11999512 + - 0.5214844 + - 0.36865234 + - 0.2890625 + - -0.39160156 + - -0.048675537 + - 0.42114258 + - -0.27124023 + - 0.012619019 + - -0.15917969 + - 1.0341797 + - 0.54345703 + - -0.10723877 + - -0.115478516 + - 0.625 + - -0.16564941 + - -0.010139465 + - 0.16589355 + - -0.23693848 + - 0.28686523 + - -0.12524414 + - 0.039611816 + - -0.47558594 + - -0.08154297 + - 0.25170898 + - 0.12145996 + - 0.30566406 + - -0.010986328 + - 0.24633789 + - -0.18188477 + - -0.14099121 + - -0.14562988 + - 0.1505127 + - -0.9428711 + - -0.07421875 + - 1.5507813 + - 0.78222656 + - -0.3010254 + - -0.20532227 + - -0.13647461 + - 0.25073242 + - -0.5151367 + - -0.95751953 + - 0.025177002 + - -0.01777649 + - 0.34155273 + - 0.058288574 + - -0.6694336 + - -0.43579102 + - -0.8334961 + - -1.1269531 + - 0.13964844 + - 0.5317383 + - 0.27929688 + - 0.22961426 + - -0.28442383 + - 0.6225586 + - -0.08343506 + - 0.23291016 + - 0.06756592 + - 0.033813477 + - -0.11401367 + - 0.12030029 + - -0.23950195 + - 0.052856445 + - 0.061706543 + - -0.25732422 + - -0.20532227 + - 0.101623535 + - -0.81884766 + - -0.81640625 + - -0.04067993 + - -0.3149414 + - -0.03250122 + - 0.0046043396 + - -0.31640625 + - -0.38085938 + - -0.5991211 + - -0.17053223 + - 0.52685547 + - 0.15979004 + - 0.026824951 + - -0.10070801 + - -0.083984375 + - -0.32421875 + - 0.19067383 + - -0.037322998 + - -0.61279297 + - -0.19445801 + - 0.059173584 + - -0.9711914 + - -0.111328125 + - 0.25097656 + - -0.29296875 + - -1.0039063 + - 0.10266113 + - -0.26293945 + - 0.37402344 + - 0.32104492 + - 0.21984863 + - 0.16625977 + - 0.24169922 + - -0.75097656 + - 0.41674805 + - 0.23547363 + - -0.50927734 + - -0.3408203 + - -0.5 + - -0.56591797 + - -0.10430908 + - -0.2097168 + - -0.013595581 + - -0.053894043 + - 0.067871094 + - -0.07635498 + - 0.3803711 + - -0.21484375 + - 0.6508789 + - 0.16333008 + - 0.21191406 + - -0.107543945 + - -1.1650391 + - 0.8515625 + - -0.13708496 + - -0.27905273 + - 0.39282227 + - -0.84521484 + - 0.06378174 + - -0.17102051 + - 0.65966797 + - 0.0947876 + - -0.33520508 + - 0.10723877 + - 0.17993164 + - 0.48364258 + - 0.030548096 + - 0.09863281 + - 0.15454102 + - 0.43066406 + - 0.10076904 + - -1.0048828 + - -0.4152832 + - -0.21923828 + - 0.8144531 + - 0.20581055 + - 0.8095703 + - 0.97265625 + - -0.119262695 + - -0.33129883 + - -0.20471191 + - -0.057037354 + - -1.1357422 + - 0.10089111 + - 0.7944336 + - 0.21435547 + - 0.086364746 + - -0.08148193 + - 0.04510498 + - -0.29858398 + - 0.5126953 + - -0.048583984 + - 0.044036865 + - 0.38427734 + - 0.3005371 + - -0.3088379 + - 0.60595703 + - 0.38745117 + - -0.39135742 + - -0.16174316 + - 0.47924805 + - 0.23217773 + - -1.0439453 + - 0.66748047 + - 0.5498047 + - -0.30444336 + - -0.46875 + - 0.120788574 + - -0.20373535 + - -0.30981445 + - 0.12145996 + - -0.73876953 + - 0.4267578 + - 0.25976563 + - -0.61572266 + - -0.43774414 + - 0.054473877 + - 0.4230957 + - -0.96191406 + - 0.14416504 + - 0.111816406 + - -0.6113281 + - 0.03665161 + - -0.11779785 + - -0.15563965 + - -0.34301758 + - 0.4296875 + - -0.3359375 + - -0.2800293 + - 0.05618286 + - -0.5546875 + - 0.60595703 + - 0.9160156 + - -0.33374023 + - 0.7890625 + - 0.093322754 + - -0.81347656 + - -0.28076172 + - -0.46777344 + - -0.6386719 + - 0.6015625 + - -0.38134766 + - -0.20031738 + - 0.0826416 + - -0.31079102 + - 0.2980957 + - -1.3066406 + - -0.09161377 + - 0.64404297 + - -0.33691406 + - 0.74365234 + - -0.13024902 + - -0.29101563 + - 0.10620117 + - 0.047912598 + - -0.10949707 + - -0.039276123 + - -0.06781006 + - -0.18383789 + - -0.328125 + - 0.2861328 + - -0.2565918 + - 0.9316406 + - -0.0101623535 + - -0.12548828 + - -0.2529297 + - 0.55859375 + - -0.017501831 + - 0.56591797 + - -1.0097656 + - -0.15197754 + - -1.3779297 + - 0.013214111 + - -0.9628906 + - 0.56884766 + - -0.1352539 + - -0.11755371 + - 0.34179688 + - 0.69873047 + - 0.12548828 diff --git a/backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap b/backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap index 87f5bbd6..c82cb3b7 100644 --- a/backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap +++ b/backends/candle/tests/snapshots/test_jina_code__jina_code_batch.snap @@ -1,772 +1,2309 @@ --- source: backends/candle/tests/test_jina_code.rs +assertion_line: 34 expression: embeddings_batch --- -- - -0.011624558 - - -0.0016926473 - - -0.006434922 - - -0.009909191 - - 0.027506275 - - 0.022786874 - - -0.059169117 - - -0.047887173 - - 0.038912594 - - 0.025214802 - - -0.014350341 - - 0.039117776 - - 0.03485464 - - 0.05296896 - - 0.034907352 - - 0.0013971328 - - 0.0019907136 - - 0.052471623 - - -0.014562107 - - 0.00030206257 - - -0.02770458 - - 0.02685756 - - -0.015385578 - - -0.012668428 - - -0.025259107 - - 0.00836893 - - 0.028925523 - - -0.035507426 - - -0.04220648 - - 0.047328673 - - -0.083232224 - - -0.02608385 - - -0.012809777 - - -0.0140402755 - - -0.013649549 - - -0.013641793 - - 0.02880054 - - 0.04465023 - - -0.0274121 - - -0.03170939 - - -0.047180377 - - -0.0349574 - - -0.037762504 - - 0.024104225 - - -0.039361924 - - -0.024559166 - - -0.0138650155 - - -0.049862508 - - -0.0507675 - - -0.07775355 - - -0.055519626 - - -0.025151063 - - 0.040781654 - - 0.0039354665 - - 0.015940087 - - -0.022214677 - - -0.013484792 - - -0.00070730236 - - -0.009409981 - - 0.0016682384 - - 0.016079267 - - -0.032368172 - - 0.024572799 - - 0.026780155 - - -0.025954 - - 0.021282032 - - -0.047395118 - - 0.044386413 - - -0.023020437 - - 0.0056320634 - - -0.017416032 - - -0.024118245 - - 0.05878816 - - 0.00059366866 - - -0.018553924 - - 0.003762008 - - 0.0035026476 - - -0.0077498616 - - -0.004517831 - - 0.008116448 - - -0.010922055 - - 0.037391223 - - -0.03318112 - - -0.07876148 - - -0.0018068684 - - -0.0484656 - - -0.038104814 - - -0.0070756334 - - -0.015427567 - - -0.04499487 - - 0.008910639 - - 0.029193114 - - 0.032674707 - - 0.0305758 - - -0.017541302 - - 0.028164856 - - -0.0344121 - - 0.016969312 - - 0.04108575 - - -0.054463603 - - -0.005427823 - - -0.008252881 - - -0.024992533 - - 0.048412405 - - -0.05769221 - - -0.08227673 - - -0.0523458 - - 0.025244992 - - -0.016289622 - - -0.049253095 - - -0.03999235 - - 0.05642755 - - -0.010015731 - - 0.04892553 - - -0.02504831 - - -0.014305144 - - 0.04907702 - - -0.0096177375 - - -0.0854665 - - 0.017617436 - - -0.014481601 - - 0.046187755 - - -0.030009247 - - -0.049553443 - - -0.006797771 - - -0.034234725 - - 0.06525787 - - 0.017298417 - - -0.018988462 - - -0.08520813 - - -0.011840521 - - -0.042942975 - - -0.056341827 - - 0.08071612 - - 0.028146833 - - -0.0141261155 - - 0.04001012 - - 0.018236378 - - 0.01583886 - - 0.0058086845 - - 0.0005290361 - - 0.0045259795 - - 0.024873685 - - 0.018050008 - - 0.02440984 - - -0.057676647 - - -0.022263395 - - -0.033016473 - - 0.014353932 - - -0.010189813 - - 0.018424626 - - -0.018238619 - - 0.07698089 - - -0.015595315 - - 0.007074499 - - 0.027340613 - - -0.02035102 - - -0.073149584 - - -0.0061021335 - - 0.0209061 - - -0.024985746 - - -0.020401739 - - -0.0048702923 - - 0.0444933 - - -0.02158648 - - 0.010312202 - - 0.009883107 - - 0.022790415 - - -0.01893943 - - 0.017615119 - - 0.023000762 - - -0.051276624 - - 0.019835759 - - 0.016675396 - - 0.021532865 - - 0.023097536 - - 0.01091247 - - 0.007642041 - - 0.0385409 - - 0.044193454 - - 0.003319116 - - 0.019355802 - - -0.055695307 - - -0.07680676 - - -0.035279598 - - -0.0070618573 - - -0.01408385 - - 0.03107026 - - 0.011547187 - - 0.04217532 - - 0.048034772 - - -0.014330861 - - -0.0007901662 - - 0.009103947 - - 0.011091706 - - -0.008960474 - - -0.009301379 - - 0.032424763 - - 0.09180531 - - 0.015491586 - - 0.031114861 - - 0.013289549 - - 0.03616163 - - 0.031084707 - - -0.021437835 - - 0.011905716 - - -0.104623 - - 0.033417992 - - -0.04683295 - - -0.05382028 - - 0.025979578 - - -0.003795323 - - 0.094473585 - - 0.09126942 - - 0.067700386 - - -0.002935823 - - -0.031604428 - - 0.0045677535 - - 0.014042491 - - -0.02969786 - - -0.012263599 - - -0.05807616 - - -0.0107510965 - - 0.022099612 - - 0.02685798 - - -0.048912797 - - 0.020464186 - - 0.011517319 - - -0.0016606319 - - -0.033255223 - - 0.02488959 - - -0.043240122 - - 0.00013934783 - - 0.037608404 - - 0.0748658 - - 0.061115693 - - -0.01670558 - - 0.037827995 - - -0.004162286 - - -0.00011341072 - - -0.031436242 - - -0.040532686 - - -0.0096016815 - - -0.065639205 - - -0.030070387 - - 0.05715196 - - 0.024338327 - - -0.008972259 - - -0.013220871 - - -0.07115904 - - -0.03446362 - - -0.010893238 - - 0.011950567 - - 0.0143028535 - - 0.0022963681 - - -0.060428943 - - 0.047038406 - - -0.017493663 - - 0.0208505 - - -0.010212147 - - -0.03337894 - - 0.026969628 - - -0.019734934 - - 0.0922163 - - -0.056534916 - - 0.017255465 - - 0.021692138 - - 0.023583038 - - 0.017224979 - - -0.0689936 - - 0.23665377 - - 0.04984247 - - -0.0039337534 - - -0.010740561 - - 0.00313393 - - -0.02665381 - - 0.013037893 - - 0.020565815 - - -0.002266256 - - 0.03748113 - - 0.018353125 - - -0.048318923 - - -0.06522075 - - -0.021460611 - - -0.029665926 - - -0.025507431 - - 0.0033435076 - - -0.0071087605 - - 0.001970083 - - -0.0025331723 - - 0.061776515 - - 0.017747495 - - 0.04396135 - - 0.0011617352 - - 0.02509327 - - 0.039078914 - - -0.03762337 - - 0.021575885 - - 0.015548619 - - 0.043990802 - - -0.024633111 - - -0.0013324996 - - 0.063795656 - - -0.02035371 - - -0.0440217 - - -0.033049908 - - 0.031034056 - - -0.004495562 - - -0.0044647786 - - -0.033148468 - - 0.0025072312 - - 0.009637453 - - 0.04357035 - - 0.044546504 - - -0.08865154 - - -0.08487347 - - 0.00205395 - - 0.0060572727 - - 0.023767816 - - 0.051007573 - - 0.0057035745 - - 0.040539596 - - -0.035988905 - - -0.01824621 - - 0.007887274 - - -0.052848075 - - 0.08228733 - - 0.0015825987 - - 0.0004136183 - - 0.018108545 - - 0.040081892 - - -0.035405345 - - 0.050933696 - - 0.036154125 - - -0.03947257 - - -0.0018412384 - - -0.005589829 - - 0.03620321 - - 0.012144826 - - -0.008619581 - - -0.0043279063 - - 0.016455552 - - -0.015757388 - - 0.047043085 - - 0.08675011 - - -0.009986743 - - 0.022379123 - - 0.009470605 - - 0.034120724 - - 0.009922824 - - -0.014435422 - - 0.017998574 - - -0.03849387 - - 0.042357396 - - -0.010053916 - - 0.057034835 - - -0.027412737 - - 0.017308975 - - 0.02185228 - - -0.048017155 - - -0.025138885 - - 0.016482655 - - -0.01756698 - - 0.031146016 - - 0.021930695 - - -0.00075341173 - - -0.015085438 - - 0.0146785155 - - 0.028547939 - - -0.036677707 - - -0.022699077 - - -0.045135103 - - -0.02802744 - - 0.071454674 - - -0.009201392 - - -0.051717956 - - -0.019421624 - - 0.0034821872 - - 0.06667364 - - 0.09145379 - - -0.068826884 - - 0.053568542 - - 0.01160062 - - -0.025829546 - - 0.04487214 - - 0.030954553 - - -0.022543794 - - -0.009475118 - - -0.014623143 - - -0.02070793 - - -0.02656788 - - 0.009701591 - - -0.025120718 - - -0.018472325 - - -0.027967019 - - -0.021122226 - - -0.009891716 - - 0.018696679 - - -0.068876855 - - -0.023419108 - - -0.025495855 - - 0.016256742 - - 0.00064859784 - - 0.037749656 - - -0.046321914 - - 0.065936595 - - -0.008921658 - - 0.07497468 - - -0.05094385 - - -0.052860104 - - 0.022196138 - - -0.0140462285 - - -0.03562305 - - 0.024858234 - - 0.021310989 - - 0.014657512 - - 0.07767391 - - -0.027777392 - - 0.057577316 - - 0.055513144 - - 0.06322926 - - -0.026312957 - - 0.010970987 - - -0.0057475767 - - 0.0028267235 - - 0.051367335 - - -0.022320578 - - 0.009050165 - - 0.016952222 - - -0.032026373 - - -0.074292615 - - -0.02315535 - - 0.025375988 - - -0.041241057 - - -0.032157563 - - -0.015576387 - - -0.015834223 - - 0.02224181 - - 0.017586967 - - -0.029070066 - - 0.0030065721 - - -0.051857695 - - 0.04008828 - - -0.007960872 - - -0.061745025 - - -0.00086617953 - - 0.026723113 - - 0.008719714 - - -0.049826868 - - -0.0046574236 - - 0.018954279 - - -0.007935451 - - 0.053987946 - - 0.022795292 - - 0.029722994 - - -0.010146585 - - -0.019956842 - - -0.014686722 - - 0.01708331 - - 0.020001508 - - 0.016564105 - - 0.011379248 - - -0.011843253 - - 0.04056168 - - 0.004384286 - - -0.049596023 - - 0.02674251 - - 0.0076475106 - - -0.0064563937 - - -0.014233138 - - 0.014224383 - - 0.0052741244 - - 0.049964864 - - -0.016286546 - - -0.001200327 - - 0.041904222 - - -0.0010395087 - - -0.05105399 - - 0.022099879 - - -0.019455278 - - 0.009444127 - - -0.081325725 - - 0.015994828 - - 0.0010952728 - - 0.0008373874 - - -0.0016424303 - - -0.05096469 - - 0.045976803 - - 0.024695056 - - -0.031656373 - - -0.0013138534 - - -0.0060524447 - - 0.060276203 - - -0.016745795 - - -0.029930653 - - -0.0222771 - - 0.012314711 - - 0.038991332 - - -0.006665343 - - 0.041694533 - - 0.0076992502 - - -0.014353178 - - 0.0025135442 - - -0.0498445 - - 0.020322764 - - 0.0575802 - - -0.006096128 - - -0.010841882 - - -0.024337102 - - 0.021975596 - - 0.0064031687 - - -0.026746146 - - 0.03455729 - - -0.011909055 - - 0.016994143 - - 0.026053395 - - -0.020393625 - - 0.06403403 - - 0.042590734 - - 0.009193913 - - 0.04016698 - - 0.028304791 - - 0.022147119 - - -0.030121539 - - -0.0037334429 - - 0.03235819 - - -0.020825844 - - 0.0009766509 - - -0.012216568 - - 0.07944978 - - 0.04177374 - - -0.008281654 - - -0.008908983 - - 0.04799388 - - -0.012743454 - - -0.00076762337 - - 0.012673029 - - -0.018283572 - - 0.022068778 - - -0.009605337 - - 0.0030652087 - - -0.036517244 - - -0.006263211 - - 0.0194632 - - 0.009333852 - - 0.02350168 - - -0.0008530139 - - 0.018934859 - - -0.013986168 - - -0.010833636 - - -0.011189203 - - 0.011567913 - - -0.07253544 - - -0.005748846 - - 0.11930293 - - 0.060044624 - - -0.023167728 - - -0.015781552 - - -0.010494401 - - 0.01930528 - - -0.039608266 - - -0.073587865 - - 0.0019034932 - - -0.0013838339 - - 0.026257295 - - 0.004433007 - - -0.051545423 - - -0.033456888 - - -0.06401291 - - -0.08664347 - - 0.010781564 - - 0.0408775 - - 0.021475399 - - 0.017633006 - - -0.02186024 - - 0.047795497 - - -0.006370007 - - 0.01792626 - - 0.005195737 - - 0.0026206016 - - -0.008816542 - - 0.009266863 - - -0.018453414 - - 0.0040575014 - - 0.0047053 - - -0.0197809 - - -0.01580334 - - 0.007821501 - - -0.06296649 - - -0.06274416 - - -0.0031381177 - - -0.024228694 - - -0.002459634 - - 0.00034323192 - - -0.02430543 - - -0.029262288 - - -0.04606642 - - -0.013138838 - - 0.040473 - - 0.012308485 - - 0.0020701357 - - -0.007718021 - - -0.0064122216 - - -0.024890581 - - 0.014665469 - - -0.0028788927 - - -0.047072053 - - -0.014959743 - - 0.004587824 - - -0.07462158 - - -0.008558996 - - 0.019324543 - - -0.02247574 - - -0.07721102 - - 0.007920586 - - -0.020274863 - - 0.028696692 - - 0.024707401 - - 0.016905285 - - 0.012742534 - - 0.018577736 - - -0.05768951 - - 0.03203929 - - 0.018105863 - - -0.03917534 - - -0.026208939 - - -0.038492158 - - -0.043517314 - - -0.008031121 - - -0.016162876 - - -0.0010640965 - - -0.004164019 - - 0.005193703 - - -0.0058410293 - - 0.029311381 - - -0.016533207 - - 0.05005747 - - 0.012600715 - - 0.016292874 - - -0.008300225 - - -0.08953819 - - 0.06544125 - - -0.010512851 - - -0.021443438 - - 0.030277776 - - -0.06502247 - - 0.004850903 - - -0.013137611 - - 0.0506941 - - 0.0072725127 - - -0.025755724 - - 0.008224718 - - 0.013813313 - - 0.037197027 - - 0.0023671025 - - 0.00763629 - - 0.011905766 - - 0.033143394 - - 0.007750765 - - -0.07725993 - - -0.03193554 - - -0.016900484 - - 0.06256093 - - 0.015902048 - - 0.062251173 - - 0.07478062 - - -0.009171957 - - -0.025452917 - - -0.015754124 - - -0.004426243 - - -0.0873611 - - 0.0077999695 - - 0.061026644 - - 0.016489599 - - 0.0066420045 - - -0.0062355455 - - 0.00345123 - - -0.022935547 - - 0.03939866 - - -0.0037231673 - - 0.0033949488 - - 0.029471302 - - 0.023097953 - - -0.0237214 - - 0.046621986 - - 0.029790087 - - -0.030113066 - - -0.012432801 - - 0.036813233 - - 0.01785254 - - -0.08032645 - - 0.051262226 - - 0.04222712 - - -0.023358794 - - -0.03602671 - - 0.0092950305 - - -0.015663076 - - -0.023873692 - - 0.009383877 - - -0.056770466 - - 0.032832243 - - 0.019920528 - - -0.04734062 - - -0.03368295 - - 0.0041841906 - - 0.03257228 - - -0.07387151 - - 0.011083565 - - 0.008633363 - - -0.04694844 - - 0.0027943242 - - -0.009078945 - - -0.011981829 - - -0.026407028 - - 0.033040557 - - -0.025803888 - - -0.021555608 - - 0.0042838412 - - -0.04263439 - - 0.0465685 - - 0.070476055 - - -0.02560814 - - 0.060619954 - - 0.0071254023 - - -0.062549844 - - -0.021544673 - - -0.03598606 - - -0.04904548 - - 0.04631042 - - -0.029345924 - - -0.015404836 - - 0.0063473387 - - -0.023926385 - - 0.022935716 - - -0.1004558 - - -0.007012574 - - 0.049480513 - - -0.02592937 - - 0.057209775 - - -0.010056263 - - -0.02236333 - - 0.008163001 - - 0.0036735693 - - -0.008406754 - - -0.0029980235 - - -0.0052409745 - - -0.014090007 - - -0.025248934 - - 0.022062942 - - -0.019766279 - - 0.07160526 - - -0.00075892545 - - -0.0096911425 - - -0.019483106 - - 0.042904716 - - -0.0013572425 - - 0.04353212 - - -0.07759716 - - -0.011731261 - - -0.10602095 - - 0.0010180247 - - -0.07403971 - - 0.043784548 - - -0.010357722 - - -0.009020027 - - 0.026289912 - - 0.053744033 - - 0.009665143 +- - -0.15109055 + - -0.021903634 + - -0.083914824 + - -0.12880398 + - 0.35795656 + - 0.29648995 + - -0.7700259 + - -0.6232085 + - 0.5061859 + - 0.32812628 + - -0.18676779 + - 0.5090188 + - 0.45361203 + - 0.68920135 + - 0.45408535 + - 0.018128024 + - 0.025971208 + - 0.68283266 + - -0.18952315 + - 0.0038942832 + - -0.3604529 + - 0.34934753 + - -0.20016576 + - -0.16480061 + - -0.32872507 + - 0.109056644 + - 0.3764274 + - -0.46188527 + - -0.54918104 + - 0.6157312 + - -1.0830243 + - -0.33922067 + - -0.16675155 + - -0.18266918 + - -0.17769708 + - -0.17737399 + - 0.37486547 + - 0.58084005 + - -0.3567266 + - -0.41240114 + - -0.6137596 + - -0.45474958 + - -0.49108082 + - 0.31371123 + - -0.5121634 + - -0.3197327 + - -0.18065253 + - -0.64862263 + - -0.66046077 + - -1.0115874 + - -0.7223414 + - -0.32740927 + - 0.53072345 + - 0.05111746 + - 0.2075495 + - -0.28874597 + - -0.17527471 + - -0.008905607 + - -0.122156546 + - 0.021472305 + - 0.20913471 + - -0.4211547 + - 0.3197582 + - 0.34856012 + - -0.33770165 + - 0.27678913 + - -0.6166295 + - 0.57761586 + - -0.29957268 + - 0.07320643 + - -0.2265589 + - -0.31391874 + - 0.76492447 + - 0.007600454 + - -0.24119496 + - 0.04892763 + - 0.045543913 + - -0.10091984 + - -0.058633436 + - 0.10562694 + - -0.1420554 + - 0.4863675 + - -0.4318424 + - -1.0247877 + - -0.023403248 + - -0.63065374 + - -0.49578613 + - -0.092090085 + - -0.20044541 + - -0.58556545 + - 0.115839 + - 0.3798816 + - 0.424985 + - 0.39816627 + - -0.2285332 + - 0.36628655 + - -0.44768625 + - 0.22070913 + - 0.534507 + - -0.7085661 + - -0.070538834 + - -0.107348874 + - -0.3253587 + - 0.62993294 + - -0.75059 + - -1.0707804 + - -0.68110603 + - 0.32859373 + - -0.2118855 + - -0.6408962 + - -0.52045304 + - 0.73433083 + - -0.1304437 + - 0.6365012 + - -0.32628164 + - -0.18581727 + - 0.63856125 + - -0.12516598 + - -1.1121966 + - 0.22908626 + - -0.18862781 + - 0.60101926 + - -0.39073998 + - -0.6447968 + - -0.08831934 + - -0.44524685 + - 0.8490645 + - 0.22501259 + - -0.24692704 + - -1.1086503 + - -0.15384841 + - -0.55875844 + - -0.7331938 + - 1.0501978 + - 0.36605185 + - -0.1838262 + - 0.5206189 + - 0.237174 + - 0.2063224 + - 0.07563617 + - 0.0067095836 + - 0.05887958 + - 0.32364896 + - 0.23489417 + - 0.3175898 + - -0.75022984 + - -0.28961807 + - -0.42942932 + - 0.18670824 + - -0.13244013 + - 0.23977569 + - -0.2373133 + - 1.0015438 + - -0.20318209 + - 0.091986164 + - 0.35573465 + - -0.2647709 + - -0.95180094 + - -0.079319276 + - 0.27213028 + - -0.3250932 + - -0.265531 + - -0.06336659 + - 0.5788936 + - -0.28100872 + - 0.13420996 + - 0.12869371 + - 0.29647395 + - -0.24638884 + - 0.22951232 + - 0.29915494 + - -0.6673683 + - 0.2579727 + - 0.2170357 + - 0.28044018 + - 0.3005139 + - 0.1420653 + - 0.09953698 + - 0.5016433 + - 0.5750065 + - 0.043215007 + - 0.25182495 + - -0.7248352 + - -0.999321 + - -0.4589929 + - -0.09168369 + - -0.18338953 + - 0.40430227 + - 0.15028067 + - 0.5487751 + - 0.62510055 + - -0.18643674 + - -0.010421776 + - 0.11832279 + - 0.14426151 + - -0.116284296 + - -0.12081876 + - 0.4218832 + - 1.1945444 + - 0.20170249 + - 0.40529028 + - 0.17298388 + - 0.4703354 + - 0.40446448 + - -0.27903953 + - 0.15500137 + - -1.3613433 + - 0.4349553 + - -0.6092625 + - -0.70038843 + - 0.33829692 + - -0.049486037 + - 1.2292315 + - 1.1875246 + - 0.88110733 + - -0.03808219 + - -0.4112232 + - 0.059451427 + - 0.18286517 + - -0.38637286 + - -0.15960105 + - -0.75563526 + - -0.13992405 + - 0.2876585 + - 0.34938484 + - -0.6364276 + - 0.26648706 + - 0.14986621 + - -0.02178538 + - -0.4328274 + - 0.32400253 + - -0.56284696 + - 0.0017066401 + - 0.48950258 + - 0.9744805 + - 0.79537344 + - -0.21747883 + - 0.49245363 + - -0.054273184 + - -0.0015835592 + - -0.40899876 + - -0.5273927 + - -0.12501761 + - -0.8540773 + - -0.39120156 + - 0.74370086 + - 0.31688598 + - -0.1167029 + - -0.17205204 + - -0.92589134 + - -0.44832373 + - -0.14176796 + - 0.15559316 + - 0.18620004 + - 0.029677821 + - -0.7860899 + - 0.6119261 + - -0.22759564 + - 0.27114338 + - -0.13304555 + - -0.43458125 + - 0.3509001 + - -0.25703368 + - 1.1999604 + - -0.7353845 + - 0.22466286 + - 0.28216404 + - 0.3068133 + - 0.22410686 + - -0.89779717 + - 3.079363 + - 0.64849144 + - -0.051214017 + - -0.13966322 + - 0.040685207 + - -0.34677258 + - 0.16971292 + - 0.26769742 + - -0.029500902 + - 0.48766795 + - 0.23884484 + - -0.6286489 + - -0.84872234 + - -0.2792891 + - -0.38614812 + - -0.33205667 + - 0.043627854 + - -0.09268977 + - 0.025558773 + - -0.03295981 + - 0.8038319 + - 0.23085825 + - 0.57229805 + - 0.015164251 + - 0.326595 + - 0.5086542 + - -0.48954597 + - 0.28064272 + - 0.20231196 + - 0.57230157 + - -0.32051596 + - -0.017456383 + - 0.8301593 + - -0.26487425 + - -0.57291526 + - -0.43000674 + - 0.40386793 + - -0.05868221 + - -0.057881687 + - -0.43141183 + - 0.032518987 + - 0.1253997 + - 0.56710976 + - 0.5799254 + - -1.153662 + - -1.10415 + - 0.026664412 + - 0.07890936 + - 0.30930015 + - 0.663942 + - 0.074350215 + - 0.5277145 + - -0.46849388 + - -0.23736477 + - 0.10271544 + - -0.6875649 + - 1.0708058 + - 0.020512069 + - 0.0056299777 + - 0.2355162 + - 0.5215009 + - -0.46059683 + - 0.66269505 + - 0.47026086 + - -0.5134104 + - -0.024114873 + - -0.072785124 + - 0.47082546 + - 0.1581585 + - -0.11227976 + - -0.056339893 + - 0.21406786 + - -0.20518807 + - 0.6122274 + - 1.1290092 + - -0.12989084 + - 0.29127744 + - 0.12319786 + - 0.4438106 + - 0.12894677 + - -0.18791506 + - 0.23426783 + - -0.50117284 + - 0.551251 + - -0.13086843 + - 0.74193066 + - -0.35664067 + - 0.22491322 + - 0.28431758 + - -0.6247842 + - -0.32735807 + - 0.21448077 + - -0.2287333 + - 0.40534654 + - 0.285397 + - -0.00997967 + - -0.19634967 + - 0.19089007 + - 0.37149337 + - -0.47715828 + - -0.29549593 + - -0.5872835 + - -0.36474487 + - 0.9297853 + - -0.11981724 + - -0.6729041 + - -0.25248244 + - 0.04529079 + - 0.8676567 + - 1.190012 + - -0.8955213 + - 0.6969344 + - 0.15096132 + - -0.33601168 + - 0.58402616 + - 0.40269914 + - -0.29323262 + - -0.12331058 + - -0.19022873 + - -0.2695512 + - -0.34561163 + - 0.12637508 + - -0.32674125 + - -0.24046609 + - -0.36392096 + - -0.2750025 + - -0.1285536 + - 0.24339662 + - -0.8961811 + - -0.30471936 + - -0.33182573 + - 0.21140103 + - 0.0081760185 + - 0.49128702 + - -0.6027674 + - 0.8579567 + - -0.11586177 + - 0.9756438 + - -0.6629891 + - -0.6875798 + - 0.28862348 + - -0.18273708 + - -0.46361127 + - 0.32340264 + - 0.2774327 + - 0.19078733 + - 1.0107533 + - -0.36158043 + - 0.74900544 + - 0.72242737 + - 0.8227667 + - -0.34258467 + - 0.14299211 + - -0.07485575 + - 0.036902674 + - 0.6683555 + - -0.29041463 + - 0.117668785 + - 0.22068712 + - -0.41664442 + - -0.96687144 + - -0.30115357 + - 0.32991382 + - -0.53672373 + - -0.41835007 + - -0.20272854 + - -0.2060292 + - 0.28951123 + - 0.22901095 + - -0.37840703 + - 0.039218128 + - -0.6748184 + - 0.5217079 + - -0.1034972 + - -0.8034658 + - -0.011289501 + - 0.34773663 + - 0.11336859 + - -0.6484629 + - -0.060686268 + - 0.24654332 + - -0.10321144 + - 0.7025103 + - 0.29660672 + - 0.38687262 + - -0.13210179 + - -0.2598397 + - -0.19132333 + - 0.22228898 + - 0.2603877 + - 0.21548876 + - 0.14805317 + - -0.15419398 + - 0.5276412 + - 0.056747086 + - -0.6454563 + - 0.34790102 + - 0.09949684 + - -0.08417777 + - -0.1851544 + - 0.18506108 + - 0.068498686 + - 0.6502181 + - -0.21207963 + - -0.015460708 + - 0.5452031 + - -0.0136506725 + - -0.66419417 + - 0.28765276 + - -0.25317898 + - 0.12276302 + - -1.0584223 + - 0.2080617 + - 0.014420531 + - 0.010814128 + - -0.021357426 + - -0.663314 + - 0.5983 + - 0.3211898 + - -0.4120384 + - -0.016948262 + - -0.0784177 + - 0.7843738 + - -0.21809463 + - -0.38949633 + - -0.2897738 + - 0.16010587 + - 0.50716555 + - -0.08669298 + - 0.54262674 + - 0.10004849 + - -0.18665542 + - 0.032770045 + - -0.64843833 + - 0.26445454 + - 0.74924886 + - -0.07950161 + - -0.14100347 + - -0.31680727 + - 0.28603527 + - 0.083222285 + - -0.3480211 + - 0.44965547 + - -0.15479736 + - 0.22125898 + - 0.3388934 + - -0.26549906 + - 0.83331996 + - 0.55423844 + - 0.119455345 + - 0.522641 + - 0.36807114 + - 0.28813356 + - -0.39205498 + - -0.048589382 + - 0.42110068 + - -0.27116948 + - 0.012550103 + - -0.15916474 + - 1.0338836 + - 0.5436742 + - -0.107564844 + - -0.11579458 + - 0.62463063 + - -0.1658367 + - -0.00991859 + - 0.16484539 + - -0.2379682 + - 0.28699717 + - -0.12484685 + - 0.03996123 + - -0.4752685 + - -0.08142393 + - 0.25321585 + - 0.12158222 + - 0.30579358 + - -0.011137897 + - 0.24646255 + - -0.18199305 + - -0.14097403 + - -0.14552395 + - 0.15069184 + - -0.94389087 + - -0.07475461 + - 1.5525175 + - 0.7813598 + - -0.30151543 + - -0.20538568 + - -0.13666657 + - 0.25118873 + - -0.51551485 + - -0.95776737 + - 0.024866985 + - -0.017964458 + - 0.3413524 + - 0.057734262 + - -0.67059296 + - -0.43544927 + - -0.8328768 + - -1.1275549 + - 0.14031795 + - 0.5319012 + - 0.27944943 + - 0.22952522 + - -0.28443557 + - 0.6221407 + - -0.08270294 + - 0.23333415 + - 0.067328826 + - 0.033942398 + - -0.114709854 + - 0.12058519 + - -0.24028197 + - 0.052860312 + - 0.06138326 + - -0.25741568 + - -0.20557322 + - 0.10167645 + - -0.81910133 + - -0.8167869 + - -0.04096342 + - -0.31532592 + - -0.032089792 + - 0.004406052 + - -0.31635433 + - -0.3807473 + - -0.59952134 + - -0.17082903 + - 0.5269717 + - 0.16015509 + - 0.026568549 + - -0.100347854 + - -0.08351288 + - -0.32397708 + - 0.19073197 + - -0.0373209 + - -0.6122793 + - -0.1947716 + - 0.059598617 + - -0.9711447 + - -0.11143776 + - 0.25144938 + - -0.29247233 + - -1.004682 + - 0.103191294 + - -0.26377746 + - 0.3734496 + - 0.32138142 + - 0.22011694 + - 0.16574502 + - 0.24156201 + - -0.7507314 + - 0.41684183 + - 0.23563682 + - -0.509628 + - -0.34086603 + - -0.500616 + - -0.5663271 + - -0.10434014 + - -0.21033464 + - -0.013725403 + - -0.054067906 + - 0.06762518 + - -0.07603091 + - 0.38126868 + - -0.21514787 + - 0.6514047 + - 0.16380346 + - 0.21190718 + - -0.10777349 + - -1.1651728 + - 0.85149914 + - -0.13673452 + - -0.27911338 + - 0.39395612 + - -0.8459781 + - 0.06320047 + - -0.17092915 + - 0.6597654 + - 0.094674535 + - -0.33517623 + - 0.10690124 + - 0.17950585 + - 0.48410887 + - 0.030655479 + - 0.09933066 + - 0.1550446 + - 0.431155 + - 0.100912 + - -1.005455 + - -0.41569605 + - -0.21975613 + - 0.8140865 + - 0.20669267 + - 0.8102458 + - 0.9729819 + - -0.11925534 + - -0.33138567 + - -0.2048377 + - -0.05757957 + - -1.1365687 + - 0.10137909 + - 0.79411316 + - 0.21457972 + - 0.0864565 + - -0.0811936 + - 0.04506113 + - -0.29865235 + - 0.51285124 + - -0.048639547 + - 0.044134088 + - 0.38353294 + - 0.300623 + - -0.3087665 + - 0.6065137 + - 0.38760313 + - -0.39175853 + - -0.16171618 + - 0.4792343 + - 0.23237494 + - -1.0454332 + - 0.6672624 + - 0.54942864 + - -0.30390593 + - -0.46868578 + - 0.12068311 + - -0.20385695 + - -0.31071672 + - 0.12209125 + - -0.7388752 + - 0.42730883 + - 0.25917837 + - -0.61594784 + - -0.4380438 + - 0.054391284 + - 0.42368263 + - -0.96115905 + - 0.14401515 + - 0.11230274 + - -0.61102945 + - 0.036328387 + - -0.11808626 + - -0.15593222 + - -0.34371534 + - 0.43030024 + - -0.3359318 + - -0.2805354 + - 0.05581813 + - -0.55480397 + - 0.6060769 + - 0.9170542 + - -0.33335024 + - 0.78890103 + - 0.092671975 + - -0.8138399 + - -0.28036532 + - -0.46818033 + - -0.63843864 + - 0.60233265 + - -0.38163826 + - -0.20055696 + - 0.08256174 + - -0.31126404 + - 0.29852346 + - -1.3070982 + - -0.09121116 + - 0.64371055 + - -0.3373175 + - 0.7442893 + - -0.13088854 + - -0.29106006 + - 0.10606987 + - 0.047938626 + - -0.10944657 + - -0.03900265 + - -0.06794337 + - -0.18343163 + - -0.32839713 + - 0.28699616 + - -0.2572582 + - 0.9318657 + - -0.009791291 + - -0.1260892 + - -0.25368518 + - 0.5582221 + - -0.017653896 + - 0.566508 + - -1.0098631 + - -0.15263984 + - -1.3795891 + - 0.013236173 + - -0.96332794 + - 0.5696775 + - -0.13456643 + - -0.117322244 + - 0.34215567 + - 0.69917 + - 0.12586595 +- - -0.07786142 + - -0.45357418 + - -0.045068722 + - 0.45729974 + - 0.13652606 + - 0.4864305 + - -0.71263504 + - -0.45784613 + - 1.0385213 + - 0.45541835 + - -0.18054126 + - 0.15263839 + - 0.5569997 + - 0.32648245 + - 0.12692109 + - -0.17369151 + - 0.20731775 + - 0.76437336 + - -0.33021906 + - 0.061555278 + - -0.6511664 + - 0.25529107 + - -0.30445695 + - -0.014878184 + - -0.20437212 + - 0.074958794 + - 0.3190094 + - -0.49267665 + - -0.39914694 + - 0.48511568 + - -1.1315125 + - -0.72234744 + - 0.14346719 + - -0.013703414 + - 0.26688978 + - 0.01835191 + - 0.2824485 + - 0.63652986 + - -0.6954544 + - -0.42081937 + - -0.34980702 + - -1.1362054 + - -0.4327159 + - 0.6343842 + - -0.54404825 + - -0.19070852 + - -0.21079022 + - -0.38062838 + - -0.40214238 + - -0.9367988 + - -0.6708524 + - -0.54254025 + - 0.5711626 + - 0.491761 + - 0.011714119 + - -0.104597025 + - -0.09937394 + - 0.30859467 + - -0.014304787 + - 0.1598517 + - 0.17957723 + - -0.52580196 + - 0.53314155 + - 0.547278 + - -0.19830479 + - 0.3412484 + - -0.821317 + - 0.6425899 + - -0.18173802 + - 0.26403978 + - -0.07493261 + - -0.2578795 + - 0.9358241 + - 0.35953212 + - -0.26545367 + - -0.15325285 + - -0.27156934 + - -0.098969586 + - -0.06900242 + - -0.10856401 + - 0.014845073 + - 0.6543663 + - -0.20648926 + - -0.59429616 + - 0.044834074 + - -0.6016011 + - -0.3074939 + - 0.12069436 + - -0.21068253 + - -0.4462637 + - -0.3160701 + - 0.40451536 + - 0.71486014 + - 0.56199837 + - 0.25870034 + - 0.63157356 + - -0.29506713 + - -0.03399534 + - 0.42672864 + - -1.1007652 + - -0.0299249 + - 0.0035790552 + - -0.015582025 + - 0.49542332 + - -0.38047197 + - -0.97221154 + - -0.4969573 + - 0.0900822 + - -0.111649394 + - -0.5494892 + - -0.81757635 + - 0.64183956 + - -0.28965923 + - 0.46828648 + - -0.15771942 + - -0.6171276 + - 0.49324498 + - -0.27548513 + - -1.1439961 + - 0.46799517 + - 0.0007062008 + - 0.6362501 + - -0.4524293 + - -0.30710042 + - 0.060824484 + - 0.091235705 + - 0.91970557 + - 0.4701204 + - 0.33024046 + - -1.2422528 + - -0.007898175 + - -0.29915166 + - -0.91086435 + - 0.7777292 + - 0.27987966 + - -0.38256717 + - 0.15310927 + - -0.049911886 + - 0.2220818 + - 0.18885867 + - 0.18296032 + - 0.37604895 + - 0.47609007 + - 0.08868736 + - 0.26372507 + - -0.41232395 + - -0.3160052 + - -0.24398251 + - 0.241612 + - -0.25604454 + - 0.27717087 + - -0.09842613 + - 0.73582727 + - -0.5052824 + - -0.15584397 + - 0.07055872 + - -0.003672878 + - -0.9515732 + - 0.17043869 + - 0.11430165 + - -0.19623208 + - -0.5138623 + - -0.41950908 + - 0.32824373 + - -0.19083916 + - 0.37393293 + - -0.23411167 + - 0.5913014 + - -0.28060567 + - 0.296862 + - 0.2596457 + - -0.9002312 + - -0.13431151 + - 0.40842977 + - -0.22142428 + - 0.7187679 + - 0.15689404 + - 0.124225296 + - 0.2035294 + - 0.83978146 + - 0.09570151 + - 0.23836873 + - -0.6525228 + - -0.55621916 + - -0.27292597 + - -0.13630824 + - 0.14037149 + - 0.229254 + - 0.12983714 + - 0.40444943 + - 0.1858714 + - 0.068808794 + - -0.110493384 + - 0.102672435 + - 0.3521144 + - -0.10837799 + - 0.05199879 + - 0.6989198 + - 0.664522 + - 0.10287348 + - 0.4963374 + - -0.2030559 + - 0.0726716 + - -0.04625601 + - -0.3365918 + - 0.0068650967 + - -1.0241108 + - 0.76348543 + - -0.6046044 + - -0.43724862 + - 0.33068967 + - -0.4087681 + - 0.94922096 + - 1.1976125 + - 0.9665229 + - -0.036878865 + - -0.36757708 + - 0.2157582 + - -0.028651789 + - -0.20252632 + - -0.29808772 + - -0.52247566 + - -0.005355196 + - -0.075832695 + - 0.30384603 + - -0.68423486 + - 0.51785684 + - 0.1623555 + - -0.1476549 + - -0.45655838 + - 0.3543713 + - -0.3572794 + - 0.09839416 + - 0.36012864 + - 0.7882468 + - 0.8440898 + - -0.09494529 + - 0.63669956 + - -0.53272164 + - 0.08586896 + - -0.32474843 + - -0.5816953 + - -0.16000634 + - -1.076547 + - -0.24794038 + - 0.65420693 + - 0.8528168 + - 0.011532496 + - -0.45261598 + - -0.52250195 + - -0.46723437 + - -0.101790994 + - -0.08021287 + - -0.21129172 + - -0.14711331 + - -0.9028279 + - 0.16915126 + - -0.3702627 + - 0.6825509 + - -0.27478036 + - -0.22102176 + - 0.35095587 + - -0.24872582 + - 1.0209233 + - -0.93013436 + - 0.5628895 + - 0.3478675 + - 0.43118665 + - 0.20640378 + - -0.70029324 + - 3.02863 + - 0.77857095 + - -0.51064146 + - -0.14920074 + - -0.19589609 + - -0.38595414 + - -0.08397072 + - 0.010033189 + - -0.47740045 + - 0.66486734 + - 0.5594165 + - -0.57105136 + - -0.75195533 + - -0.49135843 + - -0.6753535 + - -0.36823097 + - 0.20132725 + - -0.28685614 + - -0.11755943 + - -0.38957253 + - 0.3233848 + - 0.25502992 + - 0.6123748 + - -0.046694417 + - 0.16391285 + - 0.19540663 + - -0.08024872 + - 0.12695618 + - 0.10749493 + - 0.6060849 + - -0.28204346 + - -0.24861582 + - 0.35207233 + - -0.3655013 + - -0.3177478 + - -0.3710073 + - 0.6485475 + - 0.032564417 + - 0.19188507 + - -0.35666385 + - -0.022722358 + - 0.21269345 + - 0.61906487 + - 0.5533348 + - -0.84949845 + - -0.76725054 + - 0.052179724 + - 0.12143079 + - 0.5103976 + - 1.0513825 + - 0.011810702 + - 0.25544533 + - -0.46194184 + - -0.17457883 + - -0.08209206 + - -0.8323801 + - 1.1035703 + - -0.04112914 + - -0.23204209 + - 0.13400488 + - 0.24492435 + - -0.53583604 + - 0.6864936 + - 0.36237684 + - -0.29057115 + - 0.16300681 + - -0.18469922 + - 0.2510353 + - 0.24710034 + - -0.25797105 + - 0.07936838 + - -0.10755459 + - -0.6668527 + - 0.71272737 + - 0.96070784 + - 0.0897095 + - -0.10134282 + - 0.13745584 + - 0.88356096 + - 0.18184268 + - -0.6444132 + - 0.6922049 + - -0.22376014 + - 0.92993736 + - 0.22876155 + - 0.92287606 + - -0.4919002 + - 0.0806739 + - 0.25746316 + - -0.6026022 + - -0.18700987 + - 0.06746069 + - -0.35947916 + - 0.7623815 + - 0.4746667 + - 0.06671024 + - -0.033748213 + - 0.35250023 + - 0.358421 + - -0.50682014 + - -0.5062383 + - -0.4786962 + - -0.51264924 + - 0.3474764 + - -0.16556293 + - -0.34439793 + - -0.805664 + - -0.30450737 + - 0.5673922 + - 1.0772012 + - -0.8594753 + - 0.7097661 + - 0.060878694 + - -0.12994874 + - 0.4822967 + - -0.053847596 + - -0.29866394 + - 0.02455262 + - -0.06947708 + - -0.5491764 + - 0.03477047 + - -0.01529944 + - -0.5502256 + - -0.34595826 + - -0.29576373 + - -0.23496501 + - 0.009616404 + - 0.4136629 + - -0.7399896 + - -0.15643853 + - -0.57472676 + - -0.02720648 + - -0.12653823 + - 0.6138194 + - -0.7175372 + - 0.52002805 + - -0.11973959 + - 1.0825653 + - -0.6634874 + - -0.56024426 + - 0.051323373 + - -0.1694911 + - -0.48492217 + - 0.22308724 + - -0.1251921 + - 0.31983027 + - 0.8123491 + - -0.15791355 + - 0.6639076 + - 0.85814685 + - 0.7805775 + - 0.3318061 + - 0.5087306 + - 0.14216462 + - 0.014538806 + - 0.4973236 + - -0.52142996 + - -0.0939501 + - 0.27000418 + - -0.16738701 + - -1.1808728 + - -0.53163177 + - 0.1802219 + - -0.6681091 + - -0.12522037 + - 0.05341505 + - -0.4074185 + - 0.078052685 + - 0.11662149 + - -0.22537689 + - 0.39836836 + - -0.6388151 + - 0.42452845 + - 0.20052695 + - -0.33104977 + - -0.20882992 + - -0.0055798716 + - 0.058122497 + - -0.8222186 + - -0.23073284 + - 0.20193343 + - -0.026150277 + - 0.56446 + - 0.012413904 + - 0.4913505 + - 0.13922305 + - -0.39070535 + - -0.24243315 + - 0.3587341 + - 0.56367624 + - 0.16596705 + - 0.2980485 + - -0.8546462 + - 0.7205205 + - 0.25655636 + - -1.1924773 + - 0.14163761 + - 0.26107943 + - -0.31167057 + - -0.31069285 + - 0.01503661 + - -0.38676533 + - 0.5201192 + - -0.58126616 + - 0.0046842606 + - 0.28297573 + - 0.02450039 + - -0.09804239 + - 0.16392608 + - -0.2637203 + - -0.4590641 + - -0.9859044 + - 0.15291356 + - 0.09713489 + - 0.004781542 + - 0.0007805874 + - -0.7196388 + - 0.06848469 + - 0.20312263 + - -0.46077347 + - -0.10777697 + - 0.06653512 + - 0.54529816 + - 0.11644112 + - -0.13014708 + - -0.25128517 + - 0.20415425 + - 0.7031765 + - 0.052980002 + - 0.33849978 + - 0.09222051 + - 0.2069536 + - -0.11453975 + - -0.36772454 + - 0.19188285 + - 0.68252546 + - -0.21095681 + - -0.3889579 + - -0.39637685 + - 0.31065863 + - 0.013831769 + - -0.3277922 + - 0.14038284 + - 0.06756198 + - 0.26589158 + - -0.2968774 + - -0.17099635 + - 0.73079413 + - 0.41855884 + - 0.101155005 + - 0.64970505 + - 0.12927054 + - 0.12355563 + - -0.4484849 + - -0.11863465 + - 0.763428 + - -0.22464389 + - -0.21322136 + - -0.27266 + - 1.0779943 + - 0.36396742 + - -0.510103 + - 0.09781108 + - 0.89254457 + - -0.20394637 + - 0.089977324 + - 0.3754529 + - -0.57247245 + - 0.08559313 + - -0.022890093 + - 0.12191874 + - -0.6448781 + - -0.026477367 + - 0.03702365 + - 0.071819924 + - 0.8331191 + - -0.086881906 + - 0.4117887 + - -0.049356624 + - 0.08455386 + - -0.25153118 + - 0.22801332 + - -0.40329194 + - 0.02178665 + - 1.8242391 + - 1.0338726 + - -0.11683666 + - -0.24572569 + - 0.022225609 + - 0.18766128 + - -0.3318024 + - -0.9145606 + - 0.233082 + - 0.16015281 + - -0.14052598 + - -0.24143334 + - -0.639072 + - -0.07328624 + - -0.67356634 + - -1.0313023 + - 0.1372344 + - 0.21618499 + - -0.52421004 + - -0.08402295 + - -0.20775484 + - 0.3355142 + - 0.11586433 + - 0.040259954 + - -0.009388034 + - -0.030507976 + - -0.10569668 + - 0.058448236 + - 0.23130989 + - 0.005419073 + - 0.26752022 + - 0.08603015 + - -0.58107597 + - 0.34348592 + - -0.36722827 + - -0.44802245 + - -0.35667157 + - 0.25324306 + - -0.20233725 + - -0.24386542 + - -0.41802678 + - -0.24581607 + - -0.08361264 + - -0.22173172 + - 0.42013893 + - 0.29966265 + - 0.10372277 + - -0.020874217 + - -0.028987303 + - 0.10375854 + - -0.104231186 + - -0.1924567 + - -0.58349866 + - 0.02809445 + - -0.16484728 + - -0.4186561 + - 0.061491515 + - 0.33746204 + - 0.10590016 + - -0.97023124 + - -0.16373104 + - -0.17172937 + - 0.25044575 + - 0.2700204 + - 0.28472677 + - 0.2979721 + - 0.34639537 + - -0.5168371 + - 0.33294415 + - 0.21985702 + - -0.3356746 + - -0.519751 + - -0.1971544 + - -0.6763213 + - 0.25759685 + - -0.5150413 + - -0.019787619 + - -0.324185 + - 0.18128169 + - -0.50133616 + - 0.47159365 + - -0.19445294 + - 0.52053434 + - 0.34485683 + - -0.31365943 + - -0.1259356 + - -0.94132406 + - 0.62074035 + - -0.027113594 + - -0.4773698 + - 0.25823697 + - -0.9260861 + - -0.029197177 + - 0.013566784 + - 0.7449417 + - 0.041948408 + - -0.16807151 + - 0.06611917 + - 0.17323375 + - 0.4400281 + - 0.081085615 + - -0.2928522 + - 0.15883158 + - 0.69848084 + - 0.18511367 + - -1.0700536 + - -0.722466 + - -0.037948128 + - 0.48510018 + - 0.04885233 + - 0.59825724 + - 0.6956024 + - 0.093223326 + - -0.59197503 + - -0.18171175 + - -0.032995123 + - -1.109768 + - 0.15207964 + - 0.1296593 + - 0.04163472 + - 0.39506078 + - -0.32870626 + - -0.04877087 + - -0.6636247 + - 0.7076656 + - 0.030838361 + - -0.04005822 + - 0.44165573 + - 0.079907365 + - -0.23726363 + - 0.5202741 + - 0.4782865 + - -0.41767368 + - 0.08130417 + - 0.5881479 + - -0.046927657 + - -1.4542216 + - 0.36477986 + - 0.74205416 + - -0.06654648 + - -0.25716388 + - 0.33002937 + - -0.4251559 + - -0.23838937 + - -0.18283546 + - -0.15233858 + - 0.22007908 + - -0.030792812 + - -0.8057933 + - -0.3671298 + - 0.013044941 + - 0.38409305 + - -0.74167275 + - 0.12098155 + - -0.510333 + - -0.40742263 + - -0.15140836 + - -0.05806388 + - -0.09841139 + - -0.3321196 + - 0.09564469 + - 0.3311245 + - -0.43358645 + - 0.3575132 + - -0.32164496 + - 0.38793147 + - 0.62529284 + - -0.08150098 + - 0.69711304 + - 0.4113922 + - -1.014911 + - -0.18161912 + - -0.29689062 + - -0.6251485 + - 0.5013513 + - -0.22253461 + - -0.2588533 + - 0.044328805 + - -0.45983234 + - 0.5534084 + - -1.3843861 + - -0.24567102 + - 0.6996462 + - -0.26762566 + - 0.29501638 + - -0.27813682 + - 0.024225136 + - -0.056865245 + - -0.03493492 + - 0.18810733 + - 0.16761969 + - -0.14906047 + - 0.19758202 + - -0.41006827 + - 0.058017988 + - -0.6509508 + - 0.9418776 + - 0.5173828 + - 0.05777247 + - -0.07246566 + - 0.70380193 + - 0.025031468 + - 0.612567 + - -0.6046367 + - -0.19929521 + - -1.0587875 + - -0.07334349 + - -0.64692575 + - 0.49547282 + - 0.26393098 + - -0.03014906 + - 0.46493307 + - 0.71193695 + - 0.12913483 +- - -0.15109055 + - -0.021903634 + - -0.083914824 + - -0.12880398 + - 0.35795656 + - 0.29648995 + - -0.7700259 + - -0.6232085 + - 0.5061859 + - 0.32812628 + - -0.18676779 + - 0.5090188 + - 0.45361203 + - 0.68920135 + - 0.45408535 + - 0.018128024 + - 0.025971208 + - 0.68283266 + - -0.18952315 + - 0.0038942832 + - -0.3604529 + - 0.34934753 + - -0.20016576 + - -0.16480061 + - -0.32872507 + - 0.109056644 + - 0.3764274 + - -0.46188527 + - -0.54918104 + - 0.6157312 + - -1.0830243 + - -0.33922067 + - -0.16675155 + - -0.18266918 + - -0.17769708 + - -0.17737399 + - 0.37486547 + - 0.58084005 + - -0.3567266 + - -0.41240114 + - -0.6137596 + - -0.45474958 + - -0.49108082 + - 0.31371123 + - -0.5121634 + - -0.3197327 + - -0.18065253 + - -0.64862263 + - -0.66046077 + - -1.0115874 + - -0.7223414 + - -0.32740927 + - 0.53072345 + - 0.05111746 + - 0.2075495 + - -0.28874597 + - -0.17527471 + - -0.008905607 + - -0.122156546 + - 0.021472305 + - 0.20913471 + - -0.4211547 + - 0.3197582 + - 0.34856012 + - -0.33770165 + - 0.27678913 + - -0.6166295 + - 0.57761586 + - -0.29957268 + - 0.07320643 + - -0.2265589 + - -0.31391874 + - 0.76492447 + - 0.007600454 + - -0.24119496 + - 0.04892763 + - 0.045543913 + - -0.10091984 + - -0.058633436 + - 0.10562694 + - -0.1420554 + - 0.4863675 + - -0.4318424 + - -1.0247877 + - -0.023403248 + - -0.63065374 + - -0.49578613 + - -0.092090085 + - -0.20044541 + - -0.58556545 + - 0.115839 + - 0.3798816 + - 0.424985 + - 0.39816627 + - -0.2285332 + - 0.36628655 + - -0.44768625 + - 0.22070913 + - 0.534507 + - -0.7085661 + - -0.070538834 + - -0.107348874 + - -0.3253587 + - 0.62993294 + - -0.75059 + - -1.0707804 + - -0.68110603 + - 0.32859373 + - -0.2118855 + - -0.6408962 + - -0.52045304 + - 0.73433083 + - -0.1304437 + - 0.6365012 + - -0.32628164 + - -0.18581727 + - 0.63856125 + - -0.12516598 + - -1.1121966 + - 0.22908626 + - -0.18862781 + - 0.60101926 + - -0.39073998 + - -0.6447968 + - -0.08831934 + - -0.44524685 + - 0.8490645 + - 0.22501259 + - -0.24692704 + - -1.1086503 + - -0.15384841 + - -0.55875844 + - -0.7331938 + - 1.0501978 + - 0.36605185 + - -0.1838262 + - 0.5206189 + - 0.237174 + - 0.2063224 + - 0.07563617 + - 0.0067095836 + - 0.05887958 + - 0.32364896 + - 0.23489417 + - 0.3175898 + - -0.75022984 + - -0.28961807 + - -0.42942932 + - 0.18670824 + - -0.13244013 + - 0.23977569 + - -0.2373133 + - 1.0015438 + - -0.20318209 + - 0.091986164 + - 0.35573465 + - -0.2647709 + - -0.95180094 + - -0.079319276 + - 0.27213028 + - -0.3250932 + - -0.265531 + - -0.06336659 + - 0.5788936 + - -0.28100872 + - 0.13420996 + - 0.12869371 + - 0.29647395 + - -0.24638884 + - 0.22951232 + - 0.29915494 + - -0.6673683 + - 0.2579727 + - 0.2170357 + - 0.28044018 + - 0.3005139 + - 0.1420653 + - 0.09953698 + - 0.5016433 + - 0.5750065 + - 0.043215007 + - 0.25182495 + - -0.7248352 + - -0.999321 + - -0.4589929 + - -0.09168369 + - -0.18338953 + - 0.40430227 + - 0.15028067 + - 0.5487751 + - 0.62510055 + - -0.18643674 + - -0.010421776 + - 0.11832279 + - 0.14426151 + - -0.116284296 + - -0.12081876 + - 0.4218832 + - 1.1945444 + - 0.20170249 + - 0.40529028 + - 0.17298388 + - 0.4703354 + - 0.40446448 + - -0.27903953 + - 0.15500137 + - -1.3613433 + - 0.4349553 + - -0.6092625 + - -0.70038843 + - 0.33829692 + - -0.049486037 + - 1.2292315 + - 1.1875246 + - 0.88110733 + - -0.03808219 + - -0.4112232 + - 0.059451427 + - 0.18286517 + - -0.38637286 + - -0.15960105 + - -0.75563526 + - -0.13992405 + - 0.2876585 + - 0.34938484 + - -0.6364276 + - 0.26648706 + - 0.14986621 + - -0.02178538 + - -0.4328274 + - 0.32400253 + - -0.56284696 + - 0.0017066401 + - 0.48950258 + - 0.9744805 + - 0.79537344 + - -0.21747883 + - 0.49245363 + - -0.054273184 + - -0.0015835592 + - -0.40899876 + - -0.5273927 + - -0.12501761 + - -0.8540773 + - -0.39120156 + - 0.74370086 + - 0.31688598 + - -0.1167029 + - -0.17205204 + - -0.92589134 + - -0.44832373 + - -0.14176796 + - 0.15559316 + - 0.18620004 + - 0.029677821 + - -0.7860899 + - 0.6119261 + - -0.22759564 + - 0.27114338 + - -0.13304555 + - -0.43458125 + - 0.3509001 + - -0.25703368 + - 1.1999604 + - -0.7353845 + - 0.22466286 + - 0.28216404 + - 0.3068133 + - 0.22410686 + - -0.89779717 + - 3.079363 + - 0.64849144 + - -0.051214017 + - -0.13966322 + - 0.040685207 + - -0.34677258 + - 0.16971292 + - 0.26769742 + - -0.029500902 + - 0.48766795 + - 0.23884484 + - -0.6286489 + - -0.84872234 + - -0.2792891 + - -0.38614812 + - -0.33205667 + - 0.043627854 + - -0.09268977 + - 0.025558773 + - -0.03295981 + - 0.8038319 + - 0.23085825 + - 0.57229805 + - 0.015164251 + - 0.326595 + - 0.5086542 + - -0.48954597 + - 0.28064272 + - 0.20231196 + - 0.57230157 + - -0.32051596 + - -0.017456383 + - 0.8301593 + - -0.26487425 + - -0.57291526 + - -0.43000674 + - 0.40386793 + - -0.05868221 + - -0.057881687 + - -0.43141183 + - 0.032518987 + - 0.1253997 + - 0.56710976 + - 0.5799254 + - -1.153662 + - -1.10415 + - 0.026664412 + - 0.07890936 + - 0.30930015 + - 0.663942 + - 0.074350215 + - 0.5277145 + - -0.46849388 + - -0.23736477 + - 0.10271544 + - -0.6875649 + - 1.0708058 + - 0.020512069 + - 0.0056299777 + - 0.2355162 + - 0.5215009 + - -0.46059683 + - 0.66269505 + - 0.47026086 + - -0.5134104 + - -0.024114873 + - -0.072785124 + - 0.47082546 + - 0.1581585 + - -0.11227976 + - -0.056339893 + - 0.21406786 + - -0.20518807 + - 0.6122274 + - 1.1290092 + - -0.12989084 + - 0.29127744 + - 0.12319786 + - 0.4438106 + - 0.12894677 + - -0.18791506 + - 0.23426783 + - -0.50117284 + - 0.551251 + - -0.13086843 + - 0.74193066 + - -0.35664067 + - 0.22491322 + - 0.28431758 + - -0.6247842 + - -0.32735807 + - 0.21448077 + - -0.2287333 + - 0.40534654 + - 0.285397 + - -0.00997967 + - -0.19634967 + - 0.19089007 + - 0.37149337 + - -0.47715828 + - -0.29549593 + - -0.5872835 + - -0.36474487 + - 0.9297853 + - -0.11981724 + - -0.6729041 + - -0.25248244 + - 0.04529079 + - 0.8676567 + - 1.190012 + - -0.8955213 + - 0.6969344 + - 0.15096132 + - -0.33601168 + - 0.58402616 + - 0.40269914 + - -0.29323262 + - -0.12331058 + - -0.19022873 + - -0.2695512 + - -0.34561163 + - 0.12637508 + - -0.32674125 + - -0.24046609 + - -0.36392096 + - -0.2750025 + - -0.1285536 + - 0.24339662 + - -0.8961811 + - -0.30471936 + - -0.33182573 + - 0.21140103 + - 0.0081760185 + - 0.49128702 + - -0.6027674 + - 0.8579567 + - -0.11586177 + - 0.9756438 + - -0.6629891 + - -0.6875798 + - 0.28862348 + - -0.18273708 + - -0.46361127 + - 0.32340264 + - 0.2774327 + - 0.19078733 + - 1.0107533 + - -0.36158043 + - 0.74900544 + - 0.72242737 + - 0.8227667 + - -0.34258467 + - 0.14299211 + - -0.07485575 + - 0.036902674 + - 0.6683555 + - -0.29041463 + - 0.117668785 + - 0.22068712 + - -0.41664442 + - -0.96687144 + - -0.30115357 + - 0.32991382 + - -0.53672373 + - -0.41835007 + - -0.20272854 + - -0.2060292 + - 0.28951123 + - 0.22901095 + - -0.37840703 + - 0.039218128 + - -0.6748184 + - 0.5217079 + - -0.1034972 + - -0.8034658 + - -0.011289501 + - 0.34773663 + - 0.11336859 + - -0.6484629 + - -0.060686268 + - 0.24654332 + - -0.10321144 + - 0.7025103 + - 0.29660672 + - 0.38687262 + - -0.13210179 + - -0.2598397 + - -0.19132333 + - 0.22228898 + - 0.2603877 + - 0.21548876 + - 0.14805317 + - -0.15419398 + - 0.5276412 + - 0.056747086 + - -0.6454563 + - 0.34790102 + - 0.09949684 + - -0.08417777 + - -0.1851544 + - 0.18506108 + - 0.068498686 + - 0.6502181 + - -0.21207963 + - -0.015460708 + - 0.5452031 + - -0.0136506725 + - -0.66419417 + - 0.28765276 + - -0.25317898 + - 0.12276302 + - -1.0584223 + - 0.2080617 + - 0.014420531 + - 0.010814128 + - -0.021357426 + - -0.663314 + - 0.5983 + - 0.3211898 + - -0.4120384 + - -0.016948262 + - -0.0784177 + - 0.7843738 + - -0.21809463 + - -0.38949633 + - -0.2897738 + - 0.16010587 + - 0.50716555 + - -0.08669298 + - 0.54262674 + - 0.10004849 + - -0.18665542 + - 0.032770045 + - -0.64843833 + - 0.26445454 + - 0.74924886 + - -0.07950161 + - -0.14100347 + - -0.31680727 + - 0.28603527 + - 0.083222285 + - -0.3480211 + - 0.44965547 + - -0.15479736 + - 0.22125898 + - 0.3388934 + - -0.26549906 + - 0.83331996 + - 0.55423844 + - 0.119455345 + - 0.522641 + - 0.36807114 + - 0.28813356 + - -0.39205498 + - -0.048589382 + - 0.42110068 + - -0.27116948 + - 0.012550103 + - -0.15916474 + - 1.0338836 + - 0.5436742 + - -0.107564844 + - -0.11579458 + - 0.62463063 + - -0.1658367 + - -0.00991859 + - 0.16484539 + - -0.2379682 + - 0.28699717 + - -0.12484685 + - 0.03996123 + - -0.4752685 + - -0.08142393 + - 0.25321585 + - 0.12158222 + - 0.30579358 + - -0.011137897 + - 0.24646255 + - -0.18199305 + - -0.14097403 + - -0.14552395 + - 0.15069184 + - -0.94389087 + - -0.07475461 + - 1.5525175 + - 0.7813598 + - -0.30151543 + - -0.20538568 + - -0.13666657 + - 0.25118873 + - -0.51551485 + - -0.95776737 + - 0.024866985 + - -0.017964458 + - 0.3413524 + - 0.057734262 + - -0.67059296 + - -0.43544927 + - -0.8328768 + - -1.1275549 + - 0.14031795 + - 0.5319012 + - 0.27944943 + - 0.22952522 + - -0.28443557 + - 0.6221407 + - -0.08270294 + - 0.23333415 + - 0.067328826 + - 0.033942398 + - -0.114709854 + - 0.12058519 + - -0.24028197 + - 0.052860312 + - 0.06138326 + - -0.25741568 + - -0.20557322 + - 0.10167645 + - -0.81910133 + - -0.8167869 + - -0.04096342 + - -0.31532592 + - -0.032089792 + - 0.004406052 + - -0.31635433 + - -0.3807473 + - -0.59952134 + - -0.17082903 + - 0.5269717 + - 0.16015509 + - 0.026568549 + - -0.100347854 + - -0.08351288 + - -0.32397708 + - 0.19073197 + - -0.0373209 + - -0.6122793 + - -0.1947716 + - 0.059598617 + - -0.9711447 + - -0.11143776 + - 0.25144938 + - -0.29247233 + - -1.004682 + - 0.103191294 + - -0.26377746 + - 0.3734496 + - 0.32138142 + - 0.22011694 + - 0.16574502 + - 0.24156201 + - -0.7507314 + - 0.41684183 + - 0.23563682 + - -0.509628 + - -0.34086603 + - -0.500616 + - -0.5663271 + - -0.10434014 + - -0.21033464 + - -0.013725403 + - -0.054067906 + - 0.06762518 + - -0.07603091 + - 0.38126868 + - -0.21514787 + - 0.6514047 + - 0.16380346 + - 0.21190718 + - -0.10777349 + - -1.1651728 + - 0.85149914 + - -0.13673452 + - -0.27911338 + - 0.39395612 + - -0.8459781 + - 0.06320047 + - -0.17092915 + - 0.6597654 + - 0.094674535 + - -0.33517623 + - 0.10690124 + - 0.17950585 + - 0.48410887 + - 0.030655479 + - 0.09933066 + - 0.1550446 + - 0.431155 + - 0.100912 + - -1.005455 + - -0.41569605 + - -0.21975613 + - 0.8140865 + - 0.20669267 + - 0.8102458 + - 0.9729819 + - -0.11925534 + - -0.33138567 + - -0.2048377 + - -0.05757957 + - -1.1365687 + - 0.10137909 + - 0.79411316 + - 0.21457972 + - 0.0864565 + - -0.0811936 + - 0.04506113 + - -0.29865235 + - 0.51285124 + - -0.048639547 + - 0.044134088 + - 0.38353294 + - 0.300623 + - -0.3087665 + - 0.6065137 + - 0.38760313 + - -0.39175853 + - -0.16171618 + - 0.4792343 + - 0.23237494 + - -1.0454332 + - 0.6672624 + - 0.54942864 + - -0.30390593 + - -0.46868578 + - 0.12068311 + - -0.20385695 + - -0.31071672 + - 0.12209125 + - -0.7388752 + - 0.42730883 + - 0.25917837 + - -0.61594784 + - -0.4380438 + - 0.054391284 + - 0.42368263 + - -0.96115905 + - 0.14401515 + - 0.11230274 + - -0.61102945 + - 0.036328387 + - -0.11808626 + - -0.15593222 + - -0.34371534 + - 0.43030024 + - -0.3359318 + - -0.2805354 + - 0.05581813 + - -0.55480397 + - 0.6060769 + - 0.9170542 + - -0.33335024 + - 0.78890103 + - 0.092671975 + - -0.8138399 + - -0.28036532 + - -0.46818033 + - -0.63843864 + - 0.60233265 + - -0.38163826 + - -0.20055696 + - 0.08256174 + - -0.31126404 + - 0.29852346 + - -1.3070982 + - -0.09121116 + - 0.64371055 + - -0.3373175 + - 0.7442893 + - -0.13088854 + - -0.29106006 + - 0.10606987 + - 0.047938626 + - -0.10944657 + - -0.03900265 + - -0.06794337 + - -0.18343163 + - -0.32839713 + - 0.28699616 + - -0.2572582 + - 0.9318657 + - -0.009791291 + - -0.1260892 + - -0.25368518 + - 0.5582221 + - -0.017653896 + - 0.566508 + - -1.0098631 + - -0.15263984 + - -1.3795891 + - 0.013236173 + - -0.96332794 + - 0.5696775 + - -0.13456643 + - -0.117322244 + - 0.34215567 + - 0.69917 + - 0.12586595 diff --git a/backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap b/backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap index ee1cdfa1..dc2119de 100644 --- a/backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap +++ b/backends/candle/tests/snapshots/test_jina_code__jina_code_single.snap @@ -1,772 +1,773 @@ --- source: backends/candle/tests/test_jina_code.rs +assertion_line: 45 expression: embeddings_single --- -- - -0.011624558 - - -0.0016926473 - - -0.006434922 - - -0.009909191 - - 0.027506275 - - 0.022786874 - - -0.059169117 - - -0.047887173 - - 0.038912594 - - 0.025214802 - - -0.014350341 - - 0.039117776 - - 0.03485464 - - 0.05296896 - - 0.034907352 - - 0.0013971328 - - 0.0019907136 - - 0.052471623 - - -0.014562107 - - 0.00030206257 - - -0.02770458 - - 0.02685756 - - -0.015385578 - - -0.012668428 - - -0.025259107 - - 0.00836893 - - 0.028925523 - - -0.035507426 - - -0.04220648 - - 0.047328673 - - -0.083232224 - - -0.02608385 - - -0.012809777 - - -0.0140402755 - - -0.013649549 - - -0.013641793 - - 0.02880054 - - 0.04465023 - - -0.0274121 - - -0.03170939 - - -0.047180377 - - -0.0349574 - - -0.037762504 - - 0.024104225 - - -0.039361924 - - -0.024559166 - - -0.0138650155 - - -0.049862508 - - -0.0507675 - - -0.07775355 - - -0.055519626 - - -0.025151063 - - 0.040781654 - - 0.0039354665 - - 0.015940087 - - -0.022214677 - - -0.013484792 - - -0.00070730236 - - -0.009409981 - - 0.0016682384 - - 0.016079267 - - -0.032368172 - - 0.024572799 - - 0.026780155 - - -0.025954 - - 0.021282032 - - -0.047395118 - - 0.044386413 - - -0.023020437 - - 0.0056320634 - - -0.017416032 - - -0.024118245 - - 0.05878816 - - 0.00059366866 - - -0.018553924 - - 0.003762008 - - 0.0035026476 - - -0.0077498616 - - -0.004517831 - - 0.008116448 - - -0.010922055 - - 0.037391223 - - -0.03318112 - - -0.07876148 - - -0.0018068684 - - -0.0484656 - - -0.038104814 - - -0.0070756334 - - -0.015427567 - - -0.04499487 - - 0.008910639 - - 0.029193114 - - 0.032674707 - - 0.0305758 - - -0.017541302 - - 0.028164856 - - -0.0344121 - - 0.016969312 - - 0.04108575 - - -0.054463603 - - -0.005427823 - - -0.008252881 - - -0.024992533 - - 0.048412405 - - -0.05769221 - - -0.08227673 - - -0.0523458 - - 0.025244992 - - -0.016289622 - - -0.049253095 - - -0.03999235 - - 0.05642755 - - -0.010015731 - - 0.04892553 - - -0.02504831 - - -0.014305144 - - 0.04907702 - - -0.0096177375 - - -0.0854665 - - 0.017617436 - - -0.014481601 - - 0.046187755 - - -0.030009247 - - -0.049553443 - - -0.006797771 - - -0.034234725 - - 0.06525787 - - 0.017298417 - - -0.018988462 - - -0.08520813 - - -0.011840521 - - -0.042942975 - - -0.056341827 - - 0.08071612 - - 0.028146833 - - -0.0141261155 - - 0.04001012 - - 0.018236378 - - 0.01583886 - - 0.0058086845 - - 0.0005290361 - - 0.0045259795 - - 0.024873685 - - 0.018050008 - - 0.02440984 - - -0.057676647 - - -0.022263395 - - -0.033016473 - - 0.014353932 - - -0.010189813 - - 0.018424626 - - -0.018238619 - - 0.07698089 - - -0.015595315 - - 0.007074499 - - 0.027340613 - - -0.02035102 - - -0.073149584 - - -0.0061021335 - - 0.0209061 - - -0.024985746 - - -0.020401739 - - -0.0048702923 - - 0.0444933 - - -0.02158648 - - 0.010312202 - - 0.009883107 - - 0.022790415 - - -0.01893943 - - 0.017615119 - - 0.023000762 - - -0.051276624 - - 0.019835759 - - 0.016675396 - - 0.021532865 - - 0.023097536 - - 0.01091247 - - 0.007642041 - - 0.0385409 - - 0.044193454 - - 0.003319116 - - 0.019355802 - - -0.055695307 - - -0.07680676 - - -0.035279598 - - -0.0070618573 - - -0.01408385 - - 0.03107026 - - 0.011547187 - - 0.04217532 - - 0.048034772 - - -0.014330861 - - -0.0007901662 - - 0.009103947 - - 0.011091706 - - -0.008960474 - - -0.009301379 - - 0.032424763 - - 0.09180531 - - 0.015491586 - - 0.031114861 - - 0.013289549 - - 0.03616163 - - 0.031084707 - - -0.021437835 - - 0.011905716 - - -0.104623 - - 0.033417992 - - -0.04683295 - - -0.05382028 - - 0.025979578 - - -0.003795323 - - 0.094473585 - - 0.09126942 - - 0.067700386 - - -0.002935823 - - -0.031604428 - - 0.0045677535 - - 0.014042491 - - -0.02969786 - - -0.012263599 - - -0.05807616 - - -0.0107510965 - - 0.022099612 - - 0.02685798 - - -0.048912797 - - 0.020464186 - - 0.011517319 - - -0.0016606319 - - -0.033255223 - - 0.02488959 - - -0.043240122 - - 0.00013934783 - - 0.037608404 - - 0.0748658 - - 0.061115693 - - -0.01670558 - - 0.037827995 - - -0.004162286 - - -0.00011341072 - - -0.031436242 - - -0.040532686 - - -0.0096016815 - - -0.065639205 - - -0.030070387 - - 0.05715196 - - 0.024338327 - - -0.008972259 - - -0.013220871 - - -0.07115904 - - -0.03446362 - - -0.010893238 - - 0.011950567 - - 0.0143028535 - - 0.0022963681 - - -0.060428943 - - 0.047038406 - - -0.017493663 - - 0.0208505 - - -0.010212147 - - -0.03337894 - - 0.026969628 - - -0.019734934 - - 0.0922163 - - -0.056534916 - - 0.017255465 - - 0.021692138 - - 0.023583038 - - 0.017224979 - - -0.0689936 - - 0.23665377 - - 0.04984247 - - -0.0039337534 - - -0.010740561 - - 0.00313393 - - -0.02665381 - - 0.013037893 - - 0.020565815 - - -0.002266256 - - 0.03748113 - - 0.018353125 - - -0.048318923 - - -0.06522075 - - -0.021460611 - - -0.029665926 - - -0.025507431 - - 0.0033435076 - - -0.0071087605 - - 0.001970083 - - -0.0025331723 - - 0.061776515 - - 0.017747495 - - 0.04396135 - - 0.0011617352 - - 0.02509327 - - 0.039078914 - - -0.03762337 - - 0.021575885 - - 0.015548619 - - 0.043990802 - - -0.024633111 - - -0.0013324996 - - 0.063795656 - - -0.02035371 - - -0.0440217 - - -0.033049908 - - 0.031034056 - - -0.004495562 - - -0.0044647786 - - -0.033148468 - - 0.0025072312 - - 0.009637453 - - 0.04357035 - - 0.044546504 - - -0.08865154 - - -0.08487347 - - 0.00205395 - - 0.0060572727 - - 0.023767816 - - 0.051007573 - - 0.0057035745 - - 0.040539596 - - -0.035988905 - - -0.01824621 - - 0.007887274 - - -0.052848075 - - 0.08228733 - - 0.0015825987 - - 0.0004136183 - - 0.018108545 - - 0.040081892 - - -0.035405345 - - 0.050933696 - - 0.036154125 - - -0.03947257 - - -0.0018412384 - - -0.005589829 - - 0.03620321 - - 0.012144826 - - -0.008619581 - - -0.0043279063 - - 0.016455552 - - -0.015757388 - - 0.047043085 - - 0.08675011 - - -0.009986743 - - 0.022379123 - - 0.009470605 - - 0.034120724 - - 0.009922824 - - -0.014435422 - - 0.017998574 - - -0.03849387 - - 0.042357396 - - -0.010053916 - - 0.057034835 - - -0.027412737 - - 0.017308975 - - 0.02185228 - - -0.048017155 - - -0.025138885 - - 0.016482655 - - -0.01756698 - - 0.031146016 - - 0.021930695 - - -0.00075341173 - - -0.015085438 - - 0.0146785155 - - 0.028547939 - - -0.036677707 - - -0.022699077 - - -0.045135103 - - -0.02802744 - - 0.071454674 - - -0.009201392 - - -0.051717956 - - -0.019421624 - - 0.0034821872 - - 0.06667364 - - 0.09145379 - - -0.068826884 - - 0.053568542 - - 0.01160062 - - -0.025829546 - - 0.04487214 - - 0.030954553 - - -0.022543794 - - -0.009475118 - - -0.014623143 - - -0.02070793 - - -0.02656788 - - 0.009701591 - - -0.025120718 - - -0.018472325 - - -0.027967019 - - -0.021122226 - - -0.009891716 - - 0.018696679 - - -0.068876855 - - -0.023419108 - - -0.025495855 - - 0.016256742 - - 0.00064859784 - - 0.037749656 - - -0.046321914 - - 0.065936595 - - -0.008921658 - - 0.07497468 - - -0.05094385 - - -0.052860104 - - 0.022196138 - - -0.0140462285 - - -0.03562305 - - 0.024858234 - - 0.021310989 - - 0.014657512 - - 0.07767391 - - -0.027777392 - - 0.057577316 - - 0.055513144 - - 0.06322926 - - -0.026312957 - - 0.010970987 - - -0.0057475767 - - 0.0028267235 - - 0.051367335 - - -0.022320578 - - 0.009050165 - - 0.016952222 - - -0.032026373 - - -0.074292615 - - -0.02315535 - - 0.025375988 - - -0.041241057 - - -0.032157563 - - -0.015576387 - - -0.015834223 - - 0.02224181 - - 0.017586967 - - -0.029070066 - - 0.0030065721 - - -0.051857695 - - 0.04008828 - - -0.007960872 - - -0.061745025 - - -0.00086617953 - - 0.026723113 - - 0.008719714 - - -0.049826868 - - -0.0046574236 - - 0.018954279 - - -0.007935451 - - 0.053987946 - - 0.022795292 - - 0.029722994 - - -0.010146585 - - -0.019956842 - - -0.014686722 - - 0.01708331 - - 0.020001508 - - 0.016564105 - - 0.011379248 - - -0.011843253 - - 0.04056168 - - 0.004384286 - - -0.049596023 - - 0.02674251 - - 0.0076475106 - - -0.0064563937 - - -0.014233138 - - 0.014224383 - - 0.0052741244 - - 0.049964864 - - -0.016286546 - - -0.001200327 - - 0.041904222 - - -0.0010395087 - - -0.05105399 - - 0.022099879 - - -0.019455278 - - 0.009444127 - - -0.081325725 - - 0.015994828 - - 0.0010952728 - - 0.0008373874 - - -0.0016424303 - - -0.05096469 - - 0.045976803 - - 0.024695056 - - -0.031656373 - - -0.0013138534 - - -0.0060524447 - - 0.060276203 - - -0.016745795 - - -0.029930653 - - -0.0222771 - - 0.012314711 - - 0.038991332 - - -0.006665343 - - 0.041694533 - - 0.0076992502 - - -0.014353178 - - 0.0025135442 - - -0.0498445 - - 0.020322764 - - 0.0575802 - - -0.006096128 - - -0.010841882 - - -0.024337102 - - 0.021975596 - - 0.0064031687 - - -0.026746146 - - 0.03455729 - - -0.011909055 - - 0.016994143 - - 0.026053395 - - -0.020393625 - - 0.06403403 - - 0.042590734 - - 0.009193913 - - 0.04016698 - - 0.028304791 - - 0.022147119 - - -0.030121539 - - -0.0037334429 - - 0.03235819 - - -0.020825844 - - 0.0009766509 - - -0.012216568 - - 0.07944978 - - 0.04177374 - - -0.008281654 - - -0.008908983 - - 0.04799388 - - -0.012743454 - - -0.00076762337 - - 0.012673029 - - -0.018283572 - - 0.022068778 - - -0.009605337 - - 0.0030652087 - - -0.036517244 - - -0.006263211 - - 0.0194632 - - 0.009333852 - - 0.02350168 - - -0.0008530139 - - 0.018934859 - - -0.013986168 - - -0.010833636 - - -0.011189203 - - 0.011567913 - - -0.07253544 - - -0.005748846 - - 0.11930293 - - 0.060044624 - - -0.023167728 - - -0.015781552 - - -0.010494401 - - 0.01930528 - - -0.039608266 - - -0.073587865 - - 0.0019034932 - - -0.0013838339 - - 0.026257295 - - 0.004433007 - - -0.051545423 - - -0.033456888 - - -0.06401291 - - -0.08664347 - - 0.010781564 - - 0.0408775 - - 0.021475399 - - 0.017633006 - - -0.02186024 - - 0.047795497 - - -0.006370007 - - 0.01792626 - - 0.005195737 - - 0.0026206016 - - -0.008816542 - - 0.009266863 - - -0.018453414 - - 0.0040575014 - - 0.0047053 - - -0.0197809 - - -0.01580334 - - 0.007821501 - - -0.06296649 - - -0.06274416 - - -0.0031381177 - - -0.024228694 - - -0.002459634 - - 0.00034323192 - - -0.02430543 - - -0.029262288 - - -0.04606642 - - -0.013138838 - - 0.040473 - - 0.012308485 - - 0.0020701357 - - -0.007718021 - - -0.0064122216 - - -0.024890581 - - 0.014665469 - - -0.0028788927 - - -0.047072053 - - -0.014959743 - - 0.004587824 - - -0.07462158 - - -0.008558996 - - 0.019324543 - - -0.02247574 - - -0.07721102 - - 0.007920586 - - -0.020274863 - - 0.028696692 - - 0.024707401 - - 0.016905285 - - 0.012742534 - - 0.018577736 - - -0.05768951 - - 0.03203929 - - 0.018105863 - - -0.03917534 - - -0.026208939 - - -0.038492158 - - -0.043517314 - - -0.008031121 - - -0.016162876 - - -0.0010640965 - - -0.004164019 - - 0.005193703 - - -0.0058410293 - - 0.029311381 - - -0.016533207 - - 0.05005747 - - 0.012600715 - - 0.016292874 - - -0.008300225 - - -0.08953819 - - 0.06544125 - - -0.010512851 - - -0.021443438 - - 0.030277776 - - -0.06502247 - - 0.004850903 - - -0.013137611 - - 0.0506941 - - 0.0072725127 - - -0.025755724 - - 0.008224718 - - 0.013813313 - - 0.037197027 - - 0.0023671025 - - 0.00763629 - - 0.011905766 - - 0.033143394 - - 0.007750765 - - -0.07725993 - - -0.03193554 - - -0.016900484 - - 0.06256093 - - 0.015902048 - - 0.062251173 - - 0.07478062 - - -0.009171957 - - -0.025452917 - - -0.015754124 - - -0.004426243 - - -0.0873611 - - 0.0077999695 - - 0.061026644 - - 0.016489599 - - 0.0066420045 - - -0.0062355455 - - 0.00345123 - - -0.022935547 - - 0.03939866 - - -0.0037231673 - - 0.0033949488 - - 0.029471302 - - 0.023097953 - - -0.0237214 - - 0.046621986 - - 0.029790087 - - -0.030113066 - - -0.012432801 - - 0.036813233 - - 0.01785254 - - -0.08032645 - - 0.051262226 - - 0.04222712 - - -0.023358794 - - -0.03602671 - - 0.0092950305 - - -0.015663076 - - -0.023873692 - - 0.009383877 - - -0.056770466 - - 0.032832243 - - 0.019920528 - - -0.04734062 - - -0.03368295 - - 0.0041841906 - - 0.03257228 - - -0.07387151 - - 0.011083565 - - 0.008633363 - - -0.04694844 - - 0.0027943242 - - -0.009078945 - - -0.011981829 - - -0.026407028 - - 0.033040557 - - -0.025803888 - - -0.021555608 - - 0.0042838412 - - -0.04263439 - - 0.0465685 - - 0.070476055 - - -0.02560814 - - 0.060619954 - - 0.0071254023 - - -0.062549844 - - -0.021544673 - - -0.03598606 - - -0.04904548 - - 0.04631042 - - -0.029345924 - - -0.015404836 - - 0.0063473387 - - -0.023926385 - - 0.022935716 - - -0.1004558 - - -0.007012574 - - 0.049480513 - - -0.02592937 - - 0.057209775 - - -0.010056263 - - -0.02236333 - - 0.008163001 - - 0.0036735693 - - -0.008406754 - - -0.0029980235 - - -0.0052409745 - - -0.014090007 - - -0.025248934 - - 0.022062942 - - -0.019766279 - - 0.07160526 - - -0.00075892545 - - -0.0096911425 - - -0.019483106 - - 0.042904716 - - -0.0013572425 - - 0.04353212 - - -0.07759716 - - -0.011731261 - - -0.10602095 - - 0.0010180247 - - -0.07403971 - - 0.043784548 - - -0.010357722 - - -0.009020027 - - 0.026289912 - - 0.053744033 - - 0.009665143 +- - -0.15109017 + - -0.021903912 + - -0.08391459 + - -0.12880382 + - 0.35795733 + - 0.2964905 + - -0.7700258 + - -0.6232095 + - 0.50618637 + - 0.3281261 + - -0.18676828 + - 0.5090185 + - 0.45361134 + - 0.6892018 + - 0.45408398 + - 0.018128872 + - 0.025972119 + - 0.68283266 + - -0.18952282 + - 0.0038939554 + - -0.36045286 + - 0.34934822 + - -0.20016623 + - -0.16480026 + - -0.32872525 + - 0.10905678 + - 0.37642816 + - -0.46188572 + - -0.54918206 + - 0.6157313 + - -1.0830249 + - -0.339221 + - -0.1667515 + - -0.1826696 + - -0.17769721 + - -0.1773744 + - 0.37486538 + - 0.5808406 + - -0.3567268 + - -0.412402 + - -0.61375934 + - -0.45475024 + - -0.49108127 + - 0.31371126 + - -0.5121643 + - -0.31973246 + - -0.18065177 + - -0.6486226 + - -0.66046107 + - -1.0115873 + - -0.72234154 + - -0.32740912 + - 0.5307237 + - 0.05111724 + - 0.2075493 + - -0.28874597 + - -0.17527461 + - -0.008904695 + - -0.122156724 + - 0.021473024 + - 0.20913582 + - -0.4211541 + - 0.31975842 + - 0.3485598 + - -0.3377011 + - 0.2767898 + - -0.6166291 + - 0.5776161 + - -0.29957384 + - 0.07320692 + - -0.22655882 + - -0.31391934 + - 0.76492363 + - 0.007601051 + - -0.2411951 + - 0.048926763 + - 0.045543216 + - -0.10092032 + - -0.058633085 + - 0.10562677 + - -0.14205451 + - 0.48636737 + - -0.431843 + - -1.0247887 + - -0.023403699 + - -0.630654 + - -0.49578592 + - -0.09209086 + - -0.20044567 + - -0.5855643 + - 0.1158377 + - 0.379882 + - 0.42498636 + - 0.3981659 + - -0.22853294 + - 0.3662865 + - -0.44768646 + - 0.22070856 + - 0.5345074 + - -0.7085676 + - -0.0705391 + - -0.10734863 + - -0.3253591 + - 0.6299327 + - -0.75059074 + - -1.0707809 + - -0.6811064 + - 0.32859367 + - -0.21188518 + - -0.6408968 + - -0.5204542 + - 0.73433125 + - -0.1304438 + - 0.6365018 + - -0.32628176 + - -0.18581797 + - 0.6385614 + - -0.12516536 + - -1.1121975 + - 0.2290868 + - -0.1886282 + - 0.60102016 + - -0.39074013 + - -0.64479715 + - -0.08831843 + - -0.4452467 + - 0.8490649 + - 0.22501282 + - -0.24692632 + - -1.1086496 + - -0.15384836 + - -0.55875856 + - -0.7331939 + - 1.050198 + - 0.366051 + - -0.18382613 + - 0.5206184 + - 0.23717418 + - 0.2063222 + - 0.07563633 + - 0.0067100087 + - 0.058879443 + - 0.3236492 + - 0.2348934 + - 0.3175897 + - -0.75022984 + - -0.28961873 + - -0.42943057 + - 0.1867075 + - -0.13243972 + - 0.2397758 + - -0.23731335 + - 1.0015451 + - -0.20318308 + - 0.09198552 + - 0.3557345 + - -0.26477066 + - -0.9518013 + - -0.079320006 + - 0.27212998 + - -0.32509333 + - -0.26553172 + - -0.06336617 + - 0.5788942 + - -0.28100845 + - 0.13421044 + - 0.1286933 + - 0.29647473 + - -0.24638796 + - 0.22951326 + - 0.29915532 + - -0.6673685 + - 0.25797236 + - 0.2170357 + - 0.28044048 + - 0.3005151 + - 0.142065 + - 0.09953769 + - 0.501644 + - 0.5750058 + - 0.043214526 + - 0.25182408 + - -0.7248358 + - -0.99932134 + - -0.458993 + - -0.09168415 + - -0.18338914 + - 0.40430218 + - 0.15027969 + - 0.54877526 + - 0.62510073 + - -0.18643698 + - -0.01042164 + - 0.11832396 + - 0.14426194 + - -0.11628445 + - -0.1208188 + - 0.4218833 + - 1.1945444 + - 0.20170312 + - 0.4052904 + - 0.1729834 + - 0.4703359 + - 0.40446433 + - -0.27903995 + - 0.1550025 + - -1.3613443 + - 0.43495545 + - -0.6092624 + - -0.7003889 + - 0.33829734 + - -0.049486108 + - 1.2292325 + - 1.1875259 + - 0.8811078 + - -0.038080666 + - -0.41122243 + - 0.05945136 + - 0.18286446 + - -0.38637257 + - -0.15960099 + - -0.75563586 + - -0.1399235 + - 0.28765863 + - 0.3493854 + - -0.63642806 + - 0.26648793 + - 0.14986706 + - -0.02178518 + - -0.4328278 + - 0.32400298 + - -0.5628467 + - 0.0017072515 + - 0.4895039 + - 0.97447956 + - 0.79537314 + - -0.21747877 + - 0.49245456 + - -0.05427343 + - -0.001583887 + - -0.4089984 + - -0.5273928 + - -0.12501858 + - -0.85407794 + - -0.39120156 + - 0.74370044 + - 0.31688666 + - -0.11670343 + - -0.1720524 + - -0.9258916 + - -0.44832334 + - -0.14176793 + - 0.15559235 + - 0.18619914 + - 0.029677043 + - -0.7860905 + - 0.6119248 + - -0.2275956 + - 0.27114373 + - -0.1330457 + - -0.4345812 + - 0.3509011 + - -0.25703478 + - 1.1999608 + - -0.73538506 + - 0.22466388 + - 0.28216428 + - 0.3068128 + - 0.22410713 + - -0.8977979 + - 3.0793605 + - 0.6484912 + - -0.05121518 + - -0.13966213 + - 0.04068459 + - -0.3467717 + - 0.16971251 + - 0.26769823 + - -0.029500855 + - 0.48766798 + - 0.23884583 + - -0.6286487 + - -0.84872204 + - -0.2792897 + - -0.38614887 + - -0.33205643 + - 0.04362763 + - -0.09268941 + - 0.02555917 + - -0.03296 + - 0.80383164 + - 0.23085819 + - 0.5722987 + - 0.01516376 + - 0.3265964 + - 0.508655 + - -0.489546 + - 0.28064126 + - 0.20231268 + - 0.5723013 + - -0.3205152 + - -0.017457549 + - 0.8301581 + - -0.26487455 + - -0.5729147 + - -0.43000627 + - 0.40386885 + - -0.05868242 + - -0.057882257 + - -0.43141195 + - 0.03251865 + - 0.12539996 + - 0.5671106 + - 0.57992566 + - -1.1536614 + - -1.1041497 + - 0.026663976 + - 0.07890819 + - 0.30930018 + - 0.6639422 + - 0.07434951 + - 0.52771425 + - -0.4684933 + - -0.23736392 + - 0.10271525 + - -0.68756473 + - 1.0708053 + - 0.02051262 + - 0.005629446 + - 0.23551573 + - 0.5215006 + - -0.46059707 + - 0.6626951 + - 0.47026092 + - -0.51341105 + - -0.024114782 + - -0.07278506 + - 0.4708267 + - 0.15815888 + - -0.112280026 + - -0.056338932 + - 0.21406803 + - -0.20518868 + - 0.61222875 + - 1.1290101 + - -0.12989084 + - 0.29127774 + - 0.123198144 + - 0.44381183 + - 0.12894794 + - -0.1879169 + - 0.23426811 + - -0.50117296 + - 0.5512518 + - -0.13086754 + - 0.7419318 + - -0.35664067 + - 0.2249138 + - 0.28431752 + - -0.6247846 + - -0.32735673 + - 0.21447966 + - -0.22873329 + - 0.4053473 + - 0.2853962 + - -0.009979942 + - -0.19634862 + - 0.19088997 + - 0.37149256 + - -0.4771584 + - -0.29549617 + - -0.58728474 + - -0.36474568 + - 0.92978513 + - -0.1198181 + - -0.6729035 + - -0.2524828 + - 0.045290913 + - 0.86765605 + - 1.1900126 + - -0.89552087 + - 0.6969349 + - 0.15096185 + - -0.3360112 + - 0.5840267 + - 0.4026988 + - -0.29323298 + - -0.123310395 + - -0.19022875 + - -0.26955125 + - -0.34561172 + - 0.12637521 + - -0.3267415 + - -0.24046628 + - -0.36392075 + - -0.27500254 + - -0.12855366 + - 0.24339654 + - -0.8961821 + - -0.30471975 + - -0.33182493 + - 0.2114005 + - 0.008176226 + - 0.49128672 + - -0.60276794 + - 0.85795695 + - -0.11586124 + - 0.9756452 + - -0.6629899 + - -0.6875797 + - 0.28862423 + - -0.18273696 + - -0.46361175 + - 0.32340184 + - 0.27743196 + - 0.1907873 + - 1.0107535 + - -0.36158037 + - 0.7490063 + - 0.7224286 + - 0.8227676 + - -0.34258455 + - 0.14299323 + - -0.07485472 + - 0.03690354 + - 0.66835594 + - -0.29041466 + - 0.117666945 + - 0.22068782 + - -0.41664478 + - -0.96687233 + - -0.30115366 + - 0.32991317 + - -0.5367237 + - -0.4183496 + - -0.20272818 + - -0.20603004 + - 0.28951097 + - 0.22901037 + - -0.37840658 + - 0.039217196 + - -0.6748186 + - 0.5217078 + - -0.10349636 + - -0.80346566 + - -0.011289856 + - 0.34773663 + - 0.11336774 + - -0.64846295 + - -0.060686886 + - 0.24654308 + - -0.1032119 + - 0.70251036 + - 0.29660708 + - 0.38687375 + - -0.13210155 + - -0.25983995 + - -0.19132254 + - 0.22228907 + - 0.26038757 + - 0.21548831 + - 0.14805342 + - -0.15419401 + - 0.52764213 + - 0.056747828 + - -0.64545715 + - 0.34790152 + - 0.09949671 + - -0.084178016 + - -0.1851547 + - 0.18506077 + - 0.06849785 + - 0.65021807 + - -0.21207952 + - -0.015461175 + - 0.5452032 + - -0.01365122 + - -0.6641938 + - 0.28765276 + - -0.25317904 + - 0.1227632 + - -1.0584215 + - 0.20806229 + - 0.014421382 + - 0.01081426 + - -0.02135765 + - -0.6633148 + - 0.59829956 + - 0.32118934 + - -0.4120391 + - -0.016948322 + - -0.07841795 + - 0.7843749 + - -0.21809503 + - -0.38949728 + - -0.28977337 + - 0.16010587 + - 0.5071659 + - -0.086693175 + - 0.5426263 + - 0.10004949 + - -0.18665528 + - 0.03277051 + - -0.64843935 + - 0.2644557 + - 0.74924755 + - -0.079501085 + - -0.14100425 + - -0.31680706 + - 0.28603593 + - 0.08322243 + - -0.34802154 + - 0.44965598 + - -0.154797 + - 0.2212598 + - 0.3388931 + - -0.26549858 + - 0.83331984 + - 0.5542385 + - 0.11945615 + - 0.52264225 + - 0.3680703 + - 0.28813347 + - -0.3920549 + - -0.04858926 + - 0.4211004 + - -0.27116972 + - 0.012550266 + - -0.15916526 + - 1.0338844 + - 0.54367495 + - -0.1075652 + - -0.115794845 + - 0.6246316 + - -0.16583593 + - -0.009917642 + - 0.16484575 + - -0.23796882 + - 0.28699717 + - -0.12484648 + - 0.039961245 + - -0.4752689 + - -0.08142411 + - 0.2532168 + - 0.121582344 + - 0.30579346 + - -0.011138479 + - 0.24646218 + - -0.18199337 + - -0.14097375 + - -0.14552434 + - 0.15069063 + - -0.9438915 + - -0.074753724 + - 1.5525185 + - 0.7813608 + - -0.30151537 + - -0.20538484 + - -0.13666666 + - 0.2511893 + - -0.5155156 + - -0.957768 + - 0.024867887 + - -0.017964648 + - 0.3413526 + - 0.057733916 + - -0.6705937 + - -0.43544868 + - -0.8328766 + - -1.127556 + - 0.14031887 + - 0.53190166 + - 0.2794492 + - 0.22952476 + - -0.28443596 + - 0.62214035 + - -0.08270305 + - 0.23333475 + - 0.06732856 + - 0.033942442 + - -0.11470904 + - 0.120585375 + - -0.24028243 + - 0.0528598 + - 0.061382774 + - -0.25741574 + - -0.20557366 + - 0.101676114 + - -0.8191013 + - -0.8167867 + - -0.04096431 + - -0.315326 + - -0.03208939 + - 0.0044063576 + - -0.31635436 + - -0.380747 + - -0.59952134 + - -0.17083004 + - 0.52697104 + - 0.16015483 + - 0.026569244 + - -0.10034638 + - -0.08351234 + - -0.32397738 + - 0.19073258 + - -0.037320424 + - -0.6122803 + - -0.19477105 + - 0.05959901 + - -0.97114486 + - -0.1114374 + - 0.25144908 + - -0.29247206 + - -1.0046825 + - 0.10319125 + - -0.26377684 + - 0.3734495 + - 0.32138124 + - 0.2201173 + - 0.16574505 + - 0.24156184 + - -0.7507315 + - 0.41684124 + - 0.23563716 + - -0.5096274 + - -0.3408667 + - -0.5006164 + - -0.5663268 + - -0.10434029 + - -0.21033548 + - -0.013725087 + - -0.05406871 + - 0.06762612 + - -0.07603185 + - 0.38126794 + - -0.21514723 + - 0.6514044 + - 0.1638036 + - 0.21190682 + - -0.10777368 + - -1.1651736 + - 0.85149956 + - -0.13673444 + - -0.2791136 + - 0.3939568 + - -0.8459791 + - 0.06319932 + - -0.17092903 + - 0.65976614 + - 0.09467505 + - -0.3351752 + - 0.10690198 + - 0.17950574 + - 0.4841084 + - 0.030654255 + - 0.09933002 + - 0.15504493 + - 0.431155 + - 0.100911595 + - -1.005456 + - -0.4156974 + - -0.21975553 + - 0.8140882 + - 0.20669341 + - 0.8102458 + - 0.9729832 + - -0.1192555 + - -0.3313866 + - -0.20483741 + - -0.05758002 + - -1.1365694 + - 0.10137964 + - 0.7941135 + - 0.21457946 + - 0.08645558 + - -0.08119329 + - 0.045061592 + - -0.2986527 + - 0.5128512 + - -0.048639238 + - 0.04413519 + - 0.38353267 + - 0.30062288 + - -0.30876812 + - 0.6065144 + - 0.38760418 + - -0.3917586 + - -0.16171588 + - 0.47923428 + - 0.2323744 + - -1.0454342 + - 0.66726273 + - 0.54942894 + - -0.3039057 + - -0.46868548 + - 0.120683506 + - -0.20385773 + - -0.3107174 + - 0.122091934 + - -0.73887575 + - 0.4273086 + - 0.25917768 + - -0.615948 + - -0.43804422 + - 0.05439096 + - 0.4236836 + - -0.9611595 + - 0.14401515 + - 0.11230327 + - -0.61103016 + - 0.03632788 + - -0.1180862 + - -0.15593259 + - -0.34371522 + - 0.43030044 + - -0.33593243 + - -0.28053537 + - 0.055819333 + - -0.5548041 + - 0.6060772 + - 0.9170542 + - -0.3333504 + - 0.78890127 + - 0.09267188 + - -0.8138399 + - -0.28036547 + - -0.46818015 + - -0.63843864 + - 0.60233366 + - -0.38163796 + - -0.20055757 + - 0.08256148 + - -0.31126496 + - 0.29852262 + - -1.3070983 + - -0.091211565 + - 0.6437114 + - -0.33731744 + - 0.74428993 + - -0.13088785 + - -0.2910597 + - 0.10607006 + - 0.04793844 + - -0.10944663 + - -0.039002948 + - -0.06794383 + - -0.18343139 + - -0.3283973 + - 0.2869965 + - -0.2572587 + - 0.9318666 + - -0.009790381 + - -0.1260892 + - -0.25368497 + - 0.55822307 + - -0.017653605 + - 0.5665084 + - -1.0098633 + - -0.1526397 + - -1.37959 + - 0.013235414 + - -0.96332794 + - 0.56967777 + - -0.13456593 + - -0.1173221 + - 0.34215552 + - 0.69916993 + - 0.1258658 diff --git a/backends/candle/tests/test_flash_jina.rs b/backends/candle/tests/test_flash_jina.rs index 4e42428a..4a5f8276 100644 --- a/backends/candle/tests/test_flash_jina.rs +++ b/backends/candle/tests/test_flash_jina.rs @@ -34,7 +34,7 @@ fn test_flash_jina_small() -> Result<()> { let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); let embeddings_batch = SnapshotScores::from(pooled_embeddings); - insta::assert_yaml_snapshot!("flash_jina_batch", embeddings_batch, &matcher); + insta::assert_yaml_snapshot!("jina_batch", embeddings_batch, &matcher); let input_single = batch( vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], @@ -45,7 +45,7 @@ fn test_flash_jina_small() -> Result<()> { let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); let embeddings_single = SnapshotScores::from(pooled_embeddings); - insta::assert_yaml_snapshot!("flash_jina_single", embeddings_single, &matcher); + insta::assert_yaml_snapshot!("jina_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); assert_eq!(embeddings_batch[2], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_jina_code.rs b/backends/candle/tests/test_flash_jina_code.rs index 74035117..508bf722 100644 --- a/backends/candle/tests/test_flash_jina_code.rs +++ b/backends/candle/tests/test_flash_jina_code.rs @@ -34,7 +34,7 @@ fn test_flash_jina_code_base() -> Result<()> { let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); let embeddings_batch = SnapshotScores::from(pooled_embeddings); - insta::assert_yaml_snapshot!("flash_jina_code_batch", embeddings_batch, &matcher); + insta::assert_yaml_snapshot!("jina_code_batch", embeddings_batch, &matcher); let input_single = batch( vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], @@ -45,7 +45,7 @@ fn test_flash_jina_code_base() -> Result<()> { let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); let embeddings_single = SnapshotScores::from(pooled_embeddings); - insta::assert_yaml_snapshot!("flash_jina_code_single", embeddings_single, &matcher); + insta::assert_yaml_snapshot!("jina_code_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); assert_eq!(embeddings_batch[2], embeddings_single[0]); From 5c6151c7c210f7b215364e84e4e304a5035961b2 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Thu, 27 Jun 2024 11:26:18 +0200 Subject: [PATCH 46/72] 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 47/72] 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 48/72] 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 49/72] 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 50/72] 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 51/72] 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 52/72] 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 53/72] 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 54/72] 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 a8db316869dc50c307f0ec19f2e4ab932835fbd0 Mon Sep 17 00:00:00 2001 From: Lukasz Towarek Date: Fri, 15 Mar 2024 08:42:22 +0100 Subject: [PATCH 55/72] Add initial support for TEI on HPU (#1) Main changes compared to the upstream: * Enabled python backend with support for HPU * Added Habana PT as a base image * Updated python requirements to match Habana PT image * Removed torch * Added transformers --- Dockerfile-hpu | 82 +++ README.md | 588 +----------------- backends/python/server/pyproject.toml | 1 - backends/python/server/requirements.txt | 2 +- .../text_embeddings_server/models/__init__.py | 9 + 5 files changed, 122 insertions(+), 560 deletions(-) create mode 100644 Dockerfile-hpu diff --git a/Dockerfile-hpu b/Dockerfile-hpu new file mode 100644 index 00000000..bfccab97 --- /dev/null +++ b/Dockerfile-hpu @@ -0,0 +1,82 @@ +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 + +# Download 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 + +COPY --from=planner /usr/src/recipe.json recipe.json + +RUN cargo chef cook --release --features python --no-default-features --recipe-path recipe.json && sccache -s + +COPY backends backends +COPY core core +COPY router router +COPY Cargo.toml ./ +COPY Cargo.lock ./ + +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 + +FROM builder as http-builder + +RUN cargo build --release --bin text-embeddings-router -F python -F http --no-default-features && sccache -s + +FROM builder as grpc-builder + +COPY proto proto + +RUN cargo build --release --bin text-embeddings-router -F grpc -F python --no-default-features && sccache -s + +FROM vault.habana.ai/gaudi-docker/1.14.0/ubuntu22.04/habanalabs/pytorch-installer-2.1.1:latest as base + +ENV HUGGINGFACE_HUB_CACHE=/data \ + PORT=80 + +WORKDIR /usr/src +COPY backends backends +COPY backends/python/server/text_embeddings_server/models/__init__.py backends/python/server/text_embeddings_server/models/__init__.py +COPY backends/python/server/pyproject.toml backends/python/server/pyproject.toml +COPY backends/python/server/requirements.txt backends/python/server/requirements.txt +RUN cd backends/python/server && \ + make install + +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 837f3f54..5286a2d1 100644 --- a/README.md +++ b/README.md @@ -1,558 +1,30 @@ -
- -# Text Embeddings Inference - - - GitHub Repo stars - - - Swagger API documentation - - -A blazing fast inference solution for text embeddings models. - -Benchmark for [BAAI/bge-base-en-v1.5](https://huggingface.co/BAAI/bge-base-en-v1.5) on an Nvidia A10 with a sequence -length of 512 tokens: - -

- - -

-

- - -

- -
- -## Table of contents - -- [Get Started](#get-started) - - [Supported Models](#supported-models) - - [Docker](#docker) - - [Docker Images](#docker-images) - - [API Documentation](#api-documentation) - - [Using a private or gated model](#using-a-private-or-gated-model) - - [Using Re-rankers models](#using-re-rankers-models) - - [Using Sequence Classification models](#using-sequence-classification-models) - - [Using SPLADE pooling](#using-splade-pooling) - - [Distributed Tracing](#distributed-tracing) - - [gRPC](#grpc) -- [Local Install](#local-install) -- [Docker Build](#docker-build) - - [Apple M1/M2 Arm](#apple-m1m2-arm64-architectures) -- [Examples](#examples) - -Text Embeddings Inference (TEI) is a toolkit for deploying and serving open source text embeddings and sequence -classification models. TEI enables high-performance extraction for the most popular models, including FlagEmbedding, -Ember, GTE and E5. TEI implements many features such as: - -* No model graph compilation step -* Metal support for local execution on Macs -* Small docker images and fast boot times. Get ready for true serverless! -* Token based dynamic batching -* Optimized transformers code for inference using [Flash Attention](https://github.com/HazyResearch/flash-attention), - [Candle](https://github.com/huggingface/candle) - and [cuBLASLt](https://docs.nvidia.com/cuda/cublas/#using-the-cublaslt-api) -* [Safetensors](https://github.com/huggingface/safetensors) weight loading -* Production ready (distributed tracing with Open Telemetry, Prometheus metrics) - -## Get Started - -### Supported Models - -#### Text Embeddings - -Text Embeddings Inference currently supports Nomic, BERT, CamemBERT, XLM-RoBERTa models with absolute positions, JinaBERT -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 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 -[Massive Text Embedding Benchmark (MTEB) Leaderboard](https://huggingface.co/spaces/mteb/leaderboard). - -#### Sequence Classification and Re-Ranking - -Text Embeddings Inference currently supports CamemBERT, and XLM-RoBERTa Sequence Classification models with absolute positions. - -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) | | - -### Docker - -```shell -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.4 --model-id $model --revision $revision -``` - -And then you can make requests like - -```bash -curl 127.0.0.1:8080/embed \ - -X POST \ - -d '{"inputs":"What is Deep Learning?"}' \ - -H 'Content-Type: application/json' -``` - -**Note:** To use GPUs, you need to install -the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). -NVIDIA drivers on your machine need to be compatible with CUDA version 12.2 or higher. - -To see all options to serve your models: - -```shell -text-embeddings-router --help -``` - -``` -Usage: text-embeddings-router [OPTIONS] - -Options: - --model-id - The name of the model to load. Can be a MODEL_ID as listed on like `thenlper/gte-base`. - Or it can be a local directory containing the necessary files as saved by `save_pretrained(...)` methods of - transformers - - [env: MODEL_ID=] - [default: thenlper/gte-base] - - --revision - The actual revision of the model if you're referring to a model on the hub. You can use a specific commit id - or a branch like `refs/pr/2` - - [env: REVISION=] - - --tokenization-workers - Optionally control the number of tokenizer workers used for payload tokenization, validation and truncation. - Default to the number of CPU cores on the machine - - [env: TOKENIZATION_WORKERS=] - - --dtype - The dtype to be forced upon the model - - [env: DTYPE=] - [possible values: float16, float32] - - --pooling - Optionally control the pooling method for embedding models. - - If `pooling` is not set, the pooling configuration will be parsed from the model `1_Pooling/config.json` configuration. - - If `pooling` is set, it will override the model pooling configuration - - [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 - - last-token: Select the last token as embedding - - --max-concurrent-requests - The maximum amount of concurrent requests for this particular deployment. - Having a low limit will refuse clients requests instead of having them wait for too long and is usually good - to handle backpressure correctly - - [env: MAX_CONCURRENT_REQUESTS=] - [default: 512] - - --max-batch-tokens - **IMPORTANT** This is one critical control to allow maximum usage of the available hardware. - - This represents the total amount of potential tokens within a batch. - - For `max_batch_tokens=1000`, you could fit `10` queries of `total_tokens=100` or a single query of `1000` tokens. - - Overall this number should be the largest possible until the model is compute bound. Since the actual memory - overhead depends on the model implementation, text-embeddings-inference cannot infer this number automatically. - - [env: MAX_BATCH_TOKENS=] - [default: 16384] - - --max-batch-requests - Optionally control the maximum number of individual requests in a batch - - [env: MAX_BATCH_REQUESTS=] - - --max-client-batch-size - Control the maximum number of inputs that a client can send in a single request - - [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 - - [env: HF_API_TOKEN=] - - --hostname - The IP address to listen on - - [env: HOSTNAME=] - [default: 0.0.0.0] - - -p, --port - The port to listen on - - [env: PORT=] - [default: 3000] - - --uds-path - The name of the unix socket some text-embeddings-inference backends will use as they communicate internally - with gRPC - - [env: UDS_PATH=] - [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 - - [env: HUGGINGFACE_HUB_CACHE=] - - --payload-limit - Payload size limit in bytes - - Default is 2MB - - [env: PAYLOAD_LIMIT=] - [default: 2000000] - - --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. - - [env: API_KEY=] - - --json-output - Outputs the logs in JSON format (useful for telemetry) - - [env: JSON_OUTPUT=] - - --otlp-endpoint - The grpc endpoint for opentelemetry. Telemetry is sent to this endpoint as OTLP over gRPC. e.g. `http://localhost:4317` - - [env: OTLP_ENDPOINT=] - - --otlp-service-name - 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=] -``` - -### Docker Images - -Text Embeddings Inference ships with multiple Docker images that you can use to target a specific backend: - -| Architecture | Image | -|-------------------------------------|-------------------------------------------------------------------------| -| 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.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. - -### API documentation - -You can consult the OpenAPI documentation of the `text-embeddings-inference` REST API using the `/docs` route. -The Swagger UI is also available -at: [https://huggingface.github.io/text-embeddings-inference](https://huggingface.github.io/text-embeddings-inference). - -### Using a private or gated model - -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 `HF_API_TOKEN=` - -or with Docker: - -```shell -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 -``` - -### Using Re-rankers models - -`text-embeddings-inference` v0.4.0 added support for CamemBERT, RoBERTa and XLM-RoBERTa Sequence Classification models. -Re-rankers models are Sequence Classification cross-encoders models with a single class that scores the similarity -between a query and a text. - -See [this blogpost](https://blog.llamaindex.ai/boosting-rag-picking-the-best-embedding-reranker-models-42d079022e83) by -the LlamaIndex team to understand how you can use re-rankers models in your RAG pipeline to improve -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 -``` - -And then you can rank the similarity between a query and a list of texts with: - -```bash -curl 127.0.0.1:8080/rerank \ - -X POST \ - -d '{"query":"What is Deep Learning?", "texts": ["Deep Learning is not...", "Deep learning is..."]}' \ - -H 'Content-Type: application/json' -``` - -### Using Sequence Classification models - -You can also use classic Sequence Classification models like `SamLowe/roberta-base-go_emotions`: - -```shell -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 -``` - -Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: - -```bash -curl 127.0.0.1:8080/predict \ - -X POST \ - -d '{"inputs":"I like you."}' \ - -H 'Content-Type: application/json' -``` - -### Using SPLADE pooling - -You can choose to activate SPLADE pooling for Bert and Distilbert MaskedLM architectures: - -```shell -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 -``` - -Once you have deployed the model you can use the `/embed_sparse` endpoint to get the sparse embedding: - -```bash -curl 127.0.0.1:8080/embed_sparse \ - -X POST \ - -d '{"inputs":"I like you."}' \ - -H 'Content-Type: application/json' -``` - -### Distributed Tracing - -`text-embeddings-inference` is instrumented with distributed tracing using OpenTelemetry. You can use this feature -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). - -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 -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 -``` - -```shell -grpcurl -d '{"inputs": "What is Deep Learning"}' -plaintext 0.0.0.0:8080 tei.v1.Embed/Embed -``` - -## Local install - -### CPU - -You can also opt to install `text-embeddings-inference` locally. - -First [install Rust](https://rustup.rs/): - -```shell -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -``` - -Then run: - -```shell -# On x86 -cargo install --path router -F mkl -# On M1 or M2 -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 - -text-embeddings-router --model-id $model --revision $revision --port 8080 -``` - -**Note:** on some machines, you may also need the OpenSSL libraries and gcc. On Linux machines, run: - -```shell -sudo apt-get install libssl-dev gcc -y -``` - -### Cuda - -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. -You also need to add the nvidia binaries to your path: - -```shell -export PATH=$PATH:/usr/local/cuda/bin -``` - -Then run: - -```shell -# This can take a while as we need to compile a lot of cuda kernels - -# On Turing GPUs (T4, RTX 2000 series ... ) -cargo install --path router -F candle-cuda-turing -F http --no-default-features - -# On Ampere and Hopper -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 - -text-embeddings-router --model-id $model --revision $revision --port 8080 -``` - -## Docker build - -You can build the CPU container with: - -```shell -docker build . -``` - -To build the Cuda containers, you need to know the compute cap of the GPU you will be using -at runtime. - -Then you can build the container with: - -```shell -# Example for Turing (T4, RTX 2000 series, ...) -runtime_compute_cap=75 - -# Example for A100 -runtime_compute_cap=80 - -# Example for A10 -runtime_compute_cap=86 - -# Example for Ada Lovelace (RTX 4000 series, ...) -runtime_compute_cap=89 - -# Example for H100 -runtime_compute_cap=90 - -docker build . -f Dockerfile-cuda --build-arg CUDA_COMPUTE_CAP=$runtime_compute_cap -``` - -### 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. - -``` -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) +# Text Embeddings Inference on Habana Gaudi + +To use [🤗 text-embeddings-inference](https://github.com/huggingface/text-embeddings-inference) on Habana Gaudi/Gaudi2, follow these steps: + +1. Build the Docker image located in this folder with: + ```bash + docker build -f Dockerfile-hpu -t tei_gaudi . + ``` +2. Launch a local server instance on 1 Gaudi card: + ```bash + 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 -p 8080:80 -v $volume:/data --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice --ipc=host tei_gaudi --model-id $model --pooling cls + ``` +3. You can then send a request: + ```bash + curl 127.0.0.1:8080/embed \ + -X POST \ + -d '{"inputs":"What is Deep Learning?"}' \ + -H 'Content-Type: application/json' + ``` + +For more information and documentation about Text Embeddings Inference, checkout [the README](https://github.com/huggingface/text-embeddings-inference#text-embeddings-inference) of the original repo. + +Not all features of TEI are currently supported as this is still a work in progress. + +> The license to use TEI on Habana Gaudi is the one of TEI: https://github.com/huggingface/text-embeddings-inference/blob/main/LICENSE +> +> Please reach out to api-enterprise@huggingface.co if you have any question. diff --git a/backends/python/server/pyproject.toml b/backends/python/server/pyproject.toml index 96fcaf9e..ec4fa5c4 100644 --- a/backends/python/server/pyproject.toml +++ b/backends/python/server/pyproject.toml @@ -20,7 +20,6 @@ loguru = "^0.6.0" opentelemetry-api = "^1.15.0" opentelemetry-exporter-otlp = "^1.15.0" opentelemetry-instrumentation-grpc = "^0.36b0" -torch = { version = "^2.0.1" } [tool.poetry.extras] diff --git a/backends/python/server/requirements.txt b/backends/python/server/requirements.txt index 89ca314d..879498d1 100644 --- a/backends/python/server/requirements.txt +++ b/backends/python/server/requirements.txt @@ -34,7 +34,7 @@ requests==2.31.0 ; python_version >= "3.9" and python_version < "3.13" safetensors==0.3.3 ; python_version >= "3.9" and python_version < "3.13" setuptools==68.2.0 ; python_version >= "3.9" and python_version < "3.13" sympy==1.12 ; python_version >= "3.9" and python_version < "3.13" -torch==2.0.1 ; python_version >= "3.9" and python_version < "3.13" +transformers==4.35.0 ; python_version >= "3.9" and python_version < "3.13" tqdm==4.66.1 ; python_version >= "3.9" and python_version < "3.13" typer==0.6.1 ; python_version >= "3.9" and python_version < "3.13" typing-extensions==4.7.1 ; python_version >= "3.9" and python_version < "3.13" diff --git a/backends/python/server/text_embeddings_server/models/__init__.py b/backends/python/server/text_embeddings_server/models/__init__.py index 47867187..61e42e6e 100644 --- a/backends/python/server/text_embeddings_server/models/__init__.py +++ b/backends/python/server/text_embeddings_server/models/__init__.py @@ -11,6 +11,13 @@ __all__ = ["Model"] +HTCORE_AVAILABLE = True +try: + import habana_frameworks.torch.core as htcore +except ImportError as e: + logger.warning(f"Could not import htcore: {e}") + HTCORE_AVAILABLE = False + # Disable gradients torch.set_grad_enabled(False) @@ -37,6 +44,8 @@ def get_model(model_path: Path, dtype: Optional[str]): if torch.cuda.is_available(): device = torch.device("cuda") + elif HTCORE_AVAILABLE and torch.hpu.is_available(): + device = torch.device("hpu") else: if dtype != torch.float32: raise ValueError("CPU device only supports float32 dtype") From b41e4ab1b4245c42cd75b30ce2b3406807a48893 Mon Sep 17 00:00:00 2001 From: Libin Tang Date: Wed, 10 Apr 2024 16:25:20 -0700 Subject: [PATCH 56/72] Update default model handle for hpu. (#2) --- .../python/server/text_embeddings_server/models/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backends/python/server/text_embeddings_server/models/__init__.py b/backends/python/server/text_embeddings_server/models/__init__.py index 61e42e6e..8ff0dd25 100644 --- a/backends/python/server/text_embeddings_server/models/__init__.py +++ b/backends/python/server/text_embeddings_server/models/__init__.py @@ -64,5 +64,9 @@ def get_model(model_path: Path, dtype: Optional[str]): return FlashBert(model_path, device, dtype) else: return DefaultModel(model_path, device, dtype) + else: + try: + return DefaultModel(model_path, device, dtype) + except: + raise RuntimeError(f"Unknown model_type {config.model_type}") - raise NotImplementedError From b6d5fc68ec80b703c8ea2a42970eba8ede7f9edc Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Thu, 18 Apr 2024 17:22:32 +0800 Subject: [PATCH 57/72] Enable graph mode for hpu (#3) Signed-off-by: kaixuan --- backends/python/server/requirements.txt | 6 ++++-- .../text_embeddings_server/models/default_model.py | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/backends/python/server/requirements.txt b/backends/python/server/requirements.txt index 879498d1..5755c80a 100644 --- a/backends/python/server/requirements.txt +++ b/backends/python/server/requirements.txt @@ -11,7 +11,7 @@ grpc-interceptor==0.15.3 ; python_version >= "3.9" and python_version < "3.13" grpcio-reflection==1.58.0 ; python_version >= "3.9" and python_version < "3.13" grpcio-status==1.58.0 ; python_version >= "3.9" and python_version < "3.13" grpcio==1.58.0 ; python_version >= "3.9" and python_version < "3.13" -huggingface-hub==0.16.4 ; python_version >= "3.9" and python_version < "3.13" +huggingface-hub==0.20.2 ; python_version >= "3.9" and python_version < "3.13" idna==3.4 ; python_version >= "3.9" and python_version < "3.13" jinja2==3.1.2 ; python_version >= "3.9" and python_version < "3.13" loguru==0.6.0 ; python_version >= "3.9" and python_version < "3.13" @@ -34,7 +34,9 @@ requests==2.31.0 ; python_version >= "3.9" and python_version < "3.13" safetensors==0.3.3 ; python_version >= "3.9" and python_version < "3.13" setuptools==68.2.0 ; python_version >= "3.9" and python_version < "3.13" sympy==1.12 ; python_version >= "3.9" and python_version < "3.13" -transformers==4.35.0 ; python_version >= "3.9" and python_version < "3.13" +transformers==4.37.0 ; python_version >= "3.9" and python_version < "3.13" +optimum-habana==1.10.2 ; python_version >= "3.9" and python_version < "3.13" +optimum==1.17.1 ; python_version >= "3.9" and python_version < "3.13" tqdm==4.66.1 ; python_version >= "3.9" and python_version < "3.13" typer==0.6.1 ; python_version >= "3.9" and python_version < "3.13" typing-extensions==4.7.1 ; python_version >= "3.9" and python_version < "3.13" diff --git a/backends/python/server/text_embeddings_server/models/default_model.py b/backends/python/server/text_embeddings_server/models/default_model.py index dc39fdc8..6162ae4d 100644 --- a/backends/python/server/text_embeddings_server/models/default_model.py +++ b/backends/python/server/text_embeddings_server/models/default_model.py @@ -1,11 +1,15 @@ import inspect import torch +from loguru import logger from pathlib import Path from typing import Type, List from transformers import AutoModel from opentelemetry import trace +from habana_frameworks.torch.hpu import wrap_in_hpu_graph +from optimum.habana.transformers.modeling_utils import adapt_transformers_to_gaudi + from text_embeddings_server.models import Model from text_embeddings_server.models.types import PaddedBatch, Embedding @@ -14,7 +18,12 @@ class DefaultModel(Model): def __init__(self, model_path: Path, device: torch.device, dtype: torch.dtype): + if device == torch.device("hpu"): + adapt_transformers_to_gaudi() model = AutoModel.from_pretrained(model_path).to(dtype).to(device) + if device == torch.device("hpu"): + logger.info("Use graph mode for HPU") + model = wrap_in_hpu_graph(model, disable_tensor_cache=True) self.hidden_size = model.config.hidden_size self.has_position_ids = ( From 42b8e69aa5385f32fa43dcca88841f3d5f078f9d Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Thu, 18 Apr 2024 17:24:19 +0800 Subject: [PATCH 58/72] Change default precision to BF16; fix the bug when input is batched (#4) Signed-off-by: kaixuanliu --- .../server/text_embeddings_server/models/default_model.py | 2 +- backends/src/dtype.rs | 2 ++ router/src/lib.rs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backends/python/server/text_embeddings_server/models/default_model.py b/backends/python/server/text_embeddings_server/models/default_model.py index 6162ae4d..32b90c92 100644 --- a/backends/python/server/text_embeddings_server/models/default_model.py +++ b/backends/python/server/text_embeddings_server/models/default_model.py @@ -51,7 +51,7 @@ def embed(self, batch: PaddedBatch) -> List[Embedding]: output = self.model(**kwargs) embedding = output[0][:, 0] - cpu_results = embedding.view(-1).tolist() + cpu_results = embedding.reshape(-1).tolist() return [ Embedding( diff --git a/backends/src/dtype.rs b/backends/src/dtype.rs index d2c896ce..31d7e740 100644 --- a/backends/src/dtype.rs +++ b/backends/src/dtype.rs @@ -12,6 +12,7 @@ pub enum DType { all(feature = "candle", not(feature = "accelerate")) ))] Float16, + BFloat16, // Float32 is not available on candle cuda #[cfg(any(feature = "python", feature = "candle"))] Float32, @@ -28,6 +29,7 @@ impl fmt::Display for DType { all(feature = "candle", not(feature = "accelerate")) ))] DType::Float16 => write!(f, "float16"), + DType::BFloat16 => write!(f, "bfloat16"), // Float32 is not available on candle cuda #[cfg(any(feature = "python", feature = "candle"))] DType::Float32 => write!(f, "float32"), diff --git a/router/src/lib.rs b/router/src/lib.rs index 57dcecb6..5c9ed072 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -242,7 +242,7 @@ pub async fn run( } #[cfg(not(any(feature = "accelerate", feature = "mkl", feature = "mkl-dynamic")))] { - DType::Float16 + DType::BFloat16 } }); From c4a366ecd3b2ea3acfa93fd05d538de59b8f6dd5 Mon Sep 17 00:00:00 2001 From: regisss <15324346+regisss@users.noreply.github.com> Date: Fri, 19 Apr 2024 11:48:48 +0200 Subject: [PATCH 59/72] Upgrade to v1.2 (#5) --- Cargo.lock | 23 +- Dockerfile-cuda-all | 4 +- backends/python/server/poetry.lock | 2063 +++++++++++++++++++++-- backends/python/server/pyproject.toml | 6 +- backends/python/server/requirements.txt | 53 +- docs/openapi.json | 104 ++ docs/source/en/cli_arguments.md | 15 + 7 files changed, 2138 insertions(+), 130 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a42181cb..e29254ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "backend-grpc-client" -version = "1.4.0" +version = "1.3.0" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -3932,9 +3932,10 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.4.0" +version = "1.3.0" dependencies = [ "clap", + "rand", "text-embeddings-backend-candle", "text-embeddings-backend-core", "text-embeddings-backend-python", @@ -3944,7 +3945,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.4.0" +version = "1.3.0" dependencies = [ "accelerate-src", "anyhow", @@ -3974,7 +3975,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.4.0" +version = "1.3.0" dependencies = [ "clap", "nohash-hasher", @@ -3983,7 +3984,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-python" -version = "1.4.0" +version = "1.3.0" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3997,7 +3998,7 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.4.0" +version = "1.3.0" dependencies = [ "async-channel", "hf-hub", @@ -4012,7 +4013,7 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.4.0" +version = "1.3.0" dependencies = [ "anyhow", "async-stream", @@ -5222,18 +5223,18 @@ dependencies = [ [[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 = [ "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", diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 71321705..43150277 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -85,9 +85,9 @@ COPY Cargo.lock ./ RUN if [ $VERTEX = "true" ]; \ then \ - CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F google && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http -F google --no-default-features && sccache -s; \ else \ - CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing && sccache -s; \ + CUDA_COMPUTE_CAP=75 cargo build --release --bin text-embeddings-router -F candle-cuda-turing -F http --no-default-features && sccache -s; \ fi; RUN mv /usr/src/target/release/text-embeddings-router /usr/src/target/release/text-embeddings-router-75 diff --git a/backends/python/server/poetry.lock b/backends/python/server/poetry.lock index a90d9487..6c01bfea 100644 --- a/backends/python/server/poetry.lock +++ b/backends/python/server/poetry.lock @@ -1,4 +1,174 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "accelerate" +version = "0.27.2" +description = "Accelerate" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "accelerate-0.27.2-py3-none-any.whl", hash = "sha256:a818dd27b9ba24e9eb5030d1b285cf4cdd1b41bbfa675fb4eb2477ddfc097074"}, + {file = "accelerate-0.27.2.tar.gz", hash = "sha256:cc715fe9a8bc7a286259bfb6d65fb78363badd3371e7cbda4e4a4ef34a0010aa"}, +] + +[package.dependencies] +huggingface-hub = "*" +numpy = ">=1.17" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = ">=0.3.1" +torch = ">=1.10.0" + +[package.extras] +dev = ["bitsandbytes", "black (>=23.1,<24.0)", "datasets", "deepspeed (<0.13.0)", "evaluate", "hf-doc-builder (>=0.3.0)", "parameterized", "pytest", "pytest-subtests", "pytest-xdist", "rich", "ruff (>=0.1.15,<0.2.0)", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +quality = ["black (>=23.1,<24.0)", "hf-doc-builder (>=0.3.0)", "ruff (>=0.1.15,<0.2.0)"] +rich = ["rich"] +sagemaker = ["sagemaker"] +test-dev = ["bitsandbytes", "datasets", "deepspeed (<0.13.0)", "evaluate", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +test-prod = ["parameterized", "pytest", "pytest-subtests", "pytest-xdist"] +test-trackers = ["comet-ml", "dvclive", "tensorboard", "wandb"] +testing = ["bitsandbytes", "datasets", "deepspeed (<0.13.0)", "evaluate", "parameterized", "pytest", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] + +[[package]] +name = "aiohttp" +version = "3.9.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "backoff" @@ -131,6 +301,67 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "coloredlogs" +version = "15.0.1" +description = "Colored terminal output for Python's logging module" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, + {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, +] + +[package.dependencies] +humanfriendly = ">=9.1" + +[package.extras] +cron = ["capturer (>=2.4)"] + +[[package]] +name = "datasets" +version = "2.18.0" +description = "HuggingFace community-driven open-source library of datasets" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "datasets-2.18.0-py3-none-any.whl", hash = "sha256:f1bbf0e2896917a914de01cbd37075b14deea3837af87ad0d9f697388ccaeb50"}, + {file = "datasets-2.18.0.tar.gz", hash = "sha256:cdf8b8c6abf7316377ba4f49f9589a4c74556d6b481afd0abd2284f3d69185cb"}, +] + +[package.dependencies] +aiohttp = "*" +dill = ">=0.3.0,<0.3.9" +filelock = "*" +fsspec = {version = ">=2023.1.0,<=2024.2.0", extras = ["http"]} +huggingface-hub = ">=0.19.4" +multiprocess = "*" +numpy = ">=1.17" +packaging = "*" +pandas = "*" +pyarrow = ">=12.0.0" +pyarrow-hotfix = "*" +pyyaml = ">=5.1" +requests = ">=2.19.0" +tqdm = ">=4.62.1" +xxhash = "*" + +[package.extras] +apache-beam = ["apache-beam (>=2.26.0)"] +audio = ["librosa", "soundfile (>=0.12.1)"] +benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] +dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +docs = ["s3fs", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos", "torch", "transformers"] +jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] +metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] +quality = ["ruff (>=0.3.0)"] +s3 = ["s3fs"] +tensorflow = ["tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos"] +tensorflow-gpu = ["tensorflow-gpu (>=2.2.0,!=2.6.0,!=2.6.1)"] +tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +torch = ["torch"] +vision = ["Pillow (>=6.2.1)"] + [[package]] name = "deprecated" version = "1.2.14" @@ -148,6 +379,51 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] +[[package]] +name = "diffusers" +version = "0.26.3" +description = "State-of-the-art diffusion in PyTorch and JAX." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "diffusers-0.26.3-py3-none-any.whl", hash = "sha256:f8f5710c8f9170e9749f0b104f50fc4a1259f8aff3effed99598409a5ea9b1cd"}, + {file = "diffusers-0.26.3.tar.gz", hash = "sha256:e217ea39e85b0bd34fee11f8b39fd00116680b05ff7a70c0b4fdab5351ae4f96"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.20.2" +importlib-metadata = "*" +numpy = "*" +Pillow = "*" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.3.1" + +[package.extras] +dev = ["GitPython (<3.1.19)", "Jinja2", "accelerate (>=0.11.0)", "compel (==0.1.8)", "datasets", "flax (>=0.4.1)", "hf-doc-builder (>=0.3.0)", "invisible-watermark (>=0.2.0)", "isort (>=5.5.4)", "jax (>=0.4.1)", "jaxlib (>=0.4.1)", "k-diffusion (>=0.0.12)", "librosa", "parameterized", "peft (>=0.6.0)", "protobuf (>=3.20.3,<4)", "pytest", "pytest-timeout", "pytest-xdist", "requests-mock (==1.10.0)", "ruff (==0.1.5)", "safetensors (>=0.3.1)", "scipy", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "torch (>=1.4,<2.2.0)", "torchvision (<0.17)", "transformers (>=4.25.1)", "urllib3 (<=2.0.0)"] +docs = ["hf-doc-builder (>=0.3.0)"] +flax = ["flax (>=0.4.1)", "jax (>=0.4.1)", "jaxlib (>=0.4.1)"] +quality = ["hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<=2.0.0)"] +test = ["GitPython (<3.1.19)", "Jinja2", "compel (==0.1.8)", "datasets", "invisible-watermark (>=0.2.0)", "k-diffusion (>=0.0.12)", "librosa", "parameterized", "pytest", "pytest-timeout", "pytest-xdist", "requests-mock (==1.10.0)", "safetensors (>=0.3.1)", "scipy", "sentencepiece (>=0.1.91,!=0.1.92)", "torchvision (<0.17)", "transformers (>=4.25.1)"] +torch = ["accelerate (>=0.11.0)", "torch (>=1.4,<2.2.0)"] +training = ["Jinja2", "accelerate (>=0.11.0)", "datasets", "peft (>=0.6.0)", "protobuf (>=3.20.3,<4)", "tensorboard"] + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + [[package]] name = "exceptiongroup" version = "1.1.3" @@ -164,21 +440,143 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.12.3" +version = "3.13.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, - {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2024.2.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, + {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, ] [package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} +aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} [package.extras] -docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] [[package]] name = "googleapis-common-protos" @@ -361,6 +759,54 @@ grpcio = ">=1.58.0" protobuf = ">=4.21.6,<5.0dev" setuptools = "*" +[[package]] +name = "huggingface-hub" +version = "0.22.2" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.22.2-py3-none-any.whl", hash = "sha256:3429e25f38ccb834d310804a3b711e7e4953db5a9e420cc147a5e194ca90fd17"}, + {file = "huggingface_hub-0.22.2.tar.gz", hash = "sha256:32e9a9a6843c92f253ff9ca16b9985def4d80a93fb357af5353f770ef74a81be"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[package]] +name = "humanfriendly" +version = "10.0" +description = "Human friendly output for text interfaces using Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, + {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, +] + +[package.dependencies] +pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} + [[package]] name = "idna" version = "3.4" @@ -372,6 +818,25 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "importlib-metadata" +version = "7.1.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -385,13 +850,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -420,71 +885,71 @@ dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -504,23 +969,332 @@ docs = ["sphinx"] gmpy = ["gmpy2 (>=2.1.0a4)"] tests = ["pytest (>=4.6)"] +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +description = "better multiprocessing and multithreading in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37b55f71c07e2d741374998c043b9520b626a8dddc8b3129222ca4f1a06ef67a"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba8c31889abf4511c7308a8c52bb4a30b9d590e7f58523302ba00237702ca054"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:0dfd078c306e08d46d7a8d06fb120313d87aa43af60d66da43ffff40b44d2f41"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e7b9d0f307cd9bd50851afaac0dba2cb6c44449efff697df7c7645f7d3f2be3a"}, + {file = "multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02"}, + {file = "multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a"}, + {file = "multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e"}, + {file = "multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435"}, + {file = "multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3"}, + {file = "multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1"}, +] + +[package.dependencies] +dill = ">=0.3.8" + [[package]] name = "networkx" -version = "3.1" +version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.18.1" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.18.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:1a6c4acefcbebfa6de320f412bf7866de856e786e0462326ba1bac40de0b5e71"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] [[package]] name = "opentelemetry-api" @@ -676,6 +1450,72 @@ files = [ {file = "opentelemetry_semantic_conventions-0.36b0.tar.gz", hash = "sha256:829dc221795467d98b773c04096e29be038d77526dc8d6ac76f546fb6279bf01"}, ] +[[package]] +name = "optimum" +version = "1.19.0" +description = "Optimum Library is an extension of the Hugging Face Transformers library, providing a framework to integrate third-party libraries from Hardware Partners and interface with their specific functionality." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "optimum-1.19.0-py3-none-any.whl", hash = "sha256:b259b2379f6904d7e1bef3f9ab1c3f22ae6c42357b416311950cd65526bb485e"}, + {file = "optimum-1.19.0.tar.gz", hash = "sha256:a1eb134d70d3093eca68160fcf84c1aff8887726641f3362adca878fda095e3d"}, +] + +[package.dependencies] +coloredlogs = "*" +datasets = "*" +huggingface-hub = ">=0.8.0" +numpy = "*" +packaging = "*" +sympy = "*" +torch = ">=1.11" +transformers = {version = ">=4.26.0,<4.40.0", extras = ["sentencepiece"]} + +[package.extras] +amd = ["optimum-amd"] +benchmark = ["evaluate (>=0.2.0)", "optuna", "scikit-learn", "seqeval", "torchvision", "tqdm"] +dev = ["Pillow", "accelerate", "black (>=23.1,<24.0)", "diffusers (>=0.17.0)", "einops", "invisible-watermark", "parameterized", "pytest (<=8.0.0)", "pytest-xdist", "requests", "rjieba", "ruff (==0.1.5)", "sacremoses", "scikit-learn", "timm", "torchaudio", "torchvision"] +diffusers = ["diffusers"] +doc-build = ["accelerate"] +exporters = ["onnx", "onnxruntime", "timm"] +exporters-gpu = ["onnx", "onnxruntime-gpu", "timm"] +exporters-tf = ["h5py", "numpy (<1.24.0)", "onnx", "onnxruntime", "tensorflow (>=2.4,<=2.12.1)", "tf2onnx", "timm", "transformers[sentencepiece] (>=4.26.0,<4.38.0)"] +furiosa = ["optimum-furiosa"] +graphcore = ["optimum-graphcore"] +habana = ["optimum-habana", "transformers (>=4.37.0,<4.38.0)"] +intel = ["optimum-intel (>=1.15.0)"] +neural-compressor = ["optimum-intel[neural-compressor] (>=1.15.0)"] +neuron = ["optimum-neuron[neuron] (>=0.0.20)", "transformers (==4.36.2)"] +neuronx = ["optimum-neuron[neuronx] (>=0.0.20)", "transformers (==4.36.2)"] +nncf = ["optimum-intel[nncf] (>=1.15.0)"] +onnxruntime = ["datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime (>=1.11.0)", "protobuf (>=3.20.1)"] +onnxruntime-gpu = ["accelerate", "datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime-gpu (>=1.11.0)", "protobuf (>=3.20.1)"] +openvino = ["optimum-intel[openvino] (>=1.15.0)"] +quality = ["black (>=23.1,<24.0)", "ruff (==0.1.5)"] +tests = ["Pillow", "accelerate", "diffusers (>=0.17.0)", "einops", "invisible-watermark", "parameterized", "pytest (<=8.0.0)", "pytest-xdist", "requests", "rjieba", "sacremoses", "scikit-learn", "timm", "torchaudio", "torchvision"] + +[[package]] +name = "optimum-habana" +version = "1.10.2" +description = "Optimum Habana is the interface between the Hugging Face Transformers and Diffusers libraries and Habana's Gaudi processor (HPU). It provides a set of tools enabling easy model loading, training and inference on single- and multi-HPU settings for different downstream tasks." +optional = false +python-versions = "*" +files = [ + {file = "optimum-habana-1.10.2.tar.gz", hash = "sha256:328e76e608afeda81f27552cfba919a243b5b473936f9d14e97c72c9113406e8"}, + {file = "optimum_habana-1.10.2-py3-none-any.whl", hash = "sha256:28bc44a8ca66cb32a3ea46df38913c133889b8a75330fb7fe0c6b92f496b44d0"}, +] + +[package.dependencies] +accelerate = "<0.28.0" +diffusers = ">=0.26.0,<0.27.0" +optimum = "*" +torch = "*" +transformers = ">=4.37.0,<4.38.0" + +[package.extras] +quality = ["hf-doc-builder", "ruff"] +tests = ["GitPython", "datasets", "optuna", "parameterized", "psutil", "pytest", "safetensors", "sentencepiece"] + [[package]] name = "packaging" version = "23.1" @@ -687,6 +1527,165 @@ files = [ {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pillow" +version = "10.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + [[package]] name = "pluggy" version = "1.3.0" @@ -724,6 +1723,104 @@ files = [ {file = "protobuf-4.24.3.tar.gz", hash = "sha256:12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d"}, ] +[[package]] +name = "psutil" +version = "5.9.8" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "pyarrow" +version = "15.0.2" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-15.0.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:88b340f0a1d05b5ccc3d2d986279045655b1fe8e41aba6ca44ea28da0d1455d8"}, + {file = "pyarrow-15.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eaa8f96cecf32da508e6c7f69bb8401f03745c050c1dd42ec2596f2e98deecac"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c6753ed4f6adb8461e7c383e418391b8d8453c5d67e17f416c3a5d5709afbd"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:290e36a59a0993e9a5224ed2fb3e53375770f07379a0ea03ee2fce2e6d30b423"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06c2bb2a98bc792f040bef31ad3e9be6a63d0cb39189227c08a7d955db96816e"}, + {file = "pyarrow-15.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a197f3670606a960ddc12adbe8075cea5f707ad7bf0dffa09637fdbb89f76c"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5f8bc839ea36b1f99984c78e06e7a06054693dc2af8920f6fb416b5bca9944e4"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5e81dfb4e519baa6b4c80410421528c214427e77ca0ea9461eb4097c328fa33"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4f240852b302a7af4646c8bfe9950c4691a419847001178662a98915fd7ee7"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e7d9cfb5a1e648e172428c7a42b744610956f3b70f524aa3a6c02a448ba853e"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2d4f905209de70c0eb5b2de6763104d5a9a37430f137678edfb9a675bac9cd98"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90adb99e8ce5f36fbecbbc422e7dcbcbed07d985eed6062e459e23f9e71fd197"}, + {file = "pyarrow-15.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:b116e7fd7889294cbd24eb90cd9bdd3850be3738d61297855a71ac3b8124ee38"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:25335e6f1f07fdaa026a61c758ee7d19ce824a866b27bba744348fa73bb5a440"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90f19e976d9c3d8e73c80be84ddbe2f830b6304e4c576349d9360e335cd627fc"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22366249bf5fd40ddacc4f03cd3160f2d7c247692945afb1899bab8a140ddfb"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2a335198f886b07e4b5ea16d08ee06557e07db54a8400cc0d03c7f6a22f785f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e6d459c0c22f0b9c810a3917a1de3ee704b021a5fb8b3bacf968eece6df098f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:033b7cad32198754d93465dcfb71d0ba7cb7cd5c9afd7052cab7214676eec38b"}, + {file = "pyarrow-15.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:29850d050379d6e8b5a693098f4de7fd6a2bea4365bfd073d7c57c57b95041ee"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7167107d7fb6dcadb375b4b691b7e316f4368f39f6f45405a05535d7ad5e5058"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e85241b44cc3d365ef950432a1b3bd44ac54626f37b2e3a0cc89c20e45dfd8bf"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:248723e4ed3255fcd73edcecc209744d58a9ca852e4cf3d2577811b6d4b59818"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ff3bdfe6f1b81ca5b73b70a8d482d37a766433823e0c21e22d1d7dde76ca33f"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f3d77463dee7e9f284ef42d341689b459a63ff2e75cee2b9302058d0d98fe142"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:8c1faf2482fb89766e79745670cbca04e7018497d85be9242d5350cba21357e1"}, + {file = "pyarrow-15.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:28f3016958a8e45a1069303a4a4f6a7d4910643fc08adb1e2e4a7ff056272ad3"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:89722cb64286ab3d4daf168386f6968c126057b8c7ec3ef96302e81d8cdb8ae4"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0ba387705044b3ac77b1b317165c0498299b08261d8122c96051024f953cd5"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2459bf1f22b6a5cdcc27ebfd99307d5526b62d217b984b9f5c974651398832"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58922e4bfece8b02abf7159f1f53a8f4d9f8e08f2d988109126c17c3bb261f22"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:adccc81d3dc0478ea0b498807b39a8d41628fa9210729b2f718b78cb997c7c91"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8bd2baa5fe531571847983f36a30ddbf65261ef23e496862ece83bdceb70420d"}, + {file = "pyarrow-15.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6669799a1d4ca9da9c7e06ef48368320f5856f36f9a4dd31a11839dda3f6cc8c"}, + {file = "pyarrow-15.0.2.tar.gz", hash = "sha256:9c9bc803cb3b7bfacc1e96ffbfd923601065d9d3f911179d81e72d99fd74a3d9"}, +] + +[package.dependencies] +numpy = ">=1.16.6,<2" + +[[package]] +name = "pyarrow-hotfix" +version = "0.6" +description = "" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyarrow_hotfix-0.6-py3-none-any.whl", hash = "sha256:dcc9ae2d220dff0083be6a9aa8e0cdee5182ad358d4931fce825c545e5c89178"}, + {file = "pyarrow_hotfix-0.6.tar.gz", hash = "sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945"}, +] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +optional = false +python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] + [[package]] name = "pytest" version = "7.4.2" @@ -746,6 +1843,193 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "regex" +version = "2024.4.16" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08"}, + {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18"}, + {file = "regex-2024.4.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a"}, + {file = "regex-2024.4.16-cp310-cp310-win32.whl", hash = "sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0"}, + {file = "regex-2024.4.16-cp310-cp310-win_amd64.whl", hash = "sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2"}, + {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26"}, + {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd"}, + {file = "regex-2024.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6"}, + {file = "regex-2024.4.16-cp311-cp311-win32.whl", hash = "sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d"}, + {file = "regex-2024.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9"}, + {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd"}, + {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec"}, + {file = "regex-2024.4.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc"}, + {file = "regex-2024.4.16-cp312-cp312-win32.whl", hash = "sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b"}, + {file = "regex-2024.4.16-cp312-cp312-win_amd64.whl", hash = "sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9"}, + {file = "regex-2024.4.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a"}, + {file = "regex-2024.4.16-cp37-cp37m-win32.whl", hash = "sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46"}, + {file = "regex-2024.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331"}, + {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48"}, + {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4"}, + {file = "regex-2024.4.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9"}, + {file = "regex-2024.4.16-cp38-cp38-win32.whl", hash = "sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e"}, + {file = "regex-2024.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834"}, + {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94"}, + {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455"}, + {file = "regex-2024.4.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50"}, + {file = "regex-2024.4.16-cp39-cp39-win32.whl", hash = "sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335"}, + {file = "regex-2024.4.16-cp39-cp39-win_amd64.whl", hash = "sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483"}, + {file = "regex-2024.4.16.tar.gz", hash = "sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0"}, +] + [[package]] name = "requests" version = "2.31.0" @@ -846,6 +2130,68 @@ tensorflow = ["numpy (>=1.21.6)", "tensorflow (>=2.11.0)"] testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] torch = ["numpy (>=1.21.6)", "torch (>=1.10)"] +[[package]] +name = "sentencepiece" +version = "0.2.0" +description = "SentencePiece python wrapper" +optional = false +python-versions = "*" +files = [ + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:188779e1298a1c8b8253c7d3ad729cb0a9891e5cef5e5d07ce4592c54869e227"}, + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bed9cf85b296fa2b76fc2547b9cbb691a523864cebaee86304c43a7b4cb1b452"}, + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d7b67e724bead13f18db6e1d10b6bbdc454af574d70efbb36f27d90387be1ca3"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fde4b08cfe237be4484c6c7c2e2c75fb862cfeab6bd5449ce4caeafd97b767a"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c378492056202d1c48a4979650981635fd97875a00eabb1f00c6a236b013b5e"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1380ce6540a368de2ef6d7e6ba14ba8f3258df650d39ba7d833b79ee68a52040"}, + {file = "sentencepiece-0.2.0-cp310-cp310-win32.whl", hash = "sha256:a1151d6a6dd4b43e552394aed0edfe9292820272f0194bd56c7c1660a0c06c3d"}, + {file = "sentencepiece-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:d490142b0521ef22bc1085f061d922a2a6666175bb6b42e588ff95c0db6819b2"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17982700c4f6dbb55fa3594f3d7e5dd1c8659a274af3738e33c987d2a27c9d5c"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c867012c0e8bcd5bdad0f791609101cb5c66acb303ab3270218d6debc68a65e"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd6071249c74f779c5b27183295b9202f8dedb68034e716784364443879eaa6"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f90c55a65013cbb8f4d7aab0599bf925cde4adc67ae43a0d323677b5a1c6cb"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b293734059ef656dcd65be62ff771507bea8fed0a711b6733976e1ed3add4553"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e58b47f933aca74c6a60a79dcb21d5b9e47416256c795c2d58d55cec27f9551d"}, + {file = "sentencepiece-0.2.0-cp311-cp311-win32.whl", hash = "sha256:c581258cf346b327c62c4f1cebd32691826306f6a41d8c4bec43b010dee08e75"}, + {file = "sentencepiece-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0993dbc665f4113017892f1b87c3904a44d0640eda510abcacdfb07f74286d36"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea5f536e32ea8ec96086ee00d7a4a131ce583a1b18d130711707c10e69601cb2"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0cb51f53b6aae3c36bafe41e86167c71af8370a039f542c43b0cce5ef24a68c"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3212121805afc58d8b00ab4e7dd1f8f76c203ddb9dc94aa4079618a31cf5da0f"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a3149e3066c2a75e0d68a43eb632d7ae728c7925b517f4c05c40f6f7280ce08"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632f3594d3e7ac8b367bca204cb3fd05a01d5b21455acd097ea4c0e30e2f63d7"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f295105c6bdbb05bd5e1b0cafbd78ff95036f5d3641e7949455a3f4e5e7c3109"}, + {file = "sentencepiece-0.2.0-cp312-cp312-win32.whl", hash = "sha256:fb89f811e5efd18bab141afc3fea3de141c3f69f3fe9e898f710ae7fe3aab251"}, + {file = "sentencepiece-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a673a72aab81fef5ebe755c6e0cc60087d1f3a4700835d40537183c1703a45f"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4547683f330289ec4f093027bfeb87f9ef023b2eb6f879fdc4a8187c7e0ffb90"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd6175f7eaec7142d2bf6f6597ce7db4c9ac89acf93fcdb17410c3a8b781eeb"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:859ba1acde782609a0910a26a60e16c191a82bf39b5621107552c0cd79fad00f"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcbbef6cc277f8f18f36959e305f10b1c620442d75addc79c21d7073ae581b50"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-win32.whl", hash = "sha256:536b934e244829e3fe6c4f198652cd82da48adb9aa145c9f00889542726dee3d"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0a91aaa3c769b52440df56fafda683b3aa48e3f2169cf7ee5b8c8454a7f3ae9b"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:787e480ca4c1d08c9985a7eb1eae4345c107729c99e9b5a9a00f2575fc7d4b4b"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4d158189eb2ecffea3a51edf6d25e110b3678ec47f1a40f2d541eafbd8f6250"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e5ca43013e8935f25457a4fca47e315780172c3e821b4b13a890668911c792"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7140d9e5a74a0908493bb4a13f1f16a401297bd755ada4c707e842fbf6f0f5bf"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-win32.whl", hash = "sha256:6cf333625234f247ab357b0bd9836638405ea9082e1543d5b8408f014979dcbf"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff88712338b01031910e8e61e7239aff3ce8869ee31a47df63cb38aadd591bea"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20813a68d4c221b1849c62c30e1281ea81687894d894b8d4a0f4677d9311e0f5"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:926ef920ae2e8182db31d3f5d081ada57804e3e1d3a8c4ef8b117f9d9fb5a945"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89f65f69636b7e9c015b79dff9c9985a9bc7d19ded6f79ef9f1ec920fdd73ecf"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f67eae0dbe6f2d7d6ba50a354623d787c99965f068b81e145d53240198021b0"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98501e075f35dd1a1d5a20f65be26839fcb1938752ec61539af008a5aa6f510b"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d1d2cc4882e8d6a1adf9d5927d7716f80617fc693385661caff21888972269"}, + {file = "sentencepiece-0.2.0-cp38-cp38-win32.whl", hash = "sha256:b99a308a2e5e569031ab164b74e6fab0b6f37dfb493c32f7816225f4d411a6dd"}, + {file = "sentencepiece-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cdb701eec783d3ec86b7cd4c763adad8eaf6b46db37ee1c36e5e6c44b3fe1b5f"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1e0f9c4d0a6b0af59b613175f019916e28ade076e21242fd5be24340d8a2f64a"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:298f21cc1366eb60311aedba3169d30f885c363ddbf44214b0a587d2908141ad"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f1ec95aa1e5dab11f37ac7eff190493fd87770f7a8b81ebc9dd768d1a3c8704"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b06b70af54daa4b4904cbb90b4eb6d35c9f3252fdc86c9c32d5afd4d30118d8"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e37bac44dd6603388cb598c64ff7a76e41ca774646f21c23aadfbf5a2228ab"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0461324897735512a32d222e3d886e24ad6a499761952b6bda2a9ee6e4313ea5"}, + {file = "sentencepiece-0.2.0-cp39-cp39-win32.whl", hash = "sha256:38aed822fb76435fa1f12185f10465a94ab9e51d5e8a9159e9a540ce926f0ffd"}, + {file = "sentencepiece-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:d8cf876516548b5a1d6ac4745d8b554f5c07891d55da557925e5c13ff0b4e6ad"}, + {file = "sentencepiece-0.2.0.tar.gz", hash = "sha256:a52c19171daaf2e697dc6cbe67684e0fa341b1248966f6aebb541de654d15843"}, +] + [[package]] name = "setuptools" version = "68.2.0" @@ -862,6 +2208,17 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + [[package]] name = "sympy" version = "1.12" @@ -876,6 +2233,133 @@ files = [ [package.dependencies] mpmath = ">=0.19" +[[package]] +name = "tokenizers" +version = "0.15.2" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.15.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:52f6130c9cbf70544287575a985bf44ae1bda2da7e8c24e97716080593638012"}, + {file = "tokenizers-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:054c1cc9c6d68f7ffa4e810b3d5131e0ba511b6e4be34157aa08ee54c2f8d9ee"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9b9b070fdad06e347563b88c278995735292ded1132f8657084989a4c84a6d5"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea621a7eef4b70e1f7a4e84dd989ae3f0eeb50fc8690254eacc08acb623e82f1"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf7fd9a5141634fa3aa8d6b7be362e6ae1b4cda60da81388fa533e0b552c98fd"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44f2a832cd0825295f7179eaf173381dc45230f9227ec4b44378322d900447c9"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b9ec69247a23747669ec4b0ca10f8e3dfb3545d550258129bd62291aabe8605"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b6a4c78da863ff26dbd5ad9a8ecc33d8a8d97b535172601cf00aee9d7ce9ce"}, + {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5ab2a4d21dcf76af60e05af8063138849eb1d6553a0d059f6534357bce8ba364"}, + {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a47acfac7e511f6bbfcf2d3fb8c26979c780a91e06fb5b9a43831b2c0153d024"}, + {file = "tokenizers-0.15.2-cp310-none-win32.whl", hash = "sha256:064ff87bb6acdbd693666de9a4b692add41308a2c0ec0770d6385737117215f2"}, + {file = "tokenizers-0.15.2-cp310-none-win_amd64.whl", hash = "sha256:3b919afe4df7eb6ac7cafd2bd14fb507d3f408db7a68c43117f579c984a73843"}, + {file = "tokenizers-0.15.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:89cd1cb93e4b12ff39bb2d626ad77e35209de9309a71e4d3d4672667b4b256e7"}, + {file = "tokenizers-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfed5c64e5be23d7ee0f0e98081a25c2a46b0b77ce99a4f0605b1ec43dd481fa"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a907d76dcfda37023ba203ab4ceeb21bc5683436ebefbd895a0841fd52f6f6f2"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20ea60479de6fc7b8ae756b4b097572372d7e4032e2521c1bbf3d90c90a99ff0"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:48e2b9335be2bc0171df9281385c2ed06a15f5cf121c44094338306ab7b33f2c"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:112a1dd436d2cc06e6ffdc0b06d55ac019a35a63afd26475205cb4b1bf0bfbff"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4620cca5c2817177ee8706f860364cc3a8845bc1e291aaf661fb899e5d1c45b0"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd73a82751c523b3fc31ff8194702e4af4db21dc20e55b30ecc2079c5d43cb7"}, + {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:107089f135b4ae7817affe6264f8c7a5c5b4fd9a90f9439ed495f54fcea56fb4"}, + {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0ff110ecc57b7aa4a594396525a3451ad70988e517237fe91c540997c4e50e29"}, + {file = "tokenizers-0.15.2-cp311-none-win32.whl", hash = "sha256:6d76f00f5c32da36c61f41c58346a4fa7f0a61be02f4301fd30ad59834977cc3"}, + {file = "tokenizers-0.15.2-cp311-none-win_amd64.whl", hash = "sha256:cc90102ed17271cf0a1262babe5939e0134b3890345d11a19c3145184b706055"}, + {file = "tokenizers-0.15.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f86593c18d2e6248e72fb91c77d413a815153b8ea4e31f7cd443bdf28e467670"}, + {file = "tokenizers-0.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0774bccc6608eca23eb9d620196687c8b2360624619623cf4ba9dc9bd53e8b51"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d0222c5b7c9b26c0b4822a82f6a7011de0a9d3060e1da176f66274b70f846b98"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3835738be1de66624fff2f4f6f6684775da4e9c00bde053be7564cbf3545cc66"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0143e7d9dcd811855c1ce1ab9bf5d96d29bf5e528fd6c7824d0465741e8c10fd"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db35825f6d54215f6b6009a7ff3eedee0848c99a6271c870d2826fbbedf31a38"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f5e64b0389a2be47091d8cc53c87859783b837ea1a06edd9d8e04004df55a5c"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e0480c452217edd35eca56fafe2029fb4d368b7c0475f8dfa3c5c9c400a7456"}, + {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a33ab881c8fe70474980577e033d0bc9a27b7ab8272896e500708b212995d834"}, + {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a308a607ca9de2c64c1b9ba79ec9a403969715a1b8ba5f998a676826f1a7039d"}, + {file = "tokenizers-0.15.2-cp312-none-win32.whl", hash = "sha256:b8fcfa81bcb9447df582c5bc96a031e6df4da2a774b8080d4f02c0c16b42be0b"}, + {file = "tokenizers-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:38d7ab43c6825abfc0b661d95f39c7f8af2449364f01d331f3b51c94dcff7221"}, + {file = "tokenizers-0.15.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:38bfb0204ff3246ca4d5e726e8cc8403bfc931090151e6eede54d0e0cf162ef0"}, + {file = "tokenizers-0.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c861d35e8286a53e06e9e28d030b5a05bcbf5ac9d7229e561e53c352a85b1fc"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:936bf3842db5b2048eaa53dade907b1160f318e7c90c74bfab86f1e47720bdd6"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:620beacc3373277700d0e27718aa8b25f7b383eb8001fba94ee00aeea1459d89"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2735ecbbf37e52db4ea970e539fd2d450d213517b77745114f92867f3fc246eb"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:473c83c5e2359bb81b0b6fde870b41b2764fcdd36d997485e07e72cc3a62264a"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968fa1fb3c27398b28a4eca1cbd1e19355c4d3a6007f7398d48826bbe3a0f728"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:865c60ae6eaebdde7da66191ee9b7db52e542ed8ee9d2c653b6d190a9351b980"}, + {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7c0d8b52664ab2d4a8d6686eb5effc68b78608a9008f086a122a7b2996befbab"}, + {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f33dfbdec3784093a9aebb3680d1f91336c56d86cc70ddf88708251da1fe9064"}, + {file = "tokenizers-0.15.2-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d44ba80988ff9424e33e0a49445072ac7029d8c0e1601ad25a0ca5f41ed0c1d6"}, + {file = "tokenizers-0.15.2-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:dce74266919b892f82b1b86025a613956ea0ea62a4843d4c4237be2c5498ed3a"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0ef06b9707baeb98b316577acb04f4852239d856b93e9ec3a299622f6084e4be"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73e2e74bbb07910da0d37c326869f34113137b23eadad3fc00856e6b3d9930c"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eeb12daf02a59e29f578a865f55d87cd103ce62bd8a3a5874f8fdeaa82e336b"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ba9f6895af58487ca4f54e8a664a322f16c26bbb442effd01087eba391a719e"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccec77aa7150e38eec6878a493bf8c263ff1fa8a62404e16c6203c64c1f16a26"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f40604f5042ff210ba82743dda2b6aa3e55aa12df4e9f2378ee01a17e2855e"}, + {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5645938a42d78c4885086767c70923abad047163d809c16da75d6b290cb30bbe"}, + {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05a77cbfebe28a61ab5c3891f9939cc24798b63fa236d84e5f29f3a85a200c00"}, + {file = "tokenizers-0.15.2-cp37-none-win32.whl", hash = "sha256:361abdc068e8afe9c5b818769a48624687fb6aaed49636ee39bec4e95e1a215b"}, + {file = "tokenizers-0.15.2-cp37-none-win_amd64.whl", hash = "sha256:7ef789f83eb0f9baeb4d09a86cd639c0a5518528f9992f38b28e819df397eb06"}, + {file = "tokenizers-0.15.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4fe1f74a902bee74a3b25aff180fbfbf4f8b444ab37c4d496af7afd13a784ed2"}, + {file = "tokenizers-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c4b89038a684f40a6b15d6b09f49650ac64d951ad0f2a3ea9169687bbf2a8ba"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d05a1b06f986d41aed5f2de464c003004b2df8aaf66f2b7628254bcbfb72a438"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508711a108684111ec8af89d3a9e9e08755247eda27d0ba5e3c50e9da1600f6d"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:daa348f02d15160cb35439098ac96e3a53bacf35885072611cd9e5be7d333daa"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:494fdbe5932d3416de2a85fc2470b797e6f3226c12845cadf054dd906afd0442"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2d60f5246f4da9373f75ff18d64c69cbf60c3bca597290cea01059c336d2470"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93268e788825f52de4c7bdcb6ebc1fcd4a5442c02e730faa9b6b08f23ead0e24"}, + {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6fc7083ab404019fc9acafe78662c192673c1e696bd598d16dc005bd663a5cf9"}, + {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e39b41e5531d6b2122a77532dbea60e171ef87a3820b5a3888daa847df4153"}, + {file = "tokenizers-0.15.2-cp38-none-win32.whl", hash = "sha256:06cd0487b1cbfabefb2cc52fbd6b1f8d4c37799bd6c6e1641281adaa6b2504a7"}, + {file = "tokenizers-0.15.2-cp38-none-win_amd64.whl", hash = "sha256:5179c271aa5de9c71712e31cb5a79e436ecd0d7532a408fa42a8dbfa4bc23fd9"}, + {file = "tokenizers-0.15.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82f8652a74cc107052328b87ea8b34291c0f55b96d8fb261b3880216a9f9e48e"}, + {file = "tokenizers-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02458bee6f5f3139f1ebbb6d042b283af712c0981f5bc50edf771d6b762d5e4f"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9a09cd26cca2e1c349f91aa665309ddb48d71636370749414fbf67bc83c5343"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:158be8ea8554e5ed69acc1ce3fbb23a06060bd4bbb09029431ad6b9a466a7121"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ddba9a2b0c8c81633eca0bb2e1aa5b3a15362b1277f1ae64176d0f6eba78ab1"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ef5dd1d39797044642dbe53eb2bc56435308432e9c7907728da74c69ee2adca"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:454c203164e07a860dbeb3b1f4a733be52b0edbb4dd2e5bd75023ffa8b49403a"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf6b7f1d4dc59af960e6ffdc4faffe6460bbfa8dce27a58bf75755ffdb2526d"}, + {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2ef09bbc16519f6c25d0c7fc0c6a33a6f62923e263c9d7cca4e58b8c61572afb"}, + {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c9a2ebdd2ad4ec7a68e7615086e633857c85e2f18025bd05d2a4399e6c5f7169"}, + {file = "tokenizers-0.15.2-cp39-none-win32.whl", hash = "sha256:918fbb0eab96fe08e72a8c2b5461e9cce95585d82a58688e7f01c2bd546c79d0"}, + {file = "tokenizers-0.15.2-cp39-none-win_amd64.whl", hash = "sha256:524e60da0135e106b254bd71f0659be9f89d83f006ea9093ce4d1fab498c6d0d"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9b648a58281c4672212fab04e60648fde574877d0139cd4b4f93fe28ca8944"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7c7d18b733be6bbca8a55084027f7be428c947ddf871c500ee603e375013ffba"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:13ca3611de8d9ddfbc4dc39ef54ab1d2d4aaa114ac8727dfdc6a6ec4be017378"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:237d1bf3361cf2e6463e6c140628e6406766e8b27274f5fcc62c747ae3c6f094"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67a0fe1e49e60c664915e9fb6b0cb19bac082ab1f309188230e4b2920230edb3"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e022fe65e99230b8fd89ebdfea138c24421f91c1a4f4781a8f5016fd5cdfb4d"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d857be2df69763362ac699f8b251a8cd3fac9d21893de129bc788f8baaef2693"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:708bb3e4283177236309e698da5fcd0879ce8fd37457d7c266d16b550bcbbd18"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c35e09e9899b72a76e762f9854e8750213f67567787d45f37ce06daf57ca78"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1257f4394be0d3b00de8c9e840ca5601d0a4a8438361ce9c2b05c7d25f6057b"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02272fe48280e0293a04245ca5d919b2c94a48b408b55e858feae9618138aeda"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dc3ad9ebc76eabe8b1d7c04d38be884b8f9d60c0cdc09b0aa4e3bcf746de0388"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:32e16bdeffa7c4f46bf2152172ca511808b952701d13e7c18833c0b73cb5c23f"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fb16ba563d59003028b678d2361a27f7e4ae0ab29c7a80690efa20d829c81fdb"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:2277c36d2d6cdb7876c274547921a42425b6810d38354327dd65a8009acf870c"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cf75d32e8d250781940d07f7eece253f2fe9ecdb1dc7ba6e3833fa17b82fcbc"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1b3b31884dc8e9b21508bb76da80ebf7308fdb947a17affce815665d5c4d028"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10122d8d8e30afb43bb1fe21a3619f62c3e2574bff2699cf8af8b0b6c5dc4a3"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d88b96ff0fe8e91f6ef01ba50b0d71db5017fa4e3b1d99681cec89a85faf7bf7"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:37aaec5a52e959892870a7c47cef80c53797c0db9149d458460f4f31e2fb250e"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2ea752f2b0fe96eb6e2f3adbbf4d72aaa1272079b0dfa1145507bd6a5d537e6"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b19a808d8799fda23504a5cd31d2f58e6f52f140380082b352f877017d6342b"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c86e5e068ac8b19204419ed8ca90f9d25db20578f5881e337d203b314f4104"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de19c4dc503c612847edf833c82e9f73cd79926a384af9d801dcf93f110cea4e"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea09acd2fe3324174063d61ad620dec3bcf042b495515f27f638270a7d466e8b"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cf27fd43472e07b57cf420eee1e814549203d56de00b5af8659cb99885472f1f"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7ca22bd897537a0080521445d91a58886c8c04084a6a19e6c78c586e0cfa92a5"}, + {file = "tokenizers-0.15.2.tar.gz", hash = "sha256:e6e9c6e019dd5484be5beafc775ae6c925f4c69a3487040ed09b45e13df2cb91"}, +] + +[package.dependencies] +huggingface_hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] + [[package]] name = "tomli" version = "2.0.1" @@ -889,43 +2373,172 @@ files = [ [[package]] name = "torch" -version = "2.0.1" +version = "2.1.2" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.0.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ced00b3ba471856b993822508f77c98f48a458623596a4c43136158781e306a"}, - {file = "torch-2.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:359bfaad94d1cda02ab775dc1cc386d585712329bb47b8741607ef6ef4950747"}, - {file = "torch-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7c84e44d9002182edd859f3400deaa7410f5ec948a519cc7ef512c2f9b34d2c4"}, - {file = "torch-2.0.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:567f84d657edc5582d716900543e6e62353dbe275e61cdc36eda4929e46df9e7"}, - {file = "torch-2.0.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:787b5a78aa7917465e9b96399b883920c88a08f4eb63b5a5d2d1a16e27d2f89b"}, - {file = "torch-2.0.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e617b1d0abaf6ced02dbb9486803abfef0d581609b09641b34fa315c9c40766d"}, - {file = "torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b6019b1de4978e96daa21d6a3ebb41e88a0b474898fe251fd96189587408873e"}, - {file = "torch-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:dbd68cbd1cd9da32fe5d294dd3411509b3d841baecb780b38b3b7b06c7754434"}, - {file = "torch-2.0.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:ef654427d91600129864644e35deea761fb1fe131710180b952a6f2e2207075e"}, - {file = "torch-2.0.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:25aa43ca80dcdf32f13da04c503ec7afdf8e77e3a0183dd85cd3e53b2842e527"}, - {file = "torch-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5ef3ea3d25441d3957348f7e99c7824d33798258a2bf5f0f0277cbcadad2e20d"}, - {file = "torch-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0882243755ff28895e8e6dc6bc26ebcf5aa0911ed81b2a12f241fc4b09075b13"}, - {file = "torch-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:f66aa6b9580a22b04d0af54fcd042f52406a8479e2b6a550e3d9f95963e168c8"}, - {file = "torch-2.0.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:1adb60d369f2650cac8e9a95b1d5758e25d526a34808f7448d0bd599e4ae9072"}, - {file = "torch-2.0.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:1bcffc16b89e296826b33b98db5166f990e3b72654a2b90673e817b16c50e32b"}, - {file = "torch-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e10e1597f2175365285db1b24019eb6f04d53dcd626c735fc502f1e8b6be9875"}, - {file = "torch-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:423e0ae257b756bb45a4b49072046772d1ad0c592265c5080070e0767da4e490"}, - {file = "torch-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8742bdc62946c93f75ff92da00e3803216c6cce9b132fbca69664ca38cfb3e18"}, - {file = "torch-2.0.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:c62df99352bd6ee5a5a8d1832452110435d178b5164de450831a3a8cc14dc680"}, - {file = "torch-2.0.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:671a2565e3f63b8fe8e42ae3e36ad249fe5e567435ea27b94edaa672a7d0c416"}, + {file = "torch-2.1.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:3a871edd6c02dae77ad810335c0833391c1a4ce49af21ea8cf0f6a5d2096eea8"}, + {file = "torch-2.1.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:bef6996c27d8f6e92ea4e13a772d89611da0e103b48790de78131e308cf73076"}, + {file = "torch-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:0e13034fd5fb323cbbc29e56d0637a3791e50dd589616f40c79adfa36a5a35a1"}, + {file = "torch-2.1.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:d9b535cad0df3d13997dbe8bd68ac33e0e3ae5377639c9881948e40794a61403"}, + {file = "torch-2.1.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:f9a55d55af02826ebfbadf4e9b682f0f27766bc33df8236b48d28d705587868f"}, + {file = "torch-2.1.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:a6ebbe517097ef289cc7952783588c72de071d4b15ce0f8b285093f0916b1162"}, + {file = "torch-2.1.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:8f32ce591616a30304f37a7d5ea80b69ca9e1b94bba7f308184bf616fdaea155"}, + {file = "torch-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e0ee6cf90c8970e05760f898d58f9ac65821c37ffe8b04269ec787aa70962b69"}, + {file = "torch-2.1.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:76d37967c31c99548ad2c4d3f2cf191db48476f2e69b35a0937137116da356a1"}, + {file = "torch-2.1.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:e2d83f07b4aac983453ea5bf8f9aa9dacf2278a8d31247f5d9037f37befc60e4"}, + {file = "torch-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f41fe0c7ecbf903a568c73486139a75cfab287a0f6c17ed0698fdea7a1e8641d"}, + {file = "torch-2.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e3225f47d50bb66f756fe9196a768055d1c26b02154eb1f770ce47a2578d3aa7"}, + {file = "torch-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33d59cd03cb60106857f6c26b36457793637512998666ee3ce17311f217afe2b"}, + {file = "torch-2.1.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:8e221deccd0def6c2badff6be403e0c53491805ed9915e2c029adbcdb87ab6b5"}, + {file = "torch-2.1.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:05b18594f60a911a0c4f023f38a8bda77131fba5fd741bda626e97dcf5a3dd0a"}, + {file = "torch-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9ca96253b761e9aaf8e06fb30a66ee301aecbf15bb5a303097de1969077620b6"}, + {file = "torch-2.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d93ba70f67b08c2ae5598ee711cbc546a1bc8102cef938904b8c85c2089a51a0"}, + {file = "torch-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:255b50bc0608db177e6a3cc118961d77de7e5105f07816585fa6f191f33a9ff3"}, + {file = "torch-2.1.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6984cd5057c0c977b3c9757254e989d3f1124f4ce9d07caa6cb637783c71d42a"}, + {file = "torch-2.1.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:bc195d7927feabc0eb7c110e457c955ed2ab616f3c7c28439dd4188cf589699f"}, ] [package.dependencies] filelock = "*" +fsspec = "*" jinja2 = "*" networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.18.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" +triton = {version = "2.1.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} typing-extensions = "*" [package.extras] +dynamo = ["jinja2"] opt-einsum = ["opt-einsum (>=3.3)"] +[[package]] +name = "tqdm" +version = "4.66.2" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "transformers" +version = "4.37.1" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "transformers-4.37.1-py3-none-any.whl", hash = "sha256:05e4c4bf94f74addeb716bc83517f49d55df1e9022db3d5b027c801e9a410ebf"}, + {file = "transformers-4.37.1.tar.gz", hash = "sha256:9843368d97fd7ac30126664743adc65e8e5be930da7d66342172e97bd1243e2d"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.19.3,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +protobuf = {version = "*", optional = true, markers = "extra == \"sentencepiece\""} +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.3.1" +sentencepiece = {version = ">=0.1.91,<0.1.92 || >0.1.92", optional = true, markers = "extra == \"sentencepiece\""} +tokenizers = ">=0.14,<0.19" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.21.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.11,!=1.12.0)"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.19)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision"] +docs-specific = ["hf-doc-builder"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6,<0.15.0)"] +onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +ray = ["ray[tune] (>=2.7.0)"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic (<2)", "starlette", "uvicorn"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm"] +tokenizers = ["tokenizers (>=0.14,<0.19)"] +torch = ["accelerate (>=0.21.0)", "torch (>=1.11,!=1.12.0)"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "tqdm (>=4.27)"] +video = ["av (==9.2.0)", "decord (==0.6.0)"] +vision = ["Pillow (>=10.0.1,<=15.0)"] + +[[package]] +name = "triton" +version = "2.1.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.1.0-0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:66439923a30d5d48399b08a9eae10370f6c261a5ec864a64983bae63152d39d7"}, + {file = "triton-2.1.0-0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:919b06453f0033ea52c13eaf7833de0e57db3178d23d4e04f9fc71c4f2c32bf8"}, + {file = "triton-2.1.0-0-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae4bb8a91de790e1866405211c4d618379781188f40d5c4c399766914e84cd94"}, + {file = "triton-2.1.0-0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39f6fb6bdccb3e98f3152e3fbea724f1aeae7d749412bbb1fa9c441d474eba26"}, + {file = "triton-2.1.0-0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21544e522c02005a626c8ad63d39bdff2f31d41069592919ef281e964ed26446"}, + {file = "triton-2.1.0-0-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:143582ca31dd89cd982bd3bf53666bab1c7527d41e185f9e3d8a3051ce1b663b"}, + {file = "triton-2.1.0-0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82fc5aeeedf6e36be4e4530cbdcba81a09d65c18e02f52dc298696d45721f3bd"}, + {file = "triton-2.1.0-0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:81a96d110a738ff63339fc892ded095b31bd0d205e3aace262af8400d40b6fa8"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.18)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + [[package]] name = "typer" version = "0.6.1" @@ -957,6 +2570,17 @@ files = [ {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + [[package]] name = "urllib3" version = "2.0.4" @@ -1072,7 +2696,242 @@ files = [ {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] +[[package]] +name = "xxhash" +version = "3.4.1" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +files = [ + {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, + {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, + {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, + {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, + {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, + {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, + {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, + {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, + {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, + {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, + {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, + {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, + {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, + {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, + {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, + {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, + {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, + {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, + {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, + {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zipp" +version = "3.18.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "3345b6b3a231cfe82d336f22003ea0356a8ad535172eda8fe4b5b1a4254f2386" +content-hash = "6d4a4fdf6556f14d16f4c0272e15197f9d237fdea5511555a99ce66fc3cd1eff" diff --git a/backends/python/server/pyproject.toml b/backends/python/server/pyproject.toml index ec4fa5c4..d73feac8 100644 --- a/backends/python/server/pyproject.toml +++ b/backends/python/server/pyproject.toml @@ -20,6 +20,7 @@ loguru = "^0.6.0" opentelemetry-api = "^1.15.0" opentelemetry-exporter-otlp = "^1.15.0" opentelemetry-instrumentation-grpc = "^0.36b0" +optimum-habana = "1.10.2" [tool.poetry.extras] @@ -27,11 +28,6 @@ opentelemetry-instrumentation-grpc = "^0.36b0" grpcio-tools = "^1.51.1" pytest = "^7.3.0" -[[tool.poetry.source]] -name = "pytorch-gpu-src" -url = "https://download.pytorch.org/whl/cu118" -priority = "explicit" - [tool.pytest.ini_options] markers = ["private: marks tests as requiring an admin hf token (deselect with '-m \"not private\"')"] diff --git a/backends/python/server/requirements.txt b/backends/python/server/requirements.txt index 5755c80a..5c5973df 100644 --- a/backends/python/server/requirements.txt +++ b/backends/python/server/requirements.txt @@ -1,23 +1,39 @@ +accelerate==0.27.2 ; python_version >= "3.9" and python_version < "3.13" +aiohttp==3.9.5 ; python_version >= "3.9" and python_version < "3.13" +aiosignal==1.3.1 ; python_version >= "3.9" and python_version < "3.13" +async-timeout==4.0.3 ; python_version >= "3.9" and python_version < "3.11" +attrs==23.2.0 ; python_version >= "3.9" and python_version < "3.13" backoff==2.2.1 ; python_version >= "3.9" and python_version < "3.13" certifi==2023.7.22 ; python_version >= "3.9" and python_version < "3.13" charset-normalizer==3.2.0 ; python_version >= "3.9" and python_version < "3.13" click==8.1.7 ; python_version >= "3.9" and python_version < "3.13" colorama==0.4.6 ; python_version >= "3.9" and python_version < "3.13" and (sys_platform == "win32" or platform_system == "Windows") +coloredlogs==15.0.1 ; python_version >= "3.9" and python_version < "3.13" +datasets==2.18.0 ; python_version >= "3.9" and python_version < "3.13" deprecated==1.2.14 ; python_version >= "3.9" and python_version < "3.13" -filelock==3.12.3 ; python_version >= "3.9" and python_version < "3.13" -fsspec==2023.9.0 ; python_version >= "3.9" and python_version < "3.13" +diffusers==0.26.3 ; python_version >= "3.9" and python_version < "3.13" +dill==0.3.8 ; python_version >= "3.9" and python_version < "3.13" +filelock==3.13.4 ; python_version >= "3.9" and python_version < "3.13" +frozenlist==1.4.1 ; python_version >= "3.9" and python_version < "3.13" +fsspec==2024.2.0 ; python_version >= "3.9" and python_version < "3.13" +fsspec[http]==2024.2.0 ; python_version >= "3.9" and python_version < "3.13" googleapis-common-protos==1.60.0 ; python_version >= "3.9" and python_version < "3.13" grpc-interceptor==0.15.3 ; python_version >= "3.9" and python_version < "3.13" grpcio-reflection==1.58.0 ; python_version >= "3.9" and python_version < "3.13" grpcio-status==1.58.0 ; python_version >= "3.9" and python_version < "3.13" grpcio==1.58.0 ; python_version >= "3.9" and python_version < "3.13" -huggingface-hub==0.20.2 ; python_version >= "3.9" and python_version < "3.13" +huggingface-hub==0.22.2 ; python_version >= "3.9" and python_version < "3.13" +humanfriendly==10.0 ; python_version >= "3.9" and python_version < "3.13" idna==3.4 ; python_version >= "3.9" and python_version < "3.13" -jinja2==3.1.2 ; python_version >= "3.9" and python_version < "3.13" +importlib-metadata==7.1.0 ; python_version >= "3.9" and python_version < "3.13" +jinja2==3.1.3 ; python_version >= "3.9" and python_version < "3.13" loguru==0.6.0 ; python_version >= "3.9" and python_version < "3.13" -markupsafe==2.1.3 ; python_version >= "3.9" and python_version < "3.13" +markupsafe==2.1.5 ; python_version >= "3.9" and python_version < "3.13" mpmath==1.3.0 ; python_version >= "3.9" and python_version < "3.13" -networkx==3.1 ; python_version >= "3.9" and python_version < "3.13" +multidict==6.0.5 ; python_version >= "3.9" and python_version < "3.13" +multiprocess==0.70.16 ; python_version >= "3.9" and python_version < "3.13" +networkx==3.2.1 ; python_version >= "3.9" and python_version < "3.13" +numpy==1.26.4 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-api==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-exporter-otlp-proto-grpc==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-exporter-otlp-proto-http==1.15.0 ; python_version >= "3.9" and python_version < "3.13" @@ -27,19 +43,36 @@ opentelemetry-instrumentation==0.36b0 ; python_version >= "3.9" and python_versi opentelemetry-proto==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-sdk==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-semantic-conventions==0.36b0 ; python_version >= "3.9" and python_version < "3.13" +optimum-habana==1.10.2 ; python_version >= "3.9" and python_version < "3.13" +optimum==1.19.0 ; python_version >= "3.9" and python_version < "3.13" packaging==23.1 ; python_version >= "3.9" and python_version < "3.13" +pandas==2.2.2 ; python_version >= "3.9" and python_version < "3.13" +pillow==10.3.0 ; python_version >= "3.9" and python_version < "3.13" protobuf==4.24.3 ; python_version >= "3.9" and python_version < "3.13" +psutil==5.9.8 ; python_version >= "3.9" and python_version < "3.13" +pyarrow-hotfix==0.6 ; python_version >= "3.9" and python_version < "3.13" +pyarrow==15.0.2 ; python_version >= "3.9" and python_version < "3.13" +pyreadline3==3.4.1 ; sys_platform == "win32" and python_version >= "3.9" and python_version < "3.13" +python-dateutil==2.9.0.post0 ; python_version >= "3.9" and python_version < "3.13" +pytz==2024.1 ; python_version >= "3.9" and python_version < "3.13" pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "3.13" +regex==2024.4.16 ; python_version >= "3.9" and python_version < "3.13" requests==2.31.0 ; python_version >= "3.9" and python_version < "3.13" safetensors==0.3.3 ; python_version >= "3.9" and python_version < "3.13" +sentencepiece==0.2.0 ; python_version >= "3.9" and python_version < "3.13" setuptools==68.2.0 ; python_version >= "3.9" and python_version < "3.13" +six==1.16.0 ; python_version >= "3.9" and python_version < "3.13" sympy==1.12 ; python_version >= "3.9" and python_version < "3.13" -transformers==4.37.0 ; python_version >= "3.9" and python_version < "3.13" -optimum-habana==1.10.2 ; python_version >= "3.9" and python_version < "3.13" -optimum==1.17.1 ; python_version >= "3.9" and python_version < "3.13" -tqdm==4.66.1 ; python_version >= "3.9" and python_version < "3.13" +tokenizers==0.15.2 ; python_version >= "3.9" and python_version < "3.13" +tqdm==4.66.2 ; python_version >= "3.9" and python_version < "3.13" +transformers==4.37.1 ; python_version >= "3.9" and python_version < "3.13" +transformers[sentencepiece]==4.37.1 ; python_version >= "3.9" and python_version < "3.13" typer==0.6.1 ; python_version >= "3.9" and python_version < "3.13" typing-extensions==4.7.1 ; python_version >= "3.9" and python_version < "3.13" +tzdata==2024.1 ; python_version >= "3.9" and python_version < "3.13" urllib3==2.0.4 ; python_version >= "3.9" and python_version < "3.13" win32-setctime==1.1.0 ; python_version >= "3.9" and python_version < "3.13" and sys_platform == "win32" wrapt==1.15.0 ; python_version >= "3.9" and python_version < "3.13" +xxhash==3.4.1 ; python_version >= "3.9" and python_version < "3.13" +yarl==1.9.4 ; python_version >= "3.9" and python_version < "3.13" +zipp==3.18.1 ; python_version >= "3.9" and python_version < "3.13" diff --git a/docs/openapi.json b/docs/openapi.json index b90189e9..c8918b02 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -696,6 +696,87 @@ } } } + }, + "/vertex": { + "post": { + "tags": [ + "Text Embeddings Inference" + ], + "summary": "Generate embeddings from a Vertex request", + "description": "Generate embeddings from a Vertex request", + "operationId": "vertex_compatibility", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VertexRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Results" + }, + "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": "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" + } + } + } + } + } + } } }, "components": { @@ -1096,6 +1177,29 @@ } ] }, + "InputIds": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "integer", + "format": "int32", + "minimum": 0 + } + }, + { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "integer", + "format": "int32", + "minimum": 0 + } + } + } + ] + }, "ModelType": { "oneOf": [ { diff --git a/docs/source/en/cli_arguments.md b/docs/source/en/cli_arguments.md index 7a070f37..83669a4a 100644 --- a/docs/source/en/cli_arguments.md +++ b/docs/source/en/cli_arguments.md @@ -177,6 +177,21 @@ Options: [env: API_KEY=] + --payload-limit + Payload size limit in bytes + + Default is 2MB + + [env: PAYLOAD_LIMIT=] + [default: 2000000] + + --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. + + [env: API_KEY=] + --json-output Outputs the logs in JSON format (useful for telemetry) From 39a8a4decc86b293ded6541ec74ed5fff1f4bef5 Mon Sep 17 00:00:00 2001 From: Daniel Huang Date: Mon, 29 Apr 2024 01:14:10 -0700 Subject: [PATCH 60/72] Chunked padded batching on Python server (#6) --- .../server/text_embeddings_server/models/types.py | 13 ++++++++++--- router/src/main.rs | 5 +++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backends/python/server/text_embeddings_server/models/types.py b/backends/python/server/text_embeddings_server/models/types.py index b0ad3c43..5a6323c5 100644 --- a/backends/python/server/text_embeddings_server/models/types.py +++ b/backends/python/server/text_embeddings_server/models/types.py @@ -1,13 +1,16 @@ -import torch - +import math +import os from abc import ABC, abstractmethod from dataclasses import dataclass + +import torch from opentelemetry import trace from text_embeddings_server.pb import embed_pb2 from text_embeddings_server.pb.embed_pb2 import Embedding tracer = trace.get_tracer(__name__) +MIN_PADDING = int(os.environ.get("PYTHON_SERVER_MIN_PADDING", 128)) class Batch(ABC): @@ -31,9 +34,13 @@ class PaddedBatch(Batch): @classmethod @tracer.start_as_current_span("from_pb") def from_pb(cls, pb: embed_pb2.EmbedRequest, device: torch.device) -> "PaddedBatch": + max_length = max( + MIN_PADDING, + 2 ** math.ceil(math.log2(pb.max_length)), + ) # Allocate padded tensors all at once all_tensors = torch.zeros( - [4, len(pb.cu_seq_lengths) - 1, pb.max_length], dtype=torch.int32 + [4, len(pb.cu_seq_lengths) - 1, max_length], dtype=torch.int32 ) for i, start_index in enumerate(pb.cu_seq_lengths[:-1]): diff --git a/router/src/main.rs b/router/src/main.rs index a72caa8b..0424c897 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -158,6 +158,11 @@ struct Args { /// Unused for gRPC servers #[clap(long, env)] cors_allow_origin: Option>, + + /// Set the PYTHON_SERVER_MIN_PADDING environment variable. This increases the minimum + /// token padding for a batched input in the python server. + #[clap(long, env)] + python_min_padding: Option } #[tokio::main] From 2b4da4f8f7e15204b4332d08cf4d0df9d783bb70 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Mon, 6 May 2024 15:05:09 +0800 Subject: [PATCH 61/72] Upgrade packages version to support Habana 1.15 (#9) Signed-off-by: Liu, Kaixuan Co-authored-by: regisss <15324346+regisss@users.noreply.github.com> --- Dockerfile-hpu | 2 +- backends/python/server/pyproject.toml | 4 ++-- backends/python/server/requirements.txt | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Dockerfile-hpu b/Dockerfile-hpu index bfccab97..faa6f5cb 100644 --- a/Dockerfile-hpu +++ b/Dockerfile-hpu @@ -54,7 +54,7 @@ COPY proto proto RUN cargo build --release --bin text-embeddings-router -F grpc -F python --no-default-features && sccache -s -FROM vault.habana.ai/gaudi-docker/1.14.0/ubuntu22.04/habanalabs/pytorch-installer-2.1.1:latest as base +FROM vault.habana.ai/gaudi-docker/1.15.0/ubuntu22.04/habanalabs/pytorch-installer-2.2.0:latest as base ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 diff --git a/backends/python/server/pyproject.toml b/backends/python/server/pyproject.toml index d73feac8..dad5efcf 100644 --- a/backends/python/server/pyproject.toml +++ b/backends/python/server/pyproject.toml @@ -15,12 +15,12 @@ grpcio-status = "^1.51.1" grpcio-reflection = "^1.51.1" grpc-interceptor = "^0.15.0" typer = "^0.6.1" -safetensors = "^0.3.2" +safetensors = "^0.4.1" loguru = "^0.6.0" opentelemetry-api = "^1.15.0" opentelemetry-exporter-otlp = "^1.15.0" opentelemetry-instrumentation-grpc = "^0.36b0" -optimum-habana = "1.10.2" +optimum-habana = "1.11.1" [tool.poetry.extras] diff --git a/backends/python/server/requirements.txt b/backends/python/server/requirements.txt index 5c5973df..70168d87 100644 --- a/backends/python/server/requirements.txt +++ b/backends/python/server/requirements.txt @@ -43,7 +43,7 @@ opentelemetry-instrumentation==0.36b0 ; python_version >= "3.9" and python_versi opentelemetry-proto==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-sdk==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-semantic-conventions==0.36b0 ; python_version >= "3.9" and python_version < "3.13" -optimum-habana==1.10.2 ; python_version >= "3.9" and python_version < "3.13" +optimum-habana==1.11.1 ; python_version >= "3.9" and python_version < "3.13" optimum==1.19.0 ; python_version >= "3.9" and python_version < "3.13" packaging==23.1 ; python_version >= "3.9" and python_version < "3.13" pandas==2.2.2 ; python_version >= "3.9" and python_version < "3.13" @@ -58,17 +58,17 @@ pytz==2024.1 ; python_version >= "3.9" and python_version < "3.13" pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "3.13" regex==2024.4.16 ; python_version >= "3.9" and python_version < "3.13" requests==2.31.0 ; python_version >= "3.9" and python_version < "3.13" -safetensors==0.3.3 ; python_version >= "3.9" and python_version < "3.13" +safetensors==0.4.1 ; python_version >= "3.9" and python_version < "3.13" sentencepiece==0.2.0 ; python_version >= "3.9" and python_version < "3.13" setuptools==68.2.0 ; python_version >= "3.9" and python_version < "3.13" six==1.16.0 ; python_version >= "3.9" and python_version < "3.13" sympy==1.12 ; python_version >= "3.9" and python_version < "3.13" tokenizers==0.15.2 ; python_version >= "3.9" and python_version < "3.13" tqdm==4.66.2 ; python_version >= "3.9" and python_version < "3.13" -transformers==4.37.1 ; python_version >= "3.9" and python_version < "3.13" -transformers[sentencepiece]==4.37.1 ; python_version >= "3.9" and python_version < "3.13" +transformers==4.38.2 ; python_version >= "3.9" and python_version < "3.13" +transformers[sentencepiece]==4.38.2 ; python_version >= "3.9" and python_version < "3.13" typer==0.6.1 ; python_version >= "3.9" and python_version < "3.13" -typing-extensions==4.7.1 ; python_version >= "3.9" and python_version < "3.13" +typing-extensions==4.8.0 ; python_version >= "3.9" and python_version < "3.13" tzdata==2024.1 ; python_version >= "3.9" and python_version < "3.13" urllib3==2.0.4 ; python_version >= "3.9" and python_version < "3.13" win32-setctime==1.1.0 ; python_version >= "3.9" and python_version < "3.13" and sys_platform == "win32" From f135641dc838cf75a0f8ba7f40d9d962a86896e7 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Mon, 6 May 2024 17:33:19 +0800 Subject: [PATCH 62/72] Add warmup function to speed up the first embedding (#8) Signed-off-by: Liu, Kaixuan --- backends/Cargo.toml | 5 +- backends/src/lib.rs | 110 ++++++++++++++++++++------------------------ router/src/lib.rs | 12 ++--- 3 files changed, 59 insertions(+), 68 deletions(-) diff --git a/backends/Cargo.toml b/backends/Cargo.toml index d5659b18..3efbc52d 100644 --- a/backends/Cargo.toml +++ b/backends/Cargo.toml @@ -10,8 +10,9 @@ 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 = { workspace = true } -tracing = { workspace = true } +tokio = { version = "^1.25", features = ["sync"] } +tracing = "^0.1" +rand = "^0.8" [features] clap = ["dep:clap", "text-embeddings-backend-core/clap"] diff --git a/backends/src/lib.rs b/backends/src/lib.rs index 9b5d1762..feceab6f 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -1,6 +1,5 @@ mod dtype; - -use std::cmp::{max, min}; +use std::env; use std::path::PathBuf; use std::sync::Arc; use std::thread::JoinHandle; @@ -8,7 +7,7 @@ use std::time::{Duration, Instant}; use text_embeddings_backend_core::{Backend as CoreBackend, Predictions}; use tokio::sync::{mpsc, oneshot, watch}; use tracing::{instrument, Span}; - +use rand::Rng; pub use crate::dtype::DType; pub use text_embeddings_backend_core::{ BackendError, Batch, Embedding, Embeddings, ModelType, Pool, @@ -68,62 +67,6 @@ 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() { @@ -158,6 +101,54 @@ impl Backend { } } + #[instrument(skip(self))] + pub async fn warmup( + &self, + max_input_length: u32, + max_token: u32, + ) -> Result<(), BackendError> { + let read_env_var = |key: &str, default: u32| -> u32 { + env::var(key).ok().map_or(default, |value| value.parse::().unwrap()) + }; + // get all possible sequence lengths for prefill + let bucket_size: u32 = read_env_var("PAD_SEQUENCE_TO_MULTIPLE_OF", 128); + let mut seq_lengths: Vec = (bucket_size..max_input_length+1).step_by(bucket_size as usize).collect(); + if let Some(&last) = seq_lengths.last() { + if last < max_input_length { + seq_lengths.push(max_input_length); + } + } + for &length in seq_lengths.iter() { + tracing::info!("warmup for length: {}", length); + let batch = self.create_warmup_batch(length, max_token); + match &self.model_type { + ModelType::Classifier => self.predict(batch).await.map(|_| ()), + ModelType::Embedding(_) => self.embed(batch).await.map(|_| ()), + }; + } + Ok(()) + } + + #[instrument(skip_all)] + pub fn create_warmup_batch( + &self, + length: u32, + max_token: u32, + ) -> Batch { + let input_ids = (0..length).map(|_| rand::thread_rng().gen_range(0..max_token)).collect(); + let token_type_ids: Vec = vec![0; length as usize]; + let position_ids: Vec = (0..length).collect(); + let cumulative_seq_lengths: Vec = vec![0, length - 1]; + Batch { + input_ids: input_ids, + token_type_ids: token_type_ids, + position_ids: position_ids, + cumulative_seq_lengths: cumulative_seq_lengths, + max_length: length, + pooled_indices: vec![0], + raw_indices: vec![], + } + } #[instrument(skip(self))] pub fn health_watcher(&self) -> watch::Receiver { self.health_receiver.clone() @@ -166,7 +157,6 @@ impl Backend { #[instrument(skip_all)] pub async fn embed(&self, batch: Batch) -> Result<(Embeddings, Duration), BackendError> { let (sender, receiver) = oneshot::channel(); - self.backend_sender .try_send(BackendCommand::Embed(batch, Span::current(), sender)) .expect("No backend receiver. This is a bug."); diff --git a/router/src/lib.rs b/router/src/lib.rs index 5c9ed072..f6378a33 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -262,12 +262,12 @@ pub async fn run( .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")?; + + // Warmup + if backend.warmup( + max_input_length as u32, + max_batch_tokens as u32).await.is_ok() { + tracing::info!("Succeed doing warmup"); } let max_batch_requests = backend From bc62fa8d0d6b752017db309aeb49730f550bf3d4 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Mon, 20 May 2024 17:26:20 +0800 Subject: [PATCH 63/72] Warmup fix (#10) Signed-off-by: Liu, Kaixuan --- backends/src/lib.rs | 21 +++++++++++---------- router/src/lib.rs | 8 ++------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/backends/src/lib.rs b/backends/src/lib.rs index feceab6f..ba419a7c 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -104,27 +104,28 @@ impl Backend { #[instrument(skip(self))] pub async fn warmup( &self, - max_input_length: u32, + mut max_input_length: u32, max_token: u32, ) -> Result<(), BackendError> { let read_env_var = |key: &str, default: u32| -> u32 { env::var(key).ok().map_or(default, |value| value.parse::().unwrap()) }; - // get all possible sequence lengths for prefill - let bucket_size: u32 = read_env_var("PAD_SEQUENCE_TO_MULTIPLE_OF", 128); - let mut seq_lengths: Vec = (bucket_size..max_input_length+1).step_by(bucket_size as usize).collect(); + let seq_bucket_size: u32 = read_env_var("PAD_SEQUENCE_TO_MULTIPLE_OF", 128); + let max_warmup_length: u32 = read_env_var("MAX_WARMUP_SEQUENCE_LENGTH", 1024); + max_input_length = std::cmp::min(max_input_length, max_warmup_length); + let mut seq_lengths: Vec = (seq_bucket_size..max_input_length+1).step_by(seq_bucket_size as usize).collect(); if let Some(&last) = seq_lengths.last() { if last < max_input_length { seq_lengths.push(max_input_length); } } for &length in seq_lengths.iter() { - tracing::info!("warmup for length: {}", length); let batch = self.create_warmup_batch(length, max_token); match &self.model_type { ModelType::Classifier => self.predict(batch).await.map(|_| ()), ModelType::Embedding(_) => self.embed(batch).await.map(|_| ()), - }; + }?; + tracing::info!("finish warmup for length: {}", length); } Ok(()) } @@ -140,10 +141,10 @@ impl Backend { let position_ids: Vec = (0..length).collect(); let cumulative_seq_lengths: Vec = vec![0, length - 1]; Batch { - input_ids: input_ids, - token_type_ids: token_type_ids, - position_ids: position_ids, - cumulative_seq_lengths: cumulative_seq_lengths, + input_ids, + token_type_ids, + position_ids, + cumulative_seq_lengths, max_length: length, pooled_indices: vec![0], raw_indices: vec![], diff --git a/router/src/lib.rs b/router/src/lib.rs index f6378a33..72ad574d 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -264,11 +264,8 @@ pub async fn run( // Warmup - if backend.warmup( - max_input_length as u32, - max_batch_tokens as u32).await.is_ok() { - tracing::info!("Succeed doing warmup"); - } + + backend.warmup(max_input_length as u32, max_batch_tokens as u32).await.context("Error when doing warmup")?; let max_batch_requests = backend .max_batch_size @@ -278,7 +275,6 @@ pub async fn run( s }) .or(max_batch_requests); - // Queue logic let queue = Queue::new( backend.padded_model, From 00a49956e7ef4bf56456a52e9a706db5bee3b457 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Mon, 27 May 2024 15:12:02 +0800 Subject: [PATCH 64/72] Enable batch bucketing feature to increase the throughput for processing (#13) Signed-off-by: Liu, Kaixuan --- .../text_embeddings_server/models/types.py | 15 +++-- backends/src/lib.rs | 62 ++++++++++++++++--- router/src/lib.rs | 9 ++- router/src/main.rs | 5 -- 4 files changed, 63 insertions(+), 28 deletions(-) diff --git a/backends/python/server/text_embeddings_server/models/types.py b/backends/python/server/text_embeddings_server/models/types.py index 5a6323c5..08917900 100644 --- a/backends/python/server/text_embeddings_server/models/types.py +++ b/backends/python/server/text_embeddings_server/models/types.py @@ -2,7 +2,6 @@ import os from abc import ABC, abstractmethod from dataclasses import dataclass - import torch from opentelemetry import trace @@ -10,8 +9,10 @@ from text_embeddings_server.pb.embed_pb2 import Embedding tracer = trace.get_tracer(__name__) -MIN_PADDING = int(os.environ.get("PYTHON_SERVER_MIN_PADDING", 128)) +PAD_SEQUENCE_TO_MULTIPLE_OF = int(os.environ.get('PAD_SEQUENCE_TO_MULTIPLE_OF', 128)) +def round_up(number, k): + return (number + k - 1) // k * k class Batch(ABC): @classmethod @@ -34,15 +35,13 @@ class PaddedBatch(Batch): @classmethod @tracer.start_as_current_span("from_pb") def from_pb(cls, pb: embed_pb2.EmbedRequest, device: torch.device) -> "PaddedBatch": - max_length = max( - MIN_PADDING, - 2 ** math.ceil(math.log2(pb.max_length)), - ) + max_length = round_up(pb.max_length, PAD_SEQUENCE_TO_MULTIPLE_OF) + batch_size = len(pb.cu_seq_lengths) - 1 + new_bs = 2 ** math.ceil(math.log2(batch_size)) # Allocate padded tensors all at once all_tensors = torch.zeros( - [4, len(pb.cu_seq_lengths) - 1, max_length], dtype=torch.int32 + [4, new_bs, max_length], dtype=torch.int32 ) - for i, start_index in enumerate(pb.cu_seq_lengths[:-1]): end_index = pb.cu_seq_lengths[i + 1] input_length = end_index - start_index diff --git a/backends/src/lib.rs b/backends/src/lib.rs index ba419a7c..72b568c7 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -31,6 +31,18 @@ pub struct Backend { pub model_type: ModelType, } +fn powers_of_two(max_value: u32) -> Vec { + let mut result = Vec::new(); + let mut power: u32 = 1; + + while power <= max_value { + result.push(power); + power *= 2; + } + + result +} + impl Backend { pub fn new( model_path: PathBuf, @@ -106,12 +118,20 @@ impl Backend { &self, mut max_input_length: u32, max_token: u32, + max_bs: Option ) -> Result<(), BackendError> { let read_env_var = |key: &str, default: u32| -> u32 { env::var(key).ok().map_or(default, |value| value.parse::().unwrap()) }; let seq_bucket_size: u32 = read_env_var("PAD_SEQUENCE_TO_MULTIPLE_OF", 128); let max_warmup_length: u32 = read_env_var("MAX_WARMUP_SEQUENCE_LENGTH", 1024); + + let max_batch_size = match max_bs { + Some(value) => value as u32, + None => read_env_var("MAX_WARMUP_BATCH_SIZE", 8), + }; + let batch_sizes: Vec = powers_of_two(max_batch_size); + max_input_length = std::cmp::min(max_input_length, max_warmup_length); let mut seq_lengths: Vec = (seq_bucket_size..max_input_length+1).step_by(seq_bucket_size as usize).collect(); if let Some(&last) = seq_lengths.last() { @@ -119,13 +139,20 @@ impl Backend { seq_lengths.push(max_input_length); } } - for &length in seq_lengths.iter() { - let batch = self.create_warmup_batch(length, max_token); + + let mut shapes: Vec<(u32, u32)> = Vec::with_capacity(batch_sizes.len() * seq_lengths.len()); + for batch_size in &batch_sizes { + for seq_length in &seq_lengths { + shapes.push((*batch_size, *seq_length)); + } + } + for shape in shapes.iter() { + let batch = self.create_warmup_batch(*shape, max_token); match &self.model_type { ModelType::Classifier => self.predict(batch).await.map(|_| ()), ModelType::Embedding(_) => self.embed(batch).await.map(|_| ()), }?; - tracing::info!("finish warmup for length: {}", length); + tracing::info!("finish warmup for batch: {}, length: {}", shape.0, shape.1); } Ok(()) } @@ -133,20 +160,35 @@ impl Backend { #[instrument(skip_all)] pub fn create_warmup_batch( &self, - length: u32, + shape: (u32, u32), max_token: u32, ) -> Batch { - let input_ids = (0..length).map(|_| rand::thread_rng().gen_range(0..max_token)).collect(); + let (batch_size, length) = shape; + let mut batched_input_ids = Vec::new(); + let mut batched_token_type_ids = Vec::new(); + let mut batched_position_ids = Vec::new(); + let mut cumulative_seq_lengths = Vec::with_capacity(batch_size as usize + 1); + let mut pooled_indices = Vec::with_capacity(batch_size as usize); + cumulative_seq_lengths.push(0); + let input_ids: Vec = (0..length).map(|_| rand::thread_rng().gen_range(0..max_token)).collect(); let token_type_ids: Vec = vec![0; length as usize]; let position_ids: Vec = (0..length).collect(); - let cumulative_seq_lengths: Vec = vec![0, length - 1]; + let mut current_length = 0; + for batch_id in 0..batch_size { + batched_input_ids.extend(input_ids.iter().cloned()); + batched_token_type_ids.extend(token_type_ids.iter().cloned()); + batched_position_ids.extend(position_ids.iter().cloned()); + current_length += input_ids.len(); + cumulative_seq_lengths.push(current_length as u32); + pooled_indices.push(batch_id); + } Batch { - input_ids, - token_type_ids, - position_ids, + input_ids: batched_input_ids, + token_type_ids: batched_token_type_ids, + position_ids: batched_position_ids, cumulative_seq_lengths, max_length: length, - pooled_indices: vec![0], + pooled_indices, raw_indices: vec![], } } diff --git a/router/src/lib.rs b/router/src/lib.rs index 72ad574d..ec78278e 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -262,11 +262,6 @@ pub async fn run( .await .context("Model backend is not healthy")?; - - // Warmup - - backend.warmup(max_input_length as u32, max_batch_tokens as u32).await.context("Error when doing warmup")?; - let max_batch_requests = backend .max_batch_size .map(|s| { @@ -275,6 +270,10 @@ pub async fn run( s }) .or(max_batch_requests); + + // Warmup + backend.warmup(max_input_length as u32, max_batch_tokens as u32, max_batch_requests).await.context("Error when doing warmup")?; + // Queue logic let queue = Queue::new( backend.padded_model, diff --git a/router/src/main.rs b/router/src/main.rs index 0424c897..a72caa8b 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -158,11 +158,6 @@ struct Args { /// Unused for gRPC servers #[clap(long, env)] cors_allow_origin: Option>, - - /// Set the PYTHON_SERVER_MIN_PADDING environment variable. This increases the minimum - /// token padding for a batched input in the python server. - #[clap(long, env)] - python_min_padding: Option } #[tokio::main] From fa08974ff3f2f279ef7666ec7124da1e774ef3d6 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Tue, 9 Jul 2024 01:20:49 +0800 Subject: [PATCH 65/72] =?UTF-8?q?Fix=20bug=20when=20padded=20input=20sqque?= =?UTF-8?q?nce=20length=20exceeds=20model=20config's=20max=20=E2=80=A6=20(?= =?UTF-8?q?#14)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Liu, Kaixuan --- .../text_embeddings_server/models/default_model.py | 11 ++++++++++- .../server/text_embeddings_server/models/types.py | 9 ++++++++- .../python/server/text_embeddings_server/server.py | 3 ++- backends/src/lib.rs | 11 +++++++++-- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/backends/python/server/text_embeddings_server/models/default_model.py b/backends/python/server/text_embeddings_server/models/default_model.py index 32b90c92..a4ae0c43 100644 --- a/backends/python/server/text_embeddings_server/models/default_model.py +++ b/backends/python/server/text_embeddings_server/models/default_model.py @@ -25,7 +25,16 @@ def __init__(self, model_path: Path, device: torch.device, dtype: torch.dtype): logger.info("Use graph mode for HPU") model = wrap_in_hpu_graph(model, disable_tensor_cache=True) self.hidden_size = model.config.hidden_size - + position_offset = 0 + model_type = model.config.model_type + if model_type in ["xlm-roberta", "camembert", "roberta"]: + position_offset = model.config.pad_token_id + 1 + max_input_length = 0 + if hasattr(model.config, "max_seq_length"): + max_input_length = model.config.max_seq_length + else: + max_input_length = model.config.max_position_embeddings - position_offset + self.max_input_length = max_input_length self.has_position_ids = ( inspect.signature(model.forward).parameters.get("position_ids", None) is not None diff --git a/backends/python/server/text_embeddings_server/models/types.py b/backends/python/server/text_embeddings_server/models/types.py index 08917900..be38f462 100644 --- a/backends/python/server/text_embeddings_server/models/types.py +++ b/backends/python/server/text_embeddings_server/models/types.py @@ -34,8 +34,15 @@ class PaddedBatch(Batch): @classmethod @tracer.start_as_current_span("from_pb") - def from_pb(cls, pb: embed_pb2.EmbedRequest, device: torch.device) -> "PaddedBatch": + def from_pb(cls, + pb: embed_pb2.EmbedRequest, + device: torch.device, + max_input_length: int) -> "PaddedBatch": + if pb.max_length > max_input_length: + raise RuntimeError(f"input length exceeds model config's max_input_length") + max_length = round_up(pb.max_length, PAD_SEQUENCE_TO_MULTIPLE_OF) + max_length = min(max_length, max_input_length) batch_size = len(pb.cu_seq_lengths) - 1 new_bs = 2 ** math.ceil(math.log2(batch_size)) # Allocate padded tensors all at once diff --git a/backends/python/server/text_embeddings_server/server.py b/backends/python/server/text_embeddings_server/server.py index d0a43ace..4523d1b2 100644 --- a/backends/python/server/text_embeddings_server/server.py +++ b/backends/python/server/text_embeddings_server/server.py @@ -26,7 +26,8 @@ async def Health(self, request, context): return embed_pb2.HealthResponse() async def Embed(self, request, context): - batch = self.model.batch_type.from_pb(request, self.model.device) + max_input_length = self.model.max_input_length + batch = self.model.batch_type.from_pb(request, self.model.device, max_input_length) embeddings = self.model.embed(batch) diff --git a/backends/src/lib.rs b/backends/src/lib.rs index 72b568c7..6b98bdfa 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -130,8 +130,15 @@ impl Backend { Some(value) => value as u32, None => read_env_var("MAX_WARMUP_BATCH_SIZE", 8), }; - let batch_sizes: Vec = powers_of_two(max_batch_size); - + let mut batch_sizes: Vec = powers_of_two(max_batch_size); + if let Some(&last) = batch_sizes.last() { + if last < max_batch_size { + batch_sizes.push(max_batch_size); + } + } + if max_warmup_length > max_input_length { + tracing::warn!("max_warmup_length exceeds model's max_input_length limit, will replace it"); + } max_input_length = std::cmp::min(max_input_length, max_warmup_length); let mut seq_lengths: Vec = (seq_bucket_size..max_input_length+1).step_by(seq_bucket_size as usize).collect(); if let Some(&last) = seq_lengths.last() { From 0632df1f121186afb49570d4be26d1fe0cc06862 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Tue, 9 Jul 2024 01:21:45 +0800 Subject: [PATCH 66/72] Upgrade to 1.16 version (#15) Signed-off-by: Liu, Kaixuan --- Dockerfile-hpu | 2 +- backends/python/server/poetry.lock | 1706 ++++++++++++----------- backends/python/server/pyproject.toml | 2 +- backends/python/server/requirements.txt | 10 +- 4 files changed, 907 insertions(+), 813 deletions(-) diff --git a/Dockerfile-hpu b/Dockerfile-hpu index faa6f5cb..457279cf 100644 --- a/Dockerfile-hpu +++ b/Dockerfile-hpu @@ -54,7 +54,7 @@ COPY proto proto RUN cargo build --release --bin text-embeddings-router -F grpc -F python --no-default-features && sccache -s -FROM vault.habana.ai/gaudi-docker/1.15.0/ubuntu22.04/habanalabs/pytorch-installer-2.2.0:latest as base +FROM vault.habana.ai/gaudi-docker/1.16.1/ubuntu22.04/habanalabs/pytorch-installer-2.2.2:latest as base ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 diff --git a/backends/python/server/poetry.lock b/backends/python/server/poetry.lock index 6c01bfea..a592d306 100644 --- a/backends/python/server/poetry.lock +++ b/backends/python/server/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "accelerate" @@ -183,97 +183,112 @@ files = [ [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -320,21 +335,21 @@ cron = ["capturer (>=2.4)"] [[package]] name = "datasets" -version = "2.18.0" +version = "2.19.2" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.8.0" files = [ - {file = "datasets-2.18.0-py3-none-any.whl", hash = "sha256:f1bbf0e2896917a914de01cbd37075b14deea3837af87ad0d9f697388ccaeb50"}, - {file = "datasets-2.18.0.tar.gz", hash = "sha256:cdf8b8c6abf7316377ba4f49f9589a4c74556d6b481afd0abd2284f3d69185cb"}, + {file = "datasets-2.19.2-py3-none-any.whl", hash = "sha256:e07ff15d75b1af75c87dd96323ba2a361128d495136652f37fd62f918d17bb4e"}, + {file = "datasets-2.19.2.tar.gz", hash = "sha256:eccb82fb3bb5ee26ccc6d7a15b7f1f834e2cc4e59b7cff7733a003552bad51ef"}, ] [package.dependencies] aiohttp = "*" dill = ">=0.3.0,<0.3.9" filelock = "*" -fsspec = {version = ">=2023.1.0,<=2024.2.0", extras = ["http"]} -huggingface-hub = ">=0.19.4" +fsspec = {version = ">=2023.1.0,<=2024.3.1", extras = ["http"]} +huggingface-hub = ">=0.21.2" multiprocess = "*" numpy = ">=1.17" packaging = "*" @@ -342,7 +357,7 @@ pandas = "*" pyarrow = ">=12.0.0" pyarrow-hotfix = "*" pyyaml = ">=5.1" -requests = ">=2.19.0" +requests = ">=2.32.1" tqdm = ">=4.62.1" xxhash = "*" @@ -350,17 +365,17 @@ xxhash = "*" apache-beam = ["apache-beam (>=2.26.0)"] audio = ["librosa", "soundfile (>=0.12.1)"] benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] -docs = ["s3fs", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos", "torch", "transformers"] +dev = ["Pillow (>=9.4.0)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] quality = ["ruff (>=0.3.0)"] s3 = ["s3fs"] -tensorflow = ["tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos"] -tensorflow-gpu = ["tensorflow-gpu (>=2.2.0,!=2.6.0,!=2.6.1)"] -tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +tensorflow = ["tensorflow (>=2.6.0)"] +tensorflow-gpu = ["tensorflow (>=2.6.0)"] +tests = ["Pillow (>=9.4.0)", "absl-py", "apache-beam (>=2.26.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] torch = ["torch"] -vision = ["Pillow (>=6.2.1)"] +vision = ["Pillow (>=9.4.0)"] [[package]] name = "deprecated" @@ -426,13 +441,13 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -440,18 +455,18 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.13.4" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, - {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -542,13 +557,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.2.0" +version = "2024.3.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, - {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, ] [package.dependencies] @@ -580,30 +595,30 @@ tqdm = ["tqdm"] [[package]] name = "googleapis-common-protos" -version = "1.60.0" +version = "1.63.2" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, - {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpc-interceptor" -version = "0.15.3" +version = "0.15.4" description = "Simplifies gRPC interceptors" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "grpc-interceptor-0.15.3.tar.gz", hash = "sha256:33592cb9d8c00fceed5755c71029f75aef55b273496dbced06f1d48f2571fcc3"}, - {file = "grpc_interceptor-0.15.3-py3-none-any.whl", hash = "sha256:96be2043b7e49f9deb444f18b61c373ea28d22d81c90cd3b82127a4744eb9247"}, + {file = "grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926"}, + {file = "grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d"}, ] [package.dependencies] @@ -614,148 +629,158 @@ testing = ["protobuf (>=4.21.9)"] [[package]] name = "grpcio" -version = "1.58.0" +version = "1.64.1" description = "HTTP/2-based RPC framework" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "grpcio-1.58.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3e6bebf1dfdbeb22afd95650e4f019219fef3ab86d3fca8ebade52e4bc39389a"}, - {file = "grpcio-1.58.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cde11577d5b6fd73a00e6bfa3cf5f428f3f33c2d2878982369b5372bbc4acc60"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a2d67ff99e70e86b2be46c1017ae40b4840d09467d5455b2708de6d4c127e143"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ed979b273a81de36fc9c6716d9fb09dd3443efa18dcc8652501df11da9583e9"}, - {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:458899d2ebd55d5ca2350fd3826dfd8fcb11fe0f79828ae75e2b1e6051d50a29"}, - {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc7ffef430b80345729ff0a6825e9d96ac87efe39216e87ac58c6c4ef400de93"}, - {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5b23d75e5173faa3d1296a7bedffb25afd2fddb607ef292dfc651490c7b53c3d"}, - {file = "grpcio-1.58.0-cp310-cp310-win32.whl", hash = "sha256:fad9295fe02455d4f158ad72c90ef8b4bcaadfdb5efb5795f7ab0786ad67dd58"}, - {file = "grpcio-1.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc325fed4d074367bebd465a20763586e5e1ed5b943e9d8bc7c162b1f44fd602"}, - {file = "grpcio-1.58.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:652978551af02373a5a313e07bfef368f406b5929cf2d50fa7e4027f913dbdb4"}, - {file = "grpcio-1.58.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:9f13a171281ebb4d7b1ba9f06574bce2455dcd3f2f6d1fbe0fd0d84615c74045"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8774219e21b05f750eef8adc416e9431cf31b98f6ce9def288e4cea1548cbd22"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09206106848462763f7f273ca93d2d2d4d26cab475089e0de830bb76be04e9e8"}, - {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62831d5e251dd7561d9d9e83a0b8655084b2a1f8ea91e4bd6b3cedfefd32c9d2"}, - {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:212f38c6a156862098f6bdc9a79bf850760a751d259d8f8f249fc6d645105855"}, - {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4b12754af201bb993e6e2efd7812085ddaaef21d0a6f0ff128b97de1ef55aa4a"}, - {file = "grpcio-1.58.0-cp311-cp311-win32.whl", hash = "sha256:3886b4d56bd4afeac518dbc05933926198aa967a7d1d237a318e6fbc47141577"}, - {file = "grpcio-1.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:002f228d197fea12797a14e152447044e14fb4fdb2eb5d6cfa496f29ddbf79ef"}, - {file = "grpcio-1.58.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b5e8db0aff0a4819946215f156bd722b6f6c8320eb8419567ffc74850c9fd205"}, - {file = "grpcio-1.58.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:201e550b7e2ede113b63e718e7ece93cef5b0fbf3c45e8fe4541a5a4305acd15"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d79b660681eb9bc66cc7cbf78d1b1b9e335ee56f6ea1755d34a31108b80bd3c8"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ef8d4a76d2c7d8065aba829f8d0bc0055495c998dce1964ca5b302d02514fb3"}, - {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cba491c638c76d3dc6c191d9c75041ca5b8f5c6de4b8327ecdcab527f130bb4"}, - {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6801ff6652ecd2aae08ef994a3e49ff53de29e69e9cd0fd604a79ae4e545a95c"}, - {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:24edec346e69e672daf12b2c88e95c6f737f3792d08866101d8c5f34370c54fd"}, - {file = "grpcio-1.58.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7e473a7abad9af48e3ab5f3b5d237d18208024d28ead65a459bd720401bd2f8f"}, - {file = "grpcio-1.58.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:4891bbb4bba58acd1d620759b3be11245bfe715eb67a4864c8937b855b7ed7fa"}, - {file = "grpcio-1.58.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:e9f995a8a421405958ff30599b4d0eec244f28edc760de82f0412c71c61763d2"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2f85f87e2f087d9f632c085b37440a3169fda9cdde80cb84057c2fc292f8cbdf"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb6b92036ff312d5b4182fa72e8735d17aceca74d0d908a7f08e375456f03e07"}, - {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d81c2b2b24c32139dd2536972f1060678c6b9fbd106842a9fcdecf07b233eccd"}, - {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fbcecb6aedd5c1891db1d70efbfbdc126c986645b5dd616a045c07d6bd2dfa86"}, - {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92ae871a902cf19833328bd6498ec007b265aabf2fda845ab5bd10abcaf4c8c6"}, - {file = "grpcio-1.58.0-cp38-cp38-win32.whl", hash = "sha256:dc72e04620d49d3007771c0e0348deb23ca341c0245d610605dddb4ac65a37cb"}, - {file = "grpcio-1.58.0-cp38-cp38-win_amd64.whl", hash = "sha256:1c1c5238c6072470c7f1614bf7c774ffde6b346a100521de9ce791d1e4453afe"}, - {file = "grpcio-1.58.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fe643af248442221db027da43ed43e53b73e11f40c9043738de9a2b4b6ca7697"}, - {file = "grpcio-1.58.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:128eb1f8e70676d05b1b0c8e6600320fc222b3f8c985a92224248b1367122188"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:039003a5e0ae7d41c86c768ef8b3ee2c558aa0a23cf04bf3c23567f37befa092"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f061722cad3f9aabb3fbb27f3484ec9d4667b7328d1a7800c3c691a98f16bb0"}, - {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830"}, - {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d4cef77ad2fed42b1ba9143465856d7e737279854e444925d5ba45fc1f3ba727"}, - {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24765a627eb4d9288ace32d5104161c3654128fe27f2808ecd6e9b0cfa7fc8b9"}, - {file = "grpcio-1.58.0-cp39-cp39-win32.whl", hash = "sha256:f0241f7eb0d2303a545136c59bc565a35c4fc3b924ccbd69cb482f4828d6f31c"}, - {file = "grpcio-1.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:dcfba7befe3a55dab6fe1eb7fc9359dc0c7f7272b30a70ae0af5d5b063842f28"}, - {file = "grpcio-1.58.0.tar.gz", hash = "sha256:532410c51ccd851b706d1fbc00a87be0f5312bd6f8e5dbf89d4e99c7f79d7499"}, + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.58.0)"] +protobuf = ["grpcio-tools (>=1.64.1)"] [[package]] name = "grpcio-reflection" -version = "1.58.0" +version = "1.62.2" description = "Standard Protobuf Reflection Service for gRPC" optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-reflection-1.58.0.tar.gz", hash = "sha256:e6048a758d17b6ca1705258e7ee5d926d2960a95ae08ba0929dd233e505acd3d"}, - {file = "grpcio_reflection-1.58.0-py3-none-any.whl", hash = "sha256:fa18885d8a09cef02c9a6b1d17dfed0279f1f401b06bd1f75958b78ebf1b5c0c"}, + {file = "grpcio-reflection-1.62.2.tar.gz", hash = "sha256:2dd44806d68d0006636529bda573012b19a42281478c2d051cdaaebb91e2516c"}, + {file = "grpcio_reflection-1.62.2-py3-none-any.whl", hash = "sha256:68e8dff3617a9afaf7c462c688f7ca62b55323f497c662abf9965f2953508885"}, ] [package.dependencies] -grpcio = ">=1.58.0" +grpcio = ">=1.62.2" protobuf = ">=4.21.6" [[package]] name = "grpcio-status" -version = "1.58.0" +version = "1.62.2" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.58.0.tar.gz", hash = "sha256:0b42e70c0405a66a82d9e9867fa255fe59e618964a6099b20568c31dd9099766"}, - {file = "grpcio_status-1.58.0-py3-none-any.whl", hash = "sha256:36d46072b71a00147709ebce49344ac59b4b8960942acf0f813a8a7d6c1c28e0"}, + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.58.0" +grpcio = ">=1.62.2" protobuf = ">=4.21.6" [[package]] name = "grpcio-tools" -version = "1.58.0" +version = "1.62.2" description = "Protobuf code generator for gRPC" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-tools-1.58.0.tar.gz", hash = "sha256:6f4d80ceb591e31ca4dceec747dbe56132e1392a0a9bb1c8fe001d1b5cac898a"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:60c874908f3b40f32f1bb0221f7b3ab65ecb53a4d0a9f0a394f031f1b292c177"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:1852e798f31e5437ca7b37abc910e028b34732fb19364862cedb87b1dab66fad"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:149fb48f53cb691a6328f68bed8e4036c730f7106b7f98e92c2c0403f0b9e93c"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba3d383e5ca93826038b70f326fce8e8d12dd9b2f64d363a3d612f7475f12dd2"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6997511e9d2979f7a2389479682dbb06823f21a904e8fb0a5c6baaf1b4b4a863"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8de0b701da479643f71fad71fe66885cddd89441ae16e2c724939b47742dc72e"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43cc23908b63fcaefe690b10f68a2d8652c994b5b36ab77d2271d9608c895320"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-win32.whl", hash = "sha256:2c2221123d010dc6231799e63a37f2f4786bf614ef65b23009c387cd20d8b193"}, - {file = "grpcio_tools-1.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:df2788736bdf58abe7b0e4d6b1ff806f7686c98c5ad900da312252e3322d91c4"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:b6ea5578712cdb29b0ff60bfc6405bf0e8d681b9c71d106dd1cda54fe7fe4e55"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:c29880f491581c83181c0a84a4d11402af2b13166a5266f64e246adf1da7aa66"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:32d51e933c3565414dd0835f930bb28a1cdeba435d9d2c87fa3cf8b1d284db3c"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ad9d77f25514584b1ddc981d70c9e50dfcfc388aa5ba943eee67520c5267ed9"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4882382631e6352819059278a5c878ce0b067008dd490911d16d5616e8a36d85"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d84091a189d848d94645b7c48b61734c12ec03b0d46e5fc0049343a26989ac5c"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:85ac28a9621e9b92a3fc416288c4ce45542db0b4c31b3e23031dd8e0a0ec5590"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-win32.whl", hash = "sha256:7371d8ea80234b29affec145e25569523f549520ed7e53b2aa92bed412cdecfd"}, - {file = "grpcio_tools-1.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:6997df6e7c5cf4d3ddc764240c1ff6a04b45d70ec28913b38fbc6396ef743e12"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ac65b8d6e3acaf88b815edf9af88ff844b6600ff3d2591c05ba4f655b45d5fb4"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:88e8191d0dd789bebf42533808728f5ce75d2c51e2a72bdf20abe5b5e3fbec42"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a3dbece2a121761499a659b799979d4b738586d1065439053de553773eee11ca"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1086fe240c4c879b9721952b47d46996deb283c2d9355a8dc24a804811aacf70"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ae3dca059d5b358dd03fb63277428fa7d771605d4074a019138dd38d70719a"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f8904ac7fc3da2e874f00b3a986e8b7e004f499344a8e7eb213c26dfb025041"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:aadbd8393ae332e49731adb31e741f2e689989150569b7acc939f5ea43124e2d"}, - {file = "grpcio_tools-1.58.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1cb6e24194786687d4f23c64de1f0ce553af51de22746911bc37340f85f9783e"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:6ec43909095c630df3e479e77469bdad367067431f4af602f6ccb978a3b78afd"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:4be49ed320b0ebcbc21d19ef555fbf229c1c452105522b728e1171ee2052078e"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:28eefebddec3d3adf19baca78f8b82a2287d358e1b1575ae018cdca8eacc6269"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ef8c696e9d78676cc3f583a92bbbf2c84e94e350f7ad22f150a52559f4599d1"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aeb5949e46558d21c51fd3ec3eeecc59c94dbca76c67c0a80d3da6b7437930c"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f7144aad9396d35fb1b80429600a970b559c2ad4d07020eeb180fe83cea2bee"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ee26e9253a721fff355737649678535f76cf5d642aa3ac0cd937832559b90af"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-win32.whl", hash = "sha256:343f572312039059a8797d6e29a7fc62196e73131ab01755660a9d48202267c1"}, - {file = "grpcio_tools-1.58.0-cp38-cp38-win_amd64.whl", hash = "sha256:cd7acfbb43b7338a78cf4a67528d05530d574d92b7c829d185b78dfc451d158f"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:46628247fbce86d18232eead24bd22ed0826c79f3fe2fc2fbdbde45971361049"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:51587842a54e025a3d0d37afcf4ef2b7ac1def9a5d17448665cb424b53d6c287"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:a062ae3072a2a39a3c057f4d68b57b021f1dd2956cd09aab39709f6af494e1de"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eec3c93a08df11c80ef1c29a616bcbb0d83dbc6ea41b48306fcacc720416dfa7"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b63f823ac991ff77104da614d2a2485a59d37d57830eb2e387a6e2a3edc7fa2b"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:579c11a9f198847ed48dbc4f211c67fe96a73320b87c81f01b044b72e24a7d77"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2fc1dd8049d417a5034d944c9df05cee76f855b3e431627ab4292e7c01c47"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-win32.whl", hash = "sha256:453023120114c35d3d9d6717ea0820e5d5c140f51f9d0b621de4397ff854471b"}, - {file = "grpcio_tools-1.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6c896f1df99c35cf062d4803c15663ff00a33ff09add28baa6e475cf6b5e258"}, + {file = "grpcio-tools-1.62.2.tar.gz", hash = "sha256:5fd5e1582b678e6b941ee5f5809340be5e0724691df5299aae8226640f94e18f"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:1679b4903aed2dc5bd8cb22a452225b05dc8470a076f14fd703581efc0740cdb"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:9d41e0e47dd075c075bb8f103422968a65dd0d8dc8613288f573ae91eb1053ba"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:987e774f74296842bbffd55ea8826370f70c499e5b5f71a8cf3103838b6ee9c3"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd4eeea4b25bcb6903b82930d579027d034ba944393c4751cdefd9c49e6989"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6746bc823958499a3cf8963cc1de00072962fb5e629f26d658882d3f4c35095"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2ed775e844566ce9ce089be9a81a8b928623b8ee5820f5e4d58c1a9d33dfc5ae"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bdc5dd3f57b5368d5d661d5d3703bcaa38bceca59d25955dff66244dbc987271"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-win32.whl", hash = "sha256:3a8d6f07e64c0c7756f4e0c4781d9d5a2b9cc9cbd28f7032a6fb8d4f847d0445"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-win_amd64.whl", hash = "sha256:e33b59fb3efdddeb97ded988a871710033e8638534c826567738d3edce528752"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:472505d030135d73afe4143b0873efe0dcb385bd6d847553b4f3afe07679af00"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec674b4440ef4311ac1245a709e87b36aca493ddc6850eebe0b278d1f2b6e7d1"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:184b4174d4bd82089d706e8223e46c42390a6ebac191073b9772abc77308f9fa"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c195d74fe98541178ece7a50dad2197d43991e0f77372b9a88da438be2486f12"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34d97c62e61bfe9e6cff0410fe144ac8cca2fc979ad0be46b7edf026339d161"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb8453ae83a1db2452b7fe0f4b78e4a8dd32be0f2b2b73591ae620d4d784d3d"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f989e5cebead3ae92c6abf6bf7b19949e1563a776aea896ac5933f143f0c45d"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-win32.whl", hash = "sha256:c48fabe40b9170f4e3d7dd2c252e4f1ff395dc24e49ac15fc724b1b6f11724da"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c616d0ad872e3780693fce6a3ac8ef00fc0963e6d7815ce9dcfae68ba0fc287"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:10cc3321704ecd17c93cf68c99c35467a8a97ffaaed53207e9b2da6ae0308ee1"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:9be84ff6d47fd61462be7523b49d7ba01adf67ce4e1447eae37721ab32464dd8"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:d82f681c9a9d933a9d8068e8e382977768e7779ddb8870fa0cf918d8250d1532"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04c607029ae3660fb1624ed273811ffe09d57d84287d37e63b5b802a35897329"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72b61332f1b439c14cbd3815174a8f1d35067a02047c32decd406b3a09bb9890"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8214820990d01b52845f9fbcb92d2b7384a0c321b303e3ac614c219dc7d1d3af"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:462e0ab8dd7c7b70bfd6e3195eebc177549ede5cf3189814850c76f9a340d7ce"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-win32.whl", hash = "sha256:fa107460c842e4c1a6266150881694fefd4f33baa544ea9489601810c2210ef8"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-win_amd64.whl", hash = "sha256:759c60f24c33a181bbbc1232a6752f9b49fbb1583312a4917e2b389fea0fb0f2"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:45db5da2bcfa88f2b86b57ef35daaae85c60bd6754a051d35d9449c959925b57"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:ab84bae88597133f6ea7a2bdc57b2fda98a266fe8d8d4763652cbefd20e73ad7"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7a49bccae1c7d154b78e991885c3111c9ad8c8fa98e91233de425718f47c6139"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7e439476b29d6dac363b321781a113794397afceeb97dad85349db5f1cb5e9a"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea369c4d1567d1acdf69c8ea74144f4ccad9e545df7f9a4fc64c94fa7684ba3"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f955702dc4b530696375251319d05223b729ed24e8673c2129f7a75d2caefbb"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3708a747aa4b6b505727282ca887041174e146ae030ebcadaf4c1d346858df62"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-win_amd64.whl", hash = "sha256:2ce149ea55eadb486a7fb75a20f63ef3ac065ee6a0240ed25f3549ce7954c653"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:58cbb24b3fa6ae35aa9c210fcea3a51aa5fef0cd25618eb4fd94f746d5a9b703"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:6413581e14a80e0b4532577766cf0586de4dd33766a31b3eb5374a746771c07d"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:47117c8a7e861382470d0e22d336e5a91fdc5f851d1db44fa784b9acea190d87"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f1ba79a253df9e553d20319c615fa2b429684580fa042dba618d7f6649ac7e4"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a394cf5e51ba9be412eb9f6c482b6270bd81016e033e8eb7d21b8cc28fe8b5"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3c53b221378b035ae2f1881cbc3aca42a6075a8e90e1a342c2f205eb1d1aa6a1"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c384c838b34d1b67068e51b5bbe49caa6aa3633acd158f1ab16b5da8d226bc53"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-win32.whl", hash = "sha256:19ea69e41c3565932aa28a202d1875ec56786aea46a2eab54a3b28e8a27f9517"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-win_amd64.whl", hash = "sha256:1d768a5c07279a4c461ebf52d0cec1c6ca85c6291c71ec2703fe3c3e7e28e8c4"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:5b07b5874187e170edfbd7aa2ca3a54ebf3b2952487653e8c0b0d83601c33035"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:d58389fe8be206ddfb4fa703db1e24c956856fcb9a81da62b13577b3a8f7fda7"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:7d8b4e00c3d7237b92260fc18a561cd81f1da82e8be100db1b7d816250defc66"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe08d2038f2b7c53259b5c49e0ad08c8e0ce2b548d8185993e7ef67e8592cca"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19216e1fb26dbe23d12a810517e1b3fbb8d4f98b1a3fbebeec9d93a79f092de4"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b8574469ecc4ff41d6bb95f44e0297cdb0d95bade388552a9a444db9cd7485cd"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f6f32d39283ea834a493fccf0ebe9cfddee7577bdcc27736ad4be1732a36399"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-win32.whl", hash = "sha256:76eb459bdf3fb666e01883270beee18f3f11ed44488486b61cd210b4e0e17cc1"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-win_amd64.whl", hash = "sha256:217c2ee6a7ce519a55958b8622e21804f6fdb774db08c322f4c9536c35fdce7c"}, ] [package.dependencies] -grpcio = ">=1.58.0" +grpcio = ">=1.62.2" protobuf = ">=4.21.6,<5.0dev" setuptools = "*" @@ -809,33 +834,33 @@ pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_ve [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -848,15 +873,29 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "intel-openmp" +version = "2021.4.0" +description = "Intel OpenMP* Runtime Library" +optional = false +python-versions = "*" +files = [ + {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, +] + [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -952,6 +991,24 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "mkl" +version = "2021.4.0" +description = "Intel® oneAPI Math Kernel Library" +optional = false +python-versions = "*" +files = [ + {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, + {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, + {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, +] + +[package.dependencies] +intel-openmp = "==2021.*" +tbb = "==2021.*" + [[package]] name = "mpmath" version = "1.3.0" @@ -1112,47 +1169,56 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.0" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514"}, + {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196"}, + {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1"}, + {file = "numpy-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc"}, + {file = "numpy-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787"}, + {file = "numpy-2.0.0-cp310-cp310-win32.whl", hash = "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98"}, + {file = "numpy-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f"}, + {file = "numpy-2.0.0-cp311-cp311-win32.whl", hash = "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f"}, + {file = "numpy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e"}, + {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2"}, + {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a"}, + {file = "numpy-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95"}, + {file = "numpy-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9"}, + {file = "numpy-2.0.0-cp312-cp312-win32.whl", hash = "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54"}, + {file = "numpy-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86"}, + {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a"}, + {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d"}, + {file = "numpy-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4"}, + {file = "numpy-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44"}, + {file = "numpy-2.0.0-cp39-cp39-win32.whl", hash = "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275"}, + {file = "numpy-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9"}, + {file = "numpy-2.0.0.tar.gz", hash = "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864"}, ] [[package]] @@ -1266,23 +1332,25 @@ nvidia-nvjitlink-cu12 = "*" [[package]] name = "nvidia-nccl-cu12" -version = "2.18.1" +version = "2.20.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nccl_cu12-2.18.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:1a6c4acefcbebfa6de320f412bf7866de856e786e0462326ba1bac40de0b5e71"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, ] [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.4.127" +version = "12.5.40" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_aarch64.whl", hash = "sha256:004186d5ea6a57758fd6d57052a123c73a4815adf365eb8dd6a85c9eaa7535ff"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, ] [[package]] @@ -1452,13 +1520,13 @@ files = [ [[package]] name = "optimum" -version = "1.19.0" +version = "1.20.0" description = "Optimum Library is an extension of the Hugging Face Transformers library, providing a framework to integrate third-party libraries from Hardware Partners and interface with their specific functionality." optional = false python-versions = ">=3.7.0" files = [ - {file = "optimum-1.19.0-py3-none-any.whl", hash = "sha256:b259b2379f6904d7e1bef3f9ab1c3f22ae6c42357b416311950cd65526bb485e"}, - {file = "optimum-1.19.0.tar.gz", hash = "sha256:a1eb134d70d3093eca68160fcf84c1aff8887726641f3362adca878fda095e3d"}, + {file = "optimum-1.20.0-py3-none-any.whl", hash = "sha256:0c0d0746043c95e22cf3586946d7408d353f10c0486f1c7d2d11084a5cfc0ede"}, + {file = "optimum-1.20.0.tar.gz", hash = "sha256:b64c7536fe738db9b56605105efe72006401ad2aa00cb499ae407f2e06f3043b"}, ] [package.dependencies] @@ -1469,7 +1537,7 @@ numpy = "*" packaging = "*" sympy = "*" torch = ">=1.11" -transformers = {version = ">=4.26.0,<4.40.0", extras = ["sentencepiece"]} +transformers = {version = ">=4.26.0,<4.42.0", extras = ["sentencepiece"]} [package.extras] amd = ["optimum-amd"] @@ -1482,49 +1550,51 @@ exporters-gpu = ["onnx", "onnxruntime-gpu", "timm"] exporters-tf = ["h5py", "numpy (<1.24.0)", "onnx", "onnxruntime", "tensorflow (>=2.4,<=2.12.1)", "tf2onnx", "timm", "transformers[sentencepiece] (>=4.26.0,<4.38.0)"] furiosa = ["optimum-furiosa"] graphcore = ["optimum-graphcore"] -habana = ["optimum-habana", "transformers (>=4.37.0,<4.38.0)"] -intel = ["optimum-intel (>=1.15.0)"] -neural-compressor = ["optimum-intel[neural-compressor] (>=1.15.0)"] -neuron = ["optimum-neuron[neuron] (>=0.0.20)", "transformers (==4.36.2)"] -neuronx = ["optimum-neuron[neuronx] (>=0.0.20)", "transformers (==4.36.2)"] -nncf = ["optimum-intel[nncf] (>=1.15.0)"] +habana = ["optimum-habana", "transformers (>=4.38.0,<4.39.0)"] +intel = ["optimum-intel (>=1.16.0)"] +neural-compressor = ["optimum-intel[neural-compressor] (>=1.16.0)"] +neuron = ["optimum-neuron[neuron] (>=0.0.20)", "transformers (>=4.36.2,<4.42.0)"] +neuronx = ["optimum-neuron[neuronx] (>=0.0.20)", "transformers (>=4.36.2,<4.42.0)"] +nncf = ["optimum-intel[nncf] (>=1.16.0)"] onnxruntime = ["datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime (>=1.11.0)", "protobuf (>=3.20.1)"] onnxruntime-gpu = ["accelerate", "datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime-gpu (>=1.11.0)", "protobuf (>=3.20.1)"] -openvino = ["optimum-intel[openvino] (>=1.15.0)"] +openvino = ["optimum-intel[openvino] (>=1.16.0)"] quality = ["black (>=23.1,<24.0)", "ruff (==0.1.5)"] tests = ["Pillow", "accelerate", "diffusers (>=0.17.0)", "einops", "invisible-watermark", "parameterized", "pytest (<=8.0.0)", "pytest-xdist", "requests", "rjieba", "sacremoses", "scikit-learn", "timm", "torchaudio", "torchvision"] [[package]] name = "optimum-habana" -version = "1.10.2" +version = "1.12.0" description = "Optimum Habana is the interface between the Hugging Face Transformers and Diffusers libraries and Habana's Gaudi processor (HPU). It provides a set of tools enabling easy model loading, training and inference on single- and multi-HPU settings for different downstream tasks." optional = false python-versions = "*" files = [ - {file = "optimum-habana-1.10.2.tar.gz", hash = "sha256:328e76e608afeda81f27552cfba919a243b5b473936f9d14e97c72c9113406e8"}, - {file = "optimum_habana-1.10.2-py3-none-any.whl", hash = "sha256:28bc44a8ca66cb32a3ea46df38913c133889b8a75330fb7fe0c6b92f496b44d0"}, + {file = "optimum-habana-1.12.0.tar.gz", hash = "sha256:6e04bc5dc4223db1ef719b84f8d6ec3680b54cfbba8a741363b8e268a6b06a97"}, + {file = "optimum_habana-1.12.0-py3-none-any.whl", hash = "sha256:a8f8c74802d110460abc15dae0be98d20c916f2adc22de23bc259c740cbeb19a"}, ] [package.dependencies] accelerate = "<0.28.0" +datasets = "<2.20.0" diffusers = ">=0.26.0,<0.27.0" +huggingface-hub = "<0.23.0" optimum = "*" torch = "*" -transformers = ">=4.37.0,<4.38.0" +transformers = ">=4.40.0,<4.41.0" [package.extras] quality = ["hf-doc-builder", "ruff"] -tests = ["GitPython", "datasets", "optuna", "parameterized", "psutil", "pytest", "safetensors", "sentencepiece"] +tests = ["GitPython", "datasets", "optuna", "parameterized", "psutil", "pytest (<8.0.0)", "safetensors", "sentencepiece"] [[package]] name = "packaging" -version = "23.1" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -1688,13 +1758,13 @@ xmp = ["defusedxml"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -1703,49 +1773,48 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "4.24.3" +version = "4.25.3" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "protobuf-4.24.3-cp310-abi3-win32.whl", hash = "sha256:20651f11b6adc70c0f29efbe8f4a94a74caf61b6200472a9aea6e19898f9fcf4"}, - {file = "protobuf-4.24.3-cp310-abi3-win_amd64.whl", hash = "sha256:3d42e9e4796a811478c783ef63dc85b5a104b44aaaca85d4864d5b886e4b05e3"}, - {file = "protobuf-4.24.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:6e514e8af0045be2b56e56ae1bb14f43ce7ffa0f68b1c793670ccbe2c4fc7d2b"}, - {file = "protobuf-4.24.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:ba53c2f04798a326774f0e53b9c759eaef4f6a568ea7072ec6629851c8435959"}, - {file = "protobuf-4.24.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675"}, - {file = "protobuf-4.24.3-cp37-cp37m-win32.whl", hash = "sha256:1b182c7181a2891e8f7f3a1b5242e4ec54d1f42582485a896e4de81aa17540c2"}, - {file = "protobuf-4.24.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b0271a701e6782880d65a308ba42bc43874dabd1a0a0f41f72d2dac3b57f8e76"}, - {file = "protobuf-4.24.3-cp38-cp38-win32.whl", hash = "sha256:e29d79c913f17a60cf17c626f1041e5288e9885c8579832580209de8b75f2a52"}, - {file = "protobuf-4.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:067f750169bc644da2e1ef18c785e85071b7c296f14ac53e0900e605da588719"}, - {file = "protobuf-4.24.3-cp39-cp39-win32.whl", hash = "sha256:2da777d34b4f4f7613cdf85c70eb9a90b1fbef9d36ae4a0ccfe014b0b07906f1"}, - {file = "protobuf-4.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:f631bb982c5478e0c1c70eab383af74a84be66945ebf5dd6b06fc90079668d0b"}, - {file = "protobuf-4.24.3-py3-none-any.whl", hash = "sha256:f6f8dc65625dadaad0c8545319c2e2f0424fede988368893ca3844261342c11a"}, - {file = "protobuf-4.24.3.tar.gz", hash = "sha256:12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d"}, + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] [[package]] name = "psutil" -version = "5.9.8" +version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [package.extras] @@ -1753,51 +1822,51 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "pyarrow" -version = "15.0.2" +version = "16.1.0" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.8" files = [ - {file = "pyarrow-15.0.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:88b340f0a1d05b5ccc3d2d986279045655b1fe8e41aba6ca44ea28da0d1455d8"}, - {file = "pyarrow-15.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eaa8f96cecf32da508e6c7f69bb8401f03745c050c1dd42ec2596f2e98deecac"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c6753ed4f6adb8461e7c383e418391b8d8453c5d67e17f416c3a5d5709afbd"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:290e36a59a0993e9a5224ed2fb3e53375770f07379a0ea03ee2fce2e6d30b423"}, - {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06c2bb2a98bc792f040bef31ad3e9be6a63d0cb39189227c08a7d955db96816e"}, - {file = "pyarrow-15.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a197f3670606a960ddc12adbe8075cea5f707ad7bf0dffa09637fdbb89f76c"}, - {file = "pyarrow-15.0.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5f8bc839ea36b1f99984c78e06e7a06054693dc2af8920f6fb416b5bca9944e4"}, - {file = "pyarrow-15.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5e81dfb4e519baa6b4c80410421528c214427e77ca0ea9461eb4097c328fa33"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4f240852b302a7af4646c8bfe9950c4691a419847001178662a98915fd7ee7"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e7d9cfb5a1e648e172428c7a42b744610956f3b70f524aa3a6c02a448ba853e"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2d4f905209de70c0eb5b2de6763104d5a9a37430f137678edfb9a675bac9cd98"}, - {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90adb99e8ce5f36fbecbbc422e7dcbcbed07d985eed6062e459e23f9e71fd197"}, - {file = "pyarrow-15.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:b116e7fd7889294cbd24eb90cd9bdd3850be3738d61297855a71ac3b8124ee38"}, - {file = "pyarrow-15.0.2-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:25335e6f1f07fdaa026a61c758ee7d19ce824a866b27bba744348fa73bb5a440"}, - {file = "pyarrow-15.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90f19e976d9c3d8e73c80be84ddbe2f830b6304e4c576349d9360e335cd627fc"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22366249bf5fd40ddacc4f03cd3160f2d7c247692945afb1899bab8a140ddfb"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2a335198f886b07e4b5ea16d08ee06557e07db54a8400cc0d03c7f6a22f785f"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e6d459c0c22f0b9c810a3917a1de3ee704b021a5fb8b3bacf968eece6df098f"}, - {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:033b7cad32198754d93465dcfb71d0ba7cb7cd5c9afd7052cab7214676eec38b"}, - {file = "pyarrow-15.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:29850d050379d6e8b5a693098f4de7fd6a2bea4365bfd073d7c57c57b95041ee"}, - {file = "pyarrow-15.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7167107d7fb6dcadb375b4b691b7e316f4368f39f6f45405a05535d7ad5e5058"}, - {file = "pyarrow-15.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e85241b44cc3d365ef950432a1b3bd44ac54626f37b2e3a0cc89c20e45dfd8bf"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:248723e4ed3255fcd73edcecc209744d58a9ca852e4cf3d2577811b6d4b59818"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ff3bdfe6f1b81ca5b73b70a8d482d37a766433823e0c21e22d1d7dde76ca33f"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f3d77463dee7e9f284ef42d341689b459a63ff2e75cee2b9302058d0d98fe142"}, - {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:8c1faf2482fb89766e79745670cbca04e7018497d85be9242d5350cba21357e1"}, - {file = "pyarrow-15.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:28f3016958a8e45a1069303a4a4f6a7d4910643fc08adb1e2e4a7ff056272ad3"}, - {file = "pyarrow-15.0.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:89722cb64286ab3d4daf168386f6968c126057b8c7ec3ef96302e81d8cdb8ae4"}, - {file = "pyarrow-15.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0ba387705044b3ac77b1b317165c0498299b08261d8122c96051024f953cd5"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2459bf1f22b6a5cdcc27ebfd99307d5526b62d217b984b9f5c974651398832"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58922e4bfece8b02abf7159f1f53a8f4d9f8e08f2d988109126c17c3bb261f22"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:adccc81d3dc0478ea0b498807b39a8d41628fa9210729b2f718b78cb997c7c91"}, - {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8bd2baa5fe531571847983f36a30ddbf65261ef23e496862ece83bdceb70420d"}, - {file = "pyarrow-15.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6669799a1d4ca9da9c7e06ef48368320f5856f36f9a4dd31a11839dda3f6cc8c"}, - {file = "pyarrow-15.0.2.tar.gz", hash = "sha256:9c9bc803cb3b7bfacc1e96ffbfd923601065d9d3f911179d81e72d99fd74a3d9"}, + {file = "pyarrow-16.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9"}, + {file = "pyarrow-16.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd"}, + {file = "pyarrow-16.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b"}, + {file = "pyarrow-16.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7"}, + {file = "pyarrow-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed"}, + {file = "pyarrow-16.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3"}, + {file = "pyarrow-16.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a"}, + {file = "pyarrow-16.1.0.tar.gz", hash = "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315"}, ] [package.dependencies] -numpy = ">=1.16.6,<2" +numpy = ">=1.16.6" [[package]] name = "pyarrow-hotfix" @@ -1823,13 +1892,13 @@ files = [ [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -1930,115 +1999,101 @@ files = [ [[package]] name = "regex" -version = "2024.4.16" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a"}, - {file = "regex-2024.4.16-cp310-cp310-win32.whl", hash = "sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0"}, - {file = "regex-2024.4.16-cp310-cp310-win_amd64.whl", hash = "sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6"}, - {file = "regex-2024.4.16-cp311-cp311-win32.whl", hash = "sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d"}, - {file = "regex-2024.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc"}, - {file = "regex-2024.4.16-cp312-cp312-win32.whl", hash = "sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b"}, - {file = "regex-2024.4.16-cp312-cp312-win_amd64.whl", hash = "sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9"}, - {file = "regex-2024.4.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a"}, - {file = "regex-2024.4.16-cp37-cp37m-win32.whl", hash = "sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46"}, - {file = "regex-2024.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9"}, - {file = "regex-2024.4.16-cp38-cp38-win32.whl", hash = "sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e"}, - {file = "regex-2024.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50"}, - {file = "regex-2024.4.16-cp39-cp39-win32.whl", hash = "sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335"}, - {file = "regex-2024.4.16-cp39-cp39-win_amd64.whl", hash = "sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483"}, - {file = "regex-2024.4.16.tar.gz", hash = "sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -2053,82 +2108,125 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "safetensors" -version = "0.3.3" -description = "Fast and Safe Tensor serialization" +version = "0.4.3" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "safetensors-0.3.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:92e4d0c8b2836120fddd134474c5bda8963f322333941f8b9f643e5b24f041eb"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3dcadb6153c42addc9c625a622ebde9293fabe1973f9ef31ba10fb42c16e8536"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:08f26b61e1b0a14dc959aa9d568776bd038805f611caef1de04a80c468d4a7a4"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:17f41344d9a075f2f21b289a49a62e98baff54b5754240ba896063bce31626bf"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:f1045f798e1a16a6ced98d6a42ec72936d367a2eec81dc5fade6ed54638cd7d2"}, - {file = "safetensors-0.3.3-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:eaf0e4bc91da13f21ac846a39429eb3f3b7ed06295a32321fa3eb1a59b5c70f3"}, - {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25149180d4dc8ca48bac2ac3852a9424b466e36336a39659b35b21b2116f96fc"}, - {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9e943bf78c39de8865398a71818315e7d5d1af93c7b30d4da3fc852e62ad9bc"}, - {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cccfcac04a010354e87c7a2fe16a1ff004fc4f6e7ef8efc966ed30122ce00bc7"}, - {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a07121f427e646a50d18c1be0fa1a2cbf6398624c31149cd7e6b35486d72189e"}, - {file = "safetensors-0.3.3-cp310-cp310-win32.whl", hash = "sha256:a85e29cbfddfea86453cc0f4889b4bcc6b9c155be9a60e27be479a34e199e7ef"}, - {file = "safetensors-0.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:e13adad4a3e591378f71068d14e92343e626cf698ff805f61cdb946e684a218e"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:cbc3312f134baf07334dd517341a4b470b2931f090bd9284888acb7dfaf4606f"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d15030af39d5d30c22bcbc6d180c65405b7ea4c05b7bab14a570eac7d7d43722"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:f84a74cbe9859b28e3d6d7715ac1dd3097bebf8d772694098f6d42435245860c"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:10d637423d98ab2e6a4ad96abf4534eb26fcaf8ca3115623e64c00759374e90d"}, - {file = "safetensors-0.3.3-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:3b46f5de8b44084aff2e480874c550c399c730c84b2e8ad1bddb062c94aa14e9"}, - {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76da691a82dfaf752854fa6d17c8eba0c8466370c5ad8cf1bfdf832d3c7ee17"}, - {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4e342fd54e66aa9512dd13e410f791e47aa4feeb5f4c9a20882c72f3d272f29"}, - {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:178fd30b5dc73bce14a39187d948cedd0e5698e2f055b7ea16b5a96c9b17438e"}, - {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e8fdf7407dba44587ed5e79d5de3533d242648e1f2041760b21474bd5ea5c8c"}, - {file = "safetensors-0.3.3-cp311-cp311-win32.whl", hash = "sha256:7d3b744cee8d7a46ffa68db1a2ff1a1a432488e3f7a5a97856fe69e22139d50c"}, - {file = "safetensors-0.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f579877d30feec9b6ba409d05fa174633a4fc095675a4a82971d831a8bb60b97"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:2fff5b19a1b462c17322998b2f4b8bce43c16fe208968174d2f3a1446284ceed"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:41adb1d39e8aad04b16879e3e0cbcb849315999fad73bc992091a01e379cb058"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:0f2b404250b3b877b11d34afcc30d80e7035714a1116a3df56acaca6b6c00096"}, - {file = "safetensors-0.3.3-cp37-cp37m-macosx_13_0_x86_64.whl", hash = "sha256:b43956ef20e9f4f2e648818a9e7b3499edd6b753a0f5526d4f6a6826fbee8446"}, - {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d61a99b34169981f088ccfbb2c91170843efc869a0a0532f422db7211bf4f474"}, - {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0008aab36cd20e9a051a68563c6f80d40f238c2611811d7faa5a18bf3fd3984"}, - {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93d54166072b143084fdcd214a080a088050c1bb1651016b55942701b31334e4"}, - {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c32ee08f61cea56a5d62bbf94af95df6040c8ab574afffaeb7b44ae5da1e9e3"}, - {file = "safetensors-0.3.3-cp37-cp37m-win32.whl", hash = "sha256:351600f367badd59f7bfe86d317bb768dd8c59c1561c6fac43cafbd9c1af7827"}, - {file = "safetensors-0.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:034717e297849dae1af0a7027a14b8647bd2e272c24106dced64d83e10d468d1"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8530399666748634bc0b301a6a5523756931b0c2680d188e743d16304afe917a"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:9d741c1f1621e489ba10aa3d135b54202684f6e205df52e219d5eecd673a80c9"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:0c345fd85b4d2093a5109596ff4cd9dfc2e84992e881b4857fbc4a93a3b89ddb"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:69ccee8d05f55cdf76f7e6c87d2bdfb648c16778ef8acfd2ecc495e273e9233e"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:c08a9a4b7a4ca389232fa8d097aebc20bbd4f61e477abc7065b5c18b8202dede"}, - {file = "safetensors-0.3.3-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:a002868d2e3f49bbe81bee2655a411c24fa1f8e68b703dec6629cb989d6ae42e"}, - {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bd2704cb41faa44d3ec23e8b97330346da0395aec87f8eaf9c9e2c086cdbf13"}, - {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2951bf3f0ad63df5e6a95263652bd6c194a6eb36fd4f2d29421cd63424c883"}, - {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07114cec116253ca2e7230fdea30acf76828f21614afd596d7b5438a2f719bd8"}, - {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab43aeeb9eadbb6b460df3568a662e6f1911ecc39387f8752afcb6a7d96c087"}, - {file = "safetensors-0.3.3-cp38-cp38-win32.whl", hash = "sha256:f2f59fce31dd3429daca7269a6b06f65e6547a0c248f5116976c3f1e9b73f251"}, - {file = "safetensors-0.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:c31ca0d8610f57799925bf08616856b39518ab772c65093ef1516762e796fde4"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:59a596b3225c96d59af412385981f17dd95314e3fffdf359c7e3f5bb97730a19"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:82a16e92210a6221edd75ab17acdd468dd958ef5023d9c6c1289606cc30d1479"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:98a929e763a581f516373ef31983ed1257d2d0da912a8e05d5cd12e9e441c93a"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:12b83f1986cd16ea0454c636c37b11e819d60dd952c26978310a0835133480b7"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:f439175c827c2f1bbd54df42789c5204a10983a30bc4242bc7deaf854a24f3f0"}, - {file = "safetensors-0.3.3-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:0085be33b8cbcb13079b3a8e131656e05b0bc5e6970530d4c24150f7afd76d70"}, - {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3ec70c87b1e910769034206ad5efc051069b105aac1687f6edcd02526767f4"}, - {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f490132383e5e490e710608f4acffcb98ed37f91b885c7217d3f9f10aaff9048"}, - {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79d1b6c7ed5596baf79c80fbce5198c3cdcc521ae6a157699f427aba1a90082d"}, - {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad3cc8006e7a86ee7c88bd2813ec59cd7cc75b03e6fa4af89b9c7b235b438d68"}, - {file = "safetensors-0.3.3-cp39-cp39-win32.whl", hash = "sha256:ab29f54c6b8c301ca05fa014728996bd83aac6e21528f893aaf8945c71f42b6d"}, - {file = "safetensors-0.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:0fa82004eae1a71e2aa29843ef99de9350e459a0fc2f65fc6ee0da9690933d2d"}, - {file = "safetensors-0.3.3.tar.gz", hash = "sha256:edb7072d788c4f929d0f5735d3a2fb51e5a27f833587828583b7f5747af1a2b8"}, + {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, + {file = "safetensors-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf"}, + {file = "safetensors-0.4.3-cp310-none-win32.whl", hash = "sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9"}, + {file = "safetensors-0.4.3-cp310-none-win_amd64.whl", hash = "sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c"}, + {file = "safetensors-0.4.3-cp311-none-win32.whl", hash = "sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61"}, + {file = "safetensors-0.4.3-cp311-none-win_amd64.whl", hash = "sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e"}, + {file = "safetensors-0.4.3-cp312-none-win32.whl", hash = "sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3"}, + {file = "safetensors-0.4.3-cp312-none-win_amd64.whl", hash = "sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d"}, + {file = "safetensors-0.4.3-cp37-none-win32.whl", hash = "sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50"}, + {file = "safetensors-0.4.3-cp37-none-win_amd64.whl", hash = "sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270"}, + {file = "safetensors-0.4.3-cp38-none-win32.whl", hash = "sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac"}, + {file = "safetensors-0.4.3-cp38-none-win_amd64.whl", hash = "sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35"}, + {file = "safetensors-0.4.3-cp39-none-win32.whl", hash = "sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3"}, + {file = "safetensors-0.4.3-cp39-none-win_amd64.whl", hash = "sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65"}, + {file = "safetensors-0.4.3.tar.gz", hash = "sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2"}, ] [package.extras] -all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] -dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] -jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)"] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +mlx = ["mlx (>=0.0.9)"] numpy = ["numpy (>=1.21.6)"] -paddlepaddle = ["numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)"] -pinned-tf = ["tensorflow (==2.11.0)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] -tensorflow = ["numpy (>=1.21.6)", "tensorflow (>=2.11.0)"] -testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] -torch = ["numpy (>=1.21.6)", "torch (>=1.10)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "sentencepiece" @@ -2194,19 +2292,18 @@ files = [ [[package]] name = "setuptools" -version = "68.2.0" +version = "70.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.2.0-py3-none-any.whl", hash = "sha256:af3d5949030c3f493f550876b2fd1dd5ec66689c4ee5d5344f009746f71fd5a8"}, - {file = "setuptools-68.2.0.tar.gz", hash = "sha256:00478ca80aeebeecb2f288d3206b0de568df5cd2b8fada1209843cc9a8d88a48"}, + {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, + {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -2221,144 +2318,147 @@ files = [ [[package]] name = "sympy" -version = "1.12" +version = "1.12.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, - {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, + {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, + {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, ] [package.dependencies] -mpmath = ">=0.19" +mpmath = ">=1.1.0,<1.4.0" + +[[package]] +name = "tbb" +version = "2021.13.0" +description = "Intel® oneAPI Threading Building Blocks (oneTBB)" +optional = false +python-versions = "*" +files = [ + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:a2567725329639519d46d92a2634cf61e76601dac2f777a05686fea546c4fe4f"}, + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:aaf667e92849adb012b8874d6393282afc318aca4407fc62f912ee30a22da46a"}, + {file = "tbb-2021.13.0-py3-none-win32.whl", hash = "sha256:6669d26703e9943f6164c6407bd4a237a45007e79b8d3832fe6999576eaaa9ef"}, + {file = "tbb-2021.13.0-py3-none-win_amd64.whl", hash = "sha256:3528a53e4bbe64b07a6112b4c5a00ff3c61924ee46c9c68e004a1ac7ad1f09c3"}, +] [[package]] name = "tokenizers" -version = "0.15.2" +version = "0.19.1" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.15.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:52f6130c9cbf70544287575a985bf44ae1bda2da7e8c24e97716080593638012"}, - {file = "tokenizers-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:054c1cc9c6d68f7ffa4e810b3d5131e0ba511b6e4be34157aa08ee54c2f8d9ee"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9b9b070fdad06e347563b88c278995735292ded1132f8657084989a4c84a6d5"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea621a7eef4b70e1f7a4e84dd989ae3f0eeb50fc8690254eacc08acb623e82f1"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf7fd9a5141634fa3aa8d6b7be362e6ae1b4cda60da81388fa533e0b552c98fd"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44f2a832cd0825295f7179eaf173381dc45230f9227ec4b44378322d900447c9"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b9ec69247a23747669ec4b0ca10f8e3dfb3545d550258129bd62291aabe8605"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b6a4c78da863ff26dbd5ad9a8ecc33d8a8d97b535172601cf00aee9d7ce9ce"}, - {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5ab2a4d21dcf76af60e05af8063138849eb1d6553a0d059f6534357bce8ba364"}, - {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a47acfac7e511f6bbfcf2d3fb8c26979c780a91e06fb5b9a43831b2c0153d024"}, - {file = "tokenizers-0.15.2-cp310-none-win32.whl", hash = "sha256:064ff87bb6acdbd693666de9a4b692add41308a2c0ec0770d6385737117215f2"}, - {file = "tokenizers-0.15.2-cp310-none-win_amd64.whl", hash = "sha256:3b919afe4df7eb6ac7cafd2bd14fb507d3f408db7a68c43117f579c984a73843"}, - {file = "tokenizers-0.15.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:89cd1cb93e4b12ff39bb2d626ad77e35209de9309a71e4d3d4672667b4b256e7"}, - {file = "tokenizers-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfed5c64e5be23d7ee0f0e98081a25c2a46b0b77ce99a4f0605b1ec43dd481fa"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a907d76dcfda37023ba203ab4ceeb21bc5683436ebefbd895a0841fd52f6f6f2"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20ea60479de6fc7b8ae756b4b097572372d7e4032e2521c1bbf3d90c90a99ff0"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:48e2b9335be2bc0171df9281385c2ed06a15f5cf121c44094338306ab7b33f2c"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:112a1dd436d2cc06e6ffdc0b06d55ac019a35a63afd26475205cb4b1bf0bfbff"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4620cca5c2817177ee8706f860364cc3a8845bc1e291aaf661fb899e5d1c45b0"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd73a82751c523b3fc31ff8194702e4af4db21dc20e55b30ecc2079c5d43cb7"}, - {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:107089f135b4ae7817affe6264f8c7a5c5b4fd9a90f9439ed495f54fcea56fb4"}, - {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0ff110ecc57b7aa4a594396525a3451ad70988e517237fe91c540997c4e50e29"}, - {file = "tokenizers-0.15.2-cp311-none-win32.whl", hash = "sha256:6d76f00f5c32da36c61f41c58346a4fa7f0a61be02f4301fd30ad59834977cc3"}, - {file = "tokenizers-0.15.2-cp311-none-win_amd64.whl", hash = "sha256:cc90102ed17271cf0a1262babe5939e0134b3890345d11a19c3145184b706055"}, - {file = "tokenizers-0.15.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f86593c18d2e6248e72fb91c77d413a815153b8ea4e31f7cd443bdf28e467670"}, - {file = "tokenizers-0.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0774bccc6608eca23eb9d620196687c8b2360624619623cf4ba9dc9bd53e8b51"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d0222c5b7c9b26c0b4822a82f6a7011de0a9d3060e1da176f66274b70f846b98"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3835738be1de66624fff2f4f6f6684775da4e9c00bde053be7564cbf3545cc66"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0143e7d9dcd811855c1ce1ab9bf5d96d29bf5e528fd6c7824d0465741e8c10fd"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db35825f6d54215f6b6009a7ff3eedee0848c99a6271c870d2826fbbedf31a38"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f5e64b0389a2be47091d8cc53c87859783b837ea1a06edd9d8e04004df55a5c"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e0480c452217edd35eca56fafe2029fb4d368b7c0475f8dfa3c5c9c400a7456"}, - {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a33ab881c8fe70474980577e033d0bc9a27b7ab8272896e500708b212995d834"}, - {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a308a607ca9de2c64c1b9ba79ec9a403969715a1b8ba5f998a676826f1a7039d"}, - {file = "tokenizers-0.15.2-cp312-none-win32.whl", hash = "sha256:b8fcfa81bcb9447df582c5bc96a031e6df4da2a774b8080d4f02c0c16b42be0b"}, - {file = "tokenizers-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:38d7ab43c6825abfc0b661d95f39c7f8af2449364f01d331f3b51c94dcff7221"}, - {file = "tokenizers-0.15.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:38bfb0204ff3246ca4d5e726e8cc8403bfc931090151e6eede54d0e0cf162ef0"}, - {file = "tokenizers-0.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c861d35e8286a53e06e9e28d030b5a05bcbf5ac9d7229e561e53c352a85b1fc"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:936bf3842db5b2048eaa53dade907b1160f318e7c90c74bfab86f1e47720bdd6"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:620beacc3373277700d0e27718aa8b25f7b383eb8001fba94ee00aeea1459d89"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2735ecbbf37e52db4ea970e539fd2d450d213517b77745114f92867f3fc246eb"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:473c83c5e2359bb81b0b6fde870b41b2764fcdd36d997485e07e72cc3a62264a"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968fa1fb3c27398b28a4eca1cbd1e19355c4d3a6007f7398d48826bbe3a0f728"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:865c60ae6eaebdde7da66191ee9b7db52e542ed8ee9d2c653b6d190a9351b980"}, - {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7c0d8b52664ab2d4a8d6686eb5effc68b78608a9008f086a122a7b2996befbab"}, - {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f33dfbdec3784093a9aebb3680d1f91336c56d86cc70ddf88708251da1fe9064"}, - {file = "tokenizers-0.15.2-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d44ba80988ff9424e33e0a49445072ac7029d8c0e1601ad25a0ca5f41ed0c1d6"}, - {file = "tokenizers-0.15.2-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:dce74266919b892f82b1b86025a613956ea0ea62a4843d4c4237be2c5498ed3a"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0ef06b9707baeb98b316577acb04f4852239d856b93e9ec3a299622f6084e4be"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73e2e74bbb07910da0d37c326869f34113137b23eadad3fc00856e6b3d9930c"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eeb12daf02a59e29f578a865f55d87cd103ce62bd8a3a5874f8fdeaa82e336b"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ba9f6895af58487ca4f54e8a664a322f16c26bbb442effd01087eba391a719e"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccec77aa7150e38eec6878a493bf8c263ff1fa8a62404e16c6203c64c1f16a26"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f40604f5042ff210ba82743dda2b6aa3e55aa12df4e9f2378ee01a17e2855e"}, - {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5645938a42d78c4885086767c70923abad047163d809c16da75d6b290cb30bbe"}, - {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05a77cbfebe28a61ab5c3891f9939cc24798b63fa236d84e5f29f3a85a200c00"}, - {file = "tokenizers-0.15.2-cp37-none-win32.whl", hash = "sha256:361abdc068e8afe9c5b818769a48624687fb6aaed49636ee39bec4e95e1a215b"}, - {file = "tokenizers-0.15.2-cp37-none-win_amd64.whl", hash = "sha256:7ef789f83eb0f9baeb4d09a86cd639c0a5518528f9992f38b28e819df397eb06"}, - {file = "tokenizers-0.15.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4fe1f74a902bee74a3b25aff180fbfbf4f8b444ab37c4d496af7afd13a784ed2"}, - {file = "tokenizers-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c4b89038a684f40a6b15d6b09f49650ac64d951ad0f2a3ea9169687bbf2a8ba"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d05a1b06f986d41aed5f2de464c003004b2df8aaf66f2b7628254bcbfb72a438"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508711a108684111ec8af89d3a9e9e08755247eda27d0ba5e3c50e9da1600f6d"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:daa348f02d15160cb35439098ac96e3a53bacf35885072611cd9e5be7d333daa"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:494fdbe5932d3416de2a85fc2470b797e6f3226c12845cadf054dd906afd0442"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2d60f5246f4da9373f75ff18d64c69cbf60c3bca597290cea01059c336d2470"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93268e788825f52de4c7bdcb6ebc1fcd4a5442c02e730faa9b6b08f23ead0e24"}, - {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6fc7083ab404019fc9acafe78662c192673c1e696bd598d16dc005bd663a5cf9"}, - {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e39b41e5531d6b2122a77532dbea60e171ef87a3820b5a3888daa847df4153"}, - {file = "tokenizers-0.15.2-cp38-none-win32.whl", hash = "sha256:06cd0487b1cbfabefb2cc52fbd6b1f8d4c37799bd6c6e1641281adaa6b2504a7"}, - {file = "tokenizers-0.15.2-cp38-none-win_amd64.whl", hash = "sha256:5179c271aa5de9c71712e31cb5a79e436ecd0d7532a408fa42a8dbfa4bc23fd9"}, - {file = "tokenizers-0.15.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82f8652a74cc107052328b87ea8b34291c0f55b96d8fb261b3880216a9f9e48e"}, - {file = "tokenizers-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02458bee6f5f3139f1ebbb6d042b283af712c0981f5bc50edf771d6b762d5e4f"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9a09cd26cca2e1c349f91aa665309ddb48d71636370749414fbf67bc83c5343"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:158be8ea8554e5ed69acc1ce3fbb23a06060bd4bbb09029431ad6b9a466a7121"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ddba9a2b0c8c81633eca0bb2e1aa5b3a15362b1277f1ae64176d0f6eba78ab1"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ef5dd1d39797044642dbe53eb2bc56435308432e9c7907728da74c69ee2adca"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:454c203164e07a860dbeb3b1f4a733be52b0edbb4dd2e5bd75023ffa8b49403a"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf6b7f1d4dc59af960e6ffdc4faffe6460bbfa8dce27a58bf75755ffdb2526d"}, - {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2ef09bbc16519f6c25d0c7fc0c6a33a6f62923e263c9d7cca4e58b8c61572afb"}, - {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c9a2ebdd2ad4ec7a68e7615086e633857c85e2f18025bd05d2a4399e6c5f7169"}, - {file = "tokenizers-0.15.2-cp39-none-win32.whl", hash = "sha256:918fbb0eab96fe08e72a8c2b5461e9cce95585d82a58688e7f01c2bd546c79d0"}, - {file = "tokenizers-0.15.2-cp39-none-win_amd64.whl", hash = "sha256:524e60da0135e106b254bd71f0659be9f89d83f006ea9093ce4d1fab498c6d0d"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9b648a58281c4672212fab04e60648fde574877d0139cd4b4f93fe28ca8944"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7c7d18b733be6bbca8a55084027f7be428c947ddf871c500ee603e375013ffba"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:13ca3611de8d9ddfbc4dc39ef54ab1d2d4aaa114ac8727dfdc6a6ec4be017378"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:237d1bf3361cf2e6463e6c140628e6406766e8b27274f5fcc62c747ae3c6f094"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67a0fe1e49e60c664915e9fb6b0cb19bac082ab1f309188230e4b2920230edb3"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e022fe65e99230b8fd89ebdfea138c24421f91c1a4f4781a8f5016fd5cdfb4d"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d857be2df69763362ac699f8b251a8cd3fac9d21893de129bc788f8baaef2693"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:708bb3e4283177236309e698da5fcd0879ce8fd37457d7c266d16b550bcbbd18"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c35e09e9899b72a76e762f9854e8750213f67567787d45f37ce06daf57ca78"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1257f4394be0d3b00de8c9e840ca5601d0a4a8438361ce9c2b05c7d25f6057b"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02272fe48280e0293a04245ca5d919b2c94a48b408b55e858feae9618138aeda"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dc3ad9ebc76eabe8b1d7c04d38be884b8f9d60c0cdc09b0aa4e3bcf746de0388"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:32e16bdeffa7c4f46bf2152172ca511808b952701d13e7c18833c0b73cb5c23f"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fb16ba563d59003028b678d2361a27f7e4ae0ab29c7a80690efa20d829c81fdb"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:2277c36d2d6cdb7876c274547921a42425b6810d38354327dd65a8009acf870c"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cf75d32e8d250781940d07f7eece253f2fe9ecdb1dc7ba6e3833fa17b82fcbc"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1b3b31884dc8e9b21508bb76da80ebf7308fdb947a17affce815665d5c4d028"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10122d8d8e30afb43bb1fe21a3619f62c3e2574bff2699cf8af8b0b6c5dc4a3"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d88b96ff0fe8e91f6ef01ba50b0d71db5017fa4e3b1d99681cec89a85faf7bf7"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:37aaec5a52e959892870a7c47cef80c53797c0db9149d458460f4f31e2fb250e"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2ea752f2b0fe96eb6e2f3adbbf4d72aaa1272079b0dfa1145507bd6a5d537e6"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b19a808d8799fda23504a5cd31d2f58e6f52f140380082b352f877017d6342b"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c86e5e068ac8b19204419ed8ca90f9d25db20578f5881e337d203b314f4104"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de19c4dc503c612847edf833c82e9f73cd79926a384af9d801dcf93f110cea4e"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea09acd2fe3324174063d61ad620dec3bcf042b495515f27f638270a7d466e8b"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cf27fd43472e07b57cf420eee1e814549203d56de00b5af8659cb99885472f1f"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7ca22bd897537a0080521445d91a58886c8c04084a6a19e6c78c586e0cfa92a5"}, - {file = "tokenizers-0.15.2.tar.gz", hash = "sha256:e6e9c6e019dd5484be5beafc775ae6c925f4c69a3487040ed09b45e13df2cb91"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, ] [package.dependencies] -huggingface_hub = ">=0.16.4,<1.0" +huggingface-hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] -docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" @@ -2373,37 +2473,38 @@ files = [ [[package]] name = "torch" -version = "2.1.2" +version = "2.3.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.1.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:3a871edd6c02dae77ad810335c0833391c1a4ce49af21ea8cf0f6a5d2096eea8"}, - {file = "torch-2.1.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:bef6996c27d8f6e92ea4e13a772d89611da0e103b48790de78131e308cf73076"}, - {file = "torch-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:0e13034fd5fb323cbbc29e56d0637a3791e50dd589616f40c79adfa36a5a35a1"}, - {file = "torch-2.1.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:d9b535cad0df3d13997dbe8bd68ac33e0e3ae5377639c9881948e40794a61403"}, - {file = "torch-2.1.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:f9a55d55af02826ebfbadf4e9b682f0f27766bc33df8236b48d28d705587868f"}, - {file = "torch-2.1.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:a6ebbe517097ef289cc7952783588c72de071d4b15ce0f8b285093f0916b1162"}, - {file = "torch-2.1.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:8f32ce591616a30304f37a7d5ea80b69ca9e1b94bba7f308184bf616fdaea155"}, - {file = "torch-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e0ee6cf90c8970e05760f898d58f9ac65821c37ffe8b04269ec787aa70962b69"}, - {file = "torch-2.1.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:76d37967c31c99548ad2c4d3f2cf191db48476f2e69b35a0937137116da356a1"}, - {file = "torch-2.1.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:e2d83f07b4aac983453ea5bf8f9aa9dacf2278a8d31247f5d9037f37befc60e4"}, - {file = "torch-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f41fe0c7ecbf903a568c73486139a75cfab287a0f6c17ed0698fdea7a1e8641d"}, - {file = "torch-2.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e3225f47d50bb66f756fe9196a768055d1c26b02154eb1f770ce47a2578d3aa7"}, - {file = "torch-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33d59cd03cb60106857f6c26b36457793637512998666ee3ce17311f217afe2b"}, - {file = "torch-2.1.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:8e221deccd0def6c2badff6be403e0c53491805ed9915e2c029adbcdb87ab6b5"}, - {file = "torch-2.1.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:05b18594f60a911a0c4f023f38a8bda77131fba5fd741bda626e97dcf5a3dd0a"}, - {file = "torch-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9ca96253b761e9aaf8e06fb30a66ee301aecbf15bb5a303097de1969077620b6"}, - {file = "torch-2.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d93ba70f67b08c2ae5598ee711cbc546a1bc8102cef938904b8c85c2089a51a0"}, - {file = "torch-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:255b50bc0608db177e6a3cc118961d77de7e5105f07816585fa6f191f33a9ff3"}, - {file = "torch-2.1.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6984cd5057c0c977b3c9757254e989d3f1124f4ce9d07caa6cb637783c71d42a"}, - {file = "torch-2.1.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:bc195d7927feabc0eb7c110e457c955ed2ab616f3c7c28439dd4188cf589699f"}, + {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, + {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, + {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, + {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, + {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, + {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, + {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, + {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, + {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, + {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, + {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, + {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, + {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, + {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, + {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, + {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, + {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, + {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, + {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, + {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, ] [package.dependencies] filelock = "*" fsspec = "*" jinja2 = "*" +mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} networkx = "*" nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} @@ -2414,25 +2515,25 @@ nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linu nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nccl-cu12 = {version = "2.18.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.1.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -typing-extensions = "*" +triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +typing-extensions = ">=4.8.0" [package.extras] -dynamo = ["jinja2"] opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] [[package]] name = "tqdm" -version = "4.66.2" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] @@ -2446,13 +2547,13 @@ telegram = ["requests"] [[package]] name = "transformers" -version = "4.37.1" +version = "4.40.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" files = [ - {file = "transformers-4.37.1-py3-none-any.whl", hash = "sha256:05e4c4bf94f74addeb716bc83517f49d55df1e9022db3d5b027c801e9a410ebf"}, - {file = "transformers-4.37.1.tar.gz", hash = "sha256:9843368d97fd7ac30126664743adc65e8e5be930da7d66342172e97bd1243e2d"}, + {file = "transformers-4.40.2-py3-none-any.whl", hash = "sha256:71cb94301ec211a2e1d4b8c8d18dcfaa902dfa00a089dceca167a8aa265d6f2d"}, + {file = "transformers-4.40.2.tar.gz", hash = "sha256:657b6054a2097671398d976ad46e60836e7e15f9ea9551631a96e33cb9240649"}, ] [package.dependencies] @@ -2464,23 +2565,23 @@ protobuf = {version = "*", optional = true, markers = "extra == \"sentencepiece\ pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" -safetensors = ">=0.3.1" +safetensors = ">=0.4.1" sentencepiece = {version = ">=0.1.91,<0.1.92 || >0.1.92", optional = true, markers = "extra == \"sentencepiece\""} -tokenizers = ">=0.14,<0.19" +tokenizers = ">=0.19,<0.20" tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] -agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.11,!=1.12.0)"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.19)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] docs-specific = ["hf-doc-builder"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] @@ -2497,47 +2598,45 @@ ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] -serving = ["fastapi", "pydantic (<2)", "starlette", "uvicorn"] +serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "tensorboard", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] -tokenizers = ["tokenizers (>=0.14,<0.19)"] -torch = ["accelerate (>=0.21.0)", "torch (>=1.11,!=1.12.0)"] +tokenizers = ["tokenizers (>=0.19,<0.20)"] +torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "2.1.0" +version = "2.3.1" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" files = [ - {file = "triton-2.1.0-0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:66439923a30d5d48399b08a9eae10370f6c261a5ec864a64983bae63152d39d7"}, - {file = "triton-2.1.0-0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:919b06453f0033ea52c13eaf7833de0e57db3178d23d4e04f9fc71c4f2c32bf8"}, - {file = "triton-2.1.0-0-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae4bb8a91de790e1866405211c4d618379781188f40d5c4c399766914e84cd94"}, - {file = "triton-2.1.0-0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39f6fb6bdccb3e98f3152e3fbea724f1aeae7d749412bbb1fa9c441d474eba26"}, - {file = "triton-2.1.0-0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21544e522c02005a626c8ad63d39bdff2f31d41069592919ef281e964ed26446"}, - {file = "triton-2.1.0-0-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:143582ca31dd89cd982bd3bf53666bab1c7527d41e185f9e3d8a3051ce1b663b"}, - {file = "triton-2.1.0-0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82fc5aeeedf6e36be4e4530cbdcba81a09d65c18e02f52dc298696d45721f3bd"}, - {file = "triton-2.1.0-0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:81a96d110a738ff63339fc892ded095b31bd0d205e3aace262af8400d40b6fa8"}, + {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, + {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, + {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, + {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, + {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, + {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, ] [package.dependencies] filelock = "*" [package.extras] -build = ["cmake (>=3.18)", "lit"] -tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] -tutorials = ["matplotlib", "pandas", "tabulate"] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] [[package]] name = "typer" @@ -2561,13 +2660,13 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6. [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -2583,18 +2682,18 @@ files = [ [[package]] name = "urllib3" -version = "2.0.4" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, - {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -2614,86 +2713,81 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [[package]] @@ -2918,20 +3012,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.18.1" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "6d4a4fdf6556f14d16f4c0272e15197f9d237fdea5511555a99ce66fc3cd1eff" +content-hash = "bd94f44b941079dc0030d89481cd7418f7f6be602a9807594b6f07aa23fe4e17" diff --git a/backends/python/server/pyproject.toml b/backends/python/server/pyproject.toml index dad5efcf..51156b5c 100644 --- a/backends/python/server/pyproject.toml +++ b/backends/python/server/pyproject.toml @@ -20,7 +20,7 @@ loguru = "^0.6.0" opentelemetry-api = "^1.15.0" opentelemetry-exporter-otlp = "^1.15.0" opentelemetry-instrumentation-grpc = "^0.36b0" -optimum-habana = "1.11.1" +optimum-habana = "1.12.0" [tool.poetry.extras] diff --git a/backends/python/server/requirements.txt b/backends/python/server/requirements.txt index 70168d87..be22123e 100644 --- a/backends/python/server/requirements.txt +++ b/backends/python/server/requirements.txt @@ -43,8 +43,8 @@ opentelemetry-instrumentation==0.36b0 ; python_version >= "3.9" and python_versi opentelemetry-proto==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-sdk==1.15.0 ; python_version >= "3.9" and python_version < "3.13" opentelemetry-semantic-conventions==0.36b0 ; python_version >= "3.9" and python_version < "3.13" -optimum-habana==1.11.1 ; python_version >= "3.9" and python_version < "3.13" -optimum==1.19.0 ; python_version >= "3.9" and python_version < "3.13" +optimum-habana==1.12.0 ; python_version >= "3.9" and python_version < "3.13" +optimum==1.20.0 ; python_version >= "3.9" and python_version < "3.13" packaging==23.1 ; python_version >= "3.9" and python_version < "3.13" pandas==2.2.2 ; python_version >= "3.9" and python_version < "3.13" pillow==10.3.0 ; python_version >= "3.9" and python_version < "3.13" @@ -63,10 +63,10 @@ sentencepiece==0.2.0 ; python_version >= "3.9" and python_version < "3.13" setuptools==68.2.0 ; python_version >= "3.9" and python_version < "3.13" six==1.16.0 ; python_version >= "3.9" and python_version < "3.13" sympy==1.12 ; python_version >= "3.9" and python_version < "3.13" -tokenizers==0.15.2 ; python_version >= "3.9" and python_version < "3.13" +tokenizers==0.19.1 ; python_version >= "3.9" and python_version < "3.13" tqdm==4.66.2 ; python_version >= "3.9" and python_version < "3.13" -transformers==4.38.2 ; python_version >= "3.9" and python_version < "3.13" -transformers[sentencepiece]==4.38.2 ; python_version >= "3.9" and python_version < "3.13" +transformers==4.40.2 ; python_version >= "3.9" and python_version < "3.13" +transformers[sentencepiece]==4.40.2 ; python_version >= "3.9" and python_version < "3.13" typer==0.6.1 ; python_version >= "3.9" and python_version < "3.13" typing-extensions==4.8.0 ; python_version >= "3.9" and python_version < "3.13" tzdata==2024.1 ; python_version >= "3.9" and python_version < "3.13" From 8c28243866df63ea0fcc6312049ff0dacb897af0 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Tue, 9 Jul 2024 15:45:40 +0800 Subject: [PATCH 67/72] Add check and crash directly if set incorrect warmup params (#16) Signed-off-by: Liu, Kaixuan --- backends/src/lib.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/backends/src/lib.rs b/backends/src/lib.rs index 6b98bdfa..f854c7b8 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -130,6 +130,7 @@ impl Backend { Some(value) => value as u32, None => read_env_var("MAX_WARMUP_BATCH_SIZE", 8), }; + let mut batch_sizes: Vec = powers_of_two(max_batch_size); if let Some(&last) = batch_sizes.last() { if last < max_batch_size { @@ -137,8 +138,16 @@ impl Backend { } } if max_warmup_length > max_input_length { - tracing::warn!("max_warmup_length exceeds model's max_input_length limit, will replace it"); + return Err(BackendError::Start( + "max_warmup_length exceeds model's max_input_length".to_string() + )); + } + if seq_bucket_size > max_warmup_length { + return Err(BackendError::Start( + "PAD_SEQUENCE_TO_MULTIPLE_OF exceeds model's max warmup length".to_string() + )); } + max_input_length = std::cmp::min(max_input_length, max_warmup_length); let mut seq_lengths: Vec = (seq_bucket_size..max_input_length+1).step_by(seq_bucket_size as usize).collect(); if let Some(&last) = seq_lengths.last() { From 00c740169dee41fce193b7e23be10daf35d7e15e Mon Sep 17 00:00:00 2001 From: regisss <15324346+regisss@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:17:13 +0200 Subject: [PATCH 68/72] Add workflow for pushing Docker images (#18) --- .github/workflows/build_documentation.yml | 22 ------ .github/workflows/build_pr_documentation.yml | 20 ------ .github/workflows/liniting.yaml | 69 ------------------- .github/workflows/push_docker_image.yml | 56 +++++++++++++++ .github/workflows/upload_pr_documentation.yml | 16 ----- 5 files changed, 56 insertions(+), 127 deletions(-) delete mode 100644 .github/workflows/build_documentation.yml delete mode 100644 .github/workflows/build_pr_documentation.yml delete mode 100644 .github/workflows/liniting.yaml create mode 100644 .github/workflows/push_docker_image.yml delete mode 100644 .github/workflows/upload_pr_documentation.yml diff --git a/.github/workflows/build_documentation.yml b/.github/workflows/build_documentation.yml deleted file mode 100644 index 642766ac..00000000 --- a/.github/workflows/build_documentation.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Build documentation - -on: - push: - paths: - - "docs/source/**" - branches: - - main - - doc-builder* - - v*-release - -jobs: - build: - uses: huggingface/doc-builder/.github/workflows/build_main_documentation.yml@main - with: - commit_sha: ${{ github.sha }} - package: text-embeddings-inference - additional_args: --not_python_module - languages: en - secrets: - token: ${{ secrets.HUGGINGFACE_PUSH }} - hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }} diff --git a/.github/workflows/build_pr_documentation.yml b/.github/workflows/build_pr_documentation.yml deleted file mode 100644 index c93edb52..00000000 --- a/.github/workflows/build_pr_documentation.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Build PR Documentation - -on: - pull_request: - paths: - - "docs/source/**" - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - build: - uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@main - with: - commit_sha: ${{ github.event.pull_request.head.sha }} - pr_number: ${{ github.event.number }} - package: text-embeddings-inference - additional_args: --not_python_module - languages: en diff --git a/.github/workflows/liniting.yaml b/.github/workflows/liniting.yaml deleted file mode 100644 index ada0d052..00000000 --- a/.github/workflows/liniting.yaml +++ /dev/null @@ -1,69 +0,0 @@ -name: Linting Tests - -on: - pull_request: - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - run_tests: - runs-on: ubuntu-latest - - env: - SCCACHE_GHA_ENABLED: "on" - RUSTC_WRAPPER: /usr/local/bin/sccache - SCCACHE: 0.3.3 - - steps: - - uses: actions/checkout@v2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - # Released on: 28 December, 2023 - # Branched from master on: 10 November, 2023 - # https://releases.rs/docs/1.75.0/ - toolchain: 1.75.0 - override: true - components: rustfmt, clippy - - name: Install Protoc - uses: arduino/setup-protoc@v1 - - name: Clean unused files - run: | - sudo rm -rf /usr/local/lib/android # will release about 10 GB if you don't need Android - sudo rm -rf /usr/share/dotnet # will release about 20GB if you don't need .NET - - name: Install 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 - - 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 || ''); - core.exportVariable('SCCACHE_GHA_CACHE_TO', 'sccache-${{runner.os}}-${{github.ref_name}}'); - core.exportVariable('SCCACHE_GHA_CACHE_FROM', 'sccache-${{runner.os}}-main,sccache-${{runner.os}}-'); - - name: cargo registry cache - uses: actions/cache@v3 - with: - key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.toml') }}-${{ github.sha }} - restore-keys: | - cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.toml') }}- - cargo-${{ runner.os }}- - path: | - ~/.cargo/registry - ~/.cargo/git - - name: Build - run: | - cargo build - cargo build -F candle -F grpc --no-default-features - - name: Pre-commit checks - run: | - pip install pre-commit - pre-commit install - pre-commit run --all-files - - name: sccache stats - run: | - /usr/local/bin/sccache --show-stats diff --git a/.github/workflows/push_docker_image.yml b/.github/workflows/push_docker_image.yml new file mode 100644 index 00000000..01eaa0d1 --- /dev/null +++ b/.github/workflows/push_docker_image.yml @@ -0,0 +1,56 @@ +name: Build and push docker image to Github registry + +on: + workflow_dispatch: + inputs: + tag: + description: 'Tag for the Docker image:' + required: true + +jobs: + build-and-push: + concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + runs-on: ubuntu-latest + 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 + config-inline: | + [registry."docker.io"] + - 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@v4.3.0 + with: + flavor: | + latest=true + images: ghcr.io/huggingface/tei-gaudi + tags: | + type=raw,value=${{ github.event.inputs.tag }} + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile + push: true + platforms: 'linux/amd64' + tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/upload_pr_documentation.yml b/.github/workflows/upload_pr_documentation.yml deleted file mode 100644 index 03fde440..00000000 --- a/.github/workflows/upload_pr_documentation.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Upload PR Documentation - -on: - workflow_run: - workflows: ["Build PR Documentation"] - types: - - completed - -jobs: - build: - uses: huggingface/doc-builder/.github/workflows/upload_pr_documentation.yml@main - with: - package_name: text-embeddings-inference - secrets: - hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }} - comment_bot_token: ${{ secrets.COMMENT_BOT_TOKEN }} From 926e8b7b94bfa5bd626b031170e34c982cf281bb Mon Sep 17 00:00:00 2001 From: regisss <15324346+regisss@users.noreply.github.com> Date: Tue, 9 Jul 2024 12:23:11 +0000 Subject: [PATCH 69/72] Fix Dockerfile used for publishing Docker images --- .github/workflows/push_docker_image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push_docker_image.yml b/.github/workflows/push_docker_image.yml index 01eaa0d1..72168f9e 100644 --- a/.github/workflows/push_docker_image.yml +++ b/.github/workflows/push_docker_image.yml @@ -50,7 +50,7 @@ jobs: uses: docker/build-push-action@v4 with: context: . - file: Dockerfile + file: Dockerfile-hpu push: true platforms: 'linux/amd64' tags: ${{ steps.meta.outputs.tags }} From eb1014d7c0a4331595078f69dd9488db767a09e4 Mon Sep 17 00:00:00 2001 From: regisss <15324346+regisss@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:54:13 +0200 Subject: [PATCH 70/72] Refine warmup error (#19) --- README.md | 11 ++++++++--- backends/src/lib.rs | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5286a2d1..50d7b861 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,21 @@ To use [🤗 text-embeddings-inference](https://github.com/huggingface/text-embeddings-inference) on Habana Gaudi/Gaudi2, follow these steps: -1. Build the Docker image located in this folder with: +1. Pull the official Docker image with: ```bash - docker build -f Dockerfile-hpu -t tei_gaudi . + docker pull ghcr.io/huggingface/tei-gaudi:latest ``` +> [!NOTE] +> Alternatively, you can build the Docker image using `Dockerfile-hpu` located in this folder with: +> ```bash +> docker build -f Dockerfile-hpu -t tei_gaudi . +> ``` 2. Launch a local server instance on 1 Gaudi card: ```bash 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 -p 8080:80 -v $volume:/data --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice --ipc=host tei_gaudi --model-id $model --pooling cls + docker run -p 8080:80 -v $volume:/data --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none -e MAX_WARMUP_SEQUENCE_LENGTH=512 --cap-add=sys_nice --ipc=host ghcr.io/huggingface/tei-gaudi:latest --model-id $model --pooling cls ``` 3. You can then send a request: ```bash diff --git a/backends/src/lib.rs b/backends/src/lib.rs index f854c7b8..6fced834 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -139,15 +139,15 @@ impl Backend { } if max_warmup_length > max_input_length { return Err(BackendError::Start( - "max_warmup_length exceeds model's max_input_length".to_string() + format!("max_warmup_length ({max_warmup_length}) exceeds model's max_input_length ({max_input_length}), you can modify this value adding `-e MAX_WARMUP_SEQUENCE_LENGTH=` to your Docker run command") )); } if seq_bucket_size > max_warmup_length { return Err(BackendError::Start( - "PAD_SEQUENCE_TO_MULTIPLE_OF exceeds model's max warmup length".to_string() + format!("PAD_SEQUENCE_TO_MULTIPLE_OF ({seq_bucket_size}) exceeds model's max warmup length ({max_warmup_length}), you can modify these values adding `-e PAD_SEQUENCE_TO_MULTIPLE_OF=` or `-e MAX_WARMUP_SEQUENCE_LENGTH= to your Docker run command`") )); } - + max_input_length = std::cmp::min(max_input_length, max_warmup_length); let mut seq_lengths: Vec = (seq_bucket_size..max_input_length+1).step_by(seq_bucket_size as usize).collect(); if let Some(&last) = seq_lengths.last() { From 373049d424c775372752ea85a977fdc1c13551cc Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Wed, 10 Jul 2024 09:02:37 +0000 Subject: [PATCH 71/72] delete build yaml files Signed-off-by: kaixuanliu --- .github/workflows/build_75.yaml | 136 ---------------------------- .github/workflows/build_80.yaml | 146 ------------------------------- .github/workflows/build_86.yaml | 134 ---------------------------- .github/workflows/build_89.yaml | 134 ---------------------------- .github/workflows/build_90.yaml | 134 ---------------------------- .github/workflows/build_cpu.yaml | 144 ------------------------------ 6 files changed, 828 deletions(-) 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_cpu.yaml diff --git a/.github/workflows/build_75.yaml b/.github/workflows/build_75.yaml deleted file mode 100644 index 6d941d03..00000000 --- a/.github/workflows/build_75.yaml +++ /dev/null @@ -1,136 +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: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - 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: 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 - 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=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 - - - 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 - 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=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-75,mode=max diff --git a/.github/workflows/build_80.yaml b/.github/workflows/build_80.yaml deleted file mode 100644 index 7a41c117..00000000 --- a/.github/workflows/build_80.yaml +++ /dev/null @@ -1,146 +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: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - 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: 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 - 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=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 - - - 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 - 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=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-80,mode=max diff --git a/.github/workflows/build_86.yaml b/.github/workflows/build_86.yaml deleted file mode 100644 index 16c182ec..00000000 --- a/.github/workflows/build_86.yaml +++ /dev/null @@ -1,134 +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: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - 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: 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 - 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=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 - - - 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 - 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=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-86,mode=max diff --git a/.github/workflows/build_89.yaml b/.github/workflows/build_89.yaml deleted file mode 100644 index 689838f6..00000000 --- a/.github/workflows/build_89.yaml +++ /dev/null @@ -1,134 +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: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - 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: 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 - 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=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 - - - 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 - 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=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-89,mode=max diff --git a/.github/workflows/build_90.yaml b/.github/workflows/build_90.yaml deleted file mode 100644 index 40f05235..00000000 --- a/.github/workflows/build_90.yaml +++ /dev/null @@ -1,134 +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: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - 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: 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 - 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=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 - - - 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 - 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=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-90,mode=max diff --git a/.github/workflows/build_cpu.yaml b/.github/workflows/build_cpu.yaml deleted file mode 100644 index 3cf87f5a..00000000 --- a/.github/workflows/build_cpu.yaml +++ /dev/null @@ -1,144 +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: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - 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: 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 - 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=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 - - - 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 - 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=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-cpu,mode=max From 428b65a15d48ede8a80e7aba9a1e03086554c8b5 Mon Sep 17 00:00:00 2001 From: kaixuanliu Date: Thu, 11 Jul 2024 01:33:23 +0000 Subject: [PATCH 72/72] delete `build_all.yaml` file Signed-off-by: kaixuanliu --- .github/workflows/build_all.yaml | 119 ------------------------------- 1 file changed, 119 deletions(-) delete mode 100644 .github/workflows/build_all.yaml diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml deleted file mode 100644 index 58aa7b09..00000000 --- a/.github/workflows/build_all.yaml +++ /dev/null @@ -1,119 +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: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - 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: 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 - 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=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