# TransCoder **Repository Path**: LZY2006/TransCoder ## Basic Information - **Project Name**: TransCoder - **Description**: Public release of the TransCoder research project https://arxiv.org/pdf/2006.03511.pdf - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-02-15 - **Last Updated**: 2024-10-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TransCoder TransCoder的Pytorch的原始实现见 [编程语言的无监督翻译](https://arxiv.org/pdf/2006.03511.pdf) ![Model](https://dl.fbaipublicfiles.com/transcoder/TransCoder_Schema.jpg) ## 依存关系 - Python 3 - [NumPy](http://www.numpy.org/) - [PyTorch](http://pytorch.org/) - [fastBPE](https://github.com/fairinternal/TransCoder_release/tree/master/XLM/tools#fastbpe) (生成并应用BPE代码) - [Moses](https://github.com/fairinternal/TransCoder_release/tree/master/XLM/tools#tokenizers) (仅用于清理和标记文本的脚本-无需安装) - [Apex](https://github.com/nvidia/apex#quick-start) (用于fp16训练) - [libclang](https://pypi.org/project/clang/) (用于C ++标记化) - [submitit](https://pypi.org/project/submitit/) (在远程计算机上跑预处理pipeline) - [six](https://pypi.org/project/six/) - [sacrebleu](https://pypi.org/project/sacrebleu/) (`pip install sacrebleu=="1.2.11"`) 如果你的 `libclang.so` 不在 `/usr/lib/llvm-7/lib/`文件夹下,在`code_tokenizer.py` 的`clang.cindex.Config.set_library_path('path_to_libclang')` 处替换正确的指向 `libclang.so` 的地址 。 如果运行数据预处理pipeline,则必须编译fastBPE。在XLM/tools/fastBPE目录下的[自述文档](https://github.com/facebookresearch/TransCoder/blob/master/XLM/tools/README.md)里有说明. ## 翻译代码 Java, C++ and Python 3 这三种语言互译 该模型可以使用`translate.py`输入代码进行测试。 例如, `python translate.py --src_lang cpp --tgt_lang java --model_path trained_model.pth < input_code.cpp` 会将input_code.cpp中包含的C++代码转换为Java代码。 ## 下载预训练的模型 我们提供模型检查点(.pth文件)。 我们使用验证集为每种语言对选择最佳检查点,然后选择用于计算测试分数的模型。 我们选择了: - [这个模型](https://dl.fbaipublicfiles.com/transcoder/model_1.pth) 用作 C++ -> Java, Java -> C++ 和Java -> Python - [这个模型](https://dl.fbaipublicfiles.com/transcoder/model_2.pth) 用作 C++ -> Python, Python -> C++ 和Python -> Java ## 进行评估 - 下载[测试和验证数据集](https://dl.fbaipublicfiles.com/transcoder/TransCoder_test_val_data.zip) 然后解压缩。在该文件夹中,将对测试和验证数据进行预处理(标记,应用BPE)并转化为二进制,来直接用于XLM并测试发布的模型。 我们也[在这里](https://github.com/fairinternal/TransCoder_release/blob/master/README.md#validation-and-test-sets-release)发布了原始数据。 - 将所有二进制数据放入`data/XLM-cpp-java-python-with-comments`文件夹 - 用`eval_only`模式运行`XLM/train.py`。 例如: ```shell python XLM/train.py --n_heads 8 --bt_steps 'python_sa-cpp_sa-python_sa,cpp_sa-python_sa-cpp_sa,java_sa-cpp_sa-java_sa,cpp_sa-java_sa-cpp_sa,python_sa-java_sa-python_sa,java_sa-python_sa-java_sa' # The evaluator will use this parameter to infer the languages to test on --max_vocab '-1' --word_blank '0.1' --n_layers 6 --generate_hypothesis true --max_len 512 --bptt 256 --fp16 true --share_inout_emb true --tokens_per_batch 6000 --has_sentences_ids true --eval_bleu true --split_data false --data_path 'path_to_TransCoder_folder/data/XLM-cpp-java-python-with-comments' --eval_computation true --batch_size 32 --reload_model 'model_1.pth,model_1.pth' --amp 2 --max_batch_size 128 --ae_steps 'cpp_sa,python_sa,java_sa' --emb_dim 1024 --eval_only True --beam_size 10 --retry_mistmatching_types 1 --dump_path '/tmp/' --exp_name='eval_final_model_wc_30' --lgs 'cpp_sa-java_sa-python_sa' --encoder_only=False ``` ## 训练一个新模型 ### 需要的数据 使用MLM预训练模型所需的数据: - 训练数据(单种语言):每种语言的源代码,例如:`train.python.pth`(实际上,你有8个`train.python。[0..7] .pth`文件,因为数据划分在8个gpu上) - 测试/验证数据(单种语言):每种语言的源代码,用于测试模型的复杂性,例如:`test.python.pth` / `valid.python.pth` 训练AE和BT所需的数据 : - 训练数据(单种语言):使用每种语言单独的功能,例如: `train.python_sa.[0..7].pth` - 测试、验证数据 (单种语言+多语言并行): - 单语言功能以测试模型的复杂性,例如:`test.python_sa.pth` / `valid.python_sa.pth` - 并行功能以测试翻译模型(使用BLEU和单元测试),例如:`test.python_sa-cpp_sa.pth` / `valid.python_sa-cpp_sa.pth` 所有这些数据都应包含在一个文件夹中。 路径在--data参数中给出。 我们提供并行的测试和验证数据。 见章节 [进行评估](https://github.com/fairinternal/TransCoder_release/blob/master/README.md#run-an-evaluation) and [验证和测试集发布](https://github.com/fairinternal/TransCoder_release/blob/master/README.md#validation-and-test-sets-release)。要获取所有单钟语言数据(所有代码/功能/训练/测试/验证),请参见以下部分。 注意:在我们的案例中,训练数据太大,无法在一台机器上容纳。 因此,我们将其拆分为8个二进制文件,并在训练中将数据分给8个GPU。 如果你的训练数据可以放在一台机器上,例如,将所有训练数据重新组合到一个文件中`train.python.pth` ### 下载/预处理数据 要获取单语数据,请先从Google BigQuery下载cpp/java/python[源代码](https://cloud.google.com/blog/products/gcp/github-on-bigquery-analyze-all-the-open-source-code)。要运行我们的预处理pipeline,你需要以json格式在计算机上下载原始源代码,并将每种编程语言放在专用文件夹中。在data / test_dataset中提供了一个示例。管道从json提取源代码,对其进行标记,提取函数,应用BPE,对数据进行二进制化,并创建具有适当名称的符号链接以直接在XLM中使用。以.XLM-syml结尾的文件夹是你为XLM训练提供的数据路径。你必须将我们在“运行评估”数据中提供的测试和有效并行添加到该文件夹。 测试pipeline,运行```pytest preprocessing/test_preprocess.py```,你会在data/test_dataset文件夹中看到pipeline输出。 要运行pipeline(在本地或在远程计算机上),请使用命令示例: ``` shell python -m preprocessing.preprocess absolute_path_to_TranscCoder/data/test_dataset # path to the root folder where you have the json --lang1 java # 预处理语言 --lang2 python # --lang3 cpp # 如果只想预处理2种语言,则可以为None --keep_comments True # 如果要在代码中保留代码注释,则为True,否则设为False会删除注释。 --bpe_train_size 0 # 设置在其上训练bpe代码的训练数据子集的大小。 0->参数禁用,并且使用了所有训练数据 --test_size 10 # 测试/验证集的大小,通常为1000,此处为10,以测试json样本上的命令 --local True # 如果要在本地启动管道,则为True;如果要在远程计算机上启动,则为False。 在这种情况下,它使用submitit ``` 如果要预处理另一种编程语言,则必须在`preprocessing/src/code_tokenizer.py`中实现功能tokenize_newlang,detokenize_newlang,extract_function_newlang,get_function_name_newlang,并使用newlang运行pipeline。 注意:如果`--keep-comments`为True则为cpp/java/python运行pipeline,则不需要训练BPE代码和vocab,它们在`data/bpe.cpp-java-python.with_comments`中提供。 在有json文件夹的文件夹中,只需添加一个文件夹`cpp-java-python.with_comments`并复制代码和vocab文件。 pipeline会看到它并通过BPE训练步骤。 ### 使用MLM预训练模型 例子: ```shell python XLM/train.py --n_heads 8 --bt_steps '' --max_vocab 64000 --word_mask_keep_rand '0.8,0.1,0.1' --word_blank 0 --data_path 'path_to_TransCoder_folder/data/XLM-cpp-java-python-with-comments' --save_periodic 0 --bptt 512 --lambda_clm 1 --ae_steps '' --fp16 true --share_inout_emb true --lambda_mlm 1 --sinusoidal_embeddings false --word_shuffle 0 --mlm_steps 'cpp,java,python' --attention_dropout 0 --split_data false --length_penalty 1 --max_epoch 100000 --stopping_criterion '_valid_mlm_ppl,10' --lambda_bt 1 --dump_path '/output_folder_path' --lambda_mt 1 --epoch_size 100000 --early_stopping false --gelu_activation false --n_layers 6 --optimizer 'adam_inverse_sqrt,warmup_updates=10000,lr=0.0003,weight_decay=0.01' --validation_metrics _valid_mlm_ppl --eval_bleu false --dropout '0.1' --mt_steps '' --reload_emb '' --batch_size 32 --context_size 0 --word_dropout 0 --reload_model '' --min_count 0 --lgs 'cpp-java-python' --sample_alpha 0 --word_pred '0.15' --amp 2 --max_batch_size 0 --clip_grad_norm 5 --emb_dim 1024 --encoder_only true --beam_size 1 --clm_steps '' --exp_name mlm_cpp_java_python_with_coms --lambda_ae 1 --lg_sampling_factor '-1' --eval_only false ``` ### 使用降噪自动编码器和反向转换目标训练模型 例子: ```shell python XLM/train.py --n_heads 8 --bt_steps 'python_sa-cpp_sa-python_sa,cpp_sa-python_sa-cpp_sa,java_sa-cpp_sa-java_sa,cpp_sa-java_sa-cpp_sa,python_sa-java_sa-python_sa,java_sa-python_sa-java_sa' --max_vocab '-1' --word_mask_keep_rand '0.8,0.1,0.1' --gen_tpb_multiplier 1 --word_blank '0.1' --n_layers 6 --save_periodic 1 --dump_path '/output_folder_path' --max_len 512 --bptt 256 --lambda_clm 1 --ae_steps 'cpp_sa,python_sa,java_sa' --fp16 true --share_inout_emb true --lambda_mlm 1 --sinusoidal_embeddings false --mlm_steps '' --word_shuffle 3 --tokens_per_batch 6000 --has_sentences_ids true --attention_dropout 0 --split_data false --length_penalty 1 --max_epoch 10000000 --stopping_criterion '' --lambda_bt 1 --generate_hypothesis true --lambda_mt 1 --epoch_size 30000 --data_path 'path_to_TransCoder_folder/data/XLM-cpp-java-python-with-comments' --gelu_activation false --split_data_accross_gpu global --optimizer 'adam_inverse_sqrt,warmup_updates=10000,lr=0.0001,weight_decay=0.01' --eval_computation true --validation_metrics '' --eval_bleu true --dropout '0.1' --mt_steps '' --reload_emb '' --batch_size 32 --context_size 0 --word_dropout '0.1' --reload_model 'path_to_MLM_checkpoint,path_to_MLM_checkpoint' --min_count 0 --eval_bleu_test_only false --group_by_size true --early_stopping false --sample_alpha 0 --word_pred '0.15' --amp 2 --max_batch_size 128 --clip_grad_norm 5 --emb_dim 1024 --encoder_only false --lgs 'cpp_sa-java_sa-python_sa' --clm_steps '' --exp_name bt_with_comments_sa_final_modif_test --beam_size 1 --lambda_ae '0:1,100000:0.1,300000:0' --lg_sampling_factor '-1' --eval_only false ``` ## 用多个GPU训练 将`python XLM/train.py` 替换为 ```shell export NGPU=2; python -m torch.distributed.launch --nproc_per_node=$NGPU XLM/train.py ``` ## 验证和测试集发布 我们发布验证和测试数据集。 您可以[在这里](https://dl.fbaipublicfiles.com/transcoder/TransCoder_tokenized_test_set_functions.zip)下载原始数据。 每个文件中每一行的格式为` | `。该函数被标记化。 您可以使用脚本`preprocessing/detokenize.py`解码。您可以提取函数id并使用它在以下位置找到相应的测试脚本`data/evaluation/geeks_for_geeks_successful_test_scripts/` (如果存在)。 例如,对于在`test.cpp.shuf.valid.tok`中的这行`COUNT_SET_BITS_IN_AN_INTEGER_3 | `,相应的测试脚本在`data/evaluation/geeks_for_geeks_successful_test_scripts/cpp/COUNT_SET_BITS_IN_AN_INTEGER_3.cpp`。 如果缺少脚本,则意味着我们为相应功能自动创建的测试存在问题。 可以通过将模型生成的代码注入到测试脚本中的`TO_FILL`注释中来对其进行测试。 ## 从Google Big Query下载Github的小指南 译者注:在中国大陆无法访问,而且此服务只在美国推出,无法用中国的信用卡注册。 - 创建一个Google平台帐户(您将免费获得约300美元,对于Github来说足够了) - 创建一个Google Big Query项目 - 在那个项目中,创建一个数据集 - 在此数据集中,每种编程语言创建一个表。 每个SQL请求的结果(每种语言一个)将存储在这些表中。 - 在运行SQL请求之前,请确保更改查询设置以将查询结果保存在专用表中(更多->查询设置->目标->查询结果表->放置表名) - 运行您的SQL请求(每种语言一个,不要忘记为每个请求更改表) - 将结果导出到Google Cloud: - 在Google云端存储中,为每种语言创建一个存储桶和一个文件夹 - 将表格导出到此存储桶(导出->导出到GCS->导出格式JSON,压缩GZIP) - 要将存储区下载到您的计算机上,请使用gsutil API: - pip install gsutil - gsutil config ->使用您的Google帐户配置gsutil - gsutil -m cp -r gs://name_of_bucket/name_of_folder . ->将您的存储桶复制到计算机上 查询python的示例: ``` SELECT f.repo_name, f.ref, f.path, c.copies, c.content FROM `bigquery-public-data.github_repos.files` as f JOIN `bigquery-public-data.github_repos.contents` as c on f.id = c.id WHERE NOT c.binary AND f.path like '%.py' ``` 查看Google链接获取更多信息 ## 引用 该代码用于在以下训练和评估TransCoder模型: [1] M.A. Lachaux*, B. Roziere*, L. Chanussot, G. Lample [Unsupervised Translation of Programming Languages](https://arxiv.org/pdf/2006.03511.pdf). \* Equal Contribution ``` @article{lachaux2020unsupervised, title={Unsupervised Translation of Programming Languages}, author={Lachaux, Marie-Anne and Roziere, Baptiste and Chanussot, Lowik and Lample, Guillaume}, journal={arXiv preprint arXiv:2006.03511}, year={2020} } ``` ## 许可证 `TransCoder` 已获得Creative Commons Attribution-NonCommercial 4.0 International许可中详细说明的许可。 有关更多详细信息,请参见`LICENSE`。