import gradio as gr print('Imported gradio', gr.__version__) import transformers print('Imported sentence_transformers', transformers.__version__) import peft print('Imported torch', peft.__version__) import torch print('Imported torch', torch.__version__) import re import gc intermediate_loras = [ 'PTHQL_level1_Germanic', 'PTHQL_level1_Romance', 'PTHQL_level2_High_German', 'PTHQL_level2_North_Sea_Germanic', 'PTHQL_level2_Weser_Rhine_Germanic', 'PTHQL_level2_Gallo_Romance', 'PTHQL_level2_Iberian_Romance', 'PTHQL_level2_Italo_Romance' ] language_mapping = { 'Asturian (ast_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Romance', 'PTHQL_level2_Iberian_Romance', 'PTHQL_language_Asturian'], 'Dutch (nld_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Germanic', 'PTHQL_level2_Weser_Rhine_Germanic', 'PTHQL_language_Dutch'], 'English (eng_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Germanic', 'PTHQL_level2_North_Sea_Germanic', 'PTHQL_language_English'], 'French (fra_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Romance', 'PTHQL_level2_Gallo_Romance', 'PTHQL_language_French'], 'German (deu_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Germanic', 'PTHQL_level2_High_German', 'PTHQL_language_German'], 'Haitian Creole (hat_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Romance', 'PTHQL_level2_Gallo_Romance', 'PTHQL_language_Haitian_Creole'], 'Italian (ita_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Romance', 'PTHQL_level2_Italo_Romance', 'PTHQL_language_Italian'], 'Limburgish (lim_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Germanic', 'PTHQL_level2_Weser_Rhine_Germanic', 'PTHQL_language_Limburgish'], 'Luxembourgish (ltz_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Germanic', 'PTHQL_level2_High_German', 'PTHQL_language_Luxembourgish'], 'Sicilian (scn_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Romance', 'PTHQL_level2_Italo_Romance', 'PTHQL_language_Sicilian'], 'Spanish (spa_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Romance', 'PTHQL_level2_Iberian_Romance', 'PTHQL_language_Spanish'], 'Tok Pisin (tpi_Latn)': ['PTHQL_level0_Indo_European', 'PTHQL_level1_Germanic', 'PTHQL_level2_North_Sea_Germanic', 'PTHQL_language_Tok_Pisin'], } last_language = 'English (eng_Latn)' print('Loading base model...') model = transformers.MT5ForConditionalGeneration.from_pretrained('google/mt5-large', torch_dtype=torch.bfloat16) tokenizer = transformers.AutoTokenizer.from_pretrained('google/mt5-large') print('Base model loaded!') print('Loading base LoRA...') model = peft.PeftModel.from_pretrained(model, 'WilliamSotoM/PTHQL_level0_Indo_European', 'PTHQL_level0_Indo_European') print('Base LoRA loaded!') print('Loading Intermediate LoRAs...') for adapter in intermediate_loras: model.load_adapter(f'WilliamSotoM/{adapter}', adapter) print(f"{adapter} loaded!") print('Intermediate LoRAs loaded!') print('Loading English (eng_Latn) LoRA...') model.load_adapter('WilliamSotoM/PTHQL_language_English', 'language') print('English (eng_Latn) LoRA loaded!') print('Merging English (eng_Latn) related LoRAs...') for adapter in language_mapping['English (eng_Latn)'][:-1]: model.merge_adapter([adapter]) print(f'{adapter} merged!') model.merge_adapter(['language']) print('English (eng_Latn) related LoRAs merged!') gc.collect() print('Defining evaluate function...') def evaluate(language, amr_graph): global last_language global model if language != last_language: print('Unmerging LoRAs...') model.unmerge_adapter() print('LoRAs unmerged') print('Removing old language LoRA...') model.delete_adapter('language') gc.collect() print('Old language LoRA removed!') print(f'Loading {language} LoRA...') language_lora = language_mapping[language][-1] model.load_adapter(f'WilliamSotoM/{language_lora}', 'language') print(f'{language}LoRA loaded!') print(f'Merging {language} related LoRAs...') for adapter in language_mapping[language][:-1]: model.merge_adapter([adapter]) print(f'{adapter} merged!') model.merge_adapter(['language']) print(f'{language} related LoRAs merged!') last_language = language tokenized_input = tokenizer(amr_graph, return_tensors='pt') with torch.inference_mode(): prediction = model.generate(**tokenized_input, max_length=128) generated_text = tokenizer.batch_decode(prediction, skip_special_tokens=True)[0] print(f'AMR Graph:\n{amr_graph}') print('-----') print(f'Generated Text:\n{generated_text}') print('=====') return generated_text print('Evaluate function defined!') print('Instantiating gradio interface...') demo = gr.Interface( fn=evaluate, inputs = [ gr.Dropdown(label = 'Language', choices=list(language_mapping.keys()), value='English (eng_Latn)'), gr.Textbox(label='AMR Graph', lines=10), ], outputs = [ gr.Textbox( label="Lexicalization", interactive=False, show_copy_button=True ) ], title = 'Multilingual AMR-to-Text via PTHQL', description = '''Select a language and write the input AMR Graph to obtain a Lexicalization. The first Generation after changing language might take longer while the last LoRA is changed.''' ) print('Gradio interface instantiated...') print('Launching server...') demo.launch()