Elkeszult az FSF.hu altal tamogatott neuralis halos spamszurom uj verzioja...
uj model: http://thot.banki.hu/deepspam/model_big_v3/
sokkal tobb, tobbszorosen ellenorzott mintabol epitve:
36172 mail.neg
45139 mail.pos
81311 total
uj milter: http://thot.banki.hu/deepspam/milter-v0.3/
vagy online teszteleshez postfix/main.cf-be: smtpd_milters = inet:193.224.38.187:1080
Changelog v0.3:
================
- html parser atirva, jobban kezeli az extrem eseteket
- kodlap kezeles javitasok, pl. hibas utf8...
- tokenizalas modositva, anonimizalja a cimeket (email/url), szamokat
emiatt javasolt az uj model (v3) hasznalata, mert az mar az uj parserrel keszult!
- mar nincs python 2.x support, de ha van ra igeny megnezem majd, viszont foleg a kodlap kezeles tok maskepp megy 3.x alatt...
A'rpi
Hozzászólások
sub
Köszi!
-------------------------
Hivatásos pitiáner
neut @ présház
sub
(hatha meg iden ra tudok nezni:)
---
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....
Off: bocs, a model.png-t mivel rajzoltad?
asszem paint.exe-vel :)))))))
na jo nem. igy:
from keras.utils import plot_model
plot_model(model, to_file='model.png', show_shapes=True)
Csináltam egy konténert a cuccosnak. Megosztom hátha valakinek hasznos. Ha lesz időm csinálok hozzá dockerfile-t is, de most egyelőre tesztelgetem.
Az ellenfél egy agyontanított dspam (még nem találtam jobbat). Első ránézésre partiban van vele, talán jobb is egy kicsit.
Ja, a tesztkörnyezet egy kb. 500 useres postfix egy tizenéves vason. AVX mutatóban sincs ennek ellenére 60ms/step az átlagos idő.
HOST:
docker run -it --name=dstemp debian:stretch
CONTAINER:
apt update
apt install dialog # csak hogy ne anyázzon az apt
apt upgrade # szúrta a szemem az 5 nem frissített csomag
apt install libmilter-dev # ez a pymilter-hez kell, hogy ne kelljen forrásból fordítani
apt install python3-pip
(if CPU AVX capable)
pip3 install tensorflow
(else)
apt install wget
wget https://files.pythonhosted.org/packages/43/aa/fe3e9d0b48db4adde9781658b…
pip3 install ./tensorflow-1.5.0-cp35-cp35m-manylinux1_x86_64.whl
(fi)
pip3 install pymilter html2text keras==2.2.5
# 'ctrl-d' kilépés a konténerből
HOST:
docker commit dstemp deepspam
docker rm -f dstemp
#összerendezgeted a file és könyvtár struktúrát (lásd: v0.2) vagy átírod a deepspam.py-t, aztán belépsz a deepspam.py könyvtárába, majd go:
docker run -it --rm --name=deepspam --hostname=deepspam -v $PWD:/tmp -w /tmp deepspam python3 ./deepspam.py
Összedobtam egy docker image-et.
https://hub.docker.com/r/stivehu/deepspam
Indítás:
docker run -d -p 1080:1080 --rm stivehu/deepspam
A 0.5 verziót is megcsináltam.
Köszi
Mar kb. nincs kifogasom, hogy miert nem hasznalom mar.
Amint publikalom az ios appom ujabb verziojat, nekiallok, becsszo.
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....
Kár, hogy ez nem hír lett, megérdemelte volna :D
majd legkozelebb :) hamarosan jon a v0.4 :)
subs
Ki szerettem volna próbálni, de elakadtam python verzió problémával.
VPS-re telepítettem Debian 10-et. AVX nem támogatott.
Alapból 3.7-es python van, és a tensorflow 1.5 csak 3.6-os verzióig támogatott. Ha jól értelmeztem.
Várjak új verzióra?
Lehet telepíteni 3.6-os pythont debian 10-re? Nem sikerült, de nem értek a pythonhoz.
Mi az ajánlott distro?
ubuntu 16, 18 es centos7-en teszteltem, azokkal nem volt gond (python 3.5/3.6).
csodalkozom a debianon, mindig 5 evvel le vannak maradva, most meg naluk van a legujabb python? vagy ez valami sid/beta verzio? :)
amugy itt azt irjak 3.7-en is megy:
https://www.tensorflow.org/install/pip
A'rpi
Debian 10 stable, és 3.7.3-as verzió van alapból.
De nekem a Tensorflow 1.5-ös verzió kellene az AVX hiánya miatt, és azt nem tudom feltenni.
Megpróbálom megoldani az AVX hiányt, és akkor nem kell a régi verzióval bajlódni.
Egyelőre maradnék a Debian vonalon.
ja az avx miatt... az szivas :) jo regi vas lehet akkor. esetleg forrasbol felrakni?
Tegnap fizettem elő új VPS-re, hogy tudjam tesztelni. Ki is fizettem gyorsan fél évet.
Írtam nekik.
Ahogy nézem az összes többi használt VPS-nél támogatott, csak itt nem.
2011 ota van avx... ha nem olyan regi akkor lehet csak a cpu flag-eket nem jol maszkoltak le a vps-nel. qemu-nal pl. meg lehet adni milyen cpu-t emulaljon...
vagy probald meg masik backend-el, a keras nem csak tensorflow-t tamogat, bar en csak azzal hasznaltam.
memoria lesz eleg? vps-ek nem arrol hiresek...
2 mag 4G ram és qemu. Milyen cpu, ram igényre számítsak?
Próbálta Theanoval, de ott meg Milter-t hiányolt. Ennyire nem értek hozzá, megvárom a szolgáltató válaszát.
Ha sikerül életre kelteni, átengedek rajta pár domaint, és megírom a tapasztalatokat.
hat nalam 16G-vel megy, ugy 10-12gb siman megeszik...
proci inkabb terheles fuggo, de avx nelkul zabalni fogja azt is :(
pymilter az mas tema, az mindenkepp kell, csak lehet most elobb akad fent.
Tapasztalat:
AVX nélkül sem zabálja a procit, szinte észre sem lehet venni átlagosan 1 mail/s terhelésnél. Nagyobb gond a memória használat. A kezdeti 2 Gb körül értékről három hét alatt felkúszott több mint 4Gb-ra. Mivel csak 6 Gb van a gépben le is állítottam. Nézted mikor indítottad a memóriafoglalást? Nem lehet, hogy nálad is 2-ről ment fel 10-12-re? Nem ismerem az egész működését, de szerintem ez memória kezelési hiba lesz.
Egyébként kurva jó cucc. A három hét alatt fals-pozitívot nem találtam. Az angol nyelvű spamekre bőven 95% fölött volt a találat, a magyarokra kb. 80-85%.
Mikor jön a v0.4? Meg akartam csinálni a paraméterezhetőség (meg még egy két dolgot, pl. Subject hozzáadás), de mivel írtad, hogy hamarosan jön, ezért várakozó álláspontra helyezkedtem.
centos-en en is lattam ilyen memleak-elest a regi (0.2) verzional python2-vel. azt hittem valami bug, mert a 0.3+py3.6 ota nem tapasztalom ezt ott, ubuntun pedig regebben sem, vagy legalabbis nem ennyire durvan. amugy a pymilter-re gyanaxom, hogy a megszakadt smtp kapcsolatok beragadhatnak a memoriaban.
kell egy cron ami hetente restartolja es megoldva :)))
v0.4 lehet kimarad (beta fennvan, de az inkabb csak refaktor), mar a 0.5-on dolgozom :)
A'rpi
Az AVX és a 8-16G ram igény miatt újratervezést igényel a teszt. És akkor már megvárjuk az új verziót is.
A cron-os dolgot egyelőre hanyagolom. Mivel nálam konténerben futott egyszerű kicserélni a Debian 9-t valamelyik Ubuntu-ra. Aztán meglátjuk.
amugy az a 80-85% nem tunik realisnak, at tudnad kuldeni azokat a leveleket ami atment rajta? (felteve ha nem 'tooshort' mind, mert nincs benne eleg szoveg)
Pongyola voltam, nem találat volt 80-85%, hanem az elfogott levelek aránya. Ez annak köszönhető, hogy nem egy olyan spam volt amit egymásután 30-40 címre is küldtek. A találat a magyar leveleknél is 95% fölötti.
Nincsenek meg ezek a levelek, de ha újra beizzítom, akkor begyűjtöm és küldöm.
2 meg 4 gigabit? kozben meg 6 GIGABIT van a gepedben! durva!
atirtam a ds_model.py filet a v0.6-ban, probald ki vele, hatha megoldja a memoria zabalast. az ujabb tensorflow es a multithreading fura kapcsolata okozhatta.
A'rpi
Köszi, de nem tudom kipróbálni mert megszűnt a mem zabálás. Bővítve lett a memória és azóta minden ok. Nem értem, de ez van.
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
erdekes :)
keras es/vagy a tensorflow nem frissulhetett kozben? nagyon ugy tunik hogy annak a verziojaval fugg ossze a dolog.
Tényleg érdekes. Most nézem a grafikonokat, a régi felállással 3 hét alatt felzabálta a 6GB memóriát. Most, hogy 16GB van 7 hete 4.5GB körül mocorog. Passz.
Semmi nem frissült, konténerben fut.
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
Nálunk is változó a memória használat. Nem csökkent a levél/spam forgalmatok az utóbbi hetekben?
Annyira atomstabilan dolgozik a háttérben, hogy nem nagyon foglalkozunk vele.
Az utóbbi 3 hétben valamelyest csökkent, kb. 70-80%-ra. Ez nem indokolja a mem zabálás megszűnését.
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
Nálam egyelőre nem akar 2.5 G fölé menni a mem használat.
Nálam a big model betöltésekor több mint 4 Gb memóriát használt ami a betöltés után visszaesett 2,2 Gb-ra. Minimum 6 Gb kell az érdemi kísérletezéshez, de az nagyon szűkös.
Csak feltettem még este egy másik VPS-re. 2 GB körül eszi a memóriát. Mondjuk nagyon kicsi forgalmat irányítottam rá.
64 bites os/cpu?
64 bites os/cpu?
Eszembe jutottak az olcsóbbnál is olcsóbb VPS-t keresek topikok, és ott ráböktem az egyikre, ami támogatja az AVX-et.
https://contabo.com/?show=vps
VPS M SSD
6 mag, 16G ram.
Linux mx1....hu 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64 GNU/Linux
processor : 5
vendor_id : GenuineIntel
cpu family : 6
model : 63
model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
stepping : 2
microcode : 0x1
cpu MHz : 2399.996
cache size : 16384 KB
physical id : 0
siblings : 6
core id : 5
cpu cores : 6
apicid : 5
initial apicid : 5
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ssbd ibrs ibpb fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat umip
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips : 4799.99
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
Elég jó arányba szűri a leveleket, de azért akadnak hibák.
Szívesen visszajelzem ezeket, ha fel tudod használni. Viszont a GDPR miatt, vhogy anonimizálni kellene a leveleket. Esetleg amit a programban használsz erre a célra ki tudod emelni külön scriptbe?
vagy a deepspam.res filebol azokat a sorokat kuldd el ami tevedes, vagy a levelre/folderre kuldd ra a maildedup2.py-t, az mbox/eml filebol megcsinalja.
amugy ezt nem is ugy terveztem hogy csak onmagaban hasznalni, mert nem nez minden parametert a levelben, csak a body szoveget, sokkal inkabb kiegesziti az egyeb modszereket (greylist, header checks, spamassassin, clamav stb). pl. egy kepet vagy csak url-t tartalmazo levellel nem tud mit kezdeni, akkor sem ha az url vagy az ip rajta van 10 blacklisten mar.
en ugy latom (sok helyen hasznalom mar), hogy pont azokat fogja meg eleg jo hatekonysaggal, ami a spamassassin/clamav-on atcsuszik, mert amugy artalmatlan levelnek tunik (pl. feltort valid accounttal kuldik, ami nincs blacklisten, es betart minden smtp protokollt), de a szovege gyanus. elsosorban a phishing leveleket.
A'rpi
rspamd van utána, amivel súlyozva van.
Igen, pl az ömlik a spam topikok problémáját teljesen megoldja, amit a legtöbb szűrő átenged.
Jelentkezem majd. Valahol :)
Nem is olyan egyszerű visszakeresni.
Saját fiókban ezt a kettőt látom most. Ilyen formában jó lesz?
Mindkettőben kevés a szöveg. Gondolom ez nehezít a dolgon.
Github értesítő:
99%:fwiw i just tried sbtprojectmatrix and hit on sbt sbtprojectmatrix ## . our build is structured like this mtagsinterfaces pure java mtags crossversion . full # . ## . ## # . ## . ## # . ## . # . depends on mtagsinterfaces you are receiving this because you are subscribed to this thread . reply to this email directly view it on github or unsubscribe .
Twitter értesítő:
100%:twitter httpurl ## aktualis ertesitesed van a twitteren nezd meg httpurl sugo httpurl beallitasok httpurl leiratkozas httpurl ; cn mtewote # mtqwomfjdgl # axr # x # rpz # vzdf ## axrox # hlywrsaw # lx # noyw # nzq # d # d sig ## eee # ebf ## df #### db ########## a # d # c # c ### c iid ### e # f ######### bbd # c # b #### e # e # e # uid ######## nid ### ## usbid ## elkuldtuk emailaddressalonak . leiratkozas httpurl ; cn mtewote # mtqwomfjdgl # axr # x # rpz # vzdf ## axrox # hlywrsaw # lx # noyw # nzq # d # d sig ## eee # ebf ## df #### db ########## a # d # c # c ### c iid ### e # f ######### bbd # c # b #### e # e # e # uid ######## nid ### ## usbid ## twitter inc . #### market street suite ### san francisco ca #####
hat, ez alapjan en is spamnak mondanam oket :) foleg a 2. eleg erdekes a sok ertelmetlen karakterekkel...
de az elso is eleg erdekesen nez igy ki...
amugy a maildedup2-vel elo tudod ujra allitani barmilyen emailbol vagy unix mailboxbol, sot az meg a duplikaciokat is kiszedi, az egyszerubb mint a logbol megtalalni :)
Gyakorlatilag a levél nagy része a két nagyon hosszú hivatkozás. De ettől még ezek hasznos értesítő levelek.
Sajnos nem mentettem ki rögtön, de ma volt két google levél (talán analitika értesítések), egy számla értesítő és egy KSH adatszolgáltatás levél, amit spamnek jelölt, na és észrevettem.
Megoldottam, hogy aránylag könnyen le tudjam szűrni az utolsó pár ezer levelet. Privátba fogok néha küldeni, ha hasznos lesz.
Most csak a ham/spam jelöléseket nézem. Ez alapján 1% alatt lehet a hiba.
Amit most írok azt inkább segítő szándékkal írnám.
Jó, és nagyon tetszik, amit csinálsz!
A dokumentáció lehetne beszédesebb. Kezdőknek, akik életükben nem csináltak ilyet nem evidensek a telepítés lépései.A telepítési leírásnál azt mondod,hogy elég letölteni a deepspam.py file-t, de utána meg ott van, hogy kell a milter.eml fájl is.
Ha kaphatnék egy részletesebb (step-by-step) telepítési guide-ot szívesen csinálnék belőle egy Dockerfile-t, amit visszaosztanék a közösségnek. Jó lenne a kódot valahonnan egyszerűbben letölthetővé tenni, például GIT és a releaseket tar.gz-ben le lehetne tölteni stb.
Rövid riport, hátha érdekel valakit:
Nálam a 0.3 külön virtuál gépben futtatva ( 4 cpu mag, 8GB ram ) gond nélkül feldolgoz átlagban napi 20 ezer levelet. Vélhetően sokkal többet is tud, mert volt egy kiugró 32 ezres nap, és ott sem esett kétségbe.
Valakinek gyűlt még tapasztalat ?
A'rpi, ezúton is köszönet a munkádért !
hat ha modern (nem 8+ eves) cpu-d van (vagy van cuda-s gpu) akkor azert ez gyorsabb akar a spamassassin akar a clamav ellenorzesenel, es azok is siman visznek nalam 50k+ napi levelet. altalaban 30-70ms 1 level feldolgozasa, amivel kb 1000 levelet tud percenkent (de legkozelebb lemerem amikor ilyen sok 100 ezres mailboxokat tesztelek vele offline, de az is max 1-2 ora volt).
a 0.5 kicsit csuszik mert mindig amikor azt hiszem mar minden OK a teszteknel talalok valamit (a tokenizalot ill. html parsert reszelem meg mindig) ami miatt belenyulok es kezdhetem elolrol a tesztelest... de karacsonyra megkapjatok :)
kozben keszul az uj word2vec is, 36GB(!) magyar szovegbol (a hu wikipedia 600 mega csak...) es kb ugyanennyi angol minta, plusz valamennyi nemet, olasz, francia, spanyol is kerul bele, mert foleg a nemet leveleknel sok tevedest lattam.
A'rpi
Egy kicsit offtopik, de hatha tudtok segiteni. Kicsit elmeleti.
Nalunk olyan 3-400spam/usert kapunk naponta.
Olyat szeretnek, hogy 99.99999%-os pontosaggal eldobnam a spamek biztos reszet, ugy, hogy a usert el se eri, a spam mappajat sem.
Es utana szurnem a maradek 10-20spamet/user/nap.
Probaltam mindenfelet, de pl. a levelek ellenorzesenel (dkim+spf) inkabb a ham kuldok buknak meg (pl. *.gov.hu, van amikor dns bejegyzes sincs!).
Nektek mi a strategiatok?
A szomoru valosag az, hogy olyan 300spamenkent egy ham is becsuszik, igy a userek atnyalazzak minden nap a spam mappat is. Ami rettento idopazarlo.
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....
Egy ilyennek mindenki örülne :)
A DeepSpam nagyon sok spamet megjelöl, csak még sok számlalevelet, hivatalos értesítőt is. Mindenképpen érdemes vele súlyozni a leveleket, és egyértelműbben el tudod dobni ami sok pontot kap.
a kulonbozo modszerek/algoritmusok mas-mas tipusu spammekre hatekonyak. ezert kell sokfelet kombinalni.
a deepspam-nal elsosorban a phishing szurese volt a cel, a tanitashoz hasznalt mintaknal is erre koncentraltam. ebben messze jobb is mint barmi mas. persze ez is tevedhet, de azt lehet ellensulyozni massal (pl. bayes) vagy whitelistelni.
persze az ellensuly forditva is elsulhet: ez pl. ma jott: "Levél: Az Ön akcióban való részvétele ügyében" es 4.7 ponttal epp meguszta, pedig a deepspam adott ra 99%-ot, de whitelistelt ip-rol jott dkim-el spf-el stb.
A'rpi
Teljesen elégedett vagyok vele, már az egész levelezést átengedjük rajta. Csak azért írtam a problémákról, hogy magában nem oldja meg a 300-400 spam 100%-os kiszűrését.
ilyet szeretne mindenki nyilvan :)
sulyozni kell, en spamassassin-al fogom ossze a kulonbozo algoritmusokat (dnsbl, deepspam, dcc, clamav, sa-rules, bayes stb) es az osszpontszam alapjan vagy csak megjelolom (ez megy a spam mappaba) vagy ha eler egy erteket (12-15 pont korul) akkor megy a levesbe (karanten a szerveren, az user nem latja). igy a spammek nagy resze a levesben vegzi, ahol kicsit bizonytalan az algoritmus az megy csak a spam mappaba, ami igy nem sok, max par db/nap amit kibir az user.
spf/dkim csak arra kell hogy a gmail fogadja a leveleidet, mert amugy tenyleg a spammerek hasznaljak foleg, nem a ham-ek.
Azért az spf/dkim a fehérlistához is nagy segítség, hogy ne csak a from értéke legyen ellenőrizve, amit sokszor hamisítanak a spamerek is. Más negatív súlyokat kaphat, ha rendben van az spf/dkim is.
Nalam ragjak a fulemet, hogy menjunk at vallalati gmail ala, mert akkor nem lesz spam abszolut.
De sztem gmail alatt is csak annyi lenne, hogy a spam mappa fullon lenne allandoan, es nem napi 1-3 hammal hanem havi 1-2vel.
De lehet, hogy atmigralom magunkat, de meg ezeket a koroket amit irtatok elotte lefutom, hogy majd tudjak visszamigralni...:)
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....
Nem lesz tele a spam mappa, mert amit egyértelműen spamnek minősít a gmail, azt nem kézbesíti.
Ha napi 1-3 ham a spamben köt ki, akkor megértem ha váltani akarnak.
felraktam a v0.5 betajat:
http://thot.banki.hu/deepspam/milter-v0.5-dev/
changelog:
- sajat html parser (nem dependel tobbet a html2text-re)
- sajat xml es html entity dekoder (kiderult hogy python3-ban bugzik a gyari)
- a txt2tok tool es az eml2token mar megy python2-vel is, es pypy-vel is. lehet, hogy a tobbi is, de azt meg nem teszteltem :)
keszul az uj word2vec is, kb 90 giganyi szovegbol! ha meglesz, es jo lesz, akkor azzal tanitok egy uj modelt is.
Ezt lehet futtatni az előző verzióval párhuzamosa? Összeakadhat valami? Az 1080-as portot látom a kódban.
miert ne lehetne? a port nyilvan legyen mas, meg legyen eleg ram :)
de amugy mi ertelme parhuzamosan futtatni?
Tesztelés céljából.
Működik szépen.
Ez még működik ?
Mert ez van a logban :
igen, csak tegnap ideiglenesen lelottem mert kellett minden szabad memoria, de most elinidtottam ujbol.
Köszi !
felraktam egy uj modelt:
http://thot.banki.hu/deepspam/model_big_v4/
- uj word2vec-re epul, amit novemberben szamolt kb 1 honapig a gep. ebben sokkal tobb a szoveg (magyar is!) a korabbinal, es mas nyelvek is belekerultek kisebb mertekben (de,fr,it,es)
- mivel az uj w2v sokkal jobb minosegu lett, le lehetett csokkenteni a model meretet kb a felere, igy is hozza ugyanazokat a szamokat :) -> kevesebb RAM kell.
- ez meg a szeptemberi spam/ham datasetre (v3) epul, de abbol is keszul az uj, csak meg nem volt idom befejezni, talan majd az unnepek alatt / januar...
- keszult egy meg ujabb word2vec is decemberben ~90GB szovegbol es mas parameterekkel (cbow modszerrel skipgram helyett, es kisebb dimenzioval) de sajnos ez 1%-al rosszabb lett, igy ez ment a kukaba. ujraszamoltatom sg-vel de az megint 1 honap lesz, vagy inkabb 2... :) (eredetileg ezt akartam az uj modelhez hasznalni, de igy elovettem az elozo sg-s verziot)
fennvan a v5-os model is, ez mar a kibovitett spam/ham mintakbol lett epitve:
http://thot.banki.hu/deepspam/model_big_v5/
Köszönjük, frissítettem is.
Koszi, frissitettem is gyorsan. Remelhetoleg ebben mar nem jeloli 100% spamnek a reggeli adminisztracios leveleket.
whitelistelni kell oket :) vagy kuldesz nekem mintat.
az uj mintak kozt sok uj phishing, a ham-ek kozt meg foleg az igazi telekom/voda/telenor szamlak es kozmu levelek vannak (ezt jeleztek paran hogy tevesen jeloli).
Tapasztaltam olyat tobbszor is, hogy egyszeruen a kovetkezo hibauzenettell kb 4 orankent megall a legujabb verzio (a korabbival nem volt ilyen):
1/1 [==============================] - 0s 266ms/step
python3: /root/.theano/compiledir_Linux-5.4.5-x86_64-with-debian-10.2--3.7.3-64/tmpb6ob1p7n/mod.cpp:266: int {anonymous}::__struct_compiled_op_m43e2f10175c8cb3751d25cf685f5379783484e0f29388fc21a34a41edb6ae98d::run(): Assertion `PyArray_NDIM(V5) == 1' failed.
Esetleg van tipped?
nem lattam ilyet, de nalam mindnehol tensorflow-al megy, nem theano. ez amugy keras/theano bugnak tunik, sokat en nem tudok tenni ellene :)
Átfutottam a statisztikákat.
Már nem jelöli spamnek a github értesítőket, és a valid számlalevelekből is érezhetően kevesebbet jelöl spamnek.
Barátságosabb lett a memóriahasználat.
A facebbok, twitter értesítőket továbbra is spamnek jelöli, de ezeket a nagy szolgáltatókat könnyű fehérlistázni.
Szóval nagyon jó a cucc.
lehet volt mar rola szo. a tanulo cucc tud futni gpun is? tudom hogy van sajat gep erre, de ma mar nem annyira kifizetodo a shitcoin banyaszat, napi 2-3$-ert barki orommel kolcsonadja a gepet 5-8 gpuval
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
persze, en is gpu-n futtatom, cpu-n orokkevalosag lenne :) bar az ujabb tensorflown sokat optimalizaltak, de igy is min 10x a kulonbseg a gpu javara.
mondjuk tudtommal meg mindig csak cuda (nvidia) tamogatott a neuralis halos frameworkok (tensorflow, theano stb) altal, opencl-t nem nagyon eroltetik sehol. banyaszni meg inkabb atival szoktak...
van nvidia is boven. raadasul lassan azok egy resze technikailag is kiesnek, mert mar keves a rajtuk levo 3G ram. (1050, 1060, 1070 kartyak)
most megneztem nicehash calcban, 0.45$/napot mond egy 1070 kartyara. ebbol kb kiszamolhatod hogy mekkora koltseg a teljes tanitas.
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
nem tudom kevesebb memoriaval is megoldja-e a TF, de nalam (1080Ti) megeszi az egeszet tanitas alatt:
10801MiB / 11178MiB
ami biztos, hogy regen a 950gtx-en 4gb rammal nem indult el, tehat annal biztosan tobb kell.
amugy maga a tenyleges tanitas lefut ezen kb 1 ora alatt (meg avx2-es cpu-n is lefut 1 nap alatt szerintem), csak ugye a melo nagy resze a dataset osszeallitasabol/tesztelesebol all, valamint a model parameterekkel valo kiserletezesbol (hany iteracio, batch size, mekkora w2v model, hany dimenzios vektorok, hany dimenzios filterek, mekkora dropout stb). neha ugyanazokkal az inputokkal 2 tanitas is mas minosegu eredmenyt hoz (ugye eleg sok a random) :)
ami nagyon eszi a gepet az a word2vec epites, az 1-2 honap is akar... persze az is nagyban fugg a parameterektol es a dataset meretetol.
most futottam bele egy olyan spam-be, ahol a fejlecben (from) invalid karakterkodok voltak, amik utf8 dekodolasi exceptiont okoznak a pymilter-ben (mondjuk azt nem ertem, egyaltalan miert probalja dekodolni).
mar javitottak 4 honapja, de meg az utolso releaseben nincs benne, erdemes a githubrol frissiteni/felrakni:
https://github.com/sdgathman/pymilter/archive/master.zip
szerk: a hiba csak 3.x pythont erinti
mai meglepi: "Sěcuříty ňøtícě. Søměøňě håvě åccěss tø yøuř systěm."
"Thě fåct ís thåt yøü wěrě ínfěctěd wíth målwårě thrøügh ån ådült sítě thåt yøü vísítěd."
tehat elkezdtek intenziven hasznalni a vizualisan hasonlo karakterek (unicode confusables) trukkot spam-ekben is.
ugy tunik, hogy az unicodedata.normalize() nem kezeli le rendesen, pl. az athuzott 'o' betu (0xF8) eltunik a konverzio soran :(
osszedobtam egy sajat karakter konverzios tablat, reszben a confusables.txt, reszben a normalize() eredmenyei alapjan, helyenkent kezzel korrigalva/kiegeszitve:
http://thot.banki.hu/deepspam/unicode/
a kovetkezo verzioban mar ezt fogom hasznalni a normalize() helyett...
es ez annyira "szep": ss="".join(confusables.get(ord(x),"?") if ord(x)>=128 else x for x in s)
fenn is van a v0.6, az uj unicode tablaval, es par apro javitassal (py2 kompatibilitas javitasok, hibakezelesek):
http://thot.banki.hu/deepspam/milter-v0.6/
Szépen fejlődik a kód!
Gitlab/Github költözésre nem gondoltál még?
de, csak meg nem tudtam ravenni magam hogy emiatt beregisztraljak kiismerjem stb. azt az idot inkabb hasznos dolgokra forditom :)
Regelsz, beteszed a kulcsod, átírod az origint, pusholsz :)
elkezdtek beepiteni a keras-t a tensorflowba, es dobjak is a tobbi backend (theano stb) tamogatasat.
ezutan a keras nem onalloan fog letezni, hanem a tensorflow-on belul. a 2.3-as keras mar nem is igazan mukodik tensorflow-al, ezert kellett 2.2.5-re downgradelni, de van szebb megoldas is, at kell irni a ds_model.py-ben a keras-t tensorflow.keras-ra, es akkor nem is kell a kerast kulon telepiteni, hanem a tf beepitettet hasznalja.
az aktualis 1.x tensorflow-ban egyebkent 2.2.4-es keras van, nyilvan nem veletlenul... a 2.x tf-ben lesz majd ujabb ami tobb gpu-t tamogat stb.
A'rpi
Uj release: http://thot.banki.hu/deepspam/milter-v0.7/
- ds_model-bol keszult egy queue alapu verzio, ami 1 thread-ben futtatja a keras+tensorflow-t, a deepspam.py mar ezt hasznalja.
- es egy uj, ppymilter-re epulo verzio (deepspam3.py), ami teljesen 1 szalon fut, semmi multithreading, es nem zabalja (annyira) a memoriat :)
Uj model: http://thot.banki.hu/deepspam/model_v7_6-jo/
- A v7 ota kivettem az LSTM reteget, igazabol nem hozott annyi pluszt, amennyi eroforrast eszik, es neha furcsan is viselkedett. helyette tobb Convolution layer lett.
- 2020.marcius vegeig beerkezett es ellenorzott spam/ham mintakkal tanitva:
41006 mail.neg
58252 mail.pos
99258 total
A'rpi
ha valakit erintene, jo hir, hogy az uj verziom mar mukodik az uj, 2.1.0-as tensorflow-val is (nyilvan a tensorflow-ba beepitett keras-t hasznalva), nem csak a regi 1.x szeriaval (1.14/1.15). raadasul elso blikkre gyorsabb is valamennyivel!
(a pip3 20.x verzio mar ezt telepiti alapbol, a regebbi verzio az 1.14-et)
A'rpi
helló, próbálok életre kelteni, a fentebb linkelt docker verziót használom és ilyen hibába ütközöm:
2020-04-22 05:39:29.792248: W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open model/model.weights: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator?
természetesen a model.weights ott van, próbáltam én is megbuildelni de ugyanide jutottam. valami ötlet? vagy ez a normális működés része? köszi!
biztos nem normalis, d eilyet meg nem lattam., oly mintha hibas lenne a file (bad magic) es ezert nem tudja betolteni.
az utolso model-t probalod? milyen tensorflow/keras verzioval?
/public_html/deepspam/model_v7_6-jo# md5sum *
d32bcad25840f378e370b604611f822d keras4_emb.py
8b2ab6c21451618229b8dafdd468cfb6 model.config
a791b2d19fce60c0dd3beb8838ee6892 model.weights
92a6756f4fcabd21e3e119aaae19a57e model.wordmap-py2
e91a39609e57fff57cc1271a1058b0dc model.wordmap-py3
(szerk, adtam még memóriát neki hogy ne legyen vele gondja)
bemásolom a teljes kimenetet, mivel most pl el se indul, bár elvileg nem változott semmi (alább az md5sumok és fájlok):
Loading Model...
missing/bad milter.eml -> skipping self-test!
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint8 = np.dtype([("qint8", np.int8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint16 = np.dtype([("qint16", np.int16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint32 = np.dtype([("qint32", np.int32, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
np_resource = np.dtype([("resource", np.ubyte, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint8 = np.dtype([("qint8", np.int8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint16 = np.dtype([("qint16", np.int16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint32 = np.dtype([("qint32", np.int32, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
np_resource = np.dtype([("resource", np.ubyte, 1)])
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/initializers.py:119: calling RandomUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
2020-04-22 07:13:17.626179: W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open model/model.weights: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator?
2020-04-22 07:13:18.460631: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2793225000 Hz
2020-04-22 07:13:18.462010: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7efc88822c30 executing computations on platform Host. Devices:
2020-04-22 07:13:18.462052: I tensorflow/compiler/xla/service/service.cc:175] StreamExecutor device (0): <undefined>, <undefined>
2020-04-22 07:13:18.499948: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1412] (One-time warning): Not using XLA:CPU for cluster because envvar TF_XLA_FLAGS=--tf_xla_cpu_global_jit was not set. If you want XLA:CPU, either set that envvar, or use experimental_jit_scope to enable XLA:CPU. To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a proper command-line flag, not via TF_XLA_FLAGS) or set the envvar XLA_FLAGS=--xla_hlo_profile.
worker: started!!!
worker: waiting for job... (0)
# ls -Rla
.:
total 160
drwxr-sr-x. 1 root staff 4096 Apr 22 06:58 .
drwxrwsr-x. 1 root staff 4096 Apr 14 14:07 ..
drwxr-sr-x. 2 root staff 4096 Apr 22 06:58 __pycache__
-rwxr-xr-x. 1 root root 5224 Apr 14 13:31 deepspam.py
-rw-r--r--. 1 root root 7780 Apr 14 13:31 deepspam3.py
-rw-r--r--. 1 root root 1919 Apr 14 13:31 ds_model.py
-rw-r--r--. 1 root root 3630 Apr 14 13:31 ds_model_queue.py
-rw-r--r--. 1 root root 2859 Apr 14 13:31 ds_model_tf2.py
-rw-r--r--. 1 root root 7504 Apr 14 13:31 eml2token.py
-rw-r--r--. 1 root root 2695 Apr 14 13:31 eml2txt.py
-rw-r--r--. 1 root root 4368 Apr 14 13:31 htmlentitydefs.py
-rw-r--r--. 1 root staff 5539 Apr 5 21:12 keras4_emb.py
-rw-r--r--. 1 root root 4215 Apr 14 13:31 maildedup2.py
drwxr-sr-x. 1 root staff 4096 Apr 14 14:09 model
-rw-r--r--. 1 root root 5982 Apr 14 13:31 parsehdr.py
-rw-r--r--. 1 root root 25052 Apr 14 13:31 ppymilterbase.py
-rw-r--r--. 1 root root 2052 Apr 14 13:31 tester.py
-rw-r--r--. 1 root root 2474 Apr 14 13:31 txt2tok.py
-rw-r--r--. 1 root root 2563 Apr 14 13:31 txt2tok_test.py
-rw-r--r--. 1 root root 19863 Apr 14 13:31 unicodes.map
./__pycache__:
total 36
drwxr-sr-x. 2 root staff 4096 Apr 22 06:58 .
drwxr-sr-x. 1 root staff 4096 Apr 22 06:58 ..
-rw-r--r--. 1 root staff 2694 Apr 22 06:58 ds_model_queue.cpython-35.pyc
-rw-r--r--. 1 root staff 6242 Apr 22 06:58 eml2token.cpython-35.pyc
-rw-r--r--. 1 root staff 5078 Apr 22 06:58 htmlentitydefs.cpython-35.pyc
./model:
total 1026056
drwxr-sr-x. 1 root staff 4096 Apr 14 14:09 .
drwxr-sr-x. 1 root staff 4096 Apr 22 06:58 ..
-rw-r--r--. 1 root staff 14207 Apr 5 21:12 model.config
-rw-r--r--. 1 root staff 1025938224 Apr 5 21:13 model.weights
-rw-r--r--. 1 root staff 24704619 Apr 5 21:13 model.wordmap-py3
# md5sum model/*
8b2ab6c21451618229b8dafdd468cfb6 model/model.config
a791b2d19fce60c0dd3beb8838ee6892 model/model.weights
e91a39609e57fff57cc1271a1058b0dc model/model.wordmap-py3
ahogy futtatva van:
python3 deepspam.py
---
ha a python3 deepspam3.py -t futtatom akkor is hasonló a helyzet:
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint8 = np.dtype([("qint8", np.int8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint16 = np.dtype([("qint16", np.int16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint32 = np.dtype([("qint32", np.int32, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
np_resource = np.dtype([("resource", np.ubyte, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint8 = np.dtype([("qint8", np.int8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint16 = np.dtype([("qint16", np.int16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint32 = np.dtype([("qint32", np.int32, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
np_resource = np.dtype([("resource", np.ubyte, 1)])
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/initializers.py:119: calling RandomUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
2020-04-22 07:22:37.802571: W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open model/model.weights: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator?
2020-04-22 07:22:38.945691: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2793225000 Hz
2020-04-22 07:22:38.948290: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55ed7d9e5f30 executing computations on platform Host. Devices:
2020-04-22 07:22:38.948376: I tensorflow/compiler/xla/service/service.cc:175] StreamExecutor device (0): <undefined>, <undefined>
2020-04-22 07:22:38.995492: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1412] (One-time warning): Not using XLA:CPU for cluster because envvar TF_XLA_FLAGS=--tf_xla_cpu_global_jit was not set. If you want XLA:CPU, either set that envvar, or use experimental_jit_scope to enable XLA:CPU. To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a proper command-line flag, not via TF_XLA_FLAGS) or set the envvar XLA_FLAGS=--xla_hlo_profile.
^C
a verziók lemaradtak:
# pip3 list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
absl-py (0.9.0)
astor (0.8.1)
cryptography (1.7.1)
gast (0.3.3)
google-pasta (0.2.0)
grpcio (1.28.1)
h5py (2.10.0)
html2text (2020.1.16)
idna (2.2)
Keras (2.2.5)
Keras-Applications (1.0.8)
Keras-Preprocessing (1.1.0)
keyring (10.1)
keyrings.alt (1.3)
Markdown (3.2.1)
numpy (1.18.2)
pip (9.0.1)
protobuf (3.11.3)
pyasn1 (0.1.9)
pycrypto (2.6.1)
pygobject (3.22.0)
pymilter (1.0.4)
pyxdg (0.25)
PyYAML (5.3.1)
scipy (1.4.1)
SecretStorage (2.3.1)
setuptools (46.1.3)
six (1.10.0)
tensorboard (1.14.0)
tensorflow (1.14.0)
tensorflow-estimator (1.14.0)
termcolor (1.1.0)
Werkzeug (1.0.1)
wheel (0.29.0)
wrapt (1.12.1)
megneztem a regi tf-el is, ez is ubi 16, ez is mukodik, de azert eltart egy ideig (kb 15 sec) mire betolt, es kell hozza 2GB ram legalabb:
root@fsfgpu:/home/arpi/learn2019/v0.7-pub# ./deepspam3.py
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint8 = np.dtype([("qint8", np.int8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint16 = np.dtype([("qint16", np.int16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint32 = np.dtype([("qint32", np.int32, 1)])
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
np_resource = np.dtype([("resource", np.ubyte, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint8 = np.dtype([("qint8", np.int8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint16 = np.dtype([("qint16", np.int16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint32 = np.dtype([("qint32", np.int32, 1)])
/usr/local/lib/python3.5/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
np_resource = np.dtype([("resource", np.ubyte, 1)])
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/initializers.py:119: calling RandomUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
2020-04-22 12:53:11.024673: W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open model/model.weights: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator?
2020-04-22 12:53:11.218783: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-04-22 12:53:11.222336: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3503910000 Hz
2020-04-22 12:53:11.222609: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x43f01a0 executing computations on platform Host. Devices:
2020-04-22 12:53:11.222622: I tensorflow/compiler/xla/service/service.cc:175] StreamExecutor device (0): <undefined>, <undefined>
2020-04-22 12:53:11.237880: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1412] (One-time warning): Not using XLA:CPU for cluster because envvar TF_XLA_FLAGS=--tf_xla_cpu_global_jit was not set. If you want XLA:CPU, either set that envvar, or use experimental_jit_scope to enable XLA:CPU. To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a proper command-line flag, not via TF_XLA_FLAGS) or set the envvar XLA_FLAGS=--xla_hlo_profile.
3116 entries loaded from unicodes.map file
Loading Model...
MODEL loaded! (1000000 words)
initing MSS
root@fsfgpu:~# python3 -m pip list
-lxc (0.1)
absl-py (0.8.0)
asn1crypto (0.24.0)
astor (0.7.1)
astroid (1.4.4)
beautifulsoup4 (4.4.1)
boto (2.49.0)
boto3 (1.9.246)
botocore (1.12.246)
bz2file (0.98)
certifi (2019.9.11)
cffi (1.12.3)
chardet (2.3.0)
command-not-found (0.3)
confusables (1.1.1)
cryptography (2.7)
cycler (0.9.0)
decorator (4.3.0)
defusedxml (0.6.0)
docutils (0.15.2)
fasttext (0.9.1)
feedparser (5.1.3)
gast (0.2.0)
gensim (3.8.1)
google-pasta (0.1.7)
grpcio (1.17.0)
h5py (2.10.0)
html2text (2016.1.8)
html5lib (0.999)
idna (2.8)
jmespath (0.9.4)
Keras (2.2.5)
Keras-Applications (1.0.8)
Keras-Preprocessing (1.1.0)
langdetect (1.0.7)
language-selector (0.1)
lazy-object-proxy (1.2.1)
logilab-common (1.1.0)
lxml (3.5.0)
Markdown (3.0.1)
milter (0.8.18)
networkx (2.2)
numpy (1.17.4)
Pillow (3.1.2)
pip (8.1.1)
protobuf (3.9.1)
pybind11 (2.4.3)
pycparser (2.19)
pycurl (7.43.0)
pydot (1.4.1)
pygobject (3.20.0)
pylint (1.5.2)
pymilter (1.0.4)
pyOpenSSL (19.0.0)
pyparsing (2.0.3)
pysaml2 (4.7.0)
python-apt (1.1.0b1+ubuntu0.16.4.8)
python-dateutil (2.4.2)
python-debian (0.1.27)
python-systemd (231)
pytz (2014.10)
PyYAML (5.1.2)
requests (2.9.1)
s3transfer (0.2.1)
scipy (1.4.1)
setuptools (20.7.0)
six (1.10.0)
smart-open (1.8.4)
ssh-import-id (5.5)
tensorboard (1.14.0)
tensorflow (1.14.0)
tensorflow-estimator (1.14.0)
termcolor (1.1.0)
threadpool (1.3.2)
ufw (0.35)
unattended-upgrades (0.1)
urllib3 (1.13.1)
virtualenv (15.0.1)
Werkzeug (0.14.1)
wheel (0.29.0)
wrapt (1.8.0)
You are using pip version 8.1.1, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
"You can safely ignore the warning. It does a test to see if the file is in TensorFlow format, sees that it isn't, and loads using HDF5."
es tenyleg, nekem is kiirja, csak a sok warning kozt nem tunt fel:
root:/home/deepspam# ./deepspam3.py
2020-04-22 12:46:53.876370: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer.so.6'; dlerror: libnvinfer.so.6: cannot open shared object file: No such file or directory
2020-04-22 12:46:53.876433: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer_plugin.so.6'; dlerror: libnvinfer_plugin.so.6: cannot open shared object file: No such file or directory
2020-04-22 12:46:53.876440: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:30] Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.
Loading Model...
2020-04-22 12:46:54.300237: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory
2020-04-22 12:46:54.300269: E tensorflow/stream_executor/cuda/cuda_driver.cc:351] failed call to cuInit: UNKNOWN ERROR (303)
2020-04-22 12:46:54.300285: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (mkhlnx2): /proc/driver/nvidia/version does not exist
2020-04-22 12:46:54.300417: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-04-22 12:46:54.321711: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3792000000 Hz
2020-04-22 12:46:54.322503: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x5a8e040 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-04-22 12:46:54.322535: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version
2020-04-22 12:46:54.327174: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1024001024 exceeds 10% of system memory.
2020-04-22 12:46:54.617031: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1024001024 exceeds 10% of system memory.
2020-04-22 12:46:54.698717: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1024001024 exceeds 10% of system memory.
2020-04-22 12:46:54.893580: W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open model/model.weights: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator?
2020-04-22 12:46:55.517441: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1024001024 exceeds 10% of system memory.
MODEL loaded! (1000000 words)
initing MSS
initing SSS -> 1 ('192.168.90.10', 44946)
initing SSS -> 2 ('192.168.90.10', 44948)
freeing SSS -> 1 time: 13.153
__del__ called! processed: 0 (0.000) from: 45.142.195.3
freeing SSS -> 0 time: 13.038
__del__ called! processed: 0 (0.000) from: 45.142.195.3
ez egy ubi 16, de frissebb tensorflow:
Python 3.5.2 (default, Oct 8 2019, 13:06:37)
Package Version
-------------------- ----------------------
absl-py 0.9.0
astor 0.8.1
cachetools 4.1.0
certifi 2020.4.5.1
chardet 3.0.4
click 6.2
colorama 0.3.7
command-not-found 0.3
configobj 5.0.6
gast 0.2.2
google-auth 1.14.0
google-auth-oauthlib 0.4.1
google-pasta 0.2.0
grpcio 1.28.1
h5py 2.10.0
idna 2.9
Keras-Applications 1.0.8
Keras-Preprocessing 1.1.0
language-selector 0.1
Markdown 3.2.1
numpy 1.18.3
oauthlib 3.1.0
opt-einsum 3.2.1
pip 20.0.2
prompt-toolkit 0.57
protobuf 3.11.3
pyasn1 0.4.8
pyasn1-modules 0.2.8
pycrypto 2.6.1
pycurl 7.43.0
Pygments 2.1
pygobject 3.20.0
PyMySQL 0.7.2
python-apt 1.1.0b1+ubuntu0.16.4.8
python-debian 0.1.27
python-systemd 231
requests 2.23.0
requests-oauthlib 1.3.0
rsa 4.0
scipy 1.4.1
setuptools 46.1.3
six 1.14.0
sqlparse 0.1.18
ssh-import-id 5.5
tensorboard 2.1.1
tensorflow 2.1.0
tensorflow-estimator 2.1.0
termcolor 1.1.0
ufw 0.35
unattended-upgrades 0.1
urllib3 1.25.9
wcwidth 0.1.6
Werkzeug 1.0.1
wheel 0.29.0
wrapt 1.12.1
okés, köszi
most kezdtem el tesztelgetni de eddig majdnem mindenre fals pozitivat adott (egy olyan mailfiókra vettem fel amivel feliratkoztam egy csomó publik hirlevélre).
kezdve az első felvettem a fiókot outlookba és az küld egy teszt levelet:
X-deepspam: spam 100%
microsoft hirlevél:
X-deepspam: maybespam 95%
qatar hirlevél:
X-deepspam: spam 100%
vajon mit nézek be?
miert fp? a hirlevelek spammek... az outlook tesztlevelre tudom hogy 100% ad, mert olyan...
Azért ezt a fp problémát többen említettük már. Alapvetően a hírlevél hasznos, a kéretlen levél a probléma.
Volt egy érdekes beszélgetésem egy cégnél, hogy nekik úgy kéne szűrni a leveleket, hogy ... nekem spam, de kolléganőnek fontosak. De ott alapvetően a közös és átgondolatlan fiókok miatt is van gond.
alapvetően per user bayes az simán járható, meg akár az is hogy per user modulok ki-be
Mivel a user bayes csak egy része a spamszűrésnek, nem biztos hogy egyértelműen kiszűri,... de tény, hogy kezelhető több módon is.
Csak azért hoztam a példát, hogy már a spam meghatározása se egyértelmű.
hát de hogy lenne spam? én iratkoztam fel rá, el akarom olvasni. tehát akkor lényegében ez az eszköz arra jó hogy megkülönböztessem a személyes leveleket a bulk emailektől? annak is van értelme, csak az nem spam:)
mivel ez a level szoveget elemzi, nem tudhatja hogy te szandekosan iratkoztal fel ra, vagy csak ugy kapod... mivel tartalmilag nagyon hasonlit a spam-ekre, annak pontozza. amire feliratkoztal azt whitelisteljed es kesz. a gmail is spamba rakja ezeket...
nagyon nehez definialni mi a kulonbseg a bulk email es a spam kozott - ahogy fentebb is irtak, van akinek ez van akinek az. nezopont kerdese.
vannak url whitelistek is, spamassassinbe be lehet allitani, es akkor a megbizhato hirlevel kuldoket lepontozza.
masik lehetoseg, hogy tanitasz sajat modelt, nem muszaj az enyemet hasznalni. ott vannak a toolok hozza, lehet sajatot epiteni, mondjuk eros vas kell hozza (cuda gpu ajanlott, de anelkul is lefut par nap alatt). maildedup2.py megcsinalja az unix mailboxbol a tokenizalt .txt-t, ezt lefuttatod kulon a ham es a spam minta mappadon. aztan a 2 txt-t beadod (data/mail.pos+.neg) a keras4_emb.py-nak, az eloallitja a modelt. ha reszletesebben erdekel valakit szoljon, gyartok majd leirast rola, annyira nem trivialis, de nem is tul bonyolult.
A'rpi
Nagyon jól támogatja a spamszűrést, de tényleg érdemes mellé fehérlistát használni.
kuldenel egy ilyen outlookos fp-t a spam@uni-obuda.hu cimre? en most kerestem egy parat de mind 'toosmall' lett, egyikre se adott 100%-ot.
ment egy teszt, ez épp angol, gondolom van magyar verziója is
Mitől neurális?
a halotol :)
Jah, értem. :-)
bovebben: https://arxiv.org/pdf/1408.5882
Tegnap talaltam 2 problemat/hibat:
1. a refactoring soran bekerult v0.6 kornyeken egy 'minlen' parameter a tokenizaloba, es ennek a szurohoz nem jo a default erteke -> emiatt a 4 betunel rovidebb szavakat nem szamolta. altalaban nem okoz gondot, mert azok foleg kotoszavak, nevelok, de nagyon rovid leveleknel, mint pl az outlook tesztlevele az is szamit. ezt kell atirni 'minlen=1'-re:
eml2token.py: def tokenize(s,vocab,minlen=4):
2. decemberben megfigyeltem, hogy (majdnem) ugyanarra a tartalmu levelre is eltero eredmenyt adhat a szuro, es csak a megszolitas/nev tert el a levelek tartalmaban. valoszinuleg megtanulta, hogy bizonyos nevek sokkal jellemzobbek a spam levelekre :) (bizonyos nevu userek sok spamet kapnak, es igy a tanitashoz hasznalt datasetben felulreprezentaltak)
ezert akkor beraktam egy nev listat, az angol es magyar kereszt- es vezeteknevekkel, hogy ezeket ne vegye figyelembe, de mint most kiderult, olyan "nevek" is vannak a listaban, mint 'bank' vagy pl. 'minden', foleg az angolok neveznek el embereket gyakorlatilag barmirol, igy az a lista tele van baromsagokkal, de a magyarban is van pl. 'kis' meg 'nagy' ugye... ezt most egyelore kivettem, majd at kell nezni kezzel a listat es a csak nevkent, mas jelentessel nem birokat meghagyni, de ez rohadt sok melo lesz...
http://thot.banki.hu/deepspam/w2v-models/nevek_freq.txt
ezekkel korrigalva, valamint az aprilisi mintakkal kiegeszitve generaltam egy uj modelt, lehet tesztelni:
http://thot.banki.hu/deepspam/model_v8-teszt/
a 193.224.38.187:1080 milteren mar ez megy, minlen=1 parameterrel. az outlook teszteket mar jol pontozza :)
uj model frissitve a majusi mintakkal (+3000 level):
http://thot.banki.hu/deepspam/model_v8_1/
felraktam a v0.8 verziot, a fo valtozas/ujdonsag az attachmentek parsolasa (docx, rtf, pdf, winmail.dat), illetve a model is bovult egy adag ujfajta spam levellel:
http://thot.banki.hu/deepspam/milter-v0.8/
http://thot.banki.hu/deepspam/model_v8_2_teszt/
deepspam-milter v0.9 released :)
http://thot.banki.hu/deepspam/deepspam-milter-v0.9.tgz
http://thot.banki.hu/deepspam/model-v90.tgz
A kodban nem tortent jelentos valtozas (reszletek a changelogban), inkabb csak a tensorflow 2.x support miatt, meg par fix.
Viszont van hozza uj model is (de mukodik a 8.2-vel is, amit masfel eve hasznalunk, es nagyon ritkan hibazik), a spam mintak teljesen ujra lettek valogatva es konvertalva, bovitve az elmult masfel ev termesevel, es a ham "tananyag" is bovult kb 50%-al:
42737 mail.neg
84141 mail.pos
126878 total
kb 1 hete megy a 9.0-as model, eddig jonak tunik, es az osszehasonlito teszten is alig volt elteres a 8.2-tol, az is jo iranyba!
(tavaly vagy 100 uj modelt generaltam kulonbozo inputokbol es beallitasokkal, de egyik sem erte el a 8.2-es minoseget sem, gyanus hogy valami TF2/cuda bug miatt, mert ez mar az ubi/cuda frissites utan volt, es sokszor mar a tanitas kozben elszallt az egesz - most ujra frissitettem mindent es azota jonak tunik)
emellett mar masfel eve dolgozom egy teljesen uj verzion, honapokig tanitott cross-language word2vec modellekkel, de sajnos ez meg mindig nincs kesz... talan nyaron lesz idom befejezni :)
Most csinálok egy új mail szervert, gondoltam újra előveszem tesztelni, mert egy régebbi verzió elég jól teljesített, de sajna nem elérhető.
Végleg behalt a project? Esetleg az új verzió? Valahol elérhető még a régi?
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
hat epp ma halt meg egy aramszunetben a gep amin a regit hostoltam, majd kedden megfixeljuk :)
de amugy inkabb hasznald az ujat, jobb:
https://github.com/gereoffy/deepspam2/releases/tag/model6e25-jo10
Oh, köszi!
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
Na, elkészült a szerver. Tudsz olyan megoldásról ami a mostani éles forgalmat duplikálja és az egyik ágat egy másik szerverre küldi? Úgy mint a 'recipient_bcc_map'+'transport_map' combó. Tartalomszűrés tesztelése szempontjából ez is jó lenne, de a teljes szervert nem tudom vele tesztelni mert az 'RCPT TO:' mindig egy címre fog mutatni. A google nem volt barátom ez ügyben, bár ChatGPT-t még nem kérdeztem, de mindjárt megteszem. Saját kútfőből még azt agyaltam ki, hogy jobb híján milter-ként megírom, de már nagyon nem akarok szkripteket írogatni.
Szerk.: A ChatGPT is a bcc-és megoldást javasolja.
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
Megírattam a ChatGPT-vel :-), még nem néztem, hogy jó e:
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
nem volt meg szuksegem ilyesmire, de ranezesre kb jonak tunik. annyi hogy csak egy rcpt cimet tarol, lehet azt at kene irni listara/tombre, bar teszteleshez ez is eleg. meg ez alapjan csatolni fogja az eredeti uzenetet, nem 1:1-be kuldi, bar ki tudja, nem ismerem ezt a MIMEText() cuccot:
de nem is ertem minek megy bele az ide-oda kodolasgatasba, siman a self.email_data-t kene atadni az smtp kuldonek...
Rákérdeztem, hogy 'mime' nélkül meg lehet e oldani, és megkérdeztem, hogy hogyan tudok csatlakozni a milter-hez, alább a válasz:
Ha jól tudom a body mindig szöveges formátum, vagy tévedek?
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
Ez lett a megoldás:
Náhány emailre dob egy ilyen hibát: Error: 'ascii' codec can't encode character '\xe1'. Nincs valami ötleted? Bár nagy jelentősége nincs, mert nem áll le a milter. Próbáltam az UTF-8-on kívül az ASCII-t is, de ugyanaz.
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
hat nem kene dekodolni a bytes-t str-re, mert a mailnal ez azert nem ilyen egyszeru, a headertol stb fugg epp ascii., utf8 latin2 vagy mas. az smtplib sendmail-e is elfogadja:
msg may be a string containing characters in the ASCII range, or a byte string.
a headernel meg a '\n' helyett b'\n' kell hozzafuzni es kesz (az str() meg a .decode nem kell, az 'xyz' meg b'xyz' legyen)
Ott a nagy pont, köszi! Nem is tudom miért a bonyolultabb utat akartam járni.
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
Csak az ötlet volt jó, a megvalósításra nem. Szerintem a 'name' és 'value' stringek. Bár a franc sem érti, mi mikor string és mikor byte object, a python tudásom kevés ehhez de fejlődik :-) . Végül is ez lett, több órája működik hiba nélkül 5sec/levél forgalommal:
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)
igazabol a pymilter (ezt hasznalod, ez egy libmilter wrapper) eleg bugos es nagyon memleakel, meg helyenkent furan mukodik, sokat szivtam vele eleinte aztan lecsereltem a ppymilterre, majd irtam vegul sajatot. ezexerint a headereket dekodolja...
remlik errol valami issue discussion hogy mit kene es mit nem en/dekodolnia aztan nem jutottak dulore a kompatibilitas miatt. de lehet az mar a ppymilter-nel volt :)
az a baj ezekkel a regi libekkel hogy meg py2 idejen szulettek amikor kaotikus volt a string encoding kezeles, es szivnak a kompatibilitassal azota is. ez az egy aminek orultem a py3-nal hogy vegre rendberaktak (str/unicode helyett lett bytes/str), bar eleinte sok szivast okozott.
amugy az encode() kimenete mar bytes :)
-
„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)