README.md 4.0 KB
Newer Older
K
KP 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
```shell
$ hub install transformer_en-de==1.0.0
```

## 概述

2017 年,Google机器翻译团队在其发表的论文[Attention Is All You Need](https://arxiv.org/abs/1706.03762)中,提出了用于完成机器翻译(Machine Translation)等序列到序列(Seq2Seq)学习任务的一种全新网络结构——Transformer。Tranformer网络完全使用注意力(Attention)机制来实现序列到序列的建模,并且取得了很好的效果。

transformer_en-de包含6层的transformer结构,头数为8,隐藏层参数为512,参数量为64M。该模型在[WMT'14 EN-DE数据集](http://www.statmt.org/wmt14/translation-task.html)进行了预训练,加载后可直接用于预测,提供了英文翻译为德文的能力。

关于机器翻译的Transformer模型训练方式和详情,可查看[Machine Translation using Transformer](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/machine_translation/transformer)

## API


```python
def __init__(max_length: int = 256,
             max_out_len: int = 256,
             beam_size: int = 5):
```
初始化module,可配置模型的输入输出文本的最大长度和解码时beam search的宽度。

**参数**
- `max_length`(int): 输入文本的最大长度,默认值为256。
- `max_out_len`(int): 输出文本的最大解码长度,默认值为256。
- `beam_size`(int): beam search方式解码的beam宽度,默认为5。


```python
def predict(data: List[str],
            batch_size: int = 1,
            n_best: int = 1,
            use_gpu: bool = False):
```
预测API,输入源语言的文本句子,解码后输出翻译后的目标语言的文本候选句子。

**参数**
- `data`(List[str]): 源语言的文本列表,数据类型为List[str]
- `batch_size`(int): 进行预测的batch_size,默认为1
- `n_best`(int): 每个输入文本经过模型解码后,输出的得分最高的候选句子的数量,必须小于beam_size,默认为1
- `use_gpu`(bool): 是否使用gpu执行预测,默认为False

**返回**
* `results`(List[str]): 翻译后的目标语言的候选句子,长度为`len(data)*n_best`


**代码示例**

```python
import paddlehub as hub

model = hub.Module(name='transformer_en-de', beam_size=5)
src_texts = [
    'What are you doing now?',
    'The change was for the better; I eat well, I exercise, I take my drugs.',
    'Such experiments are not conducted for ethical reasons.',
]

n_best = 3  # 每个输入样本的输出候选句子数量
trg_texts = model.predict(src_texts, n_best=n_best)
for idx, st in enumerate(src_texts):
    print('-'*30)
    print(f'src: {st}')
    for i in range(n_best):
        print(f'trg[{i+1}]: {trg_texts[idx*n_best+i]}')
```

## 服务部署

通过启动PaddleHub Serving,可以加载模型部署在线翻译服务。

### Step1: 启动PaddleHub Serving

运行启动命令:

```shell
$ hub serving start -m transformer_en-de
```

通过以上命令可完成一个英德机器翻译API的部署,默认端口号为8866。

**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。

### Step2: 发送预测请求

配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果

```python
import requests
import json

texts = [
    'What are you doing now?',
    'The change was for the better; I eat well, I exercise, I take my drugs.',
    'Such experiments are not conducted for ethical reasons.',
]
data = {"data": texts}
# 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip
url = "http://127.0.0.1:8866/predict/transformer_en-de"
# 指定post请求的headers为application/json方式
headers = {"Content-Type": "application/json"}

r = requests.post(url=url, headers=headers, data=json.dumps(data))
print(r.json())
```

## 查看代码

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/machine_translation/transformer

## 依赖

paddlepaddle >= 2.0.0

paddlehub >= 2.1.0

## 更新历史

* 1.0.0

  初始发布