Back to site

Размеркаваныя NLTK з execnet

Размеркаваныя NLTK з execnet

Хочаце, каб паскорыць апрацоўку натуральнага мовы з NLTK? Ёсць шмат файлаў для апрацоўкі, але не ведаеце, як распаўсюджваць NLTK ў многіх ядраў?

Ну, вось, як вы можаце выкарыстоўваць execnet зрабіць размеркаванай часткі з прамовы паметкі з NLTK.

execnet

execnet гэта простая бібліятэка для стварэння сеткі шлюзаў і каналаў, якія можна выкарыстоўваць для размеркаваных вылічэнняў у Python. З яго дапамогай вы можаце пачаць Python ракету над SSH, адпраўце код і / ці дадзеныя, то атрымаеце вынікі. Ніжэй прыведзены 2 скрыпту, якія правераць дакладнасць рэкамендаваў частка NLTK аб прамовы Tagger супраць кожнага файла ў карычневы корпус. Першы сцэнар (бягун) робіць усе налады і атрымлівае вынікі, у той час як другі сцэнар (аддалены модуль) працуе на кожны шлюз, разліку і адпраўка дакладнасць кожнага файла ён атрымлівае для апрацоўкі.

Бягун

Бягун выконвае наступныя дзеянні:

  1. Вызначае хастоў і колькасць шлюзаў. Я рэкамендую 1 шлюз на кожнае ядро ​​на хост.
  2. Нагрузкі і саленні NLTK частка змаўчанні словы Tagger.
  3. Адкрывае кожны шлюз і стварае аддалены канал выканання з tag_files модуль (модуль аддаленага апісана ніжэй).
  4. Адпраўляе марынаваныя Tagger і імя корпус (карычневы) праз канал.
  5. Пасля таго як усе каналы былі створаны і ініцыялізаваны, затым ён пасылае ўсе fileids ў корпус на пераменны каналаў размяркоўваць працу.
  6. Нарэшце, ён стварае чарзе атрымліваць адбіткі і дакладнасць адказу ад кожнага канала.

run_tag_files.py

import execnet
import nltk.tag, nltk.data
import cPickle as pickle
import tag_files

HOSTS = {
	'localhost': 2
}

NICE = 20

channels = []

tagger = pickle.dumps(nltk.data.load(nltk.tag._POS_TAGGER))

for host, count in HOSTS.items():
	print 'opening %d gateways at %s' % (count, host)

	for i in range(count):
		gw = execnet.makegateway('ssh=%s//nice=%d' % (host, NICE))
		channel = gw.remote_exec(tag_files)
		channels.append(channel)
		channel.send(tagger)
		channel.send('brown')

count = 0
chan = 0

for fileid in nltk.corpus.brown.fileids():
	print 'sending %s to channel %d' % (fileid, chan)
	channels[chan].send(fileid)
	count += 1
	# alternate channels
	chan += 1
	if chan >= len(channels): chan = 0

multi = execnet.MultiChannel(channels)
queue = multi.make_receive_queue()

for i in range(count):
	channel, response = queue.get()
	print response

Аддалены модуль

Модуль аддаленага значна прасцей.

  1. Прымае і unpickles Tagger.
  2. Прыняў корпус імя і загружае яго.
  3. Для кожнага fileid атрымаў, ацэньвае дакладнасць Tagger на пазнакай прапановы і накіроўвае дакладнасць адказу.

tag_files.py

import nltk.corpus
import cPickle as pickle

if __name__ == '__channelexec__':
	tagger = pickle.loads(channel.receive())
	corpus_name = channel.receive()
	corpus = getattr(nltk.corpus, corpus_name)

	for fileid in channel:
		accuracy = tagger.evaluate(corpus.tagged_sents(fileids=[fileid]))
		channel.send('%s: %f' % (fileid, accuracy))

Збіраем ўсе разам

Пераканайцеся, што вы NLTK і корпус дадзеных устаноўлены на кожным кампутары. Вы таксама павінны мець беспарольнага SSH доступ да кожнай з прымаюць майстар хаста (машыны запуску run_tag_files.py д.).

run_tag_files.py і tag_files.py толькі павінны быць на майстар сэрвэры; execnet будзе клапаціцца аб распаўсюджванні кода. Мяркуючы, run_tag_files.py і tag_files.py знаходзяцца ў тым жа каталогу, усё што вам трэба зрабіць, гэта запусціць Python run_tag_files.py. Вы павінны атрымаць паведамленне аб адкрыцці шлюзаў варта кучу адпраўляць паведамленні. Тады, толькі чакаць і назіраць, дакладнасць адказаў, каб убачыць, наколькі дакладныя пабудаваны ў часціны мовы Tagger на карычневы корпус.

Калі вы хочаце праверыць дакладнасць іншага складу, пераканайцеся, што кожны хост мае корпус дадзеных, а затым адправіць, што корпус імя замест карычневага, а таксама перадаваць fileids ад новага корпуса.

Калі вы хочаце праверыць свае ўласныя Tagger, марынаваць яго ў файл, а затым загрузіць і адправіць яго, а не ў Tagger NLTK. Ці вы можаце трэніраваць яго на майстар, а затым адправіць яго адзін раз падрыхтоўка завершана.

Размеркаванай апрацоўкі файлаў

На практыцы гэта часта тато каб пераканацца, што кожны хост мае кожны файл, які вы жадаеце апрацаваць, і вы хочаце, каб апрацоўваць файлы за межамі убудаванай карпусоў NLTK's. Мая рэкамендацыя заключаецца ў ўстаноўцы GlusterFS захоўвання дадзеных кластара, каб кожны хост мае агульныя пункту мацавання, якія маюць доступ да кожнага файла, які вы жадаеце апрацаваць. Калі кожны хост мае тую ж кропку мацавання, вы можаце адправіць любы файл, шлях да любой канал для апрацоўкі.

Popular Links
Published (Last edited): Jun 13 , source: http://streamhacker.com/2009/11/29/distributed-nltk-execnet/