Docker入門實例:創建SRILM訓練環境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)