Docker入門實例:創建基於SRILM工具的語言模型(Language Model)訓練環境image

需求

簡單說,對方需要使用SRILM訓練自己的語言模型(Language Model),爲了快速開始訓練減少交流成本,我方提供一個配置好SRILM工具訓練環境的docker image。

背景

用過docker , 也用過virtual environment之類的工具,但是沒啥從頭開始build的經驗,所以這次決定從頭開始build。

收集所需安裝包及腳本

獲取SRILM安裝包

需要下載的SRILM最新版的安裝文件壓縮包,目前最新的是1.7.3版,下載地址。由於SRI的網頁不支持wget之類的下載,所以必須去網頁填寫一個表格才能下載。當然,也可以找其他的下載鏈接。

修改SRILM安裝腳本

此外,如果用SRILM裏的安裝指引比較繁瑣,所以直接採用KALDI裏的tools文件夾裏的install_srilm.sh 腳本去安裝。 不過這個腳本可以做一點修改:
刪除以下:

if [ "tools" != "$current_dir" ]; then
    echo "You should run this script in tools/ directory!!"
    exit 1
fi

# http://www.speech.sri.com/projects/srilm/download.html
if [ ! -f srilm.tgz ]; then
  echo This script cannot install SRILM in a completely automatic
  echo way because you need to put your address in a download form.
  echo Please download SRILM from http://www.speech.sri.com/projects/srilm/download.html
  echo put it in ./srilm.tgz, then run this script.
  exit 1
fi

28 mkdir -p srilm

還有

32 major=`awk -F. '{ print $1 }' RELEASE`
33 minor=`awk -F. '{ print $2 }' RELEASE` 
34 micro=`awk -F. '{ print $3 }' RELEASE`
35 
36 if [ $major -le 1 ] && [ $minor -le 7 ] && [ $micro -le 1 ]; then
37   echo "Detected version 1.7.1 or earlier. Applying patch."
38   patch -p0 < ../extras/srilm.patch
39 fi

修改以下:

bash extras/install_liblbfgs.sh || exit 1

bash ./install_liblbfgs.sh || exit 1

以及

tar -xvzf ../srilm.tgz

tar -xvzf ../srilm-1.7.3.tar.gz

獲取liblbfgs安裝腳本

還會需要一個lib, 就是liblbfgs。還是可以採用KALDI裏的tools/extra/install_liblbfgs.sh 腳本去安裝。

語言模型訓練腳本

build_sri_lm.sh這個其實就是用ngram-count來對訓練語料進行訓練。貼一下訓練腳本供參考

#!/bin/bash

corpus=$1
lm_suffix=$2

ngram-count -text $corpus -order 3 -write train.3.count
ngram-count -text $corpus -order 4 -write train.4.count


ngram-count -read train.3.count -order 3 -lm 3-gram.arpa.${lm_suffix} -interpolate -kndiscount
ngram-count -read train.4.count -order 4 -lm 4-gram.arpa.${lm_suffix} -interpolate -kndiscount


ngram -order 3 -lm  3-gram.arpa.${lm_suffix} -prune 1e-7 -write-lm 3-gram.arpa.pruned.1e-7.${lm_suffix}
ngram -order 3 -lm  3-gram.arpa.${lm_suffix} -prune 3e-7 -write-lm 3-gram.arpa.pruned.3e-7.${lm_suffix}

gzip 3-gram.arpa.${lm_suffix}
gzip 3-gram.arpa.pruned.1e-7.${lm_suffix}
gzip 3-gram.arpa.pruned.3e-7.${lm_suffix}
gzip 4-gram.arpa.${lm_suffix}

#rm train.3.count
#rm trian.4.count

mv *arpa*.gz /opt/data/

Dockerfile

默認是Dockerfile爲文件名,但是還是希望能標記好,所以用Dockerfile.Srilm 作爲文件名。
原始的install_srilm.sh 在最後會提示source 一下env.sh以配置環境變量。但是這個操作如果放在Dockerfile裏是不會對image產生影響的。所以最後用的是ENV FOO=FOO1這樣的方法進行配置。

FROM debian:9.8
LABEL tagVer="Appen-Srilm-Tool"

#This is the Srilm-1.7.3 language model traing tool image for Appen's ASR training

# fix the bug of apt-get in debian:9.8
#COPY ./badproxy /etc/apt/apt.conf.d/99fixbadproxy

# install tools and packages
RUN apt-get update
RUN apt-get install -y --no-install-recommends g++ gawk make git automake autoconf bzip2 unzip wget sox libtool  \
    python2.7 python3 ca-certificates zlib1g-dev gfortran subversion ffmpeg patch vim

# install tools and packages 
RUN apt-get install -y procps \
    libtool-bin python-pip python-yaml python-simplejson python-gi python-dev build-essential

# install extra tools. clean after installing. Link python2.7 to python, bash to /bin/sh
RUN apt-get clean autoclean && \
    apt-get autoremove -y && \
    rm -rf /var/lib/apt/lists/* && \
    rm /usr/bin/python && \
    ln -s /usr/bin/python2.7 /usr/bin/python && \
    ln -s -f bash /bin/sh


# build srilm
RUN mkdir /opt/srilm
COPY srilm-1.7.3.tar.gz /opt/
COPY install_liblbfgs.sh /opt/
COPY install_srilm.sh /opt/
COPY build_sri_lm.sh /opt/
RUN cd /opt/ && \
    bash ./install_liblbfgs.sh && \
    bash ./install_srilm.sh
ENV LIBLBFGS=/opt/liblbfgs-1.10
ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-}:${LIBLBFGS}/lib/.libs
ENV SRILM=/opt/srilm
ENV PATH=${PATH}:${SRILM}/bin:${SRILM}/bin/i686-m64

RUN chmod -R 777 /opt/

WORKDIR /opt

Build

docker build -f Dockerfile.Srilm -t srilm:latest ./

最後顯示:

Successfully built 068133e78c2e
Successfully tagged srilm:latest

查看剛build的image

docker images

顯示

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
srilm               latest              068133e78c2e        10 minutes ago      893MB

試一下docker run

試運行一下,運行完container即關閉

docker run -it srilm:latest /bin/bash

如果希望保持運行在後臺:

docker run -dit srilm:latest /bin/bash

需要訪問後臺運行的container的話,先找到container ID:

docker ps

顯示

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3448cf685b08        srilm:latest        "/bin/bash"         6 seconds ago       Up 5 seconds                            cranky_curran

然後執行:

docker exec -it 3448cf685b08 /bin/bash

即可進入container。

掛載本地文件夾

訓練工具配置完了如果還是需要進入container才能訓練的話會讓這個過程有點複雜,所以決定還是掛載本地文件夾到container上運行。

docker run -v /Users/czhang/images/local_data:/opt/data -dit srilm:latest /bin/bash

注意本地文件夾一定要用絕對路徑。

試一下:在container裏對/opt/data寫一個文件,退出以後在本地的文件夾/Users/czhang/images/local_data裏能查看到那個文件。

docker run執行訓練腳本

docker run -v /Users/czhang/images/local_data:/opt/data -dit srilm:latest /bin/bash build_sri_lm.sh data/corpus.txt testlm

直接運行即可

docker exec 進入container 執行訓練腳本

docker ps查看正在運行的container。

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS               NAMES
7e629e509555        srilm:latest        "/bin/bash"              6 seconds ago        Up 5 seconds                                    epic_cartwright

然後用docker exec進入

docker exec -it 7e629e509555 /bin/bash

然後執行訓練腳本即可

./build_sri_lm.sh data/corpus.txt test2

有用小工具

  • List all containers (only IDs):
docker ps -aq
  • Stop all running containers:
docker stop $(docker ps -aq)
  • Remove all containers:
docker rm $(docker ps -aq)
  • Remove all images:
docker rmi $(docker images -q)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章