2013-01-02 27 views
5

Gelişmekte olduğum bir web uygulamasına (Piramit üzerinde çalışan) özel bir tagger eklemek istiyorum. Yerel makinemde NLTK kullanarak çalışıyorum. Ama NLTK'nin üretim için nispeten yavaş olduğunu okudum.NLTK bir üretim web uygulamasında

Tetikleyiciyi depolamanın standart yolu, Pickle it'in olduğu gibi görünüyor. Makinemde 11.7MB pikle dosyasını yüklemek birkaç saniye sürüyor.

  1. NLTK, üretim için bile pratik mi? scikit-learn'a mı bakmalıyım yoksa Mahout gibi bir şey mi olmalıyım?

  2. NLTK yeterince iyi ise, bellek, vb. Düzgün şekilde kullanıldığından emin olmanın en iyi yolu nedir? başlangıç ​​gecikmeyi azaltmak için

+1

İlk önce Python 2 kullanıyor musunuz? Eğer öyleyse, 'pickle' veya' cPickle' kullanıyor musunuz? CPickle'a (veya iki uygulamanın tek bir modülde birleştirildiği Python 3'e) birkaç saniye içinde birkaç düzine freze dönüştürebilirsiniz. Alternatif olarak, tüm isteklerde aynı tagger'ı kullanmanız gerekiyorsa, her istek için neden yüklersiniz? Bir kere yükleyin (veya işlem başına bir kere veya Piramit'i bilmiyorum) ve sonra ne kadar süreceği önemli değil. – abarnert

+2

Yukarıdaki kanıtlar için şunu deneyin: 'p = cPickle.dumps (aralık (1250000)); print timeit.timeit (lambda: pickle.loads (s), sayı = 1); print timeit.timeit (lambda: cPickle.loads (s), sayı = 1) '. Sistemimde 4.96 vs 0.35s aldım. – abarnert

+0

Python 2 ve normal turney kullanıyorum. CPickle'a bir bakacağım. Evet, dosyayı yüklemenin en iyi yolundan tamamen emin değildim. Pyramid – abroekhof

cevap

5

text-processing ve onun ilişkili NLP APIs'u çalıştırıyorum ve bir Django uygulaması (nginx'in arkasında silah) tarafından yüklenen yaklaşık 2 düzine farklı turşu modeli kullanıyor. Modeller ihtiyaç duyulduklarında yüklenir ve bir kez yüklendikten sonra bellekte kalırlar. Yani, gun-parola sunucusunu yeniden başlattığımda, bir modele ihtiyaç duyan ilk talepler, yüklenmesi için birkaç saniye beklemek zorundadır, ancak sonraki her talep, RAM'de önbelleğe alınan modeli kullanmaya başlar. Yeniden başlatmalar yalnızca, genellikle modellerin güncellenmesini içeren yeni özellikler dağıttığımda olur, dolayısıyla onları yeniden yüklemem gerekir. Bu nedenle, kod değişikliklerini çok sık yapmak istemiyorsanız ve tutarlı istek süreleriyle ilgili güçlü gereksinimleriniz yoksa muhtemelen ayrı bir desteğe ihtiyacınız yoktur.

İlk yükleme süresinden başka, ana sınırlama faktörü bellektir. Şu anda sadece 1 işçi işlemim var, çünkü tüm modeller belleğe yüklendiğinde, tek bir işlem 1GB'a kadar çıkabilir (YMMV ve tek bir 11MB pikle dosyası için bellek gereksinimleriniz çok daha düşük olacaktır). Halihazırda yüklenmiş olan bir model ile bireysel bir talebi işlemek, hızlı bir şekilde (genellikle < 50ms), şu anda 1'den fazla çalışana ihtiyacım yok ve eğer yapsaydım, en basit çözüm daha fazla çalışan işlemi çalıştırmak için yeterli RAM eklemektir.

Bellek hakkında endişe ediyorsanız, eşdeğer modellerin NLTK'den önemli ölçüde daha az bellek kullanabildiğinden, scikit-öğrenmesine bakın. Ancak, mutlaka daha hızlı veya daha doğru değildirler.

+0

Tam cevap için teşekkür ederim, çok yardımcı oluyor. Modelleri başlatma sırasında belleğe nasıl yükleyeceğime yönlendirebilir misiniz? Googling "Django önbellek", vb. Ama doğru malzemeye baktığımdan emin olmak isterim. – abroekhof

+0

Bazı modüllerimde boş bir dict bildiriyorum ve sonra model gerektiren işlevlerde, modelin dict olup olmadığını kontrol edip, değilse, nltk.data.load dosyasını yüklemek için turşu dosya adıyla kullanıyorum ve dikte bir referansı saklayın. Daha sonra bu fonksiyona yapılacak tüm çağrılar zaten yüklenmiş olan modeli kullanacaktır. Modeli hemen yüklemek istiyorsanız, bunu modül seviyesinde yapabilir ve sadece "mymodel = nltk.data.load ('yol/to/model.pickle')" gibi beyan edebilirsiniz. – Jacob

2

en iyi yolu web uygulaması etiketlemek için metin parçacıkları gönderen bir cini (kalıcı hizmeti) gibi tagger çalıştırmaktır. Bu şekilde tagger'ınız sadece sistem açıldığında ve daemonun yeniden başlatılması gerektiğinde yüklenir.

Yalnızca NLTK'nın ihtiyaçlarınız için yeterince hızlı olup olmadığına karar verebilirsiniz. Tagger yüklendikten sonra, muhtemelen NLTK'nın algılanabilir gecikme olmaksızın çeşitli sayfa sayfalarını etiketleyebileceğini fark ettiniz. Ancak kaynak tüketimi ve eşzamanlı kullanıcıların sayısı işleri zorlaştırabilir.

+0

Evet, NLTK etiketleme hızı yüklendikten sonra yeterli görünüyor, bu yüzden birden fazla kullanıcı ile ne olacağı sorusu olacak. Daemonlar benim için tamamen yeni bir alan. Bu, Twisted veya Pyro ve bir kuyruk sistemi gibi bir şeyi kullanmayı gerektirir mi? – abroekhof

+0

İşletim sisteminize, beklenen cuncurrency düzeyine, CPU sayısına ("işçiler" havuzuna sahip olabilirsiniz) vb. Bağlı olarak sayısız seçenek vardır. Jacob'un yanıtı olası bir kurulumu açıklar. – alexis