--- language: - en - ko library_name: transformers tags: - translation - enko - ko datasets: - nayohan/aihub-en-ko-translation-12m - nayohan/instruction_en_ko_translation_1.4m - Translation-EnKo/trc_uniform_313k_eval_45_filtered pipeline_tag: text-generation metrics: - sacrebleu --- # **instructTrans-v2** ![image/png](https://cdn-uploads.huggingface.co/production/uploads/6152b4b9ecf3ca6ab820e325/u42WOK4XVeNi7mUd6JpJn.png) # **Introduction** **exaone3-instrucTrans-v2-enko-7.8b** model is trained on **translation datasets(english->korean)** based on exaone-3-7.8B-it. To translate the English instruction dataset. - [nayohan/aihub-en-ko-translation-12m](https://huggingface.co./datasets/nayohan/aihub-en-ko-translation-12m) - [nayohan/instruction_en_ko_translation_1.4m](https://huggingface.co./datasets/nayohan/instruction_en_ko_translation_1.4m) - [Translation-EnKo/trc_uniform_313k_eval_45_filtered](https://huggingface.co./datasets/Translation-EnKo/trc_uniform_313k_eval_45_filtered) ### **Generating Text** This model supports translation from english to korean. To translate text, use the following Python code: ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "Translation-EnKo/exaone3-instrucTrans-v2-enko-7.8b" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", torch_dtype=torch.bfloat16 ) system_prompt="당신은 번역기 입니다. 영어를 한국어로 번역하세요." sentence = "The aerospace industry is a flower in the field of technology and science." conversation = [{'role': 'system', 'content': system_prompt}, {'role': 'user', 'content': sentence}] inputs = tokenizer.apply_chat_template( conversation, tokenize=True, add_generation_prompt=True, return_tensors='pt' ).to("cuda") outputs = model.generate(inputs, max_new_tokens=4096) # Finetuned with length 8192 print(tokenizer.decode(outputs[0][len(inputs[0]):], skip_special_tokens=True)) ``` ### **inference with vLLM**
추론 코드 접기/펼치기
```bash # Requires at least a 24 GB Vram GPU. If you have 12GB VRAM, you will need to run in FP8 mode. python vllm_inference.py -gpu_id 0 -split_idx 0 -split_num 2 -dname "nvidia/HelpSteer" -untrans_col 'helpfulness' 'correctness' 'coherence' 'complexity' 'verbosity' > 0.out python vllm_inference.py -gpu_id 1 -split_idx 1 -split_num 2 -dname "nvidia/HelpSteer" -untrans_col 'helpfulness' 'correctness' 'coherence' 'complexity' 'verbosity' > 1.out ``` ```python import os import argparse import pandas as pd from tqdm import tqdm from typing import List, Dict from datasets import load_dataset, Dataset from transformers import AutoTokenizer from vllm import LLM, SamplingParams # truncate sentences with more than 4096 tokens. # for same dataset size def truncation_func(sample, column_name): input_ids = tokenizer(str(sample[column_name]), truncation=True, max_length=4096, add_special_tokens=False).input_ids output = tokenizer.decode(input_ids) sample[column_name]=output return sample # convert to chat_template def create_conversation(sample, column_name): SYSTEM_PROMPT=f"당신은 번역기 입니다. 영어 문장을 한국어로 번역하세요." messages=[ {"role":"system", "content": SYSTEM_PROMPT}, {"role":"user", "content":sample[column_name]} ] text=tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True ) sample[column_name]=text return sample def load_dataset_preprocess(dataset_name:str, untranslate_column:List, split_num, split_idx, subset=None, num_proc=128) -> Dataset: step = 100//split_num # split datasets if subset: dataset = load_dataset(dataset_name, subset, split=f'train[{step*split_idx}%:{step*(split_idx+1)}%]') else: dataset = load_dataset(dataset_name, split=f'train[{step*split_idx}%:{step*(split_idx+1)}%]') print(dataset) original_dataset = dataset # To leave columns untranslated dataset = dataset.remove_columns(untranslate_column) for feature in dataset.features: dataset = dataset.map(lambda x: truncation_func(x,feature), num_proc=num_proc) # dataset = dataset.map(lambda x: create_conversation(x,feature), batched=False, num_proc=num_proc) print("filtered_dataset:", dataset) return dataset, original_dataset def save_dataset(result_dict:Dict, dataset_name, untranslate_column:List, split_idx, subset:str): for column in untranslate_column: result_dict[column] = original_dataset[column] df = pd.DataFrame(result_dict) output_file_name = dataset_name.split('/')[-1] os.makedirs('gen', exist_ok=True) if subset: save_path = f"gen/{output_file_name}_{subset}_{split_idx}.jsonl" else: save_path = f"gen/{output_file_name}_{split_idx}.jsonl" df.to_json(save_path, lines=True, orient='records', force_ascii=False) if __name__=="__main__": model_name = "Translation-EnKo/exaone3-instrucTrans-v2-enko-7.8b" tokenizer = AutoTokenizer.from_pretrained(model_name) parser = argparse.ArgumentParser(description='load dataset name & split size') parser.add_argument('-dname', type=str, default="Magpie-Align/Magpie-Pro-MT-300K-v0.1") parser.add_argument('-untrans_col', nargs='+', default=[]) parser.add_argument('-split_num', type=int, default=4) parser.add_argument('-split_idx', type=int, default=0) parser.add_argument('-gpu_id', type=int, default=0) parser.add_argument('-subset', type=str, default=None) parser.add_argument('-num_proc', type=int, default=128) args = parser.parse_args() os.environ["CUDA_VISIBLE_DEVICES"]=str(args.gpu_id) dataset, original_dataset = load_dataset_preprocess(args.dname, args.untrans_col, args.split_num, args.split_idx, args.subset, args.num_proc ) # define model sampling_params = SamplingParams( temperature=0, max_tokens=8192, ) llm = LLM( model=model_name, tensor_parallel_size=1, gpu_memory_utilization=0.95, ) # inference model result_dict = {} for feature in tqdm(dataset.features): print(f"'{feature}' column in progress..") outputs = llm.generate(dataset[feature], sampling_params) result_dict[feature]=[output.outputs[0].text for output in outputs] save_dataset(result_dict, args.dname, args.untrans_col, args.split_idx, args.subset) print(f"saved to json. column: {feature}") ```

# Result ``` # EVAL_RESULT (2405_KO_NEWS) (max_new_tokens=512) "en_ref":"This controversy arose around a new advertisement for the latest iPad Pro that Apple released on YouTube on the 7th. The ad shows musical instruments, statues, cameras, and paints being crushed in a press, followed by the appearance of the iPad Pro in their place. It appears to emphasize the new iPad Pro's artificial intelligence features, advanced display, performance, and thickness. Apple mentioned that the newly unveiled iPad Pro is equipped with the latest 'M4' chip and is the thinnest device in Apple's history. The ad faced immediate backlash upon release, as it graphically depicts objects symbolizing creators being crushed. Critics argue that the imagery could be interpreted as technology trampling on human creators. Some have also voiced concerns that it evokes a situation where creators are losing ground due to AI." "ko_ref":"이번 논란은 애플이 지난 7일 유튜브에 공개한 신형 아이패드 프로 광고를 둘러싸고 불거졌다. 해당 광고 영상은 악기와 조각상, 카메라, 물감 등을 압착기로 짓누른 뒤 그 자리에 아이패드 프로를 등장시키는 내용이었다. 신형 아이패드 프로의 인공지능 기능들과 진화된 디스플레이와 성능, 두께 등을 강조하기 위한 취지로 풀이된다. 애플은 이번에 공개한 아이패드 프로에 신형 ‘M4’ 칩이 탑재되며 두께는 애플의 역대 제품 중 가장 얇다는 설명도 덧붙였다. 광고는 공개 직후 거센 비판에 직면했다. 창작자를 상징하는 물건이 짓눌려지는 과정을 지나치게 적나라하게 묘사한 점이 문제가 됐다. 기술이 인간 창작자를 짓밟는 모습을 묘사한 것으로 해석될 여지가 있다는 문제의식이다. 인공지능(AI)으로 인해 창작자가 설 자리가 줄어드는 상황을 연상시킨다는 목소리도 나왔다." "exaone3-InstrucTrans-v2":"이번 논란은 애플이 지난 7일 유튜브에 공개한 최신형 아이패드 프로의 새 광고를 둘러싸고 불거졌다. 이 광고는 악기, 조각상, 카메라, 물감 등이 프레스기에 짓눌리는 장면에 이어 그 자리에 아이패드 프로가 등장하는 장면을 보여준다. 새로운 아이패드 프로의 인공지능 기능, 첨단 디스플레이, 성능, 두께를 강조하는 것으로 보인다. 애플은 이번에 공개된 아이패드 프로에 최신 'M4' 칩이 탑재됐으며, 애플 역사상 가장 얇은 두께를 자랑한다고 언급했다. 이 광고는 공개되자마자 크리에이터를 상징하는 사물들이 짓밟히는 장면을 그래픽으로 표현해 즉각적인 반발에 부딪혔다. 비평가들은 이 이미지가 기술이 인간 크리에이터를 짓밟는 것으로 해석될 수 있다고 주장한다. 일부에서는 AI로 인해 크리에이터들이 설 자리를 잃는 상황을 연상시킨다는 우려의 목소리도 나왔다." "llama3-InstrucTrans":"이번 논란은 애플이 지난 7일 유튜브에 공개한 최신 아이패드 프로 광고를 중심으로 불거졌다. 이 광고는 악기, 조각상, 카메라, 물감 등을 누르기 시작하는 장면과 함께 그 자리에 아이패드 프로가 등장하는 장면을 보여준다. 이는 새로운 아이패드 프로의 인공지능 기능, 고급 디스플레이, 성능, 두께를 강조하는 것으로 보인다. 애플은 이번에 공개한 아이패드 프로에 최신 'M4' 칩이 탑재됐으며, 애플 역사상 가장 얇은 기기라고 언급했다. 이 광고는 출시하자마자 크리에이터를 상징하는 물건이 파쇄되는 장면이 그대로 그려져 논란이 되고 있다. 비평가들은 이 이미지가 기술이 인간 크리에이터를 짓밟는다는 의미로 해석될 수 있다고 주장한다. 또한 AI로 인해 크리에이터들이 밀리고 있다는 상황을 연상시킨다는 우려의 목소리도 나온다." ```
# **Evalution Result** 영어->한국어 번역 성능을 평가하기위한 데이터셋을 선정하여 평가를 진행하였습니다. ### **평가 데이터셋 출처** - Aihub/FLoRes: [traintogpb/aihub-flores-koen-integrated-sparta-30k](https://huggingface.co./datasets/traintogpb/aihub-flores-koen-integrated-sparta-30k) | (test set 1k) - iwslt-2023 : [shreevigneshs/iwslt-2023-en-ko-train-val-split-0.1](https://huggingface.co./datasets/shreevigneshs/iwslt-2023-en-ko-train-val-split-0.1) | (f_test 597, if_test 597) - ko_news_2024: [nayohan/ko_news_eval40](https://huggingface.co./datasets/nayohan/ko_news_eval40) | (40) ### **모델 평가방법** - 본 평가에서는 이전(hf)과 달리 vLLM을 활용하여 추론하여 평가하였습니다. (공통: max_new_tokens=512) - 각 자세한 평가 내용은 기존의 instruct-Trans 결과를 따랐습니다. [[링크]](https://huggingface.co./nayohan/llama3-instrucTrans-enko-8b)
## **Average** - vLLM을 활용하니 HF보다 전체적으로 점수가 낮아졌습니다. ### 모델 별 성능 비교 | 모델 이름 | AIHub | Flores | IWSLT | News | 평균 | |:-------------------------------------------------------------------------------------------|:-------:|:-------:|:------:|:-------:|:-------:| | **Meta-Llama** | | | | | | | **meta-llama/Meta-Llama-3-8B-Instruct** | 0.3075 | 0.295 | 2.395 | 0.17 | 0.7919 | | **nayohan/llama3-8b-it-translation-general-en-ko-1sent** | 15.7875 | 8.09 | 4.445 | 4.68 | 8.2506 | | **nayohan/llama3-instrucTrans-enko-8b** | 16.3938 | 9.63 | 5.405 | 5.3225 | 9.1878 | | **nayohan/llama3-8b-it-general-trc313k-enko-8k** | 14.7225 | 10.47 | 4.45 | 7.555 | 9.2994 | | **Gemma** | | | | | | | **Translation-EnKo/gemma-2-2b-it-general1.2m-trc313eval45** | 13.7775 | 7.88 | 3.95 | 6.105 | 7.9281 | | **Translation-EnKo/gemma-2-9b-it-general1.2m-trc313eval45** | 18.9887 | 13.215 | 6.28 | 9.975 | 12.1147 | | **Translation-EnKo/gukbap-gemma-2-9b-it-general1.2m-trc313eval45** | 18.405 | 12.44 | 6.59 | 9.64 | 11.7688 | | **EXAONE** | | | | | | | **CarrotAI/EXAONE-3.0-7.8B-Instruct-Llamafied-8k** | 4.9375 | 4.9 | 1.58 | 8.215 | 4.9081 | | **Translation-EnKo/exaeon3-translation-general-enko-7.8b (private)** | 17.8275 | 8.56 | 2.72 | 6.31 | 8.8544 | | **Translation-EnKo/exaone3-instrucTrans-v2-enko-7.8b** | 19.6075 | 13.46 | 7.28 | 11.4425 | **12.9475**| ### 학습 데이터셋 별 성능 분석 | 모델 이름 | AIHub | Flores | IWSLT | News | 평균 | |--------------------------------------------------------------|---------|--------|-------|--------|-------------| | **Meta-Llama** | | | | | | | Meta-Llama-3-8B-Instruct | 0.3075 | 0.295 | 2.395 | 0.17 | **0.7919** | | llama3-8b-it-general1.2m-en-ko-4k | 15.7875 | 8.09 | 4.445 | 4.68 | **8.2506** | | llama3-8b-it-general1.2m-trc313k-enko-4k | 16.3938 | 9.63 | 5.405 | 5.3225 | **9.1878** | | llama3-8b-it-general1.2m-trc313k-enko-8k | 14.7225 | 10.47 | 4.45 | 7.555 | **9.2994** | | **Gemma** | | | | | | | gemma-2-2b-it-general1.2m-trc313eval45 | 13.7775 | 7.88 | 3.95 | 6.105 | **7.9281** | | gemma-2-9b-it-general1.2m-trc313eval45 | 18.9887 | 13.215 | 6.28 | 9.975 | **12.1147** | | gukbap-gemma-2-9b-it-general1.2m-trc313eval45 | 18.405 | 12.44 | 6.59 | 9.64 | **11.7688** | | **EXAONE** | | | | | | | EXAONE-3.0-7.8B-Instruct | 4.9375 | 4.9 | 1.58 | 8.215 | **4.9081** | | EXAONE-3.0-7.8B-Instruct-general12m (private) | 17.8275 | 8.56 | 2.72 | 6.31 | **8.8544** | | EXAONE-3.0-7.8B-Instruct-general12m-trc1400k-trc313eval45 | 19.6075 | 13.46 | 7.28 | 11.4425| **12.9475** | ### **Citation** ```bibtex @misc{InstrcTrans-v2, title={exaone3-instrucTrans-v2-enko-7.8b}, author={Yohan Na, Suzie Oh, Eunji Kim, Mingyou sung}, year={2024}, url={https://huggingface.co./Translation-EnKo/exaone3-instrucTrans-v2-enko-7.8b} } ``` ```bibtex @misc{llama3modelcard, title={Llama 3 Model Card}, author={AI@Meta}, year={2024}, url={https://github.com/meta-llama/llama3/blob/main/MODEL_CARD.md} } ``` ```bibtex @article{exaone-3.0-7.8B-instruct, title={EXAONE 3.0 7.8B Instruction Tuned Language Model}, author={LG AI Research}, journal={arXiv preprint arXiv:2408.03541}, year={2024} } ``` ```bibtex @article{gemma_2024, title={Gemma}, url={https://www.kaggle.com/m/3301}, DOI={10.34740/KAGGLE/M/3301}, publisher={Kaggle}, author={Gemma Team}, year={2024} } ```