当前位置: 首页 > 科技观察

使用AWS云端机器学习,构建无服务器新闻数据管道

时间:2023-03-19 20:03:31 科技观察

使用AWS云机器学习构建无服务器新闻数据管道我在休产假时想到了这个问题,并决定构建一个简单的应用程序来跟踪有关绿色技术和可再生能源的新闻。使用AWSLambda和AWS的其他服务(如EventBridge、SNS、DynamoDB和Sagemaker),非常容易上手并在几天内构建原型。该应用程序由一系列部署为SageMaker端点的无服务器Lambda函数和文本摘要机器学习模型提供支持。AWSEventBridge规则每24小时触发一次Lambda函数,以从DynamoDB数据库获取新闻源。然后将这些新闻提要作为SNS主题发送,以触发多个Lambda来分析新闻提要并提取新闻URL。每个站点每天最多使用几篇文章更新RSS提要,因此我们不会发送可能为任何特定新闻发布消耗过多资源的大量流量。然而,一个很大的问题是提取文章全文,因为每个网站都不一样。对我们来说幸运的是,像goose3这样的库通过应用机器学习方法来提取页面文本来解决这个问题。由于版权问题,我无法存储文章的全文,这就是我使用HuggingFace文本摘要转换器模型生成简短摘要的原因。下面详细介绍如何自己搭建一个基于机器学习的新闻聚合流水线。1.设置具有必要权限的IAM角色。这个数据管道虽然简单,但是连接了很多AWS资源。要授予我们的函数访问所有必需资源的权限,我们需要设置IAM角色。此角色授予函数使用云中其他资源的权限,例如DynamoDB、Sagemaker、CloudWatch和SNS。出于安全原因,最好不要给我们的IAM角色完全的AWS管理访问权限,只允许它使用它需要的资源。2.在RSSDispatcherLambda中从DynamoDB获取RSS新闻提要你几乎可以用AWSLambda做任何事情,它是一个非常强大的无服务器计算服务,非常适合短任务。对我来说,主要优势是可以轻松访问AWS生态系统中的其他服务。我将所有RSS新闻提要存储在DynamoDB表中,使用boto3库从Lambda访问它真的很容易。从数据库中获取所有新闻提要后,我将它们作为SNS消息发送以触发新闻提要解析Lambda。importboto3importjsondeflambda_handler(事件,上下文):#ConnecttoDynamoDBdynamodb=boto3.resource('dynamodb')#Gettable=dynamodb.Table('rss_feeds')#Getallrecordsfromthetabledata=table.scan()['Items']rss=[y['rss']foryindata]#ConnecttoSNSclient=boto3.client('sns')#Sendmessagestothequeueforiteminrss:client.publish(TopicArn="arn:aws:sns:eu-west-1:802099603194:rss_to-parse",Message=item)3.使用创建层所需的库要在AWSLambdas中使用一些特定的库,您需要将它们作为层导入。要准备要导入的库,它需要位于python.zip存档中,然后我们可以将其上传到AWS并在我们的函数中使用。要创建图层,只需cd进入Python文件夹,运行pipinstall命令,它就会被压缩并准备好上传。pipinstallfeedparser-t但是,我在将goose3库部署为一个层时遇到了一些困难。快速调查显示,一些像LXML这样的库需要在类似Lambda的环境(Linux)中编译。所以如果这个库是在Windows上编译的,然后导入到一个函数中,就会发生错误。要解决此问题,我们需要在创建tarball之前在Linux上安装库。有两种方法。首先,在带有Docker的模拟Lambda环境中安装。对我来说,最简单的方法是使用AWSsambuild命令。构建函数后,我只需从构建文件夹中复制所需的包并将它们作为层上传。sambuild--use-container4.启动Lambda函数解析新闻源一旦我们将新闻URL作为主题发送到SNS,我们就可以触发多个Lambdas从RSS新闻源中获取新闻文章。一些RSS提要是不同的,但是提要解析器库允许我们使用不同的格式。我们的URL是事件对象的一部分,因此我们需要按键提取它。importboto3importfeedparserfromdatetimeimportdatetimedeflambda_handler(事件,上下文):#ConnecttoDynamoDBdynamodb=boto3.resource('dynamodb')#Gettable=dynamodb.Table('news')#Getaurlfromfromeventurl=event['Records'][0]['Sns']['Message']#Parsetherssfeedfeed=feedparser.parse(url)foriteminfeed['entries']:result={"news_url":item['link'],"title":item['title'],"created_at":datetime.now().strftime('%Y-%m-%d')#sothatdynamodbwillbeokwithourdate}#Savetheresulttodynamodbtable.put_item(Item=result,ConditionExpression='attribute_not_exists(news_url)')#storeonlyuniqueurls5.在Sagemaker上创建和部署文本摘要模型Sagemaker是一项服务,可让您在AWS上轻松编写、训练和部署机器学习模型。HuggingFace与AWS合作,让用户更容易将模型部署到云端。这里我在Jupiternotebook中写了一个简单的文本摘要模型,并使用deploy()命令来部署它。fromsagemaker.huggingfaceimportHuggingFaceModelimportsagemakerrole=sagemaker.get_execution_role()hub={'HF_MODEL_ID':'facebook/bart-large-cnn','HF_TASK':'summarization'}#HuggingFaceModelClasshuggingface_model=HuggingFaceModel(transformers_version='4.6.1','tor1.7.1',py_version='py36',env=hub,role=role,)#deploymodeltoSageMakerInferencepredictor=huggingface_model.deploy(initial_instance_count=1,#numberofinstancesinstance_type='ml.m5.xlarge'#ec2instancetype)部署完成后,我们可以获取端点来自Sagemaker->Inference->Endpointconfiguration的信息,并在我们的Lamdas中使用它。6.获取文章全文,对文章进行抽象并将结果存储在DynamoDB由于版权原因我们不存储全文,这就是为什么所有处理都在一个Lambda中完成的原因。一旦URL位于DynamoDB表中,我就会启动文本处理Lambda。为此,我创建了一个DynamoDB项目生成作为启动Lambda的触发器。我创建了批量大小,以便Lambda一次只处理一篇文章。importjsonimportboto3fromgoose3importGoosefromdatetimeimportdatetimedeflambda_handler(事件,上下文):#GeturlfromDynamoDBrecordcreationeventurl=event['Records'][0]['dynamodb']['Keys']['news_url']['S']#fetcharticlefulltextg=Goose()article=g.extract(url=url)body=article.cleaned_text#cleanarticletextpublished_date=article.publish_date#frommetadesc#CreateasummaryusingourHuggingFacetextsummarymodelENDPOINT_NAME="your_model_endpoint"runtime=boto3.client('runtime.sagemaker')response=runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,ContentType='应用程序/json',Body=json.dumps(data))#extractasummarysummary=json.loads(response['Body'].read().decode())#ConnecttoDynamoDBdynamodb=boto3.resource('dynamodb')#Gettabletable=dynamodb.Table('news')#UpdateitemstoredindynamoDBupdate=table.update_item(Key={"news_url":url},ConditionExpression='attribute_exists(news_url)',UpdateExpression='SETsummary=:val1,published_date=:val2'ExpressionAttributeValues={':val1':summary,':val2':published_date})这就是我们如何使用AWS工具构建和部署简单的无服务器数据管道来阅读最新消息原标题:使用ML构建无服务器新闻数据管道在AWS云上,作者:MariaZentsova