使用Transformers庫中可用的最新赫爾辛基NLP模型來創建標準化的機器翻譯服務
在企業環境中需要機器翻譯。 至關重要的是,跨國公司必須能夠與世界各地的人們共享多種語言的文檔,便箋,電子郵件和其他文本。
可以說,更為重要的是需要在全球化的同時使信息民主化。 無論您使用哪種口頭語言,您都應該使用與主要口語(例如英語)相同的開源出版物,醫療保健信息,工具和知識。
> I made this in powerpoint. It's horrible.
幸運的是,機器翻譯已經存在了一段時間-我們中的許多人已經使用google翻譯來在線確認某物的內容,或者只是聽起來聰明而世俗。 如果您有需要擴展的翻譯需求,Azure,AWS和GCP都提供消耗性API,每百萬個字符僅需10美元,即可支持數千種語言對(一對語言由源語言和目標語言組成)。
在開源空間中,已經進行了無數種跨多種語言的機器學習工作,并且人們早就能夠訓練自己的機器翻譯模型。 但是,大多數方法在建模方法和支持的語言數量方面似乎是完全不同的(在我自己的幼稚評估中)。
最近,Huggingface從赫爾辛基大學發布了1,000多種預訓練的語言模型。 對于希望創建自己的AWS或Google翻譯API的人來說,這從未如此簡單。 所以,我想我會利用別人的辛勤工作。 這相當于"讓我們在Flask API和Docker鏡像中包裝機器學習",但無論如何,它都很有趣。 我們開始做吧。
用變Transformer進行機器翻譯
Huggingface在將SOTA(最先進的)模型用于簡單的Python API中以實現像我這樣的復制+粘貼編碼器方面所做的出色工作。 要在本地翻譯文本,您只需要點安裝變壓器,然后使用以下來自變壓器文檔的代碼段即可。
這將下載所需的模型并轉換源文本->目標文本。 有了這種格式的大量支持語言,將其拋入dockerized flask應用程序并每天調用它是非常容易的,但是我們確實有很多額外的工作要做……
隨時關注git repo。
下載模型
當您初始化上述模型時,如果本地沒有所需的文件,則轉換器將下載所需的文件。 這對于本地使用來說是很棒的,但是在使用Docker容器時卻不是。 由于容器的存儲是短暫的,因此每次我們退出容器時,我們都會丟失所有模型,而下次需要重新下載所有模型。
為了避免這種情況,我們可以單獨處理模型下載并將模型作為卷安裝。 這也使我們可以更好地控制我們希望我們的服務從一開始就支持的語言。 Huggingface在S3上托管了所有必要的文件,因此我們可以對此進行標準化…
然后創建一個簡單的命令行實用程序來下載它們:
酷。 現在,我們可以通過一個命令下載所需的模型。 以日語->英語為例。
python download_models.py –source ja –target zh
默認情況下,這會將它們下載到名為data的目錄中,因此只需檢查以確保存在。
Python中的動態語言翻譯
現在,我們有了更好的方法來管理我們支持的語言,讓我們先解決問題的實質,然后再使用類和相關方法來管理我們的翻譯。
我們在這里需要幾個功能:
· 翻譯給定源語言和目標語言(duh)的文本
· 將我們沒有的模型加載和管理到內存中(我用一個簡單的字典)
· 獲得支持的語言(我們為此應用程序下載了哪些語言?)
由于變壓器對用戶友好,因此幾乎無需花費任何時間就可以將此功能包裝到輕量級類中供我們使用。
此類已使用我們用于保存模型并自行處理其余部分的路徑進行了初始化。 如果我們收到翻譯請求,但內存中沒有該模型,則會調用load_models將其加載到self.models字典中。 這將檢查我們的數據目錄以查看是否具有該模型,并返回一條消息以告知我們是否這樣做。
使其成為API
現在我們需要做的就是將其包裝在flask中,以便可以對其進行HTTP調用。
要使用它,只需運行python App.py,然后調用該服務即可。 要檢查其是否正常運行,您可以卷曲localhost:5000或使用更復雜的工具(例如Postman)。 我在這里使用Flask服務器,但您希望生產Web服務器在實際的任何地方都可以使用它。
將其包裝在Docker映像中
現在,我們的應用程序可以使用基本的Python,我們希望使其能夠與Docker或docker-compose一起使用,以便我們可以根據需要擴展和擴展它。 我們為此使用的實際Dockerfile非常簡單。 我們只需要確保在連接了卷的情況下運行該服務,以便該服務已經可以訪問數據。
我通常會使用較小的基本圖片,但說實話,我不想調試:
生成并運行命令:
docker build -t machine-translation-service .
docker run -p 5000:5000 -v $(pwd)/data:/app/data -it machine-translation-service
同樣,我們可以通過調用服務來測試端點。 如果我下載了en-> fr之類的語言路線,則應該可以使用curl進行以下API調用:
curl --location --request POST 'http://localhost:5000/translate'
--header 'Content-Type: application/json'
--data-raw '{ "text":"hello", "source":"en", "target":"fr"}'
現在為docker-compose
我將服務包裝在一個小燒瓶API中,甚至"正確地"將其制成可以以可重現方式擴展的Docker容器。 但是,我想分享一些使用此方法的問題。
這些翻譯模型非常大(每個模型大約300MB)。 即使數據/模型是單獨下載的,我們仍然需要在內存中加載我們要支持的每種語言對,而對于單個容器,這很快就會變得一發不可收拾。
因此,為什么不創建一個可配置的映像,我們可以使用它來使用docker-compose為每個服務啟動一個容器? 這樣一來,每對語言就可以提供一項服務,并且每對語言都可以根據需求的增長而單獨擴展。 然后,我們可以編寫一個公開的API,將請求傳遞給網絡中的所有容器。
免責聲明:至此,我才開始進行化妝,但我絲毫不相信這是最佳方法-但我想知道我能走多遠。
為了開始工作,我對目錄做了一些修改。 要查看它,您可以探索我制作的git上的分支:
代理的目的是將請求重定向到啟動的每個機器翻譯服務。 這將是唯一公開的端點。 我為支持en-> fr翻譯的服務制作了一個快速的docker-compose文件。
每個翻譯服務都具有相同的env變量(我應該只制作一個.env文件),相同的命令和包含我們模型的相同卷。 可以使用yaml自動化或類似方法來更好地擴展此功能,但我還沒有到達那里。
在那之后,我只是對代理的/ translate端點做了一些難看的工作,以便根據需要構造請求的服務端點。 當用戶向該公開服務發出請求時,它將向該容器內只能訪問的其他容器發出另一個請求。
我們要做的就是建立基礎映像。
cd translation_basedocker build -t translation_base
然后啟動服務。
docker-compose up
這是使用POSTMAN的輸出截圖。
最后是Kubernetes
這里不做深入探討,但是合理的下一步是將其帶入kubernetes以實現真正的規模。 一個簡單的起點是使用kompose CLI將docker-compose轉換為kubernetes YAML。 在macOS上:
$brew install kompose
$kompose convert
INFO Kubernetes file "translation-proxy-service.yaml" created
INFO Kubernetes file "en-fr-deployment.yaml" created
INFO Kubernetes file "en-fr-claim0-persistentvolumeclaim.yaml" created
INFO Kubernetes file "fr-en-deployment.yaml" created
INFO Kubernetes file "fr-en-claim0-persistentvolumeclaim.yaml" created
INFO Kubernetes file "translation-proxy-deployment.yaml" created
這會創建一些YAML文件,您需要這些文件才能將服務和部署擴展到K8。
這是fr-en服務的示例部署:
一旦配置了kubernetes集群,就可以kubectl apply -f $ FILENAME來創建服務,部署和持久卷聲明。
當然,還有更多的工作要做,還要創建更多的kubernetes對象,但是我想為任何實際想要擴展此范圍的人提供一個簡單的入門。
結論
我希望Huggingface能夠繼續構建工具(以及專門的研究人員訓練的模型)繼續為智能機器學習提供公平的訪問權限。 開放式機器翻譯的努力不僅為研究領域做出了貢獻,而且使全世界都可以使用一種語言編寫極其重要的資源。
我不知道自己托管這些龐大的模型是否比使用AWS或Google Translate API便宜一半,而且我也沒有探索其質量。 但這很有趣,希望可以為您提供可用的數千種SOTA機器學習模型為您提供的知識。
(本文翻譯自Kyle Gallatin的文章《Build Your Own Machine Translation Service with Transformers》,參考:
https://towardsdatascience.com/build-your-own-machine-translation-service-with-transformers-d0709df0791b)