AllenNLP源码拓展——训练结束向邮箱发邮件
训练模型时,不知道什么时候会结束(特别是设置了早停时),因此之前习惯过一会看一下状况。所以前不久想到,如果添加代码,在训练结束后向自己的邮箱发送邮件,那不是很方便嘛。于是我尝试在AllenNLP的源码上添加发送邮件的代码。
如果需要改写源码,不能直接用pip安装,需要按照https://github.com/allenai/allennlp的Installing from source部分所说的方式进行安装。
由于对python发送邮件不熟悉,我就直接使用了菜鸟教程上的代码。
菜鸟教程——Python3 SMTP发送邮件——使用第三方 SMTP 服务发送
需要按照网站上的教程在自己的邮箱进行配置,我使用了 QQ 邮箱(你也可以使用 163,Gmail等)的 SMTP 服务。
添加代码
位置allennlp.training.trainer
我在Trainer类后面加了一个函数sendEmail,Trainer的构造函数的参数最后添加一项email: List = None([‘邮箱’,‘配置邮箱SMTP时得到的密码’]),传进Trainer类self._email = email。
在def train(self)的最后,添加一行:
(这里我把train函数的返回值,包含一些训练中得到的数据,作为邮件的内容)
# send Email after train
self.sendEmail(str(metrics))
sendEmail的参数msg是需要发送的文本。
def sendEmail(self, msg : str=None):
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender = ""
my_pass = ""
my_user = ""
#这里我为了方便自己使用,设置如果self._email为空,向自己的邮箱发送邮件
if self._email == None:
my_sender = '[email protected]'
my_pass = 'kybiXXXXXcbbjf' #这个号码是配置邮箱SMTP时得到的
my_user = '[email protected]'
elif len(self._email) == 2:
my_sender = self._email[0] # 发件人邮箱账号
my_pass = self._email[1] # 发件人邮箱密码
my_user = self._email[0] # 收件人邮箱账号,我这里发送给自己
elif len(self._email) == 1:
logger.info("lack email parameter! It consists of sender address and passward.")
return
if msg == None:
msg = "finish train"
def mail():
ret=True
try:
msgsend=MIMEText(msg,'plain','utf-8')
msgsend['From']=formataddr(["wxy",my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msgsend['To']=formataddr(["name",my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msgsend['Subject']="AllenNLP Result" # 邮件的主题,也可以说是标题
server=smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,[my_user,],msgsend.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret=False
return ret
ret=mail()
if ret:
logger.info("email successed")
else:
logger.info("email failed")
这部分我提交到了我在Github上fork下来的仓库。
其他
我没有在读取配置文件的地方加email这一项,因为懒。当然你也可以自己DIY一下,比如,发送其他你希望发送的信息,或者发送给别人的邮箱。
此外,这两天在AllenNLP源码上,完成了一个很使用的自动化训练脚本,初步测试没有问题。过一段时间进行更多测试,可以试一试提交给AllenNLP官方