o
    xi&H                     @  s   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlZd dlmZ d dlmZ d dlmZ ejdd	d
dZeejedk rcedej dd dlmZ d dlmZ d dlmZmZ ejddd
dZejddd
dZG dd dZdS )    )annotationsN)Any)parse)util)Table)	telemetryopenaizOThis integration requires `openai`. To install, please run `pip install openai`F)namerequiredlazyz1.12.0zSThis integration requires openai version 1.12.0 and above. Your current version is z' To fix, please `pip install -U openai`)OpenAI)FineTuningJob)ErrorHyperparametersnumpyz]`numpy` not installed >> This integration requires numpy!  To fix, please `pip install numpy`pandasz``pandas` not installed >> This integration requires pandas!  To fix, please `pip install pandas`c                   @  s   e Zd ZU dZdZded< dZded< dZded	< dZd
ed< e											dGdHdd Z
e	dId#d$Ze	dJd&d'Ze	d(d) Ze	dKd+d,Ze	dLd.d/Ze	dMd0d1Ze	dNd4d5ZedOd9d:Ze	dPd<d=Ze	dQdAdBZe	dRdEdFZdS )SWandbLoggerzJLog OpenAI fine-tunes to [Weights & Biases](https://wandb.me/openai-docs).Nzwandb.Api | None
_wandb_apiFbool
_logged_inOpenAI | Noneopenai_clientzwandb.Run | None_runOpenAI-Fine-TuneTmodel-metadatamodelfine_tune_job_id
str | Nonenum_fine_tunes
int | Noneprojectstrentity	overwritewait_for_job_successlog_datasetsmodel_artifact_namemodel_artifact_typekwargs_wandb_initdict[str, Any]returnc              
   K  s  |du rt  }|| _|rtd |jjj|d}|g}n"|jj }|r*|jdu r1t	d dS |j|dur:| ndd }|dupF|du}g }|D ]}|j
}| d| }|durb| d| }| |}|r|jd}|r|dkr|st	d| d	|j d
 n|dks|r|dkrt	d| d td| d d}|dkr|s dS tjdu rtjdd||||d|| _ntj| _|r| |}| j|||||||	|
fi | qK|st|st	d dS )a  Sync fine-tunes to Weights & Biases.

        :param fine_tune_job_id: The id of the fine-tune (optional)
        :param openai_client: Pass the `OpenAI()` client (optional)
        :param num_fine_tunes: Number of most recent fine-tunes to log when an fine_tune_job_id is not provided. By default, every fine-tune is synced.
        :param project: Name of the project where you're sending runs. By default, it is "GPT-3".
        :param entity: Username or team name where you're sending runs. By default, your default entity is used, which is usually your username.
        :param overwrite: Forces logging and overwrite existing wandb run of the same fine-tune.
        :param wait_for_job_success: Waits for the fine-tune to be complete and then log metrics to W&B. By default, it is True.
        :param model_artifact_name: Name of the model artifact that is logged
        :param model_artifact_type: Type of the model artifact that is logged
        NzRetrieving fine-tune job...fine_tuning_job_idzNo fine-tune has been retrieved/status	succeeded
Fine-tune z) has already been logged successfully at z<. Use `overwrite=True` if you want to overwrite previous runzA run for fine-tune z3 was previously created but didn't end successfullyz.A new wandb run will be created for fine-tune z% and previous run will be overwrittenTz	fine-tune)job_typer    r"   r	   idz'No new successful fine-tunes were foundu&   🎉 wandb sync completed successfully )r   r   wandbtermlogfine_tuningjobsretrievelistdatatermwarnr2   _get_wandb_runsummarygeturlruninitr   _wait_for_job_success_log_fine_tuneany)clsr   r   r   r    r"   r#   r$   r%   r&   r'   r(   	fine_tune
fine_tunesshow_individual_warningsfine_tune_loggedfine_tune_idrun_path	wandb_runwandb_statusr3   r3   X/home/ubuntu/.local/lib/python3.10/site-packages/wandb/integration/openai/fine_tuning.pysync<   s   








	
zWandbLogger.syncrF   r   c                 C  s   t d t d 	 |jdkrt d |S |jdkr(t d|j d |S |jd	kr9t d|j d
 |S td | jjj	j
|jd}q)Nz<Waiting for the OpenAI fine-tuning job to finish training...zuTo avoid blocking, you can call `WandbLogger.sync` with `wait_for_job_success=False` after OpenAI training completes.Tr/   z[Fine-tuning finished, logging metrics, model metadata, and run metadata to Weights & Biasesfailedr0   z" has failed and will not be logged	cancelledz% was cancelled and will not be logged
   r+   )r4   r5   r.   r;   r2   timesleepr   r6   r7   r8   )rE   rF   r3   r3   rN   rB      s2   





z!WandbLogger._wait_for_job_successrH   c	              	   K  s  |j }
|j}tj| jd}d|j_W d    n1 sw   Y  |dkr5|r3td|
 d| d d S z.|j	d }z| j
jj|d }t|d	}W n tya   | j
jj|dj}Y nw W n tjyy   |rvtd|
 d
 Y d S w | jj| | tt|}| D ]"\}}dd | D }|d}|d urt|}| jj ||d q|j!}|d ur|| jj"d< | #||||||| d| jj"d< | j$  dS )N)r@   Tr/   r0   z has the status "z" and will not be loggedr   file_idutf-8z& has no results and will not be loggedc                 S  s    i | ]\}}t |s||qS r3   )npisnan.0kvr3   r3   rN   
<dictcomp>   s     z.WandbLogger._log_fine_tune.<locals>.<dictcomp>step)r_   fine_tuned_modelr.   )%r2   r.   r   contextr   featureopenai_finetuningr4   r;   result_filesr   filescontentreadbase64	b64decodedecode	Exceptiontextr   NotFoundErrorconfigupdate_get_configpdread_csvioStringIOiterrowsitemspopintlogr`   r=   _log_artifactsfinish)rE   rF   r    r"   r#   rH   r%   r&   r'   r(   rJ   r.   tel
results_idencoded_resultsresults
df_results_rowmetricsr_   r`   r3   r3   rN   rC      sl   




zWandbLogger._log_fine_tunec                 C  s$   | j st rd| _ d S tdd S )NTzIt appears you are not currently logged in to Weights & Biases. Please run `wandb login` in your terminal or `wandb.login()` in a notebook. Create a new API key at https://wandb.ai/settings and store it securely.)r   r4   loginrk   )rE   r3   r3   rN   _ensure_logged_in  s   
zWandbLogger._ensure_logged_inrK   c                 C  @   |    z| jd u rt | _| j|W S  ty   Y d S w N)r   r   r4   Apir@   rk   )rE   rK   r3   r3   rN   r<   %     

zWandbLogger._get_wandb_runartifact_pathc                 C  r   r   )r   r   r4   r   artifactrk   )rE   r   r3   r3   rN   _get_wandb_artifact/  r   zWandbLogger._get_wandb_artifactc                 C  s   t |}|d d |d< |drtj|d d|d< |dr0tj|d d|d< |dr>| |d |d< |drL| |d |d< |S )Nrd   r   
created_atz%Y-%m-%d %H:%M:%Sfinished_athyperparameterserror)dictr>   datetimefromtimestampstrftimesanitize)rE   rF   rn   r3   r3   rN   rp   9  s&   



zWandbLogger._get_configr   r   c                 C  s>   i }z|j |d< |j|d< |j|d< W |S  ty   Y d S w )Nn_epochs
batch_sizelearning_rate_multiplier)r   r   r   rk   )rE   r   hyperparamsr3   r3   rN   _unpack_hyperparametersK  s   

z#WandbLogger._unpack_hyperparametersinputr   dict | list | strc                   sf   t tttg t| ttfrt| S t| tr! fdd|  D S t| t	r/ fdd| D S t| S )Nc                   s*   i | ]\}}|t | v r|nt|qS r3   typer!   rZ   valid_typesr3   rN   r^   b  s    z(WandbLogger.sanitize.<locals>.<dictcomp>c                   s$   g | ]}t | v r|nt|qS r3   r   )r[   r]   r   r3   rN   
<listcomp>f  s   $ z(WandbLogger.sanitize.<locals>.<listcomp>)
r   rx   floatr!   
isinstancer   r   r   rv   r9   )r   r3   r   rN   r   \  s   


zWandbLogger.sanitizeNonec              	   C  s  |r5t d |jr|jnd }|jr|jnd }	|ddf|	ddffD ]\}
}}|
d ur4| |
||||| q!|j}t j||t|d}|jddd	d
+}t|}| 	|d |d< | 	|d |d< | 	|}t
j||dd W d    n1 sxw   Y  | jj|d|gd d S )Nz$Logging training/validation files...traintraining_filesvalidvalidation_files)r   metadatazmodel_metadata.jsonwrW   )modeencodingr   r      )indentlatestaliases)r4   r5   training_filevalidation_file_log_artifact_inputsr2   Artifactr   new_filer   jsondumpr   log_artifact)rE   rF   r    r"   r%   r#   r&   r'   r   r   fileprefixartifact_typerJ   r   fdict_fine_tuner3   r3   rN   rz   j  s@   


zWandbLogger._log_artifactsrV   r   r   c              
   C  s  | d| }t dd|}|}| d| d| }	|d ur%| d|	 }	| |	}
|
d u s0|rz
| jjj|d}W n tjyN   t	d| d Y d S w tj
||d	}
tjd
d}||j |j}W d    n1 spw   Y  |
|| t| z,| |j\}}|
|| | j| d|i | jjd| |i ||
jd< W n. ty } zt	d| d| d W Y d }~nd }~ww | jjd| |
jdi | jj|
d|gd d S )N-z[^a-zA-Z0-9_\-.]r   r-   :rU   zFile zd could not be retrieved. Make sure you have OpenAI permissions to download training/validation files)r   F)delete_datan_rv   zIssue saving z( as a Table to Artifacts, exception:
  ''r   r   )resubr   r   re   rf   r   rm   r4   	termerrorr   tempfileNamedTemporaryFilewriter	   add_fileosunlink_make_tablerl   addr   ry   rn   ro   r   rk   r>   use_artifact)rE   rV   r   r   r    r"   r#   artifact_nameartifact_aliasr   r   file_contenttmp_filetmp_file_pathtablen_itemser3   r3   rN   r     sJ   


 z WandbLogger._log_artifact_inputsr   tuple[Table, int]c                 C  s   t jg dd}tjt|ddd}| D ]"\}}|j}t|dks&J |	|d d |d	 d |d
 d  q|t|fS )N)zrole: systemz
role: userzrole: assistant)columnsrecordsT)orientlines   r   rf      r   )
r4   r   rq   	read_jsonrs   rt   ru   messageslenadd_data)rE   r   r   df_idxmessager   r3   r3   rN   r     s   


zWandbLogger._make_table)
NNNr   NFTTr   r   )r   r   r   r   r   r   r    r!   r"   r   r#   r   r$   r   r%   r   r&   r!   r'   r!   r(   r)   r*   r!   )rF   r   r*   r   )rF   r   r    r!   r"   r   r#   r   rH   r   r%   r   r&   r!   r'   r!   r(   r)   )rK   r!   )r   r!   )rF   r   r*   r)   )r   r   )r   r   r*   r   )rF   r   r    r!   r"   r   r%   r   r#   r   r&   r!   r'   r!   r*   r   )rV   r   r   r!   r   r!   r    r!   r"   r   r#   r   r*   r   )r   r!   r*   r   )__name__
__module____qualname____doc__r   __annotations__r   r   r   classmethodrO   rB   rC   r   r<   r   rp   r   staticmethodr   rz   r   r   r3   r3   r3   rN   r   4   sP   
 tL
		/9r   ) 
__future__r   rh   r   rs   r   r   r   r   rS   typingr   packaging.versionr   r4   r   wandb.data_typesr   wandb.sdk.libr   
get_moduler   __version__r   r   openai.types.fine_tuningr   (openai.types.fine_tuning.fine_tuning_jobr   rX   rq   r   r3   r3   r3   rN   <module>   sL    