diff --git a/.gitattributes b/.gitattributes
index 91b626d9ae9e420a922728173caa998b7a279581..592fa711cefa00c8f784af882cabf6c2d4920bf5 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -412,3 +412,4 @@ tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/
.venv/lib/python3.11/site-packages/opencv_python_headless.libs/libavcodec-76c43bf0.so.59.37.100 filter=lfs diff=lfs merge=lfs -text
.venv/lib/python3.11/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc-builtins.so.12.4 filter=lfs diff=lfs merge=lfs -text
.venv/lib/python3.11/site-packages/cv2/cv2.abi3.so filter=lfs diff=lfs merge=lfs -text
+.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/libcudnn_engines_runtime_compiled.so.9 filter=lfs diff=lfs merge=lfs -text
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/__init__.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..56a213c8b7a2f5451d66ce8b426128deebca6586
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_commit_api.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_commit_api.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b6807f8c9d310487043cfdc701b721d48332b9c5
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_commit_api.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_commit_scheduler.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_commit_scheduler.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6053f6ef765a1234fca5329771df79da31f80532
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_commit_scheduler.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_inference_endpoints.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_inference_endpoints.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..63532446d4b868fd30fe2fcd720326538407e3cf
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_inference_endpoints.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_local_folder.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_local_folder.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2303e77f40f4204e7958a4ebc78f8c1599c7b636
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_local_folder.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_login.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_login.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c97634c615c9204d73ac6468531674f1aa5aa626
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_login.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_snapshot_download.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_snapshot_download.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9a71865fe40ab2cfccd36e70568ad55d388bc0e0
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_snapshot_download.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_space_api.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_space_api.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4216913f7375d58d05878a9b6c9e028514501e2b
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_space_api.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_tensorboard_logger.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_tensorboard_logger.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dbc66261f763d170b54bdda62842783118272bff
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_tensorboard_logger.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_upload_large_folder.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_upload_large_folder.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e02bb51da54da72965a7bb385b402e8dbba69f2f
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_upload_large_folder.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_webhooks_payload.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_webhooks_payload.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..241f418386b52cc34dd4d678b0ef431a8bcd03a3
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_webhooks_payload.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_webhooks_server.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_webhooks_server.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..72daf1f7d34b8c9d233b37f316b2b44d4abc4178
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/_webhooks_server.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/community.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/community.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..219ed537febed082a62a58c9ca45141ba2ffc9df
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/community.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/constants.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/constants.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..15cb8167ea2932496f0e867a965a4b0f004f0308
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/constants.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/errors.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/errors.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..96ab67448e420a9ed62fd98f6427a23bed9f846f
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/errors.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/fastai_utils.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/fastai_utils.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6e92f7f7b86391a60921472d6d74b91f5c74bf34
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/fastai_utils.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/file_download.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/file_download.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..71b5afbaaf30096777b9d1d7f1d7e591e9705b68
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/file_download.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/hf_file_system.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/hf_file_system.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1cd300b4cdff706d787d45fc5786e6dc6ef647cd
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/hf_file_system.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/hub_mixin.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/hub_mixin.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..36966f1aa12e0f2662eda12ca4ac5870530bd2ae
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/hub_mixin.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/inference_api.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/inference_api.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e160744b3b27b593a2161902aea16fe0c66adfbe
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/inference_api.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/keras_mixin.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/keras_mixin.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aaadc9e55bc87d47540ea188e55225fb641ab5b2
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/keras_mixin.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/lfs.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/lfs.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..11e011c486fa8754dc012228b1067263766408bb
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/lfs.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repocard.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repocard.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2ecbf54085aea2024bca5161676379f748892af1
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repocard.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repocard_data.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repocard_data.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2b7311952b151fd3fa30fe4420c3d220d88d7313
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repocard_data.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repository.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repository.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7df6a0e154ad79db2528100632e6eee361ef1ae8
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/__pycache__/repository.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/__pycache__/__init__.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..15545e9bf412e1ef3bbed35ae4e47de38eeb15f3
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__init__.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..137c3c3e23c3763d1b6c334b0e28784dace05b8a
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__init__.py
@@ -0,0 +1,187 @@
+# This file is auto-generated by `utils/generate_inference_types.py`.
+# Do not modify it manually.
+#
+# ruff: noqa: F401
+
+from .audio_classification import (
+ AudioClassificationInput,
+ AudioClassificationOutputElement,
+ AudioClassificationOutputTransform,
+ AudioClassificationParameters,
+)
+from .audio_to_audio import AudioToAudioInput, AudioToAudioOutputElement
+from .automatic_speech_recognition import (
+ AutomaticSpeechRecognitionEarlyStoppingEnum,
+ AutomaticSpeechRecognitionGenerationParameters,
+ AutomaticSpeechRecognitionInput,
+ AutomaticSpeechRecognitionOutput,
+ AutomaticSpeechRecognitionOutputChunk,
+ AutomaticSpeechRecognitionParameters,
+)
+from .base import BaseInferenceType
+from .chat_completion import (
+ ChatCompletionInput,
+ ChatCompletionInputFunctionDefinition,
+ ChatCompletionInputFunctionName,
+ ChatCompletionInputGrammarType,
+ ChatCompletionInputGrammarTypeType,
+ ChatCompletionInputMessage,
+ ChatCompletionInputMessageChunk,
+ ChatCompletionInputMessageChunkType,
+ ChatCompletionInputStreamOptions,
+ ChatCompletionInputTool,
+ ChatCompletionInputToolChoiceClass,
+ ChatCompletionInputToolChoiceEnum,
+ ChatCompletionInputURL,
+ ChatCompletionOutput,
+ ChatCompletionOutputComplete,
+ ChatCompletionOutputFunctionDefinition,
+ ChatCompletionOutputLogprob,
+ ChatCompletionOutputLogprobs,
+ ChatCompletionOutputMessage,
+ ChatCompletionOutputToolCall,
+ ChatCompletionOutputTopLogprob,
+ ChatCompletionOutputUsage,
+ ChatCompletionStreamOutput,
+ ChatCompletionStreamOutputChoice,
+ ChatCompletionStreamOutputDelta,
+ ChatCompletionStreamOutputDeltaToolCall,
+ ChatCompletionStreamOutputFunction,
+ ChatCompletionStreamOutputLogprob,
+ ChatCompletionStreamOutputLogprobs,
+ ChatCompletionStreamOutputTopLogprob,
+ ChatCompletionStreamOutputUsage,
+)
+from .depth_estimation import DepthEstimationInput, DepthEstimationOutput
+from .document_question_answering import (
+ DocumentQuestionAnsweringInput,
+ DocumentQuestionAnsweringInputData,
+ DocumentQuestionAnsweringOutputElement,
+ DocumentQuestionAnsweringParameters,
+)
+from .feature_extraction import FeatureExtractionInput, FeatureExtractionInputTruncationDirection
+from .fill_mask import FillMaskInput, FillMaskOutputElement, FillMaskParameters
+from .image_classification import (
+ ImageClassificationInput,
+ ImageClassificationOutputElement,
+ ImageClassificationOutputTransform,
+ ImageClassificationParameters,
+)
+from .image_segmentation import (
+ ImageSegmentationInput,
+ ImageSegmentationOutputElement,
+ ImageSegmentationParameters,
+ ImageSegmentationSubtask,
+)
+from .image_to_image import ImageToImageInput, ImageToImageOutput, ImageToImageParameters, ImageToImageTargetSize
+from .image_to_text import (
+ ImageToTextEarlyStoppingEnum,
+ ImageToTextGenerationParameters,
+ ImageToTextInput,
+ ImageToTextOutput,
+ ImageToTextParameters,
+)
+from .object_detection import (
+ ObjectDetectionBoundingBox,
+ ObjectDetectionInput,
+ ObjectDetectionOutputElement,
+ ObjectDetectionParameters,
+)
+from .question_answering import (
+ QuestionAnsweringInput,
+ QuestionAnsweringInputData,
+ QuestionAnsweringOutputElement,
+ QuestionAnsweringParameters,
+)
+from .sentence_similarity import SentenceSimilarityInput, SentenceSimilarityInputData
+from .summarization import (
+ SummarizationInput,
+ SummarizationOutput,
+ SummarizationParameters,
+ SummarizationTruncationStrategy,
+)
+from .table_question_answering import (
+ Padding,
+ TableQuestionAnsweringInput,
+ TableQuestionAnsweringInputData,
+ TableQuestionAnsweringOutputElement,
+ TableQuestionAnsweringParameters,
+)
+from .text2text_generation import (
+ Text2TextGenerationInput,
+ Text2TextGenerationOutput,
+ Text2TextGenerationParameters,
+ Text2TextGenerationTruncationStrategy,
+)
+from .text_classification import (
+ TextClassificationInput,
+ TextClassificationOutputElement,
+ TextClassificationOutputTransform,
+ TextClassificationParameters,
+)
+from .text_generation import (
+ TextGenerationInput,
+ TextGenerationInputGenerateParameters,
+ TextGenerationInputGrammarType,
+ TextGenerationOutput,
+ TextGenerationOutputBestOfSequence,
+ TextGenerationOutputDetails,
+ TextGenerationOutputFinishReason,
+ TextGenerationOutputPrefillToken,
+ TextGenerationOutputToken,
+ TextGenerationStreamOutput,
+ TextGenerationStreamOutputStreamDetails,
+ TextGenerationStreamOutputToken,
+ TypeEnum,
+)
+from .text_to_audio import (
+ TextToAudioEarlyStoppingEnum,
+ TextToAudioGenerationParameters,
+ TextToAudioInput,
+ TextToAudioOutput,
+ TextToAudioParameters,
+)
+from .text_to_image import TextToImageInput, TextToImageOutput, TextToImageParameters, TextToImageTargetSize
+from .text_to_speech import (
+ TextToSpeechEarlyStoppingEnum,
+ TextToSpeechGenerationParameters,
+ TextToSpeechInput,
+ TextToSpeechOutput,
+ TextToSpeechParameters,
+)
+from .text_to_video import TextToVideoInput, TextToVideoOutput, TextToVideoParameters
+from .token_classification import (
+ TokenClassificationAggregationStrategy,
+ TokenClassificationInput,
+ TokenClassificationOutputElement,
+ TokenClassificationParameters,
+)
+from .translation import TranslationInput, TranslationOutput, TranslationParameters, TranslationTruncationStrategy
+from .video_classification import (
+ VideoClassificationInput,
+ VideoClassificationOutputElement,
+ VideoClassificationOutputTransform,
+ VideoClassificationParameters,
+)
+from .visual_question_answering import (
+ VisualQuestionAnsweringInput,
+ VisualQuestionAnsweringInputData,
+ VisualQuestionAnsweringOutputElement,
+ VisualQuestionAnsweringParameters,
+)
+from .zero_shot_classification import (
+ ZeroShotClassificationInput,
+ ZeroShotClassificationOutputElement,
+ ZeroShotClassificationParameters,
+)
+from .zero_shot_image_classification import (
+ ZeroShotImageClassificationInput,
+ ZeroShotImageClassificationOutputElement,
+ ZeroShotImageClassificationParameters,
+)
+from .zero_shot_object_detection import (
+ ZeroShotObjectDetectionBoundingBox,
+ ZeroShotObjectDetectionInput,
+ ZeroShotObjectDetectionOutputElement,
+ ZeroShotObjectDetectionParameters,
+)
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/__init__.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b782689323cea649d7b3fe5ed40c885bb4275091
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/audio_classification.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/audio_classification.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..28caeeb021d9b175004b87abb51984bc7fddad13
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/audio_classification.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/audio_to_audio.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/audio_to_audio.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b5db2ce39a8c268165fdc966aeeb1fe83896f0f2
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/audio_to_audio.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/automatic_speech_recognition.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/automatic_speech_recognition.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f35e2a3684d097e619dcc9debd2c9241867414da
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/automatic_speech_recognition.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/base.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/base.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ccb8207c402af4e9e3a56c32ce0f2cb0d22257d1
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/base.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/chat_completion.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/chat_completion.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6b549fd7272ffd8d4831f3490d9a78bad20a51c1
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/chat_completion.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/depth_estimation.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/depth_estimation.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6acc0e9534ce8d5920ae50e98bcfc5cdc186053d
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/depth_estimation.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/document_question_answering.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/document_question_answering.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8b5054f5215bee92ff1603efed4e265e7dd766e8
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/document_question_answering.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/feature_extraction.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/feature_extraction.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..39c0b917569231c4ce9d1954424942da838d67e0
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/feature_extraction.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/fill_mask.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/fill_mask.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e0e2e8f35521d146264b904a5adbe2e4d782777c
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/fill_mask.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_classification.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_classification.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a7b5c1807095f4289e7f1012f037991bf6a2696e
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_classification.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_segmentation.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_segmentation.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..826d2b08e3bfa283597a6c6daf4f67075f38dedf
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_segmentation.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_to_image.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_to_image.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9aa39a56251343301b75e2439bfec2088c5ec02b
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_to_image.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_to_text.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_to_text.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..63235382dad7944aa6447654b0784149f3069e08
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/image_to_text.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/object_detection.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/object_detection.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0cb262f3f4a1f88d53a374c3ceed1130a27b46ad
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/object_detection.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/question_answering.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/question_answering.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aeb8dbe6646745caf523fd94090c6f9df787b18d
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/question_answering.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/sentence_similarity.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/sentence_similarity.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5a9121b9f30279705c3df2606eee3ef1920831d7
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/sentence_similarity.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/summarization.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/summarization.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6cb97e6a1ec41a9133502412bfa0151a6d3b164b
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/summarization.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/table_question_answering.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/table_question_answering.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3062e378bbd8e6bb8553eef31b7100a63dbd0d61
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/table_question_answering.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text2text_generation.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text2text_generation.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..eaf7a9a5e53406373b6462454ba0caf3716d5a63
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text2text_generation.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_classification.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_classification.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..db964da0020f071233c56587977c6506382b3385
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_classification.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_generation.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_generation.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8e946db3ad7e14c44fc5475eee21e6a9e1974a39
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_generation.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_audio.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_audio.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dad964c30203da24127a5a00cc64804788ebe7e4
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_audio.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_image.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_image.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5d254236db49eaf7ba533ac669ad4d3c3bf5a312
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_image.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_speech.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_speech.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..92b97facc276113ef8a3e53ee97fa7a27820344f
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_speech.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_video.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_video.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2cd1db0936fdcab0068abb217de52e80fa8cb12a
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/text_to_video.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/token_classification.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/token_classification.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e4926a4bdc92381177b76b1c213d808d9e1bddb4
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/token_classification.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/translation.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/translation.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3b08b0b02615278bd9b71062db39bede964af7dd
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/translation.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/video_classification.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/video_classification.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a767c9196670d600c86f8f237ec19a0c8cc646b5
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/video_classification.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/visual_question_answering.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/visual_question_answering.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1b14481ed23eed399c60134ec1f32b87633c48f9
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/visual_question_answering.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_classification.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_classification.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0c91fcbcb5508f5d6f1a3cd29a39467a6a1fe9ff
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_classification.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_image_classification.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_image_classification.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..83e86526b5a8c987303c6bad5eb4e0a0b28b742f
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_image_classification.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_object_detection.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_object_detection.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5e31fcd648e009ddcbfcb501dfa2c328a20c26d3
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/__pycache__/zero_shot_object_detection.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/base.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..e57b9e8c1e6c677b5b0ea6367e8db58212092014
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/base.py
@@ -0,0 +1,140 @@
+# Copyright 2024 The HuggingFace Team. All rights reserved.
+#
+# 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.
+"""Contains a base class for all inference types."""
+
+import inspect
+import json
+from dataclasses import asdict, dataclass
+from typing import Any, Dict, List, Type, TypeVar, Union, get_args
+
+
+T = TypeVar("T", bound="BaseInferenceType")
+
+
+@dataclass
+class BaseInferenceType(dict):
+ """Base class for all inference types.
+
+ Object is a dataclass and a dict for backward compatibility but plan is to remove the dict part in the future.
+
+ Handle parsing from dict, list and json strings in a permissive way to ensure future-compatibility (e.g. all fields
+ are made optional, and non-expected fields are added as dict attributes).
+ """
+
+ @classmethod
+ def parse_obj_as_list(cls: Type[T], data: Union[bytes, str, List, Dict]) -> List[T]:
+ """Alias to parse server response and return a single instance.
+
+ See `parse_obj` for more details.
+ """
+ output = cls.parse_obj(data)
+ if not isinstance(output, list):
+ raise ValueError(f"Invalid input data for {cls}. Expected a list, but got {type(output)}.")
+ return output
+
+ @classmethod
+ def parse_obj_as_instance(cls: Type[T], data: Union[bytes, str, List, Dict]) -> T:
+ """Alias to parse server response and return a single instance.
+
+ See `parse_obj` for more details.
+ """
+ output = cls.parse_obj(data)
+ if isinstance(output, list):
+ raise ValueError(f"Invalid input data for {cls}. Expected a single instance, but got a list.")
+ return output
+
+ @classmethod
+ def parse_obj(cls: Type[T], data: Union[bytes, str, List, Dict]) -> Union[List[T], T]:
+ """Parse server response as a dataclass or list of dataclasses.
+
+ To enable future-compatibility, we want to handle cases where the server return more fields than expected.
+ In such cases, we don't want to raise an error but still create the dataclass object. Remaining fields are
+ added as dict attributes.
+ """
+ # Parse server response (from bytes)
+ if isinstance(data, bytes):
+ data = data.decode()
+ if isinstance(data, str):
+ data = json.loads(data)
+
+ # If a list, parse each item individually
+ if isinstance(data, List):
+ return [cls.parse_obj(d) for d in data] # type: ignore [misc]
+
+ # At this point, we expect a dict
+ if not isinstance(data, dict):
+ raise ValueError(f"Invalid data type: {type(data)}")
+
+ init_values = {}
+ other_values = {}
+ for key, value in data.items():
+ key = normalize_key(key)
+ if key in cls.__dataclass_fields__ and cls.__dataclass_fields__[key].init:
+ if isinstance(value, dict) or isinstance(value, list):
+ field_type = cls.__dataclass_fields__[key].type
+
+ # if `field_type` is a `BaseInferenceType`, parse it
+ if inspect.isclass(field_type) and issubclass(field_type, BaseInferenceType):
+ value = field_type.parse_obj(value)
+
+ # otherwise, recursively parse nested dataclasses (if possible)
+ # `get_args` returns handle Union and Optional for us
+ else:
+ expected_types = get_args(field_type)
+ for expected_type in expected_types:
+ if getattr(expected_type, "_name", None) == "List":
+ expected_type = get_args(expected_type)[
+ 0
+ ] # assume same type for all items in the list
+ if inspect.isclass(expected_type) and issubclass(expected_type, BaseInferenceType):
+ value = expected_type.parse_obj(value)
+ break
+ init_values[key] = value
+ else:
+ other_values[key] = value
+
+ # Make all missing fields default to None
+ # => ensure that dataclass initialization will never fail even if the server does not return all fields.
+ for key in cls.__dataclass_fields__:
+ if key not in init_values:
+ init_values[key] = None
+
+ # Initialize dataclass with expected values
+ item = cls(**init_values)
+
+ # Add remaining fields as dict attributes
+ item.update(other_values)
+ return item
+
+ def __post_init__(self):
+ self.update(asdict(self))
+
+ def __setitem__(self, __key: Any, __value: Any) -> None:
+ # Hacky way to keep dataclass values in sync when dict is updated
+ super().__setitem__(__key, __value)
+ if __key in self.__dataclass_fields__ and getattr(self, __key, None) != __value:
+ self.__setattr__(__key, __value)
+ return
+
+ def __setattr__(self, __name: str, __value: Any) -> None:
+ # Hacky way to keep dict values is sync when dataclass is updated
+ super().__setattr__(__name, __value)
+ if self.get(__name) != __value:
+ self[__name] = __value
+ return
+
+
+def normalize_key(key: str) -> str:
+ # e.g "content-type" -> "content_type", "Accept" -> "accept"
+ return key.replace("-", "_").replace(" ", "_").lower()
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/chat_completion.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/chat_completion.py
new file mode 100644
index 0000000000000000000000000000000000000000..8caec602b02d9e2cc6333a8ee15d5f1c75125625
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/chat_completion.py
@@ -0,0 +1,302 @@
+# Inference code generated from the JSON schema spec in @huggingface/tasks.
+#
+# See:
+# - script: https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-codegen.ts
+# - specs: https://github.com/huggingface/huggingface.js/tree/main/packages/tasks/src/tasks.
+from dataclasses import dataclass
+from typing import Any, List, Literal, Optional, Union
+
+from .base import BaseInferenceType
+
+
+@dataclass
+class ChatCompletionInputURL(BaseInferenceType):
+ url: str
+
+
+ChatCompletionInputMessageChunkType = Literal["text", "image_url"]
+
+
+@dataclass
+class ChatCompletionInputMessageChunk(BaseInferenceType):
+ type: "ChatCompletionInputMessageChunkType"
+ image_url: Optional[ChatCompletionInputURL] = None
+ text: Optional[str] = None
+
+
+@dataclass
+class ChatCompletionInputMessage(BaseInferenceType):
+ content: Union[List[ChatCompletionInputMessageChunk], str]
+ role: str
+ name: Optional[str] = None
+
+
+ChatCompletionInputGrammarTypeType = Literal["json", "regex"]
+
+
+@dataclass
+class ChatCompletionInputGrammarType(BaseInferenceType):
+ type: "ChatCompletionInputGrammarTypeType"
+ value: Any
+ """A string that represents a [JSON Schema](https://json-schema.org/).
+ JSON Schema is a declarative language that allows to annotate JSON documents
+ with types and descriptions.
+ """
+
+
+@dataclass
+class ChatCompletionInputStreamOptions(BaseInferenceType):
+ include_usage: bool
+ """If set, an additional chunk will be streamed before the data: [DONE] message. The usage
+ field on this chunk shows the token usage statistics for the entire request, and the
+ choices field will always be an empty array. All other chunks will also include a usage
+ field, but with a null value.
+ """
+
+
+@dataclass
+class ChatCompletionInputFunctionName(BaseInferenceType):
+ name: str
+
+
+@dataclass
+class ChatCompletionInputToolChoiceClass(BaseInferenceType):
+ function: ChatCompletionInputFunctionName
+
+
+ChatCompletionInputToolChoiceEnum = Literal["auto", "none", "required"]
+
+
+@dataclass
+class ChatCompletionInputFunctionDefinition(BaseInferenceType):
+ arguments: Any
+ name: str
+ description: Optional[str] = None
+
+
+@dataclass
+class ChatCompletionInputTool(BaseInferenceType):
+ function: ChatCompletionInputFunctionDefinition
+ type: str
+
+
+@dataclass
+class ChatCompletionInput(BaseInferenceType):
+ """Chat Completion Input.
+ Auto-generated from TGI specs.
+ For more details, check out
+ https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-tgi-import.ts.
+ """
+
+ messages: List[ChatCompletionInputMessage]
+ """A list of messages comprising the conversation so far."""
+ frequency_penalty: Optional[float] = None
+ """Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing
+ frequency in the text so far,
+ decreasing the model's likelihood to repeat the same line verbatim.
+ """
+ logit_bias: Optional[List[float]] = None
+ """UNUSED
+ Modify the likelihood of specified tokens appearing in the completion. Accepts a JSON
+ object that maps tokens
+ (specified by their token ID in the tokenizer) to an associated bias value from -100 to
+ 100. Mathematically,
+ the bias is added to the logits generated by the model prior to sampling. The exact
+ effect will vary per model,
+ but values between -1 and 1 should decrease or increase likelihood of selection; values
+ like -100 or 100 should
+ result in a ban or exclusive selection of the relevant token.
+ """
+ logprobs: Optional[bool] = None
+ """Whether to return log probabilities of the output tokens or not. If true, returns the log
+ probabilities of each
+ output token returned in the content of message.
+ """
+ max_tokens: Optional[int] = None
+ """The maximum number of tokens that can be generated in the chat completion."""
+ model: Optional[str] = None
+ """[UNUSED] ID of the model to use. See the model endpoint compatibility table for details
+ on which models work with the Chat API.
+ """
+ n: Optional[int] = None
+ """UNUSED
+ How many chat completion choices to generate for each input message. Note that you will
+ be charged based on the
+ number of generated tokens across all of the choices. Keep n as 1 to minimize costs.
+ """
+ presence_penalty: Optional[float] = None
+ """Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they
+ appear in the text so far,
+ increasing the model's likelihood to talk about new topics
+ """
+ response_format: Optional[ChatCompletionInputGrammarType] = None
+ seed: Optional[int] = None
+ stop: Optional[List[str]] = None
+ """Up to 4 sequences where the API will stop generating further tokens."""
+ stream: Optional[bool] = None
+ stream_options: Optional[ChatCompletionInputStreamOptions] = None
+ temperature: Optional[float] = None
+ """What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the
+ output more random, while
+ lower values like 0.2 will make it more focused and deterministic.
+ We generally recommend altering this or `top_p` but not both.
+ """
+ tool_choice: Optional[Union[ChatCompletionInputToolChoiceClass, "ChatCompletionInputToolChoiceEnum"]] = None
+ tool_prompt: Optional[str] = None
+ """A prompt to be appended before the tools"""
+ tools: Optional[List[ChatCompletionInputTool]] = None
+ """A list of tools the model may call. Currently, only functions are supported as a tool.
+ Use this to provide a list of
+ functions the model may generate JSON inputs for.
+ """
+ top_logprobs: Optional[int] = None
+ """An integer between 0 and 5 specifying the number of most likely tokens to return at each
+ token position, each with
+ an associated log probability. logprobs must be set to true if this parameter is used.
+ """
+ top_p: Optional[float] = None
+ """An alternative to sampling with temperature, called nucleus sampling, where the model
+ considers the results of the
+ tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10%
+ probability mass are considered.
+ """
+
+
+@dataclass
+class ChatCompletionOutputTopLogprob(BaseInferenceType):
+ logprob: float
+ token: str
+
+
+@dataclass
+class ChatCompletionOutputLogprob(BaseInferenceType):
+ logprob: float
+ token: str
+ top_logprobs: List[ChatCompletionOutputTopLogprob]
+
+
+@dataclass
+class ChatCompletionOutputLogprobs(BaseInferenceType):
+ content: List[ChatCompletionOutputLogprob]
+
+
+@dataclass
+class ChatCompletionOutputFunctionDefinition(BaseInferenceType):
+ arguments: Any
+ name: str
+ description: Optional[str] = None
+
+
+@dataclass
+class ChatCompletionOutputToolCall(BaseInferenceType):
+ function: ChatCompletionOutputFunctionDefinition
+ id: str
+ type: str
+
+
+@dataclass
+class ChatCompletionOutputMessage(BaseInferenceType):
+ role: str
+ content: Optional[str] = None
+ tool_calls: Optional[List[ChatCompletionOutputToolCall]] = None
+
+
+@dataclass
+class ChatCompletionOutputComplete(BaseInferenceType):
+ finish_reason: str
+ index: int
+ message: ChatCompletionOutputMessage
+ logprobs: Optional[ChatCompletionOutputLogprobs] = None
+
+
+@dataclass
+class ChatCompletionOutputUsage(BaseInferenceType):
+ completion_tokens: int
+ prompt_tokens: int
+ total_tokens: int
+
+
+@dataclass
+class ChatCompletionOutput(BaseInferenceType):
+ """Chat Completion Output.
+ Auto-generated from TGI specs.
+ For more details, check out
+ https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-tgi-import.ts.
+ """
+
+ choices: List[ChatCompletionOutputComplete]
+ created: int
+ id: str
+ model: str
+ system_fingerprint: str
+ usage: ChatCompletionOutputUsage
+
+
+@dataclass
+class ChatCompletionStreamOutputFunction(BaseInferenceType):
+ arguments: str
+ name: Optional[str] = None
+
+
+@dataclass
+class ChatCompletionStreamOutputDeltaToolCall(BaseInferenceType):
+ function: ChatCompletionStreamOutputFunction
+ id: str
+ index: int
+ type: str
+
+
+@dataclass
+class ChatCompletionStreamOutputDelta(BaseInferenceType):
+ role: str
+ content: Optional[str] = None
+ tool_calls: Optional[ChatCompletionStreamOutputDeltaToolCall] = None
+
+
+@dataclass
+class ChatCompletionStreamOutputTopLogprob(BaseInferenceType):
+ logprob: float
+ token: str
+
+
+@dataclass
+class ChatCompletionStreamOutputLogprob(BaseInferenceType):
+ logprob: float
+ token: str
+ top_logprobs: List[ChatCompletionStreamOutputTopLogprob]
+
+
+@dataclass
+class ChatCompletionStreamOutputLogprobs(BaseInferenceType):
+ content: List[ChatCompletionStreamOutputLogprob]
+
+
+@dataclass
+class ChatCompletionStreamOutputChoice(BaseInferenceType):
+ delta: ChatCompletionStreamOutputDelta
+ index: int
+ finish_reason: Optional[str] = None
+ logprobs: Optional[ChatCompletionStreamOutputLogprobs] = None
+
+
+@dataclass
+class ChatCompletionStreamOutputUsage(BaseInferenceType):
+ completion_tokens: int
+ prompt_tokens: int
+ total_tokens: int
+
+
+@dataclass
+class ChatCompletionStreamOutput(BaseInferenceType):
+ """Chat Completion Stream Output.
+ Auto-generated from TGI specs.
+ For more details, check out
+ https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-tgi-import.ts.
+ """
+
+ choices: List[ChatCompletionStreamOutputChoice]
+ created: int
+ id: str
+ model: str
+ system_fingerprint: str
+ usage: Optional[ChatCompletionStreamOutputUsage] = None
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/summarization.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/summarization.py
new file mode 100644
index 0000000000000000000000000000000000000000..90612172b5cd3a4bf30c6cfa80ce2713daf02068
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/summarization.py
@@ -0,0 +1,42 @@
+# Inference code generated from the JSON schema spec in @huggingface/tasks.
+#
+# See:
+# - script: https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-codegen.ts
+# - specs: https://github.com/huggingface/huggingface.js/tree/main/packages/tasks/src/tasks.
+from dataclasses import dataclass
+from typing import Any, Dict, Literal, Optional
+
+from .base import BaseInferenceType
+
+
+SummarizationTruncationStrategy = Literal["do_not_truncate", "longest_first", "only_first", "only_second"]
+
+
+@dataclass
+class SummarizationParameters(BaseInferenceType):
+ """Additional inference parameters for summarization."""
+
+ clean_up_tokenization_spaces: Optional[bool] = None
+ """Whether to clean up the potential extra spaces in the text output."""
+ generate_parameters: Optional[Dict[str, Any]] = None
+ """Additional parametrization of the text generation algorithm."""
+ truncation: Optional["SummarizationTruncationStrategy"] = None
+ """The truncation strategy to use."""
+
+
+@dataclass
+class SummarizationInput(BaseInferenceType):
+ """Inputs for Summarization inference"""
+
+ inputs: str
+ """The input text to summarize."""
+ parameters: Optional[SummarizationParameters] = None
+ """Additional inference parameters for summarization."""
+
+
+@dataclass
+class SummarizationOutput(BaseInferenceType):
+ """Outputs of inference for the Summarization task"""
+
+ summary_text: str
+ """The summarized text."""
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text2text_generation.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text2text_generation.py
new file mode 100644
index 0000000000000000000000000000000000000000..32fd557e2af504b87ea06ace18727c69f6fd6acd
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text2text_generation.py
@@ -0,0 +1,43 @@
+# Inference code generated from the JSON schema spec in @huggingface/tasks.
+#
+# See:
+# - script: https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-codegen.ts
+# - specs: https://github.com/huggingface/huggingface.js/tree/main/packages/tasks/src/tasks.
+from dataclasses import dataclass
+from typing import Any, Dict, Literal, Optional
+
+from .base import BaseInferenceType
+
+
+Text2TextGenerationTruncationStrategy = Literal["do_not_truncate", "longest_first", "only_first", "only_second"]
+
+
+@dataclass
+class Text2TextGenerationParameters(BaseInferenceType):
+ """Additional inference parameters for Text2text Generation"""
+
+ clean_up_tokenization_spaces: Optional[bool] = None
+ """Whether to clean up the potential extra spaces in the text output."""
+ generate_parameters: Optional[Dict[str, Any]] = None
+ """Additional parametrization of the text generation algorithm"""
+ truncation: Optional["Text2TextGenerationTruncationStrategy"] = None
+ """The truncation strategy to use"""
+
+
+@dataclass
+class Text2TextGenerationInput(BaseInferenceType):
+ """Inputs for Text2text Generation inference"""
+
+ inputs: str
+ """The input text data"""
+ parameters: Optional[Text2TextGenerationParameters] = None
+ """Additional inference parameters for Text2text Generation"""
+
+
+@dataclass
+class Text2TextGenerationOutput(BaseInferenceType):
+ """Outputs of inference for the Text2text Generation task"""
+
+ generated_text: Any
+ text2_text_generation_output_generated_text: Optional[str] = None
+ """The generated text."""
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text_classification.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text_classification.py
new file mode 100644
index 0000000000000000000000000000000000000000..71c7f83f3cd8fe7079dc49ce41349d3fee904d70
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text_classification.py
@@ -0,0 +1,42 @@
+# Inference code generated from the JSON schema spec in @huggingface/tasks.
+#
+# See:
+# - script: https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-codegen.ts
+# - specs: https://github.com/huggingface/huggingface.js/tree/main/packages/tasks/src/tasks.
+from dataclasses import dataclass
+from typing import Literal, Optional
+
+from .base import BaseInferenceType
+
+
+TextClassificationOutputTransform = Literal["sigmoid", "softmax", "none"]
+
+
+@dataclass
+class TextClassificationParameters(BaseInferenceType):
+ """Additional inference parameters for Text Classification"""
+
+ function_to_apply: Optional["TextClassificationOutputTransform"] = None
+ """The function to apply to the model outputs in order to retrieve the scores."""
+ top_k: Optional[int] = None
+ """When specified, limits the output to the top K most probable classes."""
+
+
+@dataclass
+class TextClassificationInput(BaseInferenceType):
+ """Inputs for Text Classification inference"""
+
+ inputs: str
+ """The text to classify"""
+ parameters: Optional[TextClassificationParameters] = None
+ """Additional inference parameters for Text Classification"""
+
+
+@dataclass
+class TextClassificationOutputElement(BaseInferenceType):
+ """Outputs of inference for the Text Classification task"""
+
+ label: str
+ """The predicted class label."""
+ score: float
+ """The corresponding probability."""
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text_generation.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text_generation.py
new file mode 100644
index 0000000000000000000000000000000000000000..5e902600d88a3fc2cc3343262a1d40d6b8d730a3
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/text_generation.py
@@ -0,0 +1,169 @@
+# Inference code generated from the JSON schema spec in @huggingface/tasks.
+#
+# See:
+# - script: https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-codegen.ts
+# - specs: https://github.com/huggingface/huggingface.js/tree/main/packages/tasks/src/tasks.
+from dataclasses import dataclass
+from typing import Any, List, Literal, Optional
+
+from .base import BaseInferenceType
+
+
+TypeEnum = Literal["json", "regex"]
+
+
+@dataclass
+class TextGenerationInputGrammarType(BaseInferenceType):
+ type: "TypeEnum"
+ value: Any
+ """A string that represents a [JSON Schema](https://json-schema.org/).
+ JSON Schema is a declarative language that allows to annotate JSON documents
+ with types and descriptions.
+ """
+
+
+@dataclass
+class TextGenerationInputGenerateParameters(BaseInferenceType):
+ adapter_id: Optional[str] = None
+ """Lora adapter id"""
+ best_of: Optional[int] = None
+ """Generate best_of sequences and return the one if the highest token logprobs."""
+ decoder_input_details: Optional[bool] = None
+ """Whether to return decoder input token logprobs and ids."""
+ details: Optional[bool] = None
+ """Whether to return generation details."""
+ do_sample: Optional[bool] = None
+ """Activate logits sampling."""
+ frequency_penalty: Optional[float] = None
+ """The parameter for frequency penalty. 1.0 means no penalty
+ Penalize new tokens based on their existing frequency in the text so far,
+ decreasing the model's likelihood to repeat the same line verbatim.
+ """
+ grammar: Optional[TextGenerationInputGrammarType] = None
+ max_new_tokens: Optional[int] = None
+ """Maximum number of tokens to generate."""
+ repetition_penalty: Optional[float] = None
+ """The parameter for repetition penalty. 1.0 means no penalty.
+ See [this paper](https://arxiv.org/pdf/1909.05858.pdf) for more details.
+ """
+ return_full_text: Optional[bool] = None
+ """Whether to prepend the prompt to the generated text"""
+ seed: Optional[int] = None
+ """Random sampling seed."""
+ stop: Optional[List[str]] = None
+ """Stop generating tokens if a member of `stop` is generated."""
+ temperature: Optional[float] = None
+ """The value used to module the logits distribution."""
+ top_k: Optional[int] = None
+ """The number of highest probability vocabulary tokens to keep for top-k-filtering."""
+ top_n_tokens: Optional[int] = None
+ """The number of highest probability vocabulary tokens to keep for top-n-filtering."""
+ top_p: Optional[float] = None
+ """Top-p value for nucleus sampling."""
+ truncate: Optional[int] = None
+ """Truncate inputs tokens to the given size."""
+ typical_p: Optional[float] = None
+ """Typical Decoding mass
+ See [Typical Decoding for Natural Language Generation](https://arxiv.org/abs/2202.00666)
+ for more information.
+ """
+ watermark: Optional[bool] = None
+ """Watermarking with [A Watermark for Large Language
+ Models](https://arxiv.org/abs/2301.10226).
+ """
+
+
+@dataclass
+class TextGenerationInput(BaseInferenceType):
+ """Text Generation Input.
+ Auto-generated from TGI specs.
+ For more details, check out
+ https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-tgi-import.ts.
+ """
+
+ inputs: str
+ parameters: Optional[TextGenerationInputGenerateParameters] = None
+ stream: Optional[bool] = None
+
+
+TextGenerationOutputFinishReason = Literal["length", "eos_token", "stop_sequence"]
+
+
+@dataclass
+class TextGenerationOutputPrefillToken(BaseInferenceType):
+ id: int
+ logprob: float
+ text: str
+
+
+@dataclass
+class TextGenerationOutputToken(BaseInferenceType):
+ id: int
+ logprob: float
+ special: bool
+ text: str
+
+
+@dataclass
+class TextGenerationOutputBestOfSequence(BaseInferenceType):
+ finish_reason: "TextGenerationOutputFinishReason"
+ generated_text: str
+ generated_tokens: int
+ prefill: List[TextGenerationOutputPrefillToken]
+ tokens: List[TextGenerationOutputToken]
+ seed: Optional[int] = None
+ top_tokens: Optional[List[List[TextGenerationOutputToken]]] = None
+
+
+@dataclass
+class TextGenerationOutputDetails(BaseInferenceType):
+ finish_reason: "TextGenerationOutputFinishReason"
+ generated_tokens: int
+ prefill: List[TextGenerationOutputPrefillToken]
+ tokens: List[TextGenerationOutputToken]
+ best_of_sequences: Optional[List[TextGenerationOutputBestOfSequence]] = None
+ seed: Optional[int] = None
+ top_tokens: Optional[List[List[TextGenerationOutputToken]]] = None
+
+
+@dataclass
+class TextGenerationOutput(BaseInferenceType):
+ """Text Generation Output.
+ Auto-generated from TGI specs.
+ For more details, check out
+ https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-tgi-import.ts.
+ """
+
+ generated_text: str
+ details: Optional[TextGenerationOutputDetails] = None
+
+
+@dataclass
+class TextGenerationStreamOutputStreamDetails(BaseInferenceType):
+ finish_reason: "TextGenerationOutputFinishReason"
+ generated_tokens: int
+ input_length: int
+ seed: Optional[int] = None
+
+
+@dataclass
+class TextGenerationStreamOutputToken(BaseInferenceType):
+ id: int
+ logprob: float
+ special: bool
+ text: str
+
+
+@dataclass
+class TextGenerationStreamOutput(BaseInferenceType):
+ """Text Generation Stream Output.
+ Auto-generated from TGI specs.
+ For more details, check out
+ https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-tgi-import.ts.
+ """
+
+ index: int
+ token: TextGenerationStreamOutputToken
+ details: Optional[TextGenerationStreamOutputStreamDetails] = None
+ generated_text: Optional[str] = None
+ top_tokens: Optional[List[TextGenerationStreamOutputToken]] = None
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/zero_shot_classification.py b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/zero_shot_classification.py
new file mode 100644
index 0000000000000000000000000000000000000000..d7c93b4c1519b1cfc0c68095d34be720eb45c87a
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/inference/_generated/types/zero_shot_classification.py
@@ -0,0 +1,46 @@
+# Inference code generated from the JSON schema spec in @huggingface/tasks.
+#
+# See:
+# - script: https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/scripts/inference-codegen.ts
+# - specs: https://github.com/huggingface/huggingface.js/tree/main/packages/tasks/src/tasks.
+from dataclasses import dataclass
+from typing import List, Optional
+
+from .base import BaseInferenceType
+
+
+@dataclass
+class ZeroShotClassificationParameters(BaseInferenceType):
+ """Additional inference parameters for Zero Shot Classification"""
+
+ candidate_labels: List[str]
+ """The set of possible class labels to classify the text into."""
+ hypothesis_template: Optional[str] = None
+ """The sentence used in conjunction with `candidate_labels` to attempt the text
+ classification by replacing the placeholder with the candidate labels.
+ """
+ multi_label: Optional[bool] = None
+ """Whether multiple candidate labels can be true. If false, the scores are normalized such
+ that the sum of the label likelihoods for each sequence is 1. If true, the labels are
+ considered independent and probabilities are normalized for each candidate.
+ """
+
+
+@dataclass
+class ZeroShotClassificationInput(BaseInferenceType):
+ """Inputs for Zero Shot Classification inference"""
+
+ inputs: str
+ """The text to classify"""
+ parameters: ZeroShotClassificationParameters
+ """Additional inference parameters for Zero Shot Classification"""
+
+
+@dataclass
+class ZeroShotClassificationOutputElement(BaseInferenceType):
+ """Outputs of inference for the Zero Shot Classification task"""
+
+ label: str
+ """The predicted class label."""
+ score: float
+ """The corresponding probability."""
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/__init__.py b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..8949a22a5f65ab29b7df65aa6a9df9bce0544b7e
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/__init__.py
@@ -0,0 +1,27 @@
+# Copyright 2024 The HuggingFace Team. All rights reserved.
+#
+# 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.
+# ruff: noqa: F401
+"""Contains helpers to serialize tensors."""
+
+from ._base import StateDictSplit, split_state_dict_into_shards_factory
+from ._tensorflow import get_tf_storage_size, split_tf_state_dict_into_shards
+from ._torch import (
+ get_torch_storage_id,
+ get_torch_storage_size,
+ load_state_dict_from_file,
+ load_torch_model,
+ save_torch_model,
+ save_torch_state_dict,
+ split_torch_state_dict_into_shards,
+)
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/__pycache__/_dduf.cpython-311.pyc b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/__pycache__/_dduf.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3e5ab8fb40e4eef8e22f0683a197e955b45efefc
Binary files /dev/null and b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/__pycache__/_dduf.cpython-311.pyc differ
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_base.py b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_base.py
new file mode 100644
index 0000000000000000000000000000000000000000..b7b6454a90e1942854dd0a095a59c92794323279
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_base.py
@@ -0,0 +1,210 @@
+# Copyright 2024 The HuggingFace Team. All rights reserved.
+#
+# 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.
+"""Contains helpers to split tensors into shards."""
+
+from dataclasses import dataclass, field
+from typing import Any, Callable, Dict, List, Optional, TypeVar, Union
+
+from .. import logging
+
+
+TensorT = TypeVar("TensorT")
+TensorSizeFn_T = Callable[[TensorT], int]
+StorageIDFn_T = Callable[[TensorT], Optional[Any]]
+
+MAX_SHARD_SIZE = "5GB"
+SIZE_UNITS = {
+ "TB": 10**12,
+ "GB": 10**9,
+ "MB": 10**6,
+ "KB": 10**3,
+}
+
+
+logger = logging.get_logger(__file__)
+
+
+@dataclass
+class StateDictSplit:
+ is_sharded: bool = field(init=False)
+ metadata: Dict[str, Any]
+ filename_to_tensors: Dict[str, List[str]]
+ tensor_to_filename: Dict[str, str]
+
+ def __post_init__(self):
+ self.is_sharded = len(self.filename_to_tensors) > 1
+
+
+def split_state_dict_into_shards_factory(
+ state_dict: Dict[str, TensorT],
+ *,
+ get_storage_size: TensorSizeFn_T,
+ filename_pattern: str,
+ get_storage_id: StorageIDFn_T = lambda tensor: None,
+ max_shard_size: Union[int, str] = MAX_SHARD_SIZE,
+) -> StateDictSplit:
+ """
+ Split a model state dictionary in shards so that each shard is smaller than a given size.
+
+ The shards are determined by iterating through the `state_dict` in the order of its keys. There is no optimization
+ made to make each shard as close as possible to the maximum size passed. For example, if the limit is 10GB and we
+ have tensors of sizes [6GB, 6GB, 2GB, 6GB, 2GB, 2GB] they will get sharded as [6GB], [6+2GB], [6+2+2GB] and not
+ [6+2+2GB], [6+2GB], [6GB].
+
+
+
+ If one of the model's tensor is bigger than `max_shard_size`, it will end up in its own shard which will have a
+ size greater than `max_shard_size`.
+
+
+
+ Args:
+ state_dict (`Dict[str, Tensor]`):
+ The state dictionary to save.
+ get_storage_size (`Callable[[Tensor], int]`):
+ A function that returns the size of a tensor when saved on disk in bytes.
+ get_storage_id (`Callable[[Tensor], Optional[Any]]`, *optional*):
+ A function that returns a unique identifier to a tensor storage. Multiple different tensors can share the
+ same underlying storage. This identifier is guaranteed to be unique and constant for this tensor's storage
+ during its lifetime. Two tensor storages with non-overlapping lifetimes may have the same id.
+ filename_pattern (`str`, *optional*):
+ The pattern to generate the files names in which the model will be saved. Pattern must be a string that
+ can be formatted with `filename_pattern.format(suffix=...)` and must contain the keyword `suffix`
+ max_shard_size (`int` or `str`, *optional*):
+ The maximum size of each shard, in bytes. Defaults to 5GB.
+
+ Returns:
+ [`StateDictSplit`]: A `StateDictSplit` object containing the shards and the index to retrieve them.
+ """
+ storage_id_to_tensors: Dict[Any, List[str]] = {}
+
+ shard_list: List[Dict[str, TensorT]] = []
+ current_shard: Dict[str, TensorT] = {}
+ current_shard_size = 0
+ total_size = 0
+
+ if isinstance(max_shard_size, str):
+ max_shard_size = parse_size_to_int(max_shard_size)
+
+ for key, tensor in state_dict.items():
+ # when bnb serialization is used the weights in the state dict can be strings
+ # check: https://github.com/huggingface/transformers/pull/24416 for more details
+ if isinstance(tensor, str):
+ logger.info("Skipping tensor %s as it is a string (bnb serialization)", key)
+ continue
+
+ # If a `tensor` shares the same underlying storage as another tensor, we put `tensor` in the same `block`
+ storage_id = get_storage_id(tensor)
+ if storage_id is not None:
+ if storage_id in storage_id_to_tensors:
+ # We skip this tensor for now and will reassign to correct shard later
+ storage_id_to_tensors[storage_id].append(key)
+ continue
+ else:
+ # This is the first tensor with this storage_id, we create a new entry
+ # in the storage_id_to_tensors dict => we will assign the shard id later
+ storage_id_to_tensors[storage_id] = [key]
+
+ # Compute tensor size
+ tensor_size = get_storage_size(tensor)
+
+ # If this tensor is bigger than the maximal size, we put it in its own shard
+ if tensor_size > max_shard_size:
+ total_size += tensor_size
+ shard_list.append({key: tensor})
+ continue
+
+ # If this tensor is going to tip up over the maximal size, we split.
+ # Current shard already has some tensors, we add it to the list of shards and create a new one.
+ if current_shard_size + tensor_size > max_shard_size:
+ shard_list.append(current_shard)
+ current_shard = {}
+ current_shard_size = 0
+
+ # Add the tensor to the current shard
+ current_shard[key] = tensor
+ current_shard_size += tensor_size
+ total_size += tensor_size
+
+ # Add the last shard
+ if len(current_shard) > 0:
+ shard_list.append(current_shard)
+ nb_shards = len(shard_list)
+
+ # Loop over the tensors that share the same storage and assign them together
+ for storage_id, keys in storage_id_to_tensors.items():
+ # Let's try to find the shard where the first tensor of this storage is and put all tensors in the same shard
+ for shard in shard_list:
+ if keys[0] in shard:
+ for key in keys:
+ shard[key] = state_dict[key]
+ break
+
+ # If we only have one shard, we return it => no need to build the index
+ if nb_shards == 1:
+ filename = filename_pattern.format(suffix="")
+ return StateDictSplit(
+ metadata={"total_size": total_size},
+ filename_to_tensors={filename: list(state_dict.keys())},
+ tensor_to_filename={key: filename for key in state_dict.keys()},
+ )
+
+ # Now that each tensor is assigned to a shard, let's assign a filename to each shard
+ tensor_name_to_filename = {}
+ filename_to_tensors = {}
+ for idx, shard in enumerate(shard_list):
+ filename = filename_pattern.format(suffix=f"-{idx + 1:05d}-of-{nb_shards:05d}")
+ for key in shard:
+ tensor_name_to_filename[key] = filename
+ filename_to_tensors[filename] = list(shard.keys())
+
+ # Build the index and return
+ return StateDictSplit(
+ metadata={"total_size": total_size},
+ filename_to_tensors=filename_to_tensors,
+ tensor_to_filename=tensor_name_to_filename,
+ )
+
+
+def parse_size_to_int(size_as_str: str) -> int:
+ """
+ Parse a size expressed as a string with digits and unit (like `"5MB"`) to an integer (in bytes).
+
+ Supported units are "TB", "GB", "MB", "KB".
+
+ Args:
+ size_as_str (`str`): The size to convert. Will be directly returned if an `int`.
+
+ Example:
+
+ ```py
+ >>> parse_size_to_int("5MB")
+ 5000000
+ ```
+ """
+ size_as_str = size_as_str.strip()
+
+ # Parse unit
+ unit = size_as_str[-2:].upper()
+ if unit not in SIZE_UNITS:
+ raise ValueError(f"Unit '{unit}' not supported. Supported units are TB, GB, MB, KB. Got '{size_as_str}'.")
+ multiplier = SIZE_UNITS[unit]
+
+ # Parse value
+ try:
+ value = float(size_as_str[:-2].strip())
+ except ValueError as e:
+ raise ValueError(f"Could not parse the size value from '{size_as_str}': {e}") from e
+
+ return int(value * multiplier)
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_dduf.py b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_dduf.py
new file mode 100644
index 0000000000000000000000000000000000000000..a1debadb3ac8a45716f0359b932dc065f09edb84
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_dduf.py
@@ -0,0 +1,387 @@
+import json
+import logging
+import mmap
+import os
+import shutil
+import zipfile
+from contextlib import contextmanager
+from dataclasses import dataclass, field
+from pathlib import Path
+from typing import Any, Dict, Generator, Iterable, Tuple, Union
+
+from ..errors import DDUFCorruptedFileError, DDUFExportError, DDUFInvalidEntryNameError
+
+
+logger = logging.getLogger(__name__)
+
+DDUF_ALLOWED_ENTRIES = {
+ # Allowed file extensions in a DDUF file
+ ".json",
+ ".model",
+ ".safetensors",
+ ".txt",
+}
+
+DDUF_FOLDER_REQUIRED_ENTRIES = {
+ # Each folder must contain at least one of these entries
+ "config.json",
+ "tokenizer_config.json",
+ "preprocessor_config.json",
+ "scheduler_config.json",
+}
+
+
+@dataclass
+class DDUFEntry:
+ """Object representing a file entry in a DDUF file.
+
+ See [`read_dduf_file`] for how to read a DDUF file.
+
+ Attributes:
+ filename (str):
+ The name of the file in the DDUF archive.
+ offset (int):
+ The offset of the file in the DDUF archive.
+ length (int):
+ The length of the file in the DDUF archive.
+ dduf_path (str):
+ The path to the DDUF archive (for internal use).
+ """
+
+ filename: str
+ length: int
+ offset: int
+
+ dduf_path: Path = field(repr=False)
+
+ @contextmanager
+ def as_mmap(self) -> Generator[bytes, None, None]:
+ """Open the file as a memory-mapped file.
+
+ Useful to load safetensors directly from the file.
+
+ Example:
+ ```py
+ >>> import safetensors.torch
+ >>> with entry.as_mmap() as mm:
+ ... tensors = safetensors.torch.load(mm)
+ ```
+ """
+ with self.dduf_path.open("rb") as f:
+ with mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) as mm:
+ yield mm[self.offset : self.offset + self.length]
+
+ def read_text(self, encoding: str = "utf-8") -> str:
+ """Read the file as text.
+
+ Useful for '.txt' and '.json' entries.
+
+ Example:
+ ```py
+ >>> import json
+ >>> index = json.loads(entry.read_text())
+ ```
+ """
+ with self.dduf_path.open("rb") as f:
+ f.seek(self.offset)
+ return f.read(self.length).decode(encoding=encoding)
+
+
+def read_dduf_file(dduf_path: Union[os.PathLike, str]) -> Dict[str, DDUFEntry]:
+ """
+ Read a DDUF file and return a dictionary of entries.
+
+ Only the metadata is read, the data is not loaded in memory.
+
+ Args:
+ dduf_path (`str` or `os.PathLike`):
+ The path to the DDUF file to read.
+
+ Returns:
+ `Dict[str, DDUFEntry]`:
+ A dictionary of [`DDUFEntry`] indexed by filename.
+
+ Raises:
+ - [`DDUFCorruptedFileError`]: If the DDUF file is corrupted (i.e. doesn't follow the DDUF format).
+
+ Example:
+ ```python
+ >>> import json
+ >>> import safetensors.torch
+ >>> from huggingface_hub import read_dduf_file
+
+ # Read DDUF metadata
+ >>> dduf_entries = read_dduf_file("FLUX.1-dev.dduf")
+
+ # Returns a mapping filename <> DDUFEntry
+ >>> dduf_entries["model_index.json"]
+ DDUFEntry(filename='model_index.json', offset=66, length=587)
+
+ # Load model index as JSON
+ >>> json.loads(dduf_entries["model_index.json"].read_text())
+ {'_class_name': 'FluxPipeline', '_diffusers_version': '0.32.0.dev0', '_name_or_path': 'black-forest-labs/FLUX.1-dev', ...
+
+ # Load VAE weights using safetensors
+ >>> with dduf_entries["vae/diffusion_pytorch_model.safetensors"].as_mmap() as mm:
+ ... state_dict = safetensors.torch.load(mm)
+ ```
+ """
+ entries = {}
+ dduf_path = Path(dduf_path)
+ logger.info(f"Reading DDUF file {dduf_path}")
+ with zipfile.ZipFile(str(dduf_path), "r") as zf:
+ for info in zf.infolist():
+ logger.debug(f"Reading entry {info.filename}")
+ if info.compress_type != zipfile.ZIP_STORED:
+ raise DDUFCorruptedFileError("Data must not be compressed in DDUF file.")
+
+ try:
+ _validate_dduf_entry_name(info.filename)
+ except DDUFInvalidEntryNameError as e:
+ raise DDUFCorruptedFileError(f"Invalid entry name in DDUF file: {info.filename}") from e
+
+ offset = _get_data_offset(zf, info)
+
+ entries[info.filename] = DDUFEntry(
+ filename=info.filename, offset=offset, length=info.file_size, dduf_path=dduf_path
+ )
+
+ # Consistency checks on the DDUF file
+ if "model_index.json" not in entries:
+ raise DDUFCorruptedFileError("Missing required 'model_index.json' entry in DDUF file.")
+ index = json.loads(entries["model_index.json"].read_text())
+ _validate_dduf_structure(index, entries.keys())
+
+ logger.info(f"Done reading DDUF file {dduf_path}. Found {len(entries)} entries")
+ return entries
+
+
+def export_entries_as_dduf(
+ dduf_path: Union[str, os.PathLike], entries: Iterable[Tuple[str, Union[str, Path, bytes]]]
+) -> None:
+ """Write a DDUF file from an iterable of entries.
+
+ This is a lower-level helper than [`export_folder_as_dduf`] that allows more flexibility when serializing data.
+ In particular, you don't need to save the data on disk before exporting it in the DDUF file.
+
+ Args:
+ dduf_path (`str` or `os.PathLike`):
+ The path to the DDUF file to write.
+ entries (`Iterable[Tuple[str, Union[str, Path, bytes]]]`):
+ An iterable of entries to write in the DDUF file. Each entry is a tuple with the filename and the content.
+ The filename should be the path to the file in the DDUF archive.
+ The content can be a string or a pathlib.Path representing a path to a file on the local disk or directly the content as bytes.
+
+ Raises:
+ - [`DDUFExportError`]: If anything goes wrong during the export (e.g. invalid entry name, missing 'model_index.json', etc.).
+
+ Example:
+ ```python
+ # Export specific files from the local disk.
+ >>> from huggingface_hub import export_entries_as_dduf
+ >>> export_entries_as_dduf(
+ ... dduf_path="stable-diffusion-v1-4-FP16.dduf",
+ ... entries=[ # List entries to add to the DDUF file (here, only FP16 weights)
+ ... ("model_index.json", "path/to/model_index.json"),
+ ... ("vae/config.json", "path/to/vae/config.json"),
+ ... ("vae/diffusion_pytorch_model.fp16.safetensors", "path/to/vae/diffusion_pytorch_model.fp16.safetensors"),
+ ... ("text_encoder/config.json", "path/to/text_encoder/config.json"),
+ ... ("text_encoder/model.fp16.safetensors", "path/to/text_encoder/model.fp16.safetensors"),
+ ... # ... add more entries here
+ ... ]
+ ... )
+ ```
+
+ ```python
+ # Export state_dicts one by one from a loaded pipeline
+ >>> from diffusers import DiffusionPipeline
+ >>> from typing import Generator, Tuple
+ >>> import safetensors.torch
+ >>> from huggingface_hub import export_entries_as_dduf
+ >>> pipe = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
+ ... # ... do some work with the pipeline
+
+ >>> def as_entries(pipe: DiffusionPipeline) -> Generator[Tuple[str, bytes], None, None]:
+ ... # Build an generator that yields the entries to add to the DDUF file.
+ ... # The first element of the tuple is the filename in the DDUF archive (must use UNIX separator!). The second element is the content of the file.
+ ... # Entries will be evaluated lazily when the DDUF file is created (only 1 entry is loaded in memory at a time)
+ ... yield "vae/config.json", pipe.vae.to_json_string().encode()
+ ... yield "vae/diffusion_pytorch_model.safetensors", safetensors.torch.save(pipe.vae.state_dict())
+ ... yield "text_encoder/config.json", pipe.text_encoder.config.to_json_string().encode()
+ ... yield "text_encoder/model.safetensors", safetensors.torch.save(pipe.text_encoder.state_dict())
+ ... # ... add more entries here
+
+ >>> export_entries_as_dduf(dduf_path="stable-diffusion-v1-4.dduf", entries=as_entries(pipe))
+ ```
+ """
+ logger.info(f"Exporting DDUF file '{dduf_path}'")
+ filenames = set()
+ index = None
+ with zipfile.ZipFile(str(dduf_path), "w", zipfile.ZIP_STORED) as archive:
+ for filename, content in entries:
+ if filename in filenames:
+ raise DDUFExportError(f"Can't add duplicate entry: {filename}")
+ filenames.add(filename)
+
+ if filename == "model_index.json":
+ try:
+ index = json.loads(_load_content(content).decode())
+ except json.JSONDecodeError as e:
+ raise DDUFExportError("Failed to parse 'model_index.json'.") from e
+
+ try:
+ filename = _validate_dduf_entry_name(filename)
+ except DDUFInvalidEntryNameError as e:
+ raise DDUFExportError(f"Invalid entry name: {filename}") from e
+ logger.debug(f"Adding entry '{filename}' to DDUF file")
+ _dump_content_in_archive(archive, filename, content)
+
+ # Consistency checks on the DDUF file
+ if index is None:
+ raise DDUFExportError("Missing required 'model_index.json' entry in DDUF file.")
+ try:
+ _validate_dduf_structure(index, filenames)
+ except DDUFCorruptedFileError as e:
+ raise DDUFExportError("Invalid DDUF file structure.") from e
+
+ logger.info(f"Done writing DDUF file {dduf_path}")
+
+
+def export_folder_as_dduf(dduf_path: Union[str, os.PathLike], folder_path: Union[str, os.PathLike]) -> None:
+ """
+ Export a folder as a DDUF file.
+
+ AUses [`export_entries_as_dduf`] under the hood.
+
+ Args:
+ dduf_path (`str` or `os.PathLike`):
+ The path to the DDUF file to write.
+ folder_path (`str` or `os.PathLike`):
+ The path to the folder containing the diffusion model.
+
+ Example:
+ ```python
+ >>> from huggingface_hub import export_folder_as_dduf
+ >>> export_folder_as_dduf(dduf_path="FLUX.1-dev.dduf", folder_path="path/to/FLUX.1-dev")
+ ```
+ """
+ folder_path = Path(folder_path)
+
+ def _iterate_over_folder() -> Iterable[Tuple[str, Path]]:
+ for path in Path(folder_path).glob("**/*"):
+ if not path.is_file():
+ continue
+ if path.suffix not in DDUF_ALLOWED_ENTRIES:
+ logger.debug(f"Skipping file '{path}' (file type not allowed)")
+ continue
+ path_in_archive = path.relative_to(folder_path)
+ if len(path_in_archive.parts) >= 3:
+ logger.debug(f"Skipping file '{path}' (nested directories not allowed)")
+ continue
+ yield path_in_archive.as_posix(), path
+
+ export_entries_as_dduf(dduf_path, _iterate_over_folder())
+
+
+def _dump_content_in_archive(archive: zipfile.ZipFile, filename: str, content: Union[str, os.PathLike, bytes]) -> None:
+ with archive.open(filename, "w", force_zip64=True) as archive_fh:
+ if isinstance(content, (str, Path)):
+ content_path = Path(content)
+ with content_path.open("rb") as content_fh:
+ shutil.copyfileobj(content_fh, archive_fh, 1024 * 1024 * 8) # type: ignore[misc]
+ elif isinstance(content, bytes):
+ archive_fh.write(content)
+ else:
+ raise DDUFExportError(f"Invalid content type for {filename}. Must be str, Path or bytes.")
+
+
+def _load_content(content: Union[str, Path, bytes]) -> bytes:
+ """Load the content of an entry as bytes.
+
+ Used only for small checks (not to dump content into archive).
+ """
+ if isinstance(content, (str, Path)):
+ return Path(content).read_bytes()
+ elif isinstance(content, bytes):
+ return content
+ else:
+ raise DDUFExportError(f"Invalid content type. Must be str, Path or bytes. Got {type(content)}.")
+
+
+def _validate_dduf_entry_name(entry_name: str) -> str:
+ if "." + entry_name.split(".")[-1] not in DDUF_ALLOWED_ENTRIES:
+ raise DDUFInvalidEntryNameError(f"File type not allowed: {entry_name}")
+ if "\\" in entry_name:
+ raise DDUFInvalidEntryNameError(f"Entry names must use UNIX separators ('/'). Got {entry_name}.")
+ entry_name = entry_name.strip("/")
+ if entry_name.count("/") > 1:
+ raise DDUFInvalidEntryNameError(f"DDUF only supports 1 level of directory. Got {entry_name}.")
+ return entry_name
+
+
+def _validate_dduf_structure(index: Any, entry_names: Iterable[str]) -> None:
+ """
+ Consistency checks on the DDUF file structure.
+
+ Rules:
+ - The 'model_index.json' entry is required and must contain a dictionary.
+ - Each folder name must correspond to an entry in 'model_index.json'.
+ - Each folder must contain at least a config file ('config.json', 'tokenizer_config.json', 'preprocessor_config.json', 'scheduler_config.json').
+
+ Args:
+ index (Any):
+ The content of the 'model_index.json' entry.
+ entry_names (Iterable[str]):
+ The list of entry names in the DDUF file.
+
+ Raises:
+ - [`DDUFCorruptedFileError`]: If the DDUF file is corrupted (i.e. doesn't follow the DDUF format).
+ """
+ if not isinstance(index, dict):
+ raise DDUFCorruptedFileError(f"Invalid 'model_index.json' content. Must be a dictionary. Got {type(index)}.")
+
+ dduf_folders = {entry.split("/")[0] for entry in entry_names if "/" in entry}
+ for folder in dduf_folders:
+ if folder not in index:
+ raise DDUFCorruptedFileError(f"Missing required entry '{folder}' in 'model_index.json'.")
+ if not any(f"{folder}/{required_entry}" in entry_names for required_entry in DDUF_FOLDER_REQUIRED_ENTRIES):
+ raise DDUFCorruptedFileError(
+ f"Missing required file in folder '{folder}'. Must contains at least one of {DDUF_FOLDER_REQUIRED_ENTRIES}."
+ )
+
+
+def _get_data_offset(zf: zipfile.ZipFile, info: zipfile.ZipInfo) -> int:
+ """
+ Calculate the data offset for a file in a ZIP archive.
+
+ Args:
+ zf (`zipfile.ZipFile`):
+ The opened ZIP file. Must be opened in read mode.
+ info (`zipfile.ZipInfo`):
+ The file info.
+
+ Returns:
+ int: The offset of the file data in the ZIP archive.
+ """
+ if zf.fp is None:
+ raise DDUFCorruptedFileError("ZipFile object must be opened in read mode.")
+
+ # Step 1: Get the local file header offset
+ header_offset = info.header_offset
+
+ # Step 2: Read the local file header
+ zf.fp.seek(header_offset)
+ local_file_header = zf.fp.read(30) # Fixed-size part of the local header
+
+ if len(local_file_header) < 30:
+ raise DDUFCorruptedFileError("Incomplete local file header.")
+
+ # Step 3: Parse the header fields to calculate the start of file data
+ # Local file header: https://en.wikipedia.org/wiki/ZIP_(file_format)#File_headers
+ filename_len = int.from_bytes(local_file_header[26:28], "little")
+ extra_field_len = int.from_bytes(local_file_header[28:30], "little")
+
+ # Data offset is after the fixed header, filename, and extra fields
+ data_offset = header_offset + 30 + filename_len + extra_field_len
+
+ return data_offset
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_tensorflow.py b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_tensorflow.py
new file mode 100644
index 0000000000000000000000000000000000000000..59ed8110b28f4891d67e754fdfbfa47a26f85be1
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_tensorflow.py
@@ -0,0 +1,95 @@
+# Copyright 2024 The HuggingFace Team. All rights reserved.
+#
+# 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.
+"""Contains tensorflow-specific helpers."""
+
+import math
+import re
+from typing import TYPE_CHECKING, Dict, Union
+
+from .. import constants
+from ._base import MAX_SHARD_SIZE, StateDictSplit, split_state_dict_into_shards_factory
+
+
+if TYPE_CHECKING:
+ import tensorflow as tf
+
+
+def split_tf_state_dict_into_shards(
+ state_dict: Dict[str, "tf.Tensor"],
+ *,
+ filename_pattern: str = constants.TF2_WEIGHTS_FILE_PATTERN,
+ max_shard_size: Union[int, str] = MAX_SHARD_SIZE,
+) -> StateDictSplit:
+ """
+ Split a model state dictionary in shards so that each shard is smaller than a given size.
+
+ The shards are determined by iterating through the `state_dict` in the order of its keys. There is no optimization
+ made to make each shard as close as possible to the maximum size passed. For example, if the limit is 10GB and we
+ have tensors of sizes [6GB, 6GB, 2GB, 6GB, 2GB, 2GB] they will get sharded as [6GB], [6+2GB], [6+2+2GB] and not
+ [6+2+2GB], [6+2GB], [6GB].
+
+
+
+ If one of the model's tensor is bigger than `max_shard_size`, it will end up in its own shard which will have a
+ size greater than `max_shard_size`.
+
+
+
+ Args:
+ state_dict (`Dict[str, Tensor]`):
+ The state dictionary to save.
+ filename_pattern (`str`, *optional*):
+ The pattern to generate the files names in which the model will be saved. Pattern must be a string that
+ can be formatted with `filename_pattern.format(suffix=...)` and must contain the keyword `suffix`
+ Defaults to `"tf_model{suffix}.h5"`.
+ max_shard_size (`int` or `str`, *optional*):
+ The maximum size of each shard, in bytes. Defaults to 5GB.
+
+ Returns:
+ [`StateDictSplit`]: A `StateDictSplit` object containing the shards and the index to retrieve them.
+ """
+ return split_state_dict_into_shards_factory(
+ state_dict,
+ max_shard_size=max_shard_size,
+ filename_pattern=filename_pattern,
+ get_storage_size=get_tf_storage_size,
+ )
+
+
+def get_tf_storage_size(tensor: "tf.Tensor") -> int:
+ # Return `math.ceil` since dtype byte size can be a float (e.g., 0.125 for tf.bool).
+ # Better to overestimate than underestimate.
+ return math.ceil(tensor.numpy().size * _dtype_byte_size_tf(tensor.dtype))
+
+
+def _dtype_byte_size_tf(dtype) -> float:
+ """
+ Returns the size (in bytes) occupied by one parameter of type `dtype`.
+ Taken from https://github.com/huggingface/transformers/blob/74d9d0cebb0263a3f8ab9c280569170cc74651d0/src/transformers/modeling_tf_utils.py#L608.
+ NOTE: why not `tensor.numpy().nbytes`?
+ Example:
+ ```py
+ >>> _dtype_byte_size(tf.float32)
+ 4
+ ```
+ """
+ import tensorflow as tf
+
+ if dtype == tf.bool:
+ return 1 / 8
+ bit_search = re.search(r"[^\d](\d+)$", dtype.name)
+ if bit_search is None:
+ raise ValueError(f"`dtype` is not a valid dtype: {dtype}.")
+ bit_size = int(bit_search.groups()[0])
+ return bit_size // 8
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_torch.py b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_torch.py
new file mode 100644
index 0000000000000000000000000000000000000000..ccb9c42b925165ced016fc5b00e6c978e7cc6aca
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/serialization/_torch.py
@@ -0,0 +1,1015 @@
+# Copyright 2024 The HuggingFace Team. All rights reserved.
+#
+# 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.
+"""Contains pytorch-specific helpers."""
+
+import importlib
+import json
+import os
+import re
+from collections import defaultdict, namedtuple
+from functools import lru_cache
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Dict, Iterable, List, NamedTuple, Optional, Set, Tuple, Union
+
+from packaging import version
+
+from .. import constants, logging
+from ._base import MAX_SHARD_SIZE, StateDictSplit, split_state_dict_into_shards_factory
+
+
+logger = logging.get_logger(__file__)
+
+if TYPE_CHECKING:
+ import torch
+
+# SAVING
+
+
+def save_torch_model(
+ model: "torch.nn.Module",
+ save_directory: Union[str, Path],
+ *,
+ filename_pattern: Optional[str] = None,
+ force_contiguous: bool = True,
+ max_shard_size: Union[int, str] = MAX_SHARD_SIZE,
+ metadata: Optional[Dict[str, str]] = None,
+ safe_serialization: bool = True,
+ is_main_process: bool = True,
+ shared_tensors_to_discard: Optional[List[str]] = None,
+):
+ """
+ Saves a given torch model to disk, handling sharding and shared tensors issues.
+
+ See also [`save_torch_state_dict`] to save a state dict with more flexibility.
+
+ For more information about tensor sharing, check out [this guide](https://huggingface.co/docs/safetensors/torch_shared_tensors).
+
+ The model state dictionary is split into shards so that each shard is smaller than a given size. The shards are
+ saved in the `save_directory` with the given `filename_pattern`. If the model is too big to fit in a single shard,
+ an index file is saved in the `save_directory` to indicate where each tensor is saved. This helper uses
+ [`split_torch_state_dict_into_shards`] under the hood. If `safe_serialization` is `True`, the shards are saved as
+ safetensors (the default). Otherwise, the shards are saved as pickle.
+
+ Before saving the model, the `save_directory` is cleaned from any previous shard files.
+
+
+
+ If one of the model's tensor is bigger than `max_shard_size`, it will end up in its own shard which will have a
+ size greater than `max_shard_size`.
+
+
+
+
+
+ If your model is a `transformers.PreTrainedModel`, you should pass `model._tied_weights_keys` as `shared_tensors_to_discard` to properly handle shared tensors saving. This ensures the correct duplicate tensors are discarded during saving.
+
+
+
+ Args:
+ model (`torch.nn.Module`):
+ The model to save on disk.
+ save_directory (`str` or `Path`):
+ The directory in which the model will be saved.
+ filename_pattern (`str`, *optional*):
+ The pattern to generate the files names in which the model will be saved. Pattern must be a string that
+ can be formatted with `filename_pattern.format(suffix=...)` and must contain the keyword `suffix`
+ Defaults to `"model{suffix}.safetensors"` or `pytorch_model{suffix}.bin` depending on `safe_serialization`
+ parameter.
+ force_contiguous (`boolean`, *optional*):
+ Forcing the state_dict to be saved as contiguous tensors. This has no effect on the correctness of the
+ model, but it could potentially change performance if the layout of the tensor was chosen specifically for
+ that reason. Defaults to `True`.
+ max_shard_size (`int` or `str`, *optional*):
+ The maximum size of each shard, in bytes. Defaults to 5GB.
+ metadata (`Dict[str, str]`, *optional*):
+ Extra information to save along with the model. Some metadata will be added for each dropped tensors.
+ This information will not be enough to recover the entire shared structure but might help understanding
+ things.
+ safe_serialization (`bool`, *optional*):
+ Whether to save as safetensors, which is the default behavior. If `False`, the shards are saved as pickle.
+ Safe serialization is recommended for security reasons. Saving as pickle is deprecated and will be removed
+ in a future version.
+ is_main_process (`bool`, *optional*):
+ Whether the process calling this is the main process or not. Useful when in distributed training like
+ TPUs and need to call this function from all processes. In this case, set `is_main_process=True` only on
+ the main process to avoid race conditions. Defaults to True.
+ shared_tensors_to_discard (`List[str]`, *optional*):
+ List of tensor names to drop when saving shared tensors. If not provided and shared tensors are
+ detected, it will drop the first name alphabetically.
+
+ Example:
+
+ ```py
+ >>> from huggingface_hub import save_torch_model
+ >>> model = ... # A PyTorch model
+
+ # Save state dict to "path/to/folder". The model will be split into shards of 5GB each and saved as safetensors.
+ >>> save_torch_model(model, "path/to/folder")
+
+ # Load model back
+ >>> from huggingface_hub import load_torch_model # TODO
+ >>> load_torch_model(model, "path/to/folder")
+ >>>
+ ```
+ """
+ save_torch_state_dict(
+ state_dict=model.state_dict(),
+ filename_pattern=filename_pattern,
+ force_contiguous=force_contiguous,
+ max_shard_size=max_shard_size,
+ metadata=metadata,
+ safe_serialization=safe_serialization,
+ save_directory=save_directory,
+ is_main_process=is_main_process,
+ shared_tensors_to_discard=shared_tensors_to_discard,
+ )
+
+
+def save_torch_state_dict(
+ state_dict: Dict[str, "torch.Tensor"],
+ save_directory: Union[str, Path],
+ *,
+ filename_pattern: Optional[str] = None,
+ force_contiguous: bool = True,
+ max_shard_size: Union[int, str] = MAX_SHARD_SIZE,
+ metadata: Optional[Dict[str, str]] = None,
+ safe_serialization: bool = True,
+ is_main_process: bool = True,
+ shared_tensors_to_discard: Optional[List[str]] = None,
+) -> None:
+ """
+ Save a model state dictionary to the disk, handling sharding and shared tensors issues.
+
+ See also [`save_torch_model`] to directly save a PyTorch model.
+
+ For more information about tensor sharing, check out [this guide](https://huggingface.co/docs/safetensors/torch_shared_tensors).
+
+ The model state dictionary is split into shards so that each shard is smaller than a given size. The shards are
+ saved in the `save_directory` with the given `filename_pattern`. If the model is too big to fit in a single shard,
+ an index file is saved in the `save_directory` to indicate where each tensor is saved. This helper uses
+ [`split_torch_state_dict_into_shards`] under the hood. If `safe_serialization` is `True`, the shards are saved as
+ safetensors (the default). Otherwise, the shards are saved as pickle.
+
+ Before saving the model, the `save_directory` is cleaned from any previous shard files.
+
+
+
+ If one of the model's tensor is bigger than `max_shard_size`, it will end up in its own shard which will have a
+ size greater than `max_shard_size`.
+
+
+
+
+
+ If your model is a `transformers.PreTrainedModel`, you should pass `model._tied_weights_keys` as `shared_tensors_to_discard` to properly handle shared tensors saving. This ensures the correct duplicate tensors are discarded during saving.
+
+
+
+ Args:
+ state_dict (`Dict[str, torch.Tensor]`):
+ The state dictionary to save.
+ save_directory (`str` or `Path`):
+ The directory in which the model will be saved.
+ filename_pattern (`str`, *optional*):
+ The pattern to generate the files names in which the model will be saved. Pattern must be a string that
+ can be formatted with `filename_pattern.format(suffix=...)` and must contain the keyword `suffix`
+ Defaults to `"model{suffix}.safetensors"` or `pytorch_model{suffix}.bin` depending on `safe_serialization`
+ parameter.
+ force_contiguous (`boolean`, *optional*):
+ Forcing the state_dict to be saved as contiguous tensors. This has no effect on the correctness of the
+ model, but it could potentially change performance if the layout of the tensor was chosen specifically for
+ that reason. Defaults to `True`.
+ max_shard_size (`int` or `str`, *optional*):
+ The maximum size of each shard, in bytes. Defaults to 5GB.
+ metadata (`Dict[str, str]`, *optional*):
+ Extra information to save along with the model. Some metadata will be added for each dropped tensors.
+ This information will not be enough to recover the entire shared structure but might help understanding
+ things.
+ safe_serialization (`bool`, *optional*):
+ Whether to save as safetensors, which is the default behavior. If `False`, the shards are saved as pickle.
+ Safe serialization is recommended for security reasons. Saving as pickle is deprecated and will be removed
+ in a future version.
+ is_main_process (`bool`, *optional*):
+ Whether the process calling this is the main process or not. Useful when in distributed training like
+ TPUs and need to call this function from all processes. In this case, set `is_main_process=True` only on
+ the main process to avoid race conditions. Defaults to True.
+ shared_tensors_to_discard (`List[str]`, *optional*):
+ List of tensor names to drop when saving shared tensors. If not provided and shared tensors are
+ detected, it will drop the first name alphabetically.
+
+ Example:
+
+ ```py
+ >>> from huggingface_hub import save_torch_state_dict
+ >>> model = ... # A PyTorch model
+
+ # Save state dict to "path/to/folder". The model will be split into shards of 5GB each and saved as safetensors.
+ >>> state_dict = model_to_save.state_dict()
+ >>> save_torch_state_dict(state_dict, "path/to/folder")
+ ```
+ """
+ save_directory = str(save_directory)
+
+ if filename_pattern is None:
+ filename_pattern = (
+ constants.SAFETENSORS_WEIGHTS_FILE_PATTERN
+ if safe_serialization
+ else constants.PYTORCH_WEIGHTS_FILE_PATTERN
+ )
+
+ if metadata is None:
+ metadata = {}
+ if safe_serialization:
+ try:
+ from safetensors.torch import save_file as save_file_fn
+ except ImportError as e:
+ raise ImportError(
+ "Please install `safetensors` to use safe serialization. "
+ "You can install it with `pip install safetensors`."
+ ) from e
+ # Clean state dict for safetensors
+ state_dict = _clean_state_dict_for_safetensors(
+ state_dict,
+ metadata,
+ force_contiguous=force_contiguous,
+ shared_tensors_to_discard=shared_tensors_to_discard,
+ )
+ else:
+ from torch import save as save_file_fn # type: ignore[assignment]
+
+ logger.warning(
+ "You are using unsafe serialization. Due to security reasons, it is recommended not to load "
+ "pickled models from untrusted sources. If you intend to share your model, we strongly recommend "
+ "using safe serialization by installing `safetensors` with `pip install safetensors`."
+ )
+ # Split dict
+ state_dict_split = split_torch_state_dict_into_shards(
+ state_dict, filename_pattern=filename_pattern, max_shard_size=max_shard_size
+ )
+
+ # Only main process should clean up existing files to avoid race conditions in distributed environment
+ if is_main_process:
+ existing_files_regex = re.compile(filename_pattern.format(suffix=r"(-\d{5}-of-\d{5})?") + r"(\.index\.json)?")
+ for filename in os.listdir(save_directory):
+ if existing_files_regex.match(filename):
+ try:
+ logger.debug(f"Removing existing file '{filename}' from folder.")
+ os.remove(os.path.join(save_directory, filename))
+ except Exception as e:
+ logger.warning(
+ f"Error when trying to remove existing '{filename}' from folder: {e}. Continuing..."
+ )
+
+ # Save each shard
+ per_file_metadata = {"format": "pt"}
+ if not state_dict_split.is_sharded:
+ per_file_metadata.update(metadata)
+ safe_file_kwargs = {"metadata": per_file_metadata} if safe_serialization else {}
+ for filename, tensors in state_dict_split.filename_to_tensors.items():
+ shard = {tensor: state_dict[tensor] for tensor in tensors}
+ save_file_fn(shard, os.path.join(save_directory, filename), **safe_file_kwargs)
+ logger.debug(f"Shard saved to {filename}")
+
+ # Save the index (if any)
+ if state_dict_split.is_sharded:
+ index_path = filename_pattern.format(suffix="") + ".index.json"
+ index = {
+ "metadata": {**state_dict_split.metadata, **metadata},
+ "weight_map": state_dict_split.tensor_to_filename,
+ }
+ with open(os.path.join(save_directory, index_path), "w") as f:
+ json.dump(index, f, indent=2)
+ logger.info(
+ f"The model is bigger than the maximum size per checkpoint ({max_shard_size}). "
+ f"Model weighs have been saved in {len(state_dict_split.filename_to_tensors)} checkpoint shards. "
+ f"You can find where each parameters has been saved in the index located at {index_path}."
+ )
+
+ logger.info(f"Model weights successfully saved to {save_directory}!")
+
+
+def split_torch_state_dict_into_shards(
+ state_dict: Dict[str, "torch.Tensor"],
+ *,
+ filename_pattern: str = constants.SAFETENSORS_WEIGHTS_FILE_PATTERN,
+ max_shard_size: Union[int, str] = MAX_SHARD_SIZE,
+) -> StateDictSplit:
+ """
+ Split a model state dictionary in shards so that each shard is smaller than a given size.
+
+ The shards are determined by iterating through the `state_dict` in the order of its keys. There is no optimization
+ made to make each shard as close as possible to the maximum size passed. For example, if the limit is 10GB and we
+ have tensors of sizes [6GB, 6GB, 2GB, 6GB, 2GB, 2GB] they will get sharded as [6GB], [6+2GB], [6+2+2GB] and not
+ [6+2+2GB], [6+2GB], [6GB].
+
+
+
+
+ To save a model state dictionary to the disk, see [`save_torch_state_dict`]. This helper uses
+ `split_torch_state_dict_into_shards` under the hood.
+
+
+
+
+
+ If one of the model's tensor is bigger than `max_shard_size`, it will end up in its own shard which will have a
+ size greater than `max_shard_size`.
+
+
+
+ Args:
+ state_dict (`Dict[str, torch.Tensor]`):
+ The state dictionary to save.
+ filename_pattern (`str`, *optional*):
+ The pattern to generate the files names in which the model will be saved. Pattern must be a string that
+ can be formatted with `filename_pattern.format(suffix=...)` and must contain the keyword `suffix`
+ Defaults to `"model{suffix}.safetensors"`.
+ max_shard_size (`int` or `str`, *optional*):
+ The maximum size of each shard, in bytes. Defaults to 5GB.
+
+ Returns:
+ [`StateDictSplit`]: A `StateDictSplit` object containing the shards and the index to retrieve them.
+
+ Example:
+ ```py
+ >>> import json
+ >>> import os
+ >>> from safetensors.torch import save_file as safe_save_file
+ >>> from huggingface_hub import split_torch_state_dict_into_shards
+
+ >>> def save_state_dict(state_dict: Dict[str, torch.Tensor], save_directory: str):
+ ... state_dict_split = split_torch_state_dict_into_shards(state_dict)
+ ... for filename, tensors in state_dict_split.filename_to_tensors.items():
+ ... shard = {tensor: state_dict[tensor] for tensor in tensors}
+ ... safe_save_file(
+ ... shard,
+ ... os.path.join(save_directory, filename),
+ ... metadata={"format": "pt"},
+ ... )
+ ... if state_dict_split.is_sharded:
+ ... index = {
+ ... "metadata": state_dict_split.metadata,
+ ... "weight_map": state_dict_split.tensor_to_filename,
+ ... }
+ ... with open(os.path.join(save_directory, "model.safetensors.index.json"), "w") as f:
+ ... f.write(json.dumps(index, indent=2))
+ ```
+ """
+ return split_state_dict_into_shards_factory(
+ state_dict,
+ max_shard_size=max_shard_size,
+ filename_pattern=filename_pattern,
+ get_storage_size=get_torch_storage_size,
+ get_storage_id=get_torch_storage_id,
+ )
+
+
+# LOADING
+
+
+def load_torch_model(
+ model: "torch.nn.Module",
+ checkpoint_path: Union[str, os.PathLike],
+ *,
+ strict: bool = False,
+ safe: bool = True,
+ weights_only: bool = False,
+ map_location: Optional[Union[str, "torch.device"]] = None,
+ mmap: bool = False,
+ filename_pattern: Optional[str] = None,
+) -> NamedTuple:
+ """
+ Load a checkpoint into a model, handling both sharded and non-sharded checkpoints.
+
+ Args:
+ model (`torch.nn.Module`):
+ The model in which to load the checkpoint.
+ checkpoint_path (`str` or `os.PathLike`):
+ Path to either the checkpoint file or directory containing the checkpoint(s).
+ strict (`bool`, *optional*, defaults to `False`):
+ Whether to strictly enforce that the keys in the model state dict match the keys in the checkpoint.
+ safe (`bool`, *optional*, defaults to `True`):
+ If `safe` is True, the safetensors files will be loaded. If `safe` is False, the function
+ will first attempt to load safetensors files if they are available, otherwise it will fall back to loading
+ pickle files. `filename_pattern` parameter takes precedence over `safe` parameter.
+ weights_only (`bool`, *optional*, defaults to `False`):
+ If True, only loads the model weights without optimizer states and other metadata.
+ Only supported in PyTorch >= 1.13.
+ map_location (`str` or `torch.device`, *optional*):
+ A `torch.device` object, string or a dict specifying how to remap storage locations. It
+ indicates the location where all tensors should be loaded.
+ mmap (`bool`, *optional*, defaults to `False`):
+ Whether to use memory-mapped file loading. Memory mapping can improve loading performance
+ for large models in PyTorch >= 2.1.0 with zipfile-based checkpoints.
+ filename_pattern (`str`, *optional*):
+ The pattern to look for the index file. Pattern must be a string that
+ can be formatted with `filename_pattern.format(suffix=...)` and must contain the keyword `suffix`
+ Defaults to `"model{suffix}.safetensors"`.
+ Returns:
+ `NamedTuple`: A named tuple with `missing_keys` and `unexpected_keys` fields.
+ - `missing_keys` is a list of str containing the missing keys, i.e. keys that are in the model but not in the checkpoint.
+ - `unexpected_keys` is a list of str containing the unexpected keys, i.e. keys that are in the checkpoint but not in the model.
+
+ Raises:
+ [`FileNotFoundError`](https://docs.python.org/3/library/exceptions.html#FileNotFoundError)
+ If the checkpoint file or directory does not exist.
+ [`ImportError`](https://docs.python.org/3/library/exceptions.html#ImportError)
+ If safetensors or torch is not installed when trying to load a .safetensors file or a PyTorch checkpoint respectively.
+ [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
+ If the checkpoint path is invalid or if the checkpoint format cannot be determined.
+
+ Example:
+ ```python
+ >>> from huggingface_hub import load_torch_model
+ >>> model = ... # A PyTorch model
+ >>> load_torch_model(model, "path/to/checkpoint")
+ ```
+ """
+ checkpoint_path = Path(checkpoint_path)
+
+ if not checkpoint_path.exists():
+ raise ValueError(f"Checkpoint path {checkpoint_path} does not exist")
+ # 1. Check if checkpoint is a single file
+ if checkpoint_path.is_file():
+ state_dict = load_state_dict_from_file(
+ checkpoint_file=checkpoint_path,
+ map_location=map_location,
+ weights_only=weights_only,
+ )
+ return model.load_state_dict(state_dict, strict=strict)
+
+ # 2. If not, checkpoint_path is a directory
+ if filename_pattern is None:
+ filename_pattern = constants.SAFETENSORS_WEIGHTS_FILE_PATTERN
+ index_path = checkpoint_path / (filename_pattern.format(suffix="") + ".index.json")
+ # Only fallback to pickle format if safetensors index is not found and safe is False.
+ if not index_path.is_file() and not safe:
+ filename_pattern = constants.PYTORCH_WEIGHTS_FILE_PATTERN
+
+ index_path = checkpoint_path / (filename_pattern.format(suffix="") + ".index.json")
+
+ if index_path.is_file():
+ return _load_sharded_checkpoint(
+ model=model,
+ save_directory=checkpoint_path,
+ strict=strict,
+ weights_only=weights_only,
+ filename_pattern=filename_pattern,
+ )
+
+ # Look for single model file
+ model_files = list(checkpoint_path.glob("*.safetensors" if safe else "*.bin"))
+ if len(model_files) == 1:
+ state_dict = load_state_dict_from_file(
+ checkpoint_file=model_files[0],
+ map_location=map_location,
+ weights_only=weights_only,
+ mmap=mmap,
+ )
+ return model.load_state_dict(state_dict, strict=strict)
+
+ raise ValueError(
+ f"Directory '{checkpoint_path}' does not contain a valid checkpoint. "
+ "Expected either a sharded checkpoint with an index file, or a single model file."
+ )
+
+
+def _load_sharded_checkpoint(
+ model: "torch.nn.Module",
+ save_directory: os.PathLike,
+ *,
+ strict: bool = False,
+ weights_only: bool = False,
+ filename_pattern: str = constants.SAFETENSORS_WEIGHTS_FILE_PATTERN,
+) -> NamedTuple:
+ """
+ Loads a sharded checkpoint into a model. This is the same as
+ [`torch.nn.Module.load_state_dict`](https://pytorch.org/docs/stable/generated/torch.nn.Module.html?highlight=load_state_dict#torch.nn.Module.load_state_dict)
+ but for a sharded checkpoint. Each shard is loaded one by one and removed from memory after being loaded into the model.
+
+ Args:
+ model (`torch.nn.Module`):
+ The model in which to load the checkpoint.
+ save_directory (`str` or `os.PathLike`):
+ A path to a folder containing the sharded checkpoint.
+ strict (`bool`, *optional*, defaults to `False`):
+ Whether to strictly enforce that the keys in the model state dict match the keys in the sharded checkpoint.
+ weights_only (`bool`, *optional*, defaults to `False`):
+ If True, only loads the model weights without optimizer states and other metadata.
+ Only supported in PyTorch >= 1.13.
+ filename_pattern (`str`, *optional*, defaults to `"model{suffix}.safetensors"`):
+ The pattern to look for the index file. Pattern must be a string that
+ can be formatted with `filename_pattern.format(suffix=...)` and must contain the keyword `suffix`
+ Defaults to `"model{suffix}.safetensors"`.
+
+ Returns:
+ `NamedTuple`: A named tuple with `missing_keys` and `unexpected_keys` fields,
+ - `missing_keys` is a list of str containing the missing keys
+ - `unexpected_keys` is a list of str containing the unexpected keys
+ """
+
+ # 1. Load and validate index file
+ # The index file contains mapping of parameter names to shard files
+ index_path = filename_pattern.format(suffix="") + ".index.json"
+ index_file = os.path.join(save_directory, index_path)
+ with open(index_file, "r", encoding="utf-8") as f:
+ index = json.load(f)
+
+ # 2. Validate keys if in strict mode
+ # This is done before loading any shards to fail fast
+ if strict:
+ _validate_keys_for_strict_loading(model, index["weight_map"].keys())
+
+ # 3. Load each shard using `load_state_dict`
+ # Get unique shard files (multiple parameters can be in same shard)
+ shard_files = list(set(index["weight_map"].values()))
+ for shard_file in shard_files:
+ # Load shard into memory
+ shard_path = os.path.join(save_directory, shard_file)
+ state_dict = load_state_dict_from_file(
+ shard_path,
+ map_location="cpu",
+ weights_only=weights_only,
+ )
+ # Update model with parameters from this shard
+ model.load_state_dict(state_dict, strict=strict)
+ # Explicitly remove the state dict from memory
+ del state_dict
+
+ # 4. Return compatibility info
+ loaded_keys = set(index["weight_map"].keys())
+ model_keys = set(model.state_dict().keys())
+ return _IncompatibleKeys(
+ missing_keys=list(model_keys - loaded_keys), unexpected_keys=list(loaded_keys - model_keys)
+ )
+
+
+def load_state_dict_from_file(
+ checkpoint_file: Union[str, os.PathLike],
+ map_location: Optional[Union[str, "torch.device"]] = None,
+ weights_only: bool = False,
+ mmap: bool = False,
+) -> Union[Dict[str, "torch.Tensor"], Any]:
+ """
+ Loads a checkpoint file, handling both safetensors and pickle checkpoint formats.
+
+ Args:
+ checkpoint_file (`str` or `os.PathLike`):
+ Path to the checkpoint file to load. Can be either a safetensors or pickle (`.bin`) checkpoint.
+ map_location (`str` or `torch.device`, *optional*):
+ A `torch.device` object, string or a dict specifying how to remap storage locations. It
+ indicates the location where all tensors should be loaded.
+ weights_only (`bool`, *optional*, defaults to `False`):
+ If True, only loads the model weights without optimizer states and other metadata.
+ Only supported for pickle (`.bin`) checkpoints with PyTorch >= 1.13. Has no effect when
+ loading safetensors files.
+ mmap (`bool`, *optional*, defaults to `False`):
+ Whether to use memory-mapped file loading. Memory mapping can improve loading performance
+ for large models in PyTorch >= 2.1.0 with zipfile-based checkpoints. Has no effect when
+ loading safetensors files, as the `safetensors` library uses memory mapping by default.
+
+ Returns:
+ `Union[Dict[str, "torch.Tensor"], Any]`: The loaded checkpoint.
+ - For safetensors files: always returns a dictionary mapping parameter names to tensors.
+ - For pickle files: returns any Python object that was pickled (commonly a state dict, but could be
+ an entire model, optimizer state, or any other Python object).
+
+ Raises:
+ [`FileNotFoundError`](https://docs.python.org/3/library/exceptions.html#FileNotFoundError)
+ If the checkpoint file does not exist.
+ [`ImportError`](https://docs.python.org/3/library/exceptions.html#ImportError)
+ If safetensors or torch is not installed when trying to load a .safetensors file or a PyTorch checkpoint respectively.
+ [`OSError`](https://docs.python.org/3/library/exceptions.html#OSError)
+ If the checkpoint file format is invalid or if git-lfs files are not properly downloaded.
+ [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
+ If the checkpoint file path is empty or invalid.
+
+ Example:
+ ```python
+ >>> from huggingface_hub import load_state_dict_from_file
+
+ # Load a PyTorch checkpoint
+ >>> state_dict = load_state_dict_from_file("path/to/model.bin", map_location="cpu")
+ >>> model.load_state_dict(state_dict)
+
+ # Load a safetensors checkpoint
+ >>> state_dict = load_state_dict_from_file("path/to/model.safetensors")
+ >>> model.load_state_dict(state_dict)
+ ```
+ """
+ checkpoint_path = Path(checkpoint_file)
+
+ # Check if file exists and is a regular file (not a directory)
+ if not checkpoint_path.is_file():
+ raise FileNotFoundError(
+ f"No checkpoint file found at '{checkpoint_path}'. Please verify the path is correct and "
+ "the file has been properly downloaded."
+ )
+
+ # Load safetensors checkpoint
+ if checkpoint_path.suffix == ".safetensors":
+ try:
+ from safetensors import safe_open
+ from safetensors.torch import load_file
+ except ImportError as e:
+ raise ImportError(
+ "Please install `safetensors` to load safetensors checkpoint. "
+ "You can install it with `pip install safetensors`."
+ ) from e
+
+ # Check format of the archive
+ with safe_open(checkpoint_file, framework="pt") as f: # type: ignore[attr-defined]
+ metadata = f.metadata()
+ # see comment: https://github.com/huggingface/transformers/blob/3d213b57fe74302e5902d68ed9478c3ad1aaa713/src/transformers/modeling_utils.py#L3966
+ if metadata is not None and metadata.get("format") not in ["pt", "mlx"]:
+ raise OSError(
+ f"The safetensors archive passed at {checkpoint_file} does not contain the valid metadata. Make sure "
+ "you save your model with the `save_torch_model` method."
+ )
+ device = str(map_location.type) if map_location is not None and hasattr(map_location, "type") else map_location
+ # meta device is not supported with safetensors, falling back to CPU
+ if device == "meta":
+ logger.warning("Meta device is not supported with safetensors. Falling back to CPU device.")
+ device = "cpu"
+ return load_file(checkpoint_file, device=device) # type: ignore[arg-type]
+ # Otherwise, load from pickle
+ try:
+ import torch
+ from torch import load
+ except ImportError as e:
+ raise ImportError(
+ "Please install `torch` to load torch tensors. You can install it with `pip install torch`."
+ ) from e
+ # Add additional kwargs, mmap is only supported in torch >= 2.1.0
+ additional_kwargs = {}
+ if version.parse(torch.__version__) >= version.parse("2.1.0"):
+ additional_kwargs["mmap"] = mmap
+
+ # weights_only is only supported in torch >= 1.13.0
+ if version.parse(torch.__version__) >= version.parse("1.13.0"):
+ additional_kwargs["weights_only"] = weights_only
+
+ return load(
+ checkpoint_file,
+ map_location=map_location,
+ **additional_kwargs,
+ )
+
+
+# HELPERS
+
+
+def _validate_keys_for_strict_loading(
+ model: "torch.nn.Module",
+ loaded_keys: Iterable[str],
+) -> None:
+ """
+ Validate that model keys match loaded keys when strict loading is enabled.
+
+ Args:
+ model: The PyTorch model being loaded
+ loaded_keys: The keys present in the checkpoint
+
+ Raises:
+ RuntimeError: If there are missing or unexpected keys in strict mode
+ """
+ loaded_keys_set = set(loaded_keys)
+ model_keys = set(model.state_dict().keys())
+ missing_keys = model_keys - loaded_keys_set # Keys in model but not in checkpoint
+ unexpected_keys = loaded_keys_set - model_keys # Keys in checkpoint but not in model
+
+ if missing_keys or unexpected_keys:
+ error_message = f"Error(s) in loading state_dict for {model.__class__.__name__}"
+ if missing_keys:
+ str_missing_keys = ",".join([f'"{k}"' for k in sorted(missing_keys)])
+ error_message += f"\nMissing key(s): {str_missing_keys}."
+ if unexpected_keys:
+ str_unexpected_keys = ",".join([f'"{k}"' for k in sorted(unexpected_keys)])
+ error_message += f"\nUnexpected key(s): {str_unexpected_keys}."
+ raise RuntimeError(error_message)
+
+
+def _get_unique_id(tensor: "torch.Tensor") -> Union[int, Tuple[Any, ...]]:
+ """Returns a unique id for plain tensor
+ or a (potentially nested) Tuple of unique id for the flattened Tensor
+ if the input is a wrapper tensor subclass Tensor
+ """
+
+ try:
+ # for torch 2.1 and above we can also handle tensor subclasses
+ from torch.utils._python_dispatch import is_traceable_wrapper_subclass
+
+ if is_traceable_wrapper_subclass(tensor):
+ attrs, _ = tensor.__tensor_flatten__() # type: ignore[attr-defined]
+ return tuple(_get_unique_id(getattr(tensor, attr)) for attr in attrs)
+
+ except ImportError:
+ # for torch version less than 2.1, we can fallback to original implementation
+ pass
+
+ if tensor.device.type == "xla" and is_torch_tpu_available():
+ # NOTE: xla tensors dont have storage
+ # use some other unique id to distinguish.
+ # this is a XLA tensor, it must be created using torch_xla's
+ # device. So the following import is safe:
+ import torch_xla # type: ignore[import]
+
+ unique_id = torch_xla._XLAC._xla_get_tensor_id(tensor)
+ else:
+ unique_id = storage_ptr(tensor)
+
+ return unique_id
+
+
+def get_torch_storage_id(tensor: "torch.Tensor") -> Optional[Tuple["torch.device", Union[int, Tuple[Any, ...]], int]]:
+ """
+ Return unique identifier to a tensor storage.
+
+ Multiple different tensors can share the same underlying storage. This identifier is
+ guaranteed to be unique and constant for this tensor's storage during its lifetime. Two tensor storages with
+ non-overlapping lifetimes may have the same id.
+ In the case of meta tensors, we return None since we can't tell if they share the same storage.
+
+ Taken from https://github.com/huggingface/transformers/blob/1ecf5f7c982d761b4daaa96719d162c324187c64/src/transformers/pytorch_utils.py#L278.
+ """
+ if tensor.device.type == "meta":
+ return None
+ else:
+ return tensor.device, _get_unique_id(tensor), get_torch_storage_size(tensor)
+
+
+def get_torch_storage_size(tensor: "torch.Tensor") -> int:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/08db34094e9e59e2f9218f2df133b7b4aaff5a99/bindings/python/py_src/safetensors/torch.py#L31C1-L41C59
+ """
+ try:
+ # for torch 2.1 and above we can also handle tensor subclasses
+ from torch.utils._python_dispatch import is_traceable_wrapper_subclass
+
+ if is_traceable_wrapper_subclass(tensor):
+ attrs, _ = tensor.__tensor_flatten__() # type: ignore[attr-defined]
+ return sum(get_torch_storage_size(getattr(tensor, attr)) for attr in attrs)
+ except ImportError:
+ # for torch version less than 2.1, we can fallback to original implementation
+ pass
+
+ try:
+ return tensor.untyped_storage().nbytes()
+ except AttributeError:
+ # Fallback for torch==1.10
+ try:
+ return tensor.storage().size() * _get_dtype_size(tensor.dtype)
+ except NotImplementedError:
+ # Fallback for meta storage
+ # On torch >=2.0 this is the tensor size
+ return tensor.nelement() * _get_dtype_size(tensor.dtype)
+
+
+@lru_cache()
+def is_torch_tpu_available(check_device=True):
+ """
+ Checks if `torch_xla` is installed and potentially if a TPU is in the environment
+
+ Taken from https://github.com/huggingface/transformers/blob/1ecf5f7c982d761b4daaa96719d162c324187c64/src/transformers/utils/import_utils.py#L463.
+ """
+ if importlib.util.find_spec("torch_xla") is not None:
+ if check_device:
+ # We need to check if `xla_device` can be found, will raise a RuntimeError if not
+ try:
+ import torch_xla.core.xla_model as xm # type: ignore[import]
+
+ _ = xm.xla_device()
+ return True
+ except RuntimeError:
+ return False
+ return True
+ return False
+
+
+def storage_ptr(tensor: "torch.Tensor") -> Union[int, Tuple[Any, ...]]:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/py_src/safetensors/torch.py#L11.
+ """
+ try:
+ # for torch 2.1 and above we can also handle tensor subclasses
+ from torch.utils._python_dispatch import is_traceable_wrapper_subclass
+
+ if is_traceable_wrapper_subclass(tensor):
+ return _get_unique_id(tensor) # type: ignore
+ except ImportError:
+ # for torch version less than 2.1, we can fallback to original implementation
+ pass
+
+ try:
+ return tensor.untyped_storage().data_ptr()
+ except Exception:
+ # Fallback for torch==1.10
+ try:
+ return tensor.storage().data_ptr()
+ except NotImplementedError:
+ # Fallback for meta storage
+ return 0
+
+
+def _clean_state_dict_for_safetensors(
+ state_dict: Dict[str, "torch.Tensor"],
+ metadata: Dict[str, str],
+ force_contiguous: bool = True,
+ shared_tensors_to_discard: Optional[List[str]] = None,
+):
+ """Remove shared tensors from state_dict and update metadata accordingly (for reloading).
+
+ Warning: `state_dict` and `metadata` are mutated in-place!
+
+ Taken from https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/py_src/safetensors/torch.py#L155.
+ """
+ to_removes = _remove_duplicate_names(state_dict, discard_names=shared_tensors_to_discard)
+ for kept_name, to_remove_group in to_removes.items():
+ for to_remove in to_remove_group:
+ if metadata is None:
+ metadata = {}
+
+ if to_remove not in metadata:
+ # Do not override user data
+ metadata[to_remove] = kept_name
+ del state_dict[to_remove]
+ if force_contiguous:
+ state_dict = {k: v.contiguous() for k, v in state_dict.items()}
+ return state_dict
+
+
+def _end_ptr(tensor: "torch.Tensor") -> int:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/py_src/safetensors/torch.py#L23.
+ """
+ if tensor.nelement():
+ stop = tensor.view(-1)[-1].data_ptr() + _get_dtype_size(tensor.dtype)
+ else:
+ stop = tensor.data_ptr()
+ return stop
+
+
+def _filter_shared_not_shared(tensors: List[Set[str]], state_dict: Dict[str, "torch.Tensor"]) -> List[Set[str]]:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/py_src/safetensors/torch.py#L44
+ """
+ filtered_tensors = []
+ for shared in tensors:
+ if len(shared) < 2:
+ filtered_tensors.append(shared)
+ continue
+
+ areas = []
+ for name in shared:
+ tensor = state_dict[name]
+ areas.append((tensor.data_ptr(), _end_ptr(tensor), name))
+ areas.sort()
+
+ _, last_stop, last_name = areas[0]
+ filtered_tensors.append({last_name})
+ for start, stop, name in areas[1:]:
+ if start >= last_stop:
+ filtered_tensors.append({name})
+ else:
+ filtered_tensors[-1].add(name)
+ last_stop = stop
+
+ return filtered_tensors
+
+
+def _find_shared_tensors(state_dict: Dict[str, "torch.Tensor"]) -> List[Set[str]]:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/py_src/safetensors/torch.py#L69.
+ """
+ import torch
+
+ tensors_dict = defaultdict(set)
+ for k, v in state_dict.items():
+ if v.device != torch.device("meta") and storage_ptr(v) != 0 and get_torch_storage_size(v) != 0:
+ # Need to add device as key because of multiple GPU.
+ tensors_dict[(v.device, storage_ptr(v), get_torch_storage_size(v))].add(k)
+ tensors = list(sorted(tensors_dict.values()))
+ tensors = _filter_shared_not_shared(tensors, state_dict)
+ return tensors
+
+
+def _is_complete(tensor: "torch.Tensor") -> bool:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/py_src/safetensors/torch.py#L80
+ """
+ try:
+ # for torch 2.1 and above we can also handle tensor subclasses
+ from torch.utils._python_dispatch import is_traceable_wrapper_subclass
+
+ if is_traceable_wrapper_subclass(tensor):
+ attrs, _ = tensor.__tensor_flatten__() # type: ignore[attr-defined]
+ return all(_is_complete(getattr(tensor, attr)) for attr in attrs)
+ except ImportError:
+ # for torch version less than 2.1, we can fallback to original implementation
+ pass
+
+ return tensor.data_ptr() == storage_ptr(tensor) and tensor.nelement() * _get_dtype_size(
+ tensor.dtype
+ ) == get_torch_storage_size(tensor)
+
+
+def _remove_duplicate_names(
+ state_dict: Dict[str, "torch.Tensor"],
+ *,
+ preferred_names: Optional[List[str]] = None,
+ discard_names: Optional[List[str]] = None,
+) -> Dict[str, List[str]]:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/py_src/safetensors/torch.py#L80
+ """
+ if preferred_names is None:
+ preferred_names = []
+ unique_preferred_names = set(preferred_names)
+ if discard_names is None:
+ discard_names = []
+ unique_discard_names = set(discard_names)
+
+ shareds = _find_shared_tensors(state_dict)
+ to_remove = defaultdict(list)
+ for shared in shareds:
+ complete_names = set([name for name in shared if _is_complete(state_dict[name])])
+ if not complete_names:
+ raise RuntimeError(
+ "Error while trying to find names to remove to save state dict, but found no suitable name to keep"
+ f" for saving amongst: {shared}. None is covering the entire storage. Refusing to save/load the model"
+ " since you could be storing much more memory than needed. Please refer to"
+ " https://huggingface.co/docs/safetensors/torch_shared_tensors for more information. Or open an"
+ " issue."
+ )
+
+ keep_name = sorted(list(complete_names))[0]
+
+ # Mechanism to preferentially select keys to keep
+ # coming from the on-disk file to allow
+ # loading models saved with a different choice
+ # of keep_name
+ preferred = complete_names.difference(unique_discard_names)
+ if preferred:
+ keep_name = sorted(list(preferred))[0]
+
+ if unique_preferred_names:
+ preferred = unique_preferred_names.intersection(complete_names)
+ if preferred:
+ keep_name = sorted(list(preferred))[0]
+ for name in sorted(shared):
+ if name != keep_name:
+ to_remove[keep_name].append(name)
+ return to_remove
+
+
+@lru_cache()
+def _get_dtype_size(dtype: "torch.dtype") -> int:
+ """
+ Taken from https://github.com/huggingface/safetensors/blob/08db34094e9e59e2f9218f2df133b7b4aaff5a99/bindings/python/py_src/safetensors/torch.py#L344
+ """
+ import torch
+
+ # torch.float8 formats require 2.1; we do not support these dtypes on earlier versions
+ _float8_e4m3fn = getattr(torch, "float8_e4m3fn", None)
+ _float8_e5m2 = getattr(torch, "float8_e5m2", None)
+ _SIZE = {
+ torch.int64: 8,
+ torch.float32: 4,
+ torch.int32: 4,
+ torch.bfloat16: 2,
+ torch.float16: 2,
+ torch.int16: 2,
+ torch.uint8: 1,
+ torch.int8: 1,
+ torch.bool: 1,
+ torch.float64: 8,
+ _float8_e4m3fn: 1,
+ _float8_e5m2: 1,
+ }
+ return _SIZE[dtype]
+
+
+class _IncompatibleKeys(namedtuple("IncompatibleKeys", ["missing_keys", "unexpected_keys"])):
+ """
+ This is used to report missing and unexpected keys in the state dict.
+ Taken from https://github.com/pytorch/pytorch/blob/main/torch/nn/modules/module.py#L52.
+
+ """
+
+ def __repr__(self) -> str:
+ if not self.missing_keys and not self.unexpected_keys:
+ return ""
+ return super().__repr__()
+
+ __str__ = __repr__
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/templates/datasetcard_template.md b/.venv/lib/python3.11/site-packages/huggingface_hub/templates/datasetcard_template.md
new file mode 100644
index 0000000000000000000000000000000000000000..9af29ebbed93653ec74a8952e314e7554323ef15
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/templates/datasetcard_template.md
@@ -0,0 +1,143 @@
+---
+# For reference on dataset card metadata, see the spec: https://github.com/huggingface/hub-docs/blob/main/datasetcard.md?plain=1
+# Doc / guide: https://huggingface.co/docs/hub/datasets-cards
+{{ card_data }}
+---
+
+# Dataset Card for {{ pretty_name | default("Dataset Name", true) }}
+
+
+
+{{ dataset_summary | default("", true) }}
+
+## Dataset Details
+
+### Dataset Description
+
+
+
+{{ dataset_description | default("", true) }}
+
+- **Curated by:** {{ curators | default("[More Information Needed]", true)}}
+- **Funded by [optional]:** {{ funded_by | default("[More Information Needed]", true)}}
+- **Shared by [optional]:** {{ shared_by | default("[More Information Needed]", true)}}
+- **Language(s) (NLP):** {{ language | default("[More Information Needed]", true)}}
+- **License:** {{ license | default("[More Information Needed]", true)}}
+
+### Dataset Sources [optional]
+
+
+
+- **Repository:** {{ repo | default("[More Information Needed]", true)}}
+- **Paper [optional]:** {{ paper | default("[More Information Needed]", true)}}
+- **Demo [optional]:** {{ demo | default("[More Information Needed]", true)}}
+
+## Uses
+
+
+
+### Direct Use
+
+
+
+{{ direct_use | default("[More Information Needed]", true)}}
+
+### Out-of-Scope Use
+
+
+
+{{ out_of_scope_use | default("[More Information Needed]", true)}}
+
+## Dataset Structure
+
+
+
+{{ dataset_structure | default("[More Information Needed]", true)}}
+
+## Dataset Creation
+
+### Curation Rationale
+
+
+
+{{ curation_rationale_section | default("[More Information Needed]", true)}}
+
+### Source Data
+
+
+
+#### Data Collection and Processing
+
+
+
+{{ data_collection_and_processing_section | default("[More Information Needed]", true)}}
+
+#### Who are the source data producers?
+
+
+
+{{ source_data_producers_section | default("[More Information Needed]", true)}}
+
+### Annotations [optional]
+
+
+
+#### Annotation process
+
+
+
+{{ annotation_process_section | default("[More Information Needed]", true)}}
+
+#### Who are the annotators?
+
+
+
+{{ who_are_annotators_section | default("[More Information Needed]", true)}}
+
+#### Personal and Sensitive Information
+
+
+
+{{ personal_and_sensitive_information | default("[More Information Needed]", true)}}
+
+## Bias, Risks, and Limitations
+
+
+
+{{ bias_risks_limitations | default("[More Information Needed]", true)}}
+
+### Recommendations
+
+
+
+{{ bias_recommendations | default("Users should be made aware of the risks, biases and limitations of the dataset. More information needed for further recommendations.", true)}}
+
+## Citation [optional]
+
+
+
+**BibTeX:**
+
+{{ citation_bibtex | default("[More Information Needed]", true)}}
+
+**APA:**
+
+{{ citation_apa | default("[More Information Needed]", true)}}
+
+## Glossary [optional]
+
+
+
+{{ glossary | default("[More Information Needed]", true)}}
+
+## More Information [optional]
+
+{{ more_information | default("[More Information Needed]", true)}}
+
+## Dataset Card Authors [optional]
+
+{{ dataset_card_authors | default("[More Information Needed]", true)}}
+
+## Dataset Card Contact
+
+{{ dataset_card_contact | default("[More Information Needed]", true)}}
diff --git a/.venv/lib/python3.11/site-packages/huggingface_hub/templates/modelcard_template.md b/.venv/lib/python3.11/site-packages/huggingface_hub/templates/modelcard_template.md
new file mode 100644
index 0000000000000000000000000000000000000000..79ca15e4547debac763b390ef8e4b715e6f6403f
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/huggingface_hub/templates/modelcard_template.md
@@ -0,0 +1,200 @@
+---
+# For reference on model card metadata, see the spec: https://github.com/huggingface/hub-docs/blob/main/modelcard.md?plain=1
+# Doc / guide: https://huggingface.co/docs/hub/model-cards
+{{ card_data }}
+---
+
+# Model Card for {{ model_id | default("Model ID", true) }}
+
+
+
+{{ model_summary | default("", true) }}
+
+## Model Details
+
+### Model Description
+
+
+
+{{ model_description | default("", true) }}
+
+- **Developed by:** {{ developers | default("[More Information Needed]", true)}}
+- **Funded by [optional]:** {{ funded_by | default("[More Information Needed]", true)}}
+- **Shared by [optional]:** {{ shared_by | default("[More Information Needed]", true)}}
+- **Model type:** {{ model_type | default("[More Information Needed]", true)}}
+- **Language(s) (NLP):** {{ language | default("[More Information Needed]", true)}}
+- **License:** {{ license | default("[More Information Needed]", true)}}
+- **Finetuned from model [optional]:** {{ base_model | default("[More Information Needed]", true)}}
+
+### Model Sources [optional]
+
+
+
+- **Repository:** {{ repo | default("[More Information Needed]", true)}}
+- **Paper [optional]:** {{ paper | default("[More Information Needed]", true)}}
+- **Demo [optional]:** {{ demo | default("[More Information Needed]", true)}}
+
+## Uses
+
+
+
+### Direct Use
+
+
+
+{{ direct_use | default("[More Information Needed]", true)}}
+
+### Downstream Use [optional]
+
+
+
+{{ downstream_use | default("[More Information Needed]", true)}}
+
+### Out-of-Scope Use
+
+
+
+{{ out_of_scope_use | default("[More Information Needed]", true)}}
+
+## Bias, Risks, and Limitations
+
+
+
+{{ bias_risks_limitations | default("[More Information Needed]", true)}}
+
+### Recommendations
+
+
+
+{{ bias_recommendations | default("Users (both direct and downstream) should be made aware of the risks, biases and limitations of the model. More information needed for further recommendations.", true)}}
+
+## How to Get Started with the Model
+
+Use the code below to get started with the model.
+
+{{ get_started_code | default("[More Information Needed]", true)}}
+
+## Training Details
+
+### Training Data
+
+
+
+{{ training_data | default("[More Information Needed]", true)}}
+
+### Training Procedure
+
+
+
+#### Preprocessing [optional]
+
+{{ preprocessing | default("[More Information Needed]", true)}}
+
+
+#### Training Hyperparameters
+
+- **Training regime:** {{ training_regime | default("[More Information Needed]", true)}}
+
+#### Speeds, Sizes, Times [optional]
+
+
+
+{{ speeds_sizes_times | default("[More Information Needed]", true)}}
+
+## Evaluation
+
+
+
+### Testing Data, Factors & Metrics
+
+#### Testing Data
+
+
+
+{{ testing_data | default("[More Information Needed]", true)}}
+
+#### Factors
+
+
+
+{{ testing_factors | default("[More Information Needed]", true)}}
+
+#### Metrics
+
+
+
+{{ testing_metrics | default("[More Information Needed]", true)}}
+
+### Results
+
+{{ results | default("[More Information Needed]", true)}}
+
+#### Summary
+
+{{ results_summary | default("", true) }}
+
+## Model Examination [optional]
+
+
+
+{{ model_examination | default("[More Information Needed]", true)}}
+
+## Environmental Impact
+
+
+
+Carbon emissions can be estimated using the [Machine Learning Impact calculator](https://mlco2.github.io/impact#compute) presented in [Lacoste et al. (2019)](https://arxiv.org/abs/1910.09700).
+
+- **Hardware Type:** {{ hardware_type | default("[More Information Needed]", true)}}
+- **Hours used:** {{ hours_used | default("[More Information Needed]", true)}}
+- **Cloud Provider:** {{ cloud_provider | default("[More Information Needed]", true)}}
+- **Compute Region:** {{ cloud_region | default("[More Information Needed]", true)}}
+- **Carbon Emitted:** {{ co2_emitted | default("[More Information Needed]", true)}}
+
+## Technical Specifications [optional]
+
+### Model Architecture and Objective
+
+{{ model_specs | default("[More Information Needed]", true)}}
+
+### Compute Infrastructure
+
+{{ compute_infrastructure | default("[More Information Needed]", true)}}
+
+#### Hardware
+
+{{ hardware_requirements | default("[More Information Needed]", true)}}
+
+#### Software
+
+{{ software | default("[More Information Needed]", true)}}
+
+## Citation [optional]
+
+
+
+**BibTeX:**
+
+{{ citation_bibtex | default("[More Information Needed]", true)}}
+
+**APA:**
+
+{{ citation_apa | default("[More Information Needed]", true)}}
+
+## Glossary [optional]
+
+
+
+{{ glossary | default("[More Information Needed]", true)}}
+
+## More Information [optional]
+
+{{ more_information | default("[More Information Needed]", true)}}
+
+## Model Card Authors [optional]
+
+{{ model_card_authors | default("[More Information Needed]", true)}}
+
+## Model Card Contact
+
+{{ model_card_contact | default("[More Information Needed]", true)}}
diff --git a/.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/libcudnn_engines_runtime_compiled.so.9 b/.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/libcudnn_engines_runtime_compiled.so.9
new file mode 100644
index 0000000000000000000000000000000000000000..7894094b05674986e2c6d4d7e800f0e8c5e825e0
--- /dev/null
+++ b/.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/libcudnn_engines_runtime_compiled.so.9
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:519ff41513a3a8155f430f085acc58a5f85dc16c865b8287d5482409507ee2c0
+size 9585864