o
    óÜÓh.  ã                   @   sð   d Z ddlZddlZddlZddlmZ ddlZddlZddlm	Z	m
Z
 ddlmZ e ¡  e e¡ZdZg d¢g d¢d	œZd
d„ Zdd„ Ze ¡ ddd„ƒZedkrve ¡ Zejddedd ejddedd e ¡ Zeejejƒ dS dS )zConvert Jukebox checkpointsé    N)ÚPath)ÚJukeboxConfigÚJukeboxModel)Úloggingz2https://openaipublic.azureedge.net/jukebox/models/)ú5b/vqvae.pth.tarú5b/prior_level_0.pth.tarú5b/prior_level_1.pth.tarz1b_lyrics/prior_level_2.pth.tar)r   r   r   z5b_lyrics/prior_level_2.pth.tar)zjukebox-1b-lyricsújukebox-5b-lyricsc                 C   sÈ  |   d¡rt|  d¡ƒdkr|  dd¡} n>|   d¡r*t|  d¡ƒdkr*|  dd¡} n)|   d¡r?t|  d¡ƒdkr?|  dd¡} n|   d	¡rSt|  d¡ƒdkrS|  d	d
¡} d| v r]|  dd¡} d| v rg|  dd¡} d| v r}d| vr}d| vr}d| vr}|  dd¡} |   d¡rˆ|  dd¡S d| v r’|  dd¡S d| v rœ|  dd¡} d| v r¦|  dd¡S d| v r°|  dd¡S d | v rº|  d d!¡S d"| v rÄ|  d"d#¡S d$| v rÎ|  d$d%¡S d&| v rØ|  d'd(¡S d)| v râ|  d)d¡S | S )*Nz.model.1.biasÚ.é
   z.conv1d_1.biasz.model.1.weightz.conv1d_1.weightz.model.3.biasz.conv1d_2.biasz.model.3.weightz.conv1d_2.weightzconditioner_blocks.0.zconditioner_blocks.0Úconditioner_blocksÚprime_priorÚencoderz.emb.ÚtotalÚabsoluteÚrelativeÚkz.kz	.codebookzy_emb.zmetadata_embedding.z
x_emb.emb.z0.x_emb.embÚembed_tokensÚprime_state_lnzencoder.final_layer_normz.lnz.layer_normÚ_lnÚ_layer_normÚprime_state_projzencoder.proj_inÚprime_x_outzencoder.lm_headzprior.x_outÚx_outÚfc_proj_outÚx_emb)ÚendswithÚlenÚsplitÚreplace)Úkey© r!   úa/var/www/html/ai/venv/lib/python3.10/site-packages/transformers/models/jukebox/convert_jukebox.pyÚreplace_key2   sF    
r#   c              
   C   s  i }dd l }| d¡}| d¡}| d¡}| d¡}	| d¡}
| d¡}| d¡}| d	¡}| d
¡}|  ¡ D ]P\}}| |¡rt| |¡}| ¡ }t|d ƒd t|d ƒ }d|d › d|d › d|› d|d › }| ||¡}nÂ| |¡rÄ| |¡}| ¡ }t|d ƒd t|d ƒ }dddœ|d  }d|d › d|d › d|› d}d|d › d|› d|d › }|| }| ||¡}nr| |¡rë| |¡}| ¡ }d|d › d|d › d|d › }| ||¡}nK|	 |¡r&|	 |¡}| ¡ }t|d ƒd t|d ƒ d }d|d › d|d › d|› d|d › }|	 ||¡}n|
 |¡rx|
 |¡}| ¡ }t|d ƒd t|d ƒ d }dddœ|d  }d|d › d|d › d|› d}d|d › d|› d|d › }|| }|
 ||¡}n¾| |¡rŸ| |¡}| ¡ }d|d › d|d › d|d › }| ||¡}n—| |¡rÏ| |¡}| ¡ }t|d ƒd t|d ƒ d }d|› d|d › }| ||¡}ng| |¡r| |¡}| ¡ }t|d ƒd t|d ƒ d }dddœ|d  }d|› d}d|d › d|› d|d › }|| }| ||¡}n| |¡r4| |¡}| ¡ }d|d › }| ||¡}n|}t|ƒ}|› d|› |vsI|d u rUt	d|› d|› d ƒ n+|j
||› d|›  j
kr€||› d|›  }t	|› d!|› d"|j
› d#|j
› d$ƒ |}|||< |||< q7|S )%Nr   z@encoders.(\d*).level_blocks.(\d*).model.(\d*).(\d).(bias|weight)zXencoders.(\d*).level_blocks.(\d*).model.(\d*).(\d).model.(\d*).model.(\d*).(bias|weight)z;encoders.(\d*).level_blocks.(\d*).model.(\d*).(bias|weight)z@decoders.(\d*).level_blocks.(\d*).model.(\d*).(\d).(bias|weight)zXdecoders.(\d*).level_blocks.(\d*).model.(\d*).(\d).model.(\d*).model.(\d*).(bias|weight)z;decoders.(\d*).level_blocks.(\d*).model.(\d*).(bias|weight)z<conditioner_blocks.(\d*).cond.model.(\d*).(\d).(bias|weight)zTconditioner_blocks.(\d*).cond.model.(\d*).(\d).model.(\d*).model.(\d*).(bias|weight)z7conditioner_blocks.(\d*).cond.model.(\d*).(bias|weight)é   é   z	encoders.z.level_blocks.é   z.downsample_block.r
   éÿÿÿÿ)Ú1Ú3éþÿÿÿzresnet_block.éýÿÿÿz.conv1d_z
.proj_out.z	decoders.z.upsample_block.z	.proj_in.z,conditioner_blocks.upsampler.upsample_block.z%conditioner_blocks.upsampler.proj_in.zfailed converting ú to z, does not matchz-> z
 : 
shape z and z, do not match)ÚreÚcompileÚitemsÚ	fullmatchÚmatchÚgroupsÚintÚsubr#   ÚprintÚshape)Ú
state_dictÚmodel_state_dictÚ
key_prefixÚmappingÚnew_dictr-   Úre_encoder_block_conv_inÚre_encoder_block_resnetÚre_encoder_block_proj_outÚre_decoder_block_conv_outÚre_decoder_block_resnetÚre_decoder_block_proj_inÚre_prior_cond_conv_outÚre_prior_cond_resnetÚre_prior_cond_proj_inÚoriginal_keyÚvalueÚregex_matchr2   Úblock_indexÚ
re_new_keyr    Ú
conv_indexÚprefixÚresnet_blockÚvalr!   r!   r"   Úfix_jukebox_keys`   s²   
ÿ

ÿ

ÿ


(

 

"
 (
  
"
 
 
$
rN   c                 C   sH  t |  D ]:}tj |› d| d¡d › ¡s>tjt› |› dd}tj|› ddd t	|› d| d¡d › dƒ 
|j¡ qt |  d¡d  }t | ¡}t|ƒ}g }i }t|ƒD ]r\}	}
t |› d|
 d¡d › ¡d }i }| ¡ D ];}| d¡r†|| || d	d
¡< qt| d¡r–|| || dd¡< qtd|
vr©d|v r©|| || dd¡< qt|| ||< qt|	dkr¶dndd|	 › }t|| ¡ ||ƒ}| |¡ qY| d¡}|j |¡ tt|ƒƒD ]}	|j|	  |d|	  ¡ qÝt|ƒjdd t	|› ddƒ}t  !||¡ W d  ƒ n	1 sw   Y  t"d| › d|› ƒ | #|¡ |S )zD
    Copy/paste/tweak model's weights to our Jukebox structure.
    ú/r'   T)Úallow_redirects)Úexist_okÚwbÚmodelz.bÚbÚbiasz.wÚwÚweightÚlevel_2zcond.model.z.blocks.z.model.r   Úvqvaezpriors.r%   r$   z/mapping.jsonNzSaving model r,   )$ÚMODEL_MAPPINGÚosÚpathÚisfiler   ÚrequestsÚgetÚPREFIXÚmakedirsÚopenÚwriteÚcontentr   Úfrom_pretrainedr   Ú	enumerateÚtorchÚloadÚkeysr   r   rN   r7   ÚappendÚpoprY   Úload_state_dictÚranger   Úpriorsr   ÚmkdirÚjsonÚdumpr5   Úsave_pretrained)Ú
model_nameÚpytorch_dump_folder_pathÚfileÚrÚmodel_to_convertÚconfigrS   Úweight_dictr:   ÚiÚ	dict_nameÚold_dicÚnew_dicr   r9   Úvqvae_state_dictÚtxtfiler!   r!   r"   Úconvert_openai_checkpointÔ   sH    &€
"


ÿ
r€   Ú__main__z--model_namer	   z(Name of the model you'd like to convert.)ÚdefaultÚtypeÚhelpz--pytorch_dump_folder_pathzjukebox-5b-lyrics-convertedz+Path to the output PyTorch model directory.)NN)Ú__doc__Úargparserp   r[   Úpathlibr   r^   rg   Útransformersr   r   Útransformers.utilsr   Úset_verbosity_infoÚ
get_loggerÚ__name__Úloggerr`   rZ   r#   rN   Úno_gradr€   ÚArgumentParserÚparserÚadd_argumentÚstrÚ
parse_argsÚargsrs   rt   r!   r!   r!   r"   Ú<module>   sH   
ù.t2üüð