o
    Zh$A                     @   s
  d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d
dlmZmZ d
dlmZ ee Z!		d6de"de"fddZ#		d6de"de"de"fddZ$dZ%de  de  de  dZ&defddZ'defddZ(	d7d ee"ef d!ee	e"ef  fd"d#Z)e	d7d$e"d%ee" fd&d'Z*ed(d)ddddddddd*
d$e"d+e"d,e+d-ee" d!ee, d.ee" d/ee+ d0eee
e" e"f  d1eee
e" e"f  d2eee
e" e"f  d3ee" fd4d5Z-dS )8    N)Path)DEFAULT_PROTOCOLPicklingError)AnyDictListOptionalUnion)version)snapshot_download)CONFIG_NAME)HfApi)SoftTemporaryDirectoryget_fastai_versionget_fastcore_versionget_python_version   )loggingvalidate_hf_hub_args)_PY_VERSION2.41.3.27fastai_min_versionfastcore_min_versionc              
   C   s   t  pt dkrtd|  d| dt  dt   d	tt }tt  }|t| k r:td|  dt  d	|t|k rMtd
| dt   ddS )a+  
    Checks that the installed fastai and fastcore versions are compatible for pickle serialization.

    Args:
        fastai_min_version (`str`, *optional*):
            The minimum fastai version supported.
        fastcore_min_version (`str`, *optional*):
            The minimum fastcore version supported.

    <Tip>
    Raises the following error:

        - [`ImportError`](https://docs.python.org/3/library/exceptions.html#ImportError)
          if the fastai or fastcore libraries are not available or are of an invalid version.

    </Tip>
    zN/Azfastai>=z and fastcore>=z' are required. Currently using fastai==z and fastcore==.zD`push_to_hub_fastai` and `from_pretrained_fastai` require a fastai>=z+ version, but you are using fastai version zA which is incompatible. Upgrade with `pip install fastai==2.5.6`.zF`push_to_hub_fastai` and `from_pretrained_fastai` require a fastcore>=- version, but you are using fastcore version zD which is incompatible. Upgrade with `pip install fastcore==1.3.27`.N)r   r   ImportErrorr
   Version)r   r   Zcurrent_fastai_versionZcurrent_fastcore_version r   S/var/www/html/lang_env/lib/python3.10/site-packages/huggingface_hub/fastai_utils.py_check_fastai_fastcore_versions   s6   r    storage_folderc                 C   s~  zddl }W n ty   tdw tj|  ds"td dS ||  d}d|	 vr7td dS |d }d|	 vrHtd	 dS |d }d
d |D }t
|dkr_td n$t|d dd }|dkrt|t|k rtd| d| ddd |D }	t
|	dkrtd dS t|	d dd }
|
dkrt|
t|k rtd| d|
 ddS dS )a  
    Checks that the `pyproject.toml` file in the directory `storage_folder` has fastai and fastcore versions
    that are compatible with `from_pretrained_fastai` and `push_to_hub_fastai`. If `pyproject.toml` does not exist
    or does not contain versions for fastai and fastcore, then it logs a warning.

    Args:
        storage_folder (`str`):
            Folder to look for the `pyproject.toml` file.
        fastai_min_version (`str`, *optional*):
            The minimum fastai version supported.
        fastcore_min_version (`str`, *optional*):
            The minimum fastcore version supported.

    <Tip>
    Raises the following errors:

        - [`ImportError`](https://docs.python.org/3/library/exceptions.html#ImportError)
          if the `toml` module is not installed.
        - [`ImportError`](https://docs.python.org/3/library/exceptions.html#ImportError)
          if the `pyproject.toml` indicates a lower than minimum supported version of fastai or fastcore.

    </Tip>
    r   Nzn`push_to_hub_fastai` and `from_pretrained_fastai` require the toml module. Install it with `pip install toml`.z/pyproject.tomlzThere is no `pyproject.toml` in the repository that contains the fastai `Learner`. The `pyproject.toml` would allow us to verify that your fastai and fastcore versions are compatible with those of the model you want to load.zbuild-systemzThere is no `build-system` section in the pyproject.toml of the repository that contains the fastai `Learner`. The `build-system` would allow us to verify that your fastai and fastcore versions are compatible with those of the model you want to load.requireszThere is no `requires` section in the pyproject.toml of the repository that contains the fastai `Learner`. The `requires` would allow us to verify that your fastai and fastcore versions are compatible with those of the model you want to load.c                 S      g | ]	}| d r|qS )fastai
startswith.0Zpckr   r   r   
<listcomp>       z=_check_fastai_fastcore_pyproject_versions.<locals>.<listcomp>zPThe repository does not have a fastai version specified in the `pyproject.toml`.=    z*`from_pretrained_fastai` requires fastai>=z$ version but the model to load uses z which is incompatible.c                 S   r#   )Zfastcorer%   r'   r   r   r   r)      r*   zRThe repository does not have a fastcore version specified in the `pyproject.toml`.z,`from_pretrained_fastai` requires fastcore>=r   )tomlModuleNotFoundErrorr   ospathisfileloggerwarningloadkeyslenstr	partitionr
   r   )r!   r   r   r.   pyproject_tomlZbuild_system_tomlZpackage_versionsZfastai_packagesZfastai_versionZfastcore_packagesZfastcore_versionr   r   r   )_check_fastai_fastcore_pyproject_versionsK   sd   r;   u   ---
tags:
- fastai
---

# Amazing!

🥳 Congratulations on hosting your fastai model on the Hugging Face Hub!

# Some next steps
1. Fill out this model card with more information (see the template below and the [documentation here](https://huggingface.co/docs/hub/model-repos))!

2. Create a demo in Gradio or Streamlit using 🤗 Spaces ([documentation here](https://huggingface.co/docs/hub/spaces)).

3. Join the fastai community on the [Fastai Discord](https://discord.com/invite/YKrxeNn)!

Greetings fellow fastlearner 🤝! Don't forget to delete this content from your model card.


---


# Model card

## Model description
More information needed

## Intended uses & limitations
More information needed

## Training and evaluation data
More information needed
zB[build-system]
requires = ["setuptools>=40.8.0", "wheel", "python=z", "fastai=z", "fastcore=z6"]
build-backend = "setuptools.build_meta:__legacy__"
repo_dirc                 C   R   | d }|  s'|jddd}|t W d   dS 1 s w   Y  dS dS )z
    Creates a model card for the repository.

    Args:
        repo_dir (`Path`):
            Directory where model card is created.
    z	README.mdwutf-8encodingN)existsopenwriteREADME_TEMPLATE)r<   Zreadme_pathfr   r   r   _create_model_card      "rG   c                 C   r=   )z
    Creates a `pyproject.toml` for the repository.

    Args:
        repo_dir (`Path`):
            Directory where `pyproject.toml` is created.
    zpyproject.tomlr>   r?   r@   N)rB   rC   rD   PYPROJECT_TEMPLATE)r<   Zpyproject_pathrF   r   r   r   _create_model_pyproject   rH   rJ   save_directoryconfigc                 C   s   t   tj|dd |dur?t|tstdt| dtj|t	}t
|d}t|| W d   n1 s:w   Y  tt| tt| t|| _tj|dd z
| jdtd W dS  tyl   td	w )
a  
    Saves a fastai learner to `save_directory` in pickle format using the default pickle protocol for the version of python used.

    Args:
        learner (`Learner`):
            The `fastai.Learner` you'd like to save.
        save_directory (`str` or `Path`):
            Specific directory in which you want to save the fastai learner.
        config (`dict`, *optional*):
            Configuration object. Will be uploaded as a .json file. Example: 'https://huggingface.co/espejelomar/fastai-pet-breeds-classification/blob/main/config.json'.

    <Tip>

    Raises the following error:

        - [`RuntimeError`](https://docs.python.org/3/library/exceptions.html#RuntimeError)
          if the config file provided is not a dictionary.

    </Tip>
    T)exist_okNz(Provided config should be a dict. Got: ''r>   	model.pkl)fnameZpickle_protocolzYou are using a lambda function, i.e., an anonymous function. `pickle` cannot pickle function objects and requires that all functions have names. One possible solution is to name the function.)r    r0   makedirs
isinstancedictRuntimeErrortyper1   joinr   rC   jsondumprG   r   rJ   Zexportr   r   )learnerrK   rL   r1   rF   r   r   r   _save_pretrained_fastai   s.   

rZ   repo_idrevisionc                 C   sP   t   tj| st| |dt d}n| }t| ddlm} |tj	|dS )ap  
    Load pretrained fastai model from the Hub or from a local directory.

    Args:
        repo_id (`str`):
            The location where the pickled fastai.Learner is. It can be either of the two:
                - Hosted on the Hugging Face Hub. E.g.: 'espejelomar/fatai-pet-breeds-classification' or 'distilgpt2'.
                  You can add a `revision` by appending `@` at the end of `repo_id`. E.g.: `dbmdz/bert-base-german-cased@main`.
                  Revision is the specific model version to use. Since we use a git-based system for storing models and other
                  artifacts on the Hugging Face Hub, it can be a branch name, a tag name, or a commit id.
                - Hosted locally. `repo_id` would be a directory containing the pickle and a pyproject.toml
                  indicating the fastai and fastcore versions used to build the `fastai.Learner`. E.g.: `./my_model_directory/`.
        revision (`str`, *optional*):
            Revision at which the repo's files are downloaded. See documentation of `snapshot_download`.

    Returns:
        The `fastai.Learner` model in the `repo_id` repo.
    r$   )r[   r\   Zlibrary_nameZlibrary_versionr   )load_learnerrO   )
r    r0   r1   isdirr   r   r;   Zfastai.learnerr]   rV   )r[   r\   r!   r]   r   r   r   from_pretrained_fastai*  s   r_   z(Push FastAI model using huggingface_hub.F)
commit_messageprivatetokenrL   branch	create_prallow_patternsignore_patternsdelete_patternsapi_endpointr`   ra   rb   rc   rd   re   rf   rg   rh   c                C   s   t   t|d}|j|||ddj}t #}t|| }t| ||d |j||||||||	|
d	W  d   S 1 s;w   Y  dS )ac	  
    Upload learner checkpoint files to the Hub.

    Use `allow_patterns` and `ignore_patterns` to precisely filter which files should be pushed to the hub. Use
    `delete_patterns` to delete existing remote files in the same commit. See [`upload_folder`] reference for more
    details.

    Args:
        learner (`Learner`):
            The `fastai.Learner' you'd like to push to the Hub.
        repo_id (`str`):
            The repository id for your model in Hub in the format of "namespace/repo_name". The namespace can be your individual account or an organization to which you have write access (for example, 'stanfordnlp/stanza-de').
        commit_message (`str`, *optional*):
            Message to commit while pushing. Will default to :obj:`"add model"`.
        private (`bool`, *optional*, defaults to `False`):
            Whether or not the repository created should be private.
        token (`str`, *optional*):
            The Hugging Face account token to use as HTTP bearer authorization for remote files. If :obj:`None`, the token will be asked by a prompt.
        config (`dict`, *optional*):
            Configuration object to be saved alongside the model weights.
        branch (`str`, *optional*):
            The git branch on which to push the model. This defaults to
            the default branch as specified in your repository, which
            defaults to `"main"`.
        create_pr (`boolean`, *optional*):
            Whether or not to create a Pull Request from `branch` with that commit.
            Defaults to `False`.
        api_endpoint (`str`, *optional*):
            The API endpoint to use when pushing the model to the hub.
        allow_patterns (`List[str]` or `str`, *optional*):
            If provided, only files matching at least one pattern are pushed.
        ignore_patterns (`List[str]` or `str`, *optional*):
            If provided, files matching any of the patterns are not pushed.
        delete_patterns (`List[str]` or `str`, *optional*):
            If provided, remote files matching any of the patterns will be deleted from the repo.

    Returns:
        The url of the commit of your model in the given repository.

    <Tip>

    Raises the following error:

        - [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
          if the user is not log on to the Hugging Face Hub.

    </Tip>
    )ZendpointT)r[   rb   ra   rM   )rL   )	r[   rb   Zfolder_pathr`   r\   rd   re   rf   rg   N)r    r   Zcreate_repor[   r   r   rZ   Zupload_folder)rY   r[   r`   ra   rb   rL   rc   rd   re   rf   rg   rh   apitmpZ
saved_pathr   r   r   push_to_hub_fastaiW  s$   @
$rk   )r   r   )N).rW   r0   pathlibr   pickler   r   typingr   r   r   r   r	   	packagingr
   Zhuggingface_hubr   Zhuggingface_hub.constantsr   Zhuggingface_hub.hf_apir   Zhuggingface_hub.utilsr   r   r   r   utilsr   r   Zutils._runtimer   Z
get_logger__name__r3   r8   r    r;   rE   rI   rG   rJ   rZ   r_   boolrS   rk   r   r   r   r   <module>   s    

3
a"

8,	
