自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用AWS云端機(jī)器學(xué)習(xí),構(gòu)建無(wú)服務(wù)器新聞數(shù)據(jù)管道

譯文
人工智能 機(jī)器學(xué)習(xí)
本文介紹了如何使用作為Sagemaker端點(diǎn)來(lái)部署的機(jī)器學(xué)習(xí)模型在AWS上構(gòu)建無(wú)服務(wù)器數(shù)據(jù)管道。

[[436699]]

【51CTO.com快譯】作為一名分析師,我花很多時(shí)間來(lái)跟蹤新聞和行業(yè)最新資訊。我在休產(chǎn)假時(shí)考慮了這個(gè)問(wèn)題,決定構(gòu)建一個(gè)簡(jiǎn)單的應(yīng)用程序來(lái)跟蹤有關(guān)綠色技術(shù)和可再生能源的新聞。使用AWS Lambda及AWS的其他服務(wù)(比如EventBridge、SNS、DynamoDB和Sagemaker),可以非常輕松地上手,在幾天內(nèi)構(gòu)建好原型。

該應(yīng)用程序由一系列無(wú)服務(wù)器Lambda函數(shù)和作為SageMaker端點(diǎn)來(lái)部署的文本摘要機(jī)器學(xué)習(xí)模型提供支持。AWS EventBridge規(guī)則每24小時(shí)觸發(fā)一次Lambda函數(shù),從DynamoDB數(shù)據(jù)庫(kù)獲取新聞源(feed)。

然后這些新聞源作為SNS主題來(lái)發(fā)送,以觸發(fā)多個(gè)Lambda分析新聞源并提取新聞URL。每個(gè)網(wǎng)站每天更新RSS新聞源最多只更新幾篇文章,因此我們不會(huì)發(fā)送大批流量,不然可能會(huì)導(dǎo)致消耗任何特定新聞出版物的過(guò)多資源。

然而,一大問(wèn)題是提取文章的全文,因?yàn)槊總€(gè)網(wǎng)站不一樣。對(duì)我們來(lái)說(shuō)幸運(yùn)的是,goose3之類的庫(kù)通過(guò)運(yùn)用機(jī)器學(xué)習(xí)方法提取頁(yè)面正文來(lái)解決這個(gè)問(wèn)題。由于版權(quán)問(wèn)題,我無(wú)法存儲(chǔ)文章的全文,這就是為什么我運(yùn)用HuggingFace文本摘要轉(zhuǎn)換器模型來(lái)生成簡(jiǎn)短摘要。

下面詳細(xì)介紹了如何自行構(gòu)建基于機(jī)器學(xué)習(xí)的新聞聚合管道。

1. 設(shè)置擁有必要權(quán)限的IAM角色。

雖然這個(gè)數(shù)據(jù)管道很簡(jiǎn)單,但它連接許多AWS資源。想授予我們的函數(shù)訪問(wèn)所有所需資源的權(quán)限,我們需要設(shè)置IAM角色。該角色為函數(shù)賦予了使用云端其他資源的權(quán)限,比如DynamoDB、Sagemaker、CloudWatch和SNS。出于安全原因,最好不要為我們的IAM角色賦予全面的AWS管理訪問(wèn)權(quán)限,只允許它使用所需的資源。

2. 在RSS Dispatcher Lambda中從DynamoDB獲取RSS新聞源

使用AWS Lambda幾乎可以做任何事情,它是一種非常強(qiáng)大的無(wú)服務(wù)器計(jì)算服務(wù),非常適合短任務(wù)。對(duì)我而言,主要優(yōu)點(diǎn)在于很容易訪問(wèn)AWS生態(tài)系統(tǒng)中的其他服務(wù)。

我將所有RSS新聞源存儲(chǔ)在DynamoDB表中,使用boto3庫(kù)從Lambda訪問(wèn)它真的很容易。一旦從數(shù)據(jù)庫(kù)獲取所有新聞源后,我將它們作為SNS消息發(fā)送,以觸發(fā)新聞源解析Lambda。

  1. import boto3 
  2. import json 
  3. def lambda_handler(event, context): 
  4.     # Connect to DynamoDB 
  5.     dynamodb = boto3.resource('dynamodb'
  6.      
  7.     # Get table 
  8.     table = dynamodb.Table('rss_feeds'
  9.      
  10.     # Get all records from the table 
  11.     data = table.scan()['Items'
  12.     rss = [y['rss'for y in data] 
  13.      
  14.     # Connect to SNS 
  15.     client = boto3.client('sns'
  16.      
  17.     # Send messages to the queue 
  18.     for item in rss: 
  19.         client.publish(TopicArn="arn:aws:sns:eu-west-1:802099603194:rss_to-parse",  Message = item) 

3. 使用必要的庫(kù)創(chuàng)建層

想在AWS Lambdas中使用一些特定庫(kù),您需要將它們作為層來(lái)導(dǎo)入。想準(zhǔn)備庫(kù)導(dǎo)入,它需要位于python.zip壓縮包中,然后我們可以將其上傳到AWS并在函數(shù)中使用。想創(chuàng)建層,只需cd進(jìn)入到Python文件夾中,運(yùn)行pip install命令,將其壓縮并準(zhǔn)備好上傳。

  1. pip install feedparser -t 

然而,我將goose3庫(kù)作為一個(gè)層來(lái)部署時(shí)遇到了一些困難。簡(jiǎn)單的調(diào)查后發(fā)現(xiàn),LXML等一些庫(kù)需要在類似Lambda的環(huán)境(Linux)中加以編譯。因此如果庫(kù)在Windows上編譯,然后導(dǎo)入到函數(shù)中,就會(huì)發(fā)生錯(cuò)誤。為了解決這個(gè)問(wèn)題,在創(chuàng)建壓縮包之前,我們需要在Linux上安裝該庫(kù)。

這有兩種方法。首先,安裝在帶有Docker的模擬Lambda環(huán)境上。對(duì)我來(lái)說(shuō),最簡(jiǎn)單的方法是使用AWS sam build命令。函數(shù)構(gòu)建后,我只需從構(gòu)建文件夾中拷貝所需的包,并將它們作為層來(lái)上傳。

  1. sam build --use-container 

4. 啟動(dòng)Lambda函數(shù)來(lái)解析新聞源

一旦我們將新聞URL作為主題發(fā)送到SNS,就可以觸發(fā)多個(gè)Lambda從RSS新聞源去獲取新聞文章。一些RSS新聞源不一樣,但新聞源解析器庫(kù)允許我們使用不同的格式。我們的URL是事件對(duì)象的一部分,所以我們需要通過(guò)key來(lái)提取它。

  1. import boto3 
  2. import feedparser 
  3. from datetime import datetime 
  4. def lambda_handler(event, context): 
  5.     
  6.     #Connect to DynamoDB 
  7.     dynamodb = boto3.resource('dynamodb'
  8.     # Get table 
  9.     table = dynamodb.Table('news'
  10.      
  11.     # Get a url from from event 
  12.     url = event['Records'][0]['Sns']['Message'
  13.     
  14.     # Parse the rss feed 
  15.     feed = feedparser.parse(url) 
  16.      
  17.     for item in feed['entries']: 
  18.         result = { 
  19.             "news_url": item['link'], 
  20.             "title": item['title'], 
  21.             "created_at": datetime.now().strftime('%Y-%m-%d') # so that dynamodb will be ok with our date 
  22.         } 
  23.          
  24.         # Save the result to dynamodb 
  25.         table.put_item(Item=result, ConditionExpression='attribute_not_exists(news_url)') # store only unique urls 

5. 在Sagemaker上創(chuàng)建和部署文本摘要模型

Sagemaker是一項(xiàng)服務(wù),可讓您輕松在AWS上編寫、訓(xùn)練和部署機(jī)器學(xué)習(xí)模型。 HuggingFace與AWS合作,使用戶更容易將其模型部署到云端。

這里我在Jupiter notebook中編寫了一個(gè)簡(jiǎn)單的文本摘要模型,并使用deploy()命令來(lái)部署它。

  1. from sagemaker.huggingface import HuggingFaceModel 
  2. import sagemaker 
  3. role = sagemaker.get_execution_role() 
  4. hub = { 
  5.     'HF_MODEL_ID':'facebook/bart-large-cnn'
  6.      'HF_TASK':'summarization' 
  7. # Hugging Face Model Class 
  8. huggingface_model = HuggingFaceModel( 
  9.     transformers_version='4.6.1'
  10.     pytorch_version='1.7.1'
  11.     py_version='py36'
  12.     env=hub, 
  13.     role=role,  
  14. # deploy model to SageMaker Inference 
  15. predictor = huggingface_model.deploy( 
  16.     initial_instance_count=1, # number of instances 
  17.     instance_type='ml.m5.xlarge' # ec2 instance type 

一旦部署完畢,我們可以從Sagemaker -> Inference -> Endpoint configuration獲取端點(diǎn)信息,并用在我們的Lamdas中。

6. 獲取文章的全文、摘要文章并將結(jié)果存儲(chǔ)在DynamoDB中

由于版權(quán)我們不會(huì)存儲(chǔ)全文,這就是為什么所有處理工作都在一個(gè)Lambda中進(jìn)行。一旦URL進(jìn)入到Dynamo DB表,我啟動(dòng)了文本處理Lambda。為此,我創(chuàng)建了DynamoDB項(xiàng)生成,作為啟動(dòng)Lambda的觸發(fā)器。我創(chuàng)建了批大小,那樣Lambda每次只處理一篇文章。

  1. import json 
  2. import boto3  
  3. from goose3 import Goose 
  4. from datetime import datetime 
  5. def lambda_handler(event, context): 
  6.     # Get url from DynamoDB record creation event 
  7.     url =  event['Records'][0]['dynamodb']['Keys']['news_url']['S'
  8.      
  9.     # fetch article full text 
  10.     g = Goose() 
  11.     article = g.extract(url=url) 
  12.      
  13.     body = article.cleaned_text # clean article text 
  14.      
  15.     published_date = article.publish_date # from meta desc 
  16.      
  17.     # Create a summary using our HuggingFace text summary model 
  18.     ENDPOINT_NAME = "your_model_endpoint" 
  19.     runtime= boto3.client('runtime.sagemaker'
  20.      
  21.     response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME, ContentType='application/json', Body=json.dumps(data)) 
  22.     
  23.     #extract a summary 
  24.     summary = json.loads(response['Body'].read().decode()) 
  25.      
  26.     #Connect to DynamoDB 
  27.     dynamodb = boto3.resource('dynamodb'
  28.     # Get table 
  29.     table = dynamodb.Table('news'
  30.      
  31.     # Update item stored in dynamoDB 
  32.     update = table.update_item( 
  33.         Key = { "news_url": url  } 
  34.         , 
  35.         ConditionExpression= 'attribute_exists(news_url) ',  
  36.         UpdateExpression='SET summary = :val1, published_date = :val2' 
  37.         ExpressionAttributeValues={ 
  38.             ':val1': summary, 
  39.             ':val2': published_date 
  40.         } 
  41.     ) 

這就是我們?nèi)绾问褂肁WS工具,構(gòu)建并部署一個(gè)簡(jiǎn)單的無(wú)服務(wù)器數(shù)據(jù)管道以讀取最新新聞的過(guò)程。

原文標(biāo)題:Build a Serverless News Data Pipeline using ML on AWS Cloud,作者:Maria Zentsova

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

 

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2018-11-28 09:28:28

無(wú)服務(wù)器架構(gòu)網(wǎng)絡(luò)服務(wù)

2016-11-30 10:33:33

云計(jì)算AWS

2021-01-20 15:46:11

機(jī)器學(xué)習(xí)人工智能無(wú)服務(wù)

2018-10-24 12:15:06

無(wú)服務(wù)器軟件方式

2025-02-14 15:36:05

2015-08-11 09:48:53

2024-01-02 09:00:00

無(wú)服務(wù)器架構(gòu)RASP

2022-10-09 08:08:02

人工智能機(jī)器學(xué)習(xí)平臺(tái)

2022-12-13 10:45:12

無(wú)服務(wù)器架構(gòu)物聯(lián)網(wǎng)工具

2019-04-30 10:27:46

無(wú)服務(wù)器云計(jì)算安全

2022-04-25 15:05:33

機(jī)器學(xué)習(xí)人工智能數(shù)據(jù)集

2017-08-23 10:28:01

AWS云安全服務(wù)

2018-02-24 10:15:36

無(wú)服務(wù)器容器云計(jì)算

2018-10-10 19:39:37

云計(jì)算云服務(wù)Kubernetes

2018-11-02 09:00:15

云端無(wú)服務(wù)器虛擬機(jī)

2023-08-29 15:07:35

無(wú)服務(wù)器計(jì)算云計(jì)算

2020-02-19 10:39:44

機(jī)器學(xué)習(xí)云計(jì)算數(shù)據(jù)

2013-08-14 09:30:50

云端裸機(jī)服務(wù)器

2017-06-05 10:08:33

無(wú)服務(wù)器計(jì)算AWS Lambda

2022-04-08 18:51:43

惡意軟件加密網(wǎng)絡(luò)攻擊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)