o
    	TiX+                     @   sx   d dl Z d dlmZ d dlmZ e r!d dlmZ d dlmZm	Z	 de
de
fdd	ZG d
d dZdede
fddZdS )    N)HfApi)is_mergekit_available)MergeConfiguration)MergeOptions	run_mergefolder_pathrepo_idc                 C   s,   t  }|j|dd}|j| |j|jd d S )Nmodel)	repo_type)r   r   r
   )r   create_repoupload_folderr   r
   )r   r   apirepo r   F/home/ubuntu/.local/lib/python3.10/site-packages/trl/mergekit_utils.pyupload_model_to_hf   s   
r   c                   @   sR   e Zd ZdZddefddZddd	Zdd
dZdddZdddZ	dddZ
dS )MergeConfiga  
    Configuration class for merging two models using `mergekit`.

    This class provides a structured way to configure and generate merge configurations for various merge methods, such
    as `linear`, `ties`, `dare_ties`, and `slerp`.

    Args:
        method (`str`, *optional*, defaults to `"linear"`):
            Merge method to use. Supported methods include:

            - `"linear"`: Linearly combines two models with specified weights.
            - `"ties"`: Combines two models using the TIES method with density parameters.
            - `"dare_ties"`: A variant of TIES for domain adaptation.
            - `"slerp"`: Combines models using spherical linear interpolation.

    Note:

        For more details about the merge methods and how they are implemented, see the [MergeKit GitHub
        repository](https://github.com/arcee-ai/mergekit?tab=readme-ov-file#merge-methods).

    Attributes:
        method (`str`): The merge method to use.
        policy_model_path (`str` or `None`): Path to the policy model.
        target_model_path (`str` or `None`): Path to the target model.
        policy_model_weight (`float`): Weight for the policy model (for `linear` and `ties` methods).
        target_model_weight (`float`): Weight for the target model (for `linear` and `ties` methods).
        policy_model_density (`list[float]`): Density parameters for the policy model (for `ties` and `dare_ties`).
        target_model_density (`list[float]`): Density parameters for the target model (for `ties` and `dare_ties`).
        normalize (`float` or `None`): Normalization factor for the TIES method.
        t_values (`float` or `None`): Interpolation factor for the SLERP method.
        dtype (`str`): Data type to use for merging, e.g., `"float16"`.
    linearmethodc                 C   s   t  std|| _d | _d | _|dkrd| _d| _d| _d S |dkr:d| _g d| _d| _dg| _	d| _
d| _d S |dkrUd| _g d| _d| _dg| _	d| _
d| _d S |d	krad| _d| _d S td
| )NzRMergeConfig requires the `mergekit` extra. To install, run `pip install mergekit`.r   g      ?float16ties      ?)r   gffffff?g?	dare_tiesslerpzUnsupported merge method: )r   ImportErrorr   policy_model_pathtarget_model_pathpolicy_model_weighttarget_model_weightdtypepolicy_model_densitytarget_model_density	normalizet_values
ValueError)selfr   r   r   r   __init__I   s6   





zMergeConfig.__init__returnr   c                 C   s<   | j d| jd| jid| jd| jidgd}t|}|S )zh
        Creates a merge configuration for a linear merge of two models with specified weights.
        r   weightr	   
parameters)r   merge_methodmodels)r   r   r   r   r   r   model_validater%   merge_config_dictmerge_configr   r   r   create_merge_config_lineari   s   

z&MergeConfig.create_merge_config_linearc                 C      dd| j ddddd| j| jdd| jddddd| j| jddgd| ji| jddddd| jddddd
}t	|}|S )	zu
        Creates a merge configuration for a TIES merge of two models, with specified weights and densities.
        r   Npathrevisionr	   loraoverride_architecturedensityr(   r)   r"   
r+   slicesr,   r*   
base_modelr   tokenizer_source	tokenizerchat_template	out_dtype
r   r!   r   r   r    r   r"   r   r   r-   r.   r   r   r   create_merge_config_ties|   8   




#z$MergeConfig.create_merge_config_tiesc                 C   r2   )	zz
        Creates a merge configuration for a DARE TIES merge of two models, with specified weights and densities.
        r   Nr3   r6   r9   r)   r"   r;   rB   r.   r   r   r   create_merge_config_dare_ties   rD   z)MergeConfig.create_merge_config_dare_tiesc                 C   sX   dd| j dddddddgd| ji| jddddd| jddddd
}t|}|S )z_
        Creates a merge configuration for a SLERP merge of a model with a base model.
        r   Nr3   r6   r)   tr;   )r   r#   r   r   r   r-   r.   r   r   r   create_merge_config_slerp   s.   


z%MergeConfig.create_merge_config_slerpc                 C   sL   | j dkr	|  S | j dkr|  S | j dkr|  S | j dkr$|  S d S )Nr   r   r   r   )r   r1   rC   rE   rG   )r%   r   r   r   create   s   



zMergeConfig.createN)r   )r'   r   )__name__
__module____qualname____doc__strr&   r1   rC   rE   rG   rH   r   r   r   r   r   '   s    !
 

,
,'r   configout_pathc              
   C   s4   t  stdt| |tdtj ddddd dS )z
    Merge two models using mergekit

    Args:
        config (`MergeConfig`): The merge configuration.
        out_path (`str`): The output path for the merged model.
    zSmerge_models requires the `mergekit` extra. To install, run `pip install mergekit`.autoTF)devicecudacopy_tokenizerlazy_unpicklelow_cpu_memory)rO   optionsN)r   r   r   r   torchrR   is_available)rN   rO   r   r   r   merge_models  s   
rY   )rW   huggingface_hubr   trl.import_utilsr   mergekit.configr   mergekit.merger   r   rM   r   r   rY   r   r   r   r   <module>   s    `