From b7be6c09df4b2298ed74779e2d6a5e4855dc2c94 Mon Sep 17 00:00:00 2001 From: OlivierDehaene Date: Tue, 5 Mar 2024 18:42:31 +0100 Subject: [PATCH 01/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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/29] 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 2d0fe3586cf1eb5e5d3edd47b40baefbea6709ca Mon Sep 17 00:00:00 2001 From: regisss <15324346+regisss@users.noreply.github.com> Date: Thu, 18 Apr 2024 09:50:35 +0000 Subject: [PATCH 29/29] Update dependencies --- backends/python/server/poetry.lock | 2063 +++++++++++++++++++++-- backends/python/server/pyproject.toml | 6 +- backends/python/server/requirements.txt | 53 +- 3 files changed, 2005 insertions(+), 117 deletions(-) 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"