การใช้ Docker ในงาน text annotation

Wirote Aroonmanakun
5 min readAug 7, 2022

--

บทความนี้จะกล่าวถึงการใช้ Docker กับโปรแกรมที่ช่วยในการกำกับข้อมูลตัวบทหรือการทำ text annotation สามโปรแกรม คือ Doccano, Brat rapid annotation tool และ ConlluEditor

ทำไมควรใช้ Docker

ก่อนจะพูดถึงโปรแกรมทั้งสองตัวนี้ เราต้องเข้าใจก่อนว่า Docker คืออะไร [1]. Docker เป็น platform ที่ใช้สำหรับพัฒนางานด้านต่าง ๆ คล้ายกับ virtual machine หรือ VM. VM ทำให้เราใช้งาน OS ต่าง ๆ ได้โดยการจำลองเครื่องใหม่ขึ้นมา เช่น การใช้ UTM, parallel desktop หรือ VMware บน OSX ทำให้เราสามารถสร้าง VM ของ Linux หรือ Windows ได้แบบเป็นอิสระจาก OSX และทำงานบนเครื่องเดียวกัน. Docker ต่างจาก VM เพราะไม่ได้จำลองเครื่องขึ้นมาทั้งหมดแต่ยังคงใช้ host machine เป็นหลักในการทำงาน จึงไม่เปลืองทรัพยากรมากเท่า VM. เพียงแต่โปรแกรมงานทั้งหลายและ library ต่างๆ ที่จำเป็นต้องใช้รวมถึงการ set up ค่าต่างๆ ที่ใช้จะถูกรวมห่อไว้ด้วยกัน ทำให้หมดปัญหาในการพัฒนางาน ที่มักพบว่าแต่ละเครื่องติดตั้งโปรแกรมและ library คนละรุ่นทำให้ใช้งานไม่ได้.

ตัวอย่างที่ประสบเองคือการใช้ Brat rapid annotation ซึ่งหลังจากติดตั้งใช้งานได้บน OSX แล้ว วันดีคืนดีก็เกิดใช้งานไม่ได้ โดยไม่รู้ว่ามีไฟล์อะไรเสียหรือระบบมีการปรับปรุงไฟล์อะไรซึ่งกระทบการทำงานของ Brat. ทางออกหนึ่งคือเปลี่ยนมาใช้ Brat ที่มีคนสร้าง image ไว้แล้วแทนการติดตั้งใหม่หรือแก้ปัญหาระบบ

ความรู้พื้นฐานเกี่ยวกับ Docker

การใช้งาน Docker เราต้องเข้าใจเรื่อง Image, Container, และ Volume. Image เป็นเหมือนพิมพ์เขียวของ application หรือตัวทำงานที่ใช้ว่าประกอบด้วยโปรแกรมต่าง ๆ อะไรบ้าง เป็นรุ่นหรือ version ไหน. Image ของตัวทำงานจะเผยแพร่ผ่าน Docker hub ที่ให้คนมาเรียกใช้ได้. Container เป็นสิ่งที่สร้างจาก image เป็นตัวทำงานที่เกิดขึ้นจริง สามารถสร้างและลบทิ้งเมื่อต้องการใช้หรือเลิกใช้ได้. Container เป็นเหมือนโปรแกรมทำงานจริง ทำให้งานที่มีนักพัฒนาหลายคนสามารถทำงานบน platform เดียวกันได้. ส่วน volume เป็นเหมือนที่เก็บข้อมูลที่ต้องการให้เป็นอิสระจาก container. ไม่สูญหายไปเมื่อมีการลบ container ทิ้ง. การใช้ volume ในแต่ละ container จึงต้องมีการ bind volume ที่ต้องการใช้.

Doccano

Doccano [2] เป็นโปรแกรมสำหรับช่วยทำ text annotation เผยแพร่ในรูป docker image การใช้งานจึงต้องติดตั้ง Docker บนเครื่องเสียก่อน ให้ไปที่ https://www.docker.com/products/docker-desktop/ แล้วเลือกติดตั้ง Docker Desktop สำหรับเครื่องตัวเอง. แล้วเรียกโปรแกรม Docker desktop จากนั้น run คำสั่งนี้ใน terminal

$ docker pull doccano/doccano
$ docker container create --name doccano \
-e "ADMIN_USERNAME=admin" \
-e "ADMIN_EMAIL=admin@example.com" \
-e "ADMIN_PASSWORD=password" \
-v doccano-db:/data \
-p 8000:8000 doccano/doccano

docker pull คือการดึง image มาใช้ ในที่นี้สั่งให้ดึง image ของ doccano. คำสั่งถัดมาเป็นการสร้าง container ที่ใช้ port 8000 ข้อมูลที่ใช้เก็บใน volume doccano-db. มี username/password ตามที่ระบุ. ในการทำงาน ถ้าไปดูที่ Docker desptop เราจะเห็นทั้ง image ที่ถูกดึงมาไว้ container ชื่อ doccano ที่ถูกสร้าง และ volume doccano-db ที่สร้างขึ้น. ให้กด start แล้วเรียก web browse จาก container นั้น จะได้หน้าจอนี้ ให้ login โดยใช้ username, password ตามที่ตั้งในคำสั่งข้างบน

เมื่อ login ได้แล้ว จะเข้าไปใช้งานได้ ให้เลือก Create project แล้วเลือกประเภทงานที่มีให้เลือก. Doccano สามารถใช้กำกับข้อมูลงานได้หลายอย่างทั้งที่เป็นข้อความหรือรูปภาพ. งาน text annotation ที่ทำได้มีสามประเภทเบื้องต้น คือ text classification เป็นการกำกับทั้งตัวบทว่าเป็นประเภทไหน เช่น งาน sentiment analysis, sequence labeling เป็นการกำกับส่วนของข้อความว่าเป็นอะไร เช่น งานกำกับ named entity recognition, sequence to sequence เป็นการกำกับข้อความที่สามารถ map เข้าด้วยกันได้ เช่น การแปลภาษา

หลังจากสร้าง project แล้ว ขั้นต่อไปเป็นการ import data ซึ่งมีให้เลือกหลายรูปแบบ เช่น TextFile, TextLine, CSV, json, etc. ให้ไปที่ Dataset แล้ว import ข้อมูลที่ต้องการ จากนั้นสร้าง label ที่ต้องการใช้ในการกำกับข้อมูล แล้วเริ่มกำกับข้อมูลนั้น เมื่อกำกับข้อมูลเสร็จแล้ว จึงไปที่ dataset แล้ว export data ที่กำกับไว้แล้วออกมาใช้ได้

Brat rapid annotation

Brat rapid annotation tool [2] เป็นโปรแกรมช่วยกำกับข้อมูลแบบ sequence labeling ได้และยังกำกับความสัมพันธ์ระหว่าง label ได้ ทำให้ใช้กำกับข้อมูลวากยสัมพันธ์ที่เป็น dependency tree ได้ แต่ Brat เป็นโปรแกรมเก่า ไม่มีการปรับปรุงพัฒนามาตั้งแต่ปี 2012 ทำงานด้วยโปรแกรม Python2 ในเว็บจะมีคำอธิบายการติดตั้งโปรแกรม แต่ในที่นี้จะใช้ docker image ที่มีคนทำไว้ ทำให้ไม่ต้องยุ่งกับการติดตั้งโปรแกรมเอง

หลังจากติดตั้ง Docker desktop แล้วเรียกโปรแกรมนี้ขึ้นมาแล้ว ให้ไปที่ terminal แล้วใช้คำสั่งนี้เพื่อดึง image “cassj/brat” มาใช้งาน

$ docker pull cassj/brat

เมื่อได้ image มาแล้ว ให้สร้าง volume หรือที่เก็บข้อมูลกับ config ไฟล์ ขื่อ brat-data กับ brat-cfg. volume ที่สร้างจะเป็นที่เก็บข้อมูลกลางที่ container ต่างๆ สามารถเห็นและใช้ได้และไม่ถูกลบไปเมื่อ container ถูกลบทิ้ง กล่าวคือ volume จะเป็นอิสระจาก container ส่วน container คือตัวทำงานที่ถูกสร้างขึ้นจาก image ที่เลือก

$ docker volume create --name brat-data
$ docker volume create --name brat-cfg

หลังจากนั้นต้องนำข้อมูลเข้าไปในใส่ใน volume ที่สร้างขึ้น แต่เราไม่สามารถ copy ไฟล์โดยตรงเข้าไปได้ เพราะทั้ง container และ volume อยู่ใน virtual machine จึงต้องดึงข้อมูลเข้ามาใน virtual machine ก่อน ในที่นี้ สมมติเรามี folder DATA ที่ tar และ zip ไว้เก็บใน web server www.example.com ให้ใช้คำสั่งต่อไปนี้

$ docker run --name=brat-tmp -it -v brat-data:/bratdata cassj/brat /bin/bash
$ cd /bratdata
$ wget http://www.example.com/DATA.tgz
$ tar -xvzf DATA.tgz
$ exit
$ docker rm brat-tmp

option — name คือให้สร้าง container ชื่อ brat-tmp แบบ interactive (-it). โดยใช้ volume ชื่อ brat-data กับ brat-cfg ให้อยู่ที่ /bratdata กับ /bratcfg ใน container นั้น แล้วเรียกใช้ bash
จากนั้นก็เปลี่ยน folder ไปที่ /bratdata ใช้ wget เพื่อโหลดข้อมูลไฟล์ tgz จาก web ที่ระบุ แล้วมากระจาย zip ออกมา ข้อมูลก็จะเก็บใน volume brat-data นี้ จากนั้น exit เพื่อออกจาก bash แล้ว remove brat-tmp ข้อมูลใน DATA.tgz นอกจากตัวข้อมูลไฟล์ .ann .txt ที่ใช้สำหรับ Brat แล้วให้แนบไฟล์ annotation.conf ซึ่งเป็นตัวบอก label ต่างๆที่ใช้ในการกำกับข้อมูลไปด้วย

$ docker run --name=brat-tmp -it -v brat-cfg:/bratcfg cassj/brat /bin/bash
$ cd /bratcfg
$ wget http://www.example.com/users.json
$ exit
$ docker rm brat-tmp

ในส่วน volume ของ brat-cfg ให้โหลดไฟล์ users.json เข้ามา ซึ่งใช้เฉพาะสำหรับ Brat Docker ตัวนี้เท่านั้น users.json เป็นไฟล์ json ที่มีข้อมูล user name กับ password ตามตัวอย่างข้างล่าง user/password นี้ใช้เพื่อ login เข้า Brat แก้ไขทำ annotation ได้
{
“user1”: “password1”,
“user2”: “password2”
}

จากนั้น run image นี้โดยใช้คำสั่งตามนี้

$ docker run --name=brat2 -d -p 80:80 -v brat-data:/bratdata -v brat-cfg:/bratcfg -e BRAT_USERNAME=admin -e BRAT_PASSWORD=password -e BRAT_EMAIL=brat@example.com cassj/brat

คำสั่งนี้เป็นคำสั่งให้สร้าง container ชื่อ brat2, ใช้ port 80, ใช้ volume brat-data และ brat-cfg. เมื่อเข้าไปดูใน Docker Desktop จะเห็นว่า container ตัวนี้มีปุ่มให้กดเข้า web ได้ ให้กดปุ่มนั้นเพื่อเข้าใช้งาน Brat rapid annotation

เมื่อเข้า web แล้ว ให้ login ตาม username/password ที่ระบุใน users.json จากนั้นเปิดข้อมูลที่เตรียมไว้ และเริ่มกำกับข้อมูลได้ ตัวอย่างข้างล่างเป็นการกำกับ dependency tree จากกรอบการวิเคราะห์ภาษาไทยด้วย universal dependency version 2 [4] (ข้อมูลการกำกับว่ามี POS tag และ relation อะไรบ้างกำหนดไว้ในไฟล์ annotation.conf ซึ่งเก็บไว้ใน folder เดียวกับข้อมูลที่ใช้ รายละเอียดการสร้างไฟล์ annotation.conf ดูได้จากเว็บ Brat)

ConlluEditor

ConlluEditor [5] เป็นเครื่องมือสำหรับ edit ข้อมูล dependency tree ตามแบบของโครงการ universal dependency ที่เก็บใน format Conllu. เครื่องมือเขียนด้วยภาษา Java และทำงานบน Java server ในที่นี้เราจะใช้ Docker image ที่มีคนสร้างไว้ เริ่มด้วยการ pull image มาใช้

$ docker pull jheinecke/conllueditor:latest

จากนั้น สั่งสร้าง container ตามคำสั่งข้างล่าง conllueditor คือชื่อ container ที่สร้าง — user ตามด้วย uid และ gid ให้ใช้คำสั่ง id เพื่อหาเลขนี้แล้วแทนที่ 1000 ตัวแรกด้วย uid, 1000 ตัวหลังด้วย gid (คำสั่ง id ใช้ได้ใน Linux, OSX) ส่วน </absolute/path/to/datadir> คือ path จริงในเครื่องที่เก็บข้อมูลไฟล์ conllu, ให้แทนที่ </absolute/path/to/datadir> ด้วย path จริง เช่น /Users/awirote/Dropbox/prog/maltparser-1.9.2 และแทนที่ <yourfile>.conllu ด้วยชื่อไฟล์ที่ต้องการแก้ไข เช่น test.conllu ส่วน option -d บอกให้ run โปรแกรมใน background และไม่แสดงข้อความอะไร ถ้าหากว่ามีปัญหา run container ไม่ได้ ให้เอา -d ออก จะเห็น error message ว่าปัญหาคืออะไร ส่วนใหญ่จะเป็นปัญหาในไฟล์ข้อมูล conllu นั้น ให้แก้ไขไฟล์ให้ถูกแล้ว run ใหม่

docker run --rm -t -d \
--name conllueditor -p 8888:5555 \
--user 1000:1000 \
-v </absolute/path/to/datadir>:/data \
--env filename=<yourfile>.conllu \
jheinecke/conllueditor:latest

เมื่อสร้าง container แล้วให้ไปที่ Docker desktop กดเรียก browser ขึ้นมา จะเห็นหน้าตา editor ตามนี้ สามารถดูแก้ไขข้อมูลที่กำกับไว้ได้

container ตัวนี้โยงข้อมูลด้วยการเชื่อมตรง (bind). ไม่ได้สร้าง volume แบบใน Brat เมื่อเลิกใช้ข้อมูลสำหรับ container ก็จะหายไปด้วย แต่เราเข้าไปดูข้อมูลที่แก้ไขใน absolute path ในเครื่องเราได้. เมื่อหยุดใช้ container ตัว container ที่สร้างนี้ก็จะหายไปด้วย เมื่อต้องการแก้ไขข้อมูลไฟล์ใหม่ ก็ให้เริ่มต้นสร้าง container แบบเดิม

สรุป

ตัวอย่างการใช้ Doccano, Brat rapid annotation และ ConlluEditor นี้เป็นตัวอย่างที่ทำให้เราเห็นประโยชน์และความสะดวกในการใช้งานโปรแกรมที่ไม่ต้องมากังวลเรื่องการติดตั้งโปรแกรมพื้นฐานและองค์ประกอบต่าง ๆ ให้ตรงกับที่โปรแกรมต้องการ เพราะทั้งหมดถูกรวมไว้ใน image ที่สร้างขึ้น เราสามารถเรียกใช้ image นั้นได้เลย

หากเรามี application ที่พัฒนาขึ้นมาเอง เราก็สามารถสร้าง image ของ application นั้นใน Docker platform ได้ ด้วยการกำหนดโปรแกรมพื้นฐานและองค์ประกอบต่าง ๆ ที่ต้องการไว้ใน dockerfile แล้วสั่ง build หรือสร้าง image เพื่อให้คนอื่น ๆ นำ image ไปใช้ได้เลย วิธีการนี้สามารถแก้ปัญหาการติดตั้งโปรแกรมใน setting ของเครื่องที่ต่างกันได้ เพราะสามารถกำหนดให้ใช้ php และ mysql ของ version ที่กำหนดได้ไม่ขึ้นกับเครื่องที่ใช้จริง ซึ่งถ้ามีโอกาสก็จะนำมาเล่าต่อไป

อ้างอิง

[1] https://www.docker.com/

[2] https://github.com/doccano/doccano

[3] https://brat.nlplab.org/

[4] http://www.arts.chula.ac.th/~ling/contents/File/UD%20Annotation%20for%20Thai.pdf

[5] https://github.com/Orange-OpenSource/conllueditor

--

--