sagemaker+deeplens学习
sagemaker+deeplens報告
文章目錄
- sagemaker+deeplens報告
- Sagemaker學習
- 1. 使用boto3對S3操作
- 2.boto3調用sagemaker
- 2.1使用sagemakerRuntime
- 3.sagemaker庫
- 3.1EstimatorBase類
- 3.1.1 具有以下方法:
- 3.1.2 使用小示例
- 部署基于SSD的目標檢測模型上AWS deeplens
- 1.AWS deeplens的兩版本
- 2.關于注冊
- 2.1關于攝像頭恢復出廠設置后注冊的坑
- 3.支持的框架
- 4.選擇算法
- 5.將MXNet框架下的SSD模型轉發為可部署模式
- 轉化為部署模式
- 保存到S3存儲桶
- 6.創建樣例模板的lambda函數
- 7.關于lambda函數
- 關于編寫lambda函數
- 8.deeplens的模型中間件
- 本地上傳模型到deeplens攝像頭并生成中間件,避免模型下載慢問題
- 9.進行部署
- 9.1導入模型
- 9.2創建項目
- 9.3部署
- 10.在瀏覽器中查看項目輸出流
- 11.制作U盤成為可引導設備
- 11.1格式化U盤并對U盤分區
- 11.2 將第一個盤制作成可引導盤
- 11.3 剩余步驟
- 12.排坑
- deeplens連接到WiFi了,但是還控制臺還是長時間顯示offline
Sagemaker學習
1. 使用boto3對S3操作
學sagemaker前先學習一下boto3庫。因為使用Sagemaker要配合S3服務,使用這里 先學習boto3對S3服務的控制。
導入
import boto3指定使用AWS上哪種服務
#獲取s3服務資源對象(相比client對象擁有更高級的抽象調用) s3 = boto3.resource('s3',region_name=region) #獲取S3客戶端對象(原生) s3_client = boto3.client('s3',region_name=region)存儲桶的三個操作對象
#通過資源對象 s3 = boto3.resource('s3',region_name=region) #通過桶對象 s3.Bucket('mybucket') #S3客戶端對象 s3_client = boto3.client('s3',region_name=region)創造一個S3存儲桶
#定義區域,因為S3是全球服務,所以要聲明要使用哪個區域的S3服務 region = 'us-west-2' bucket_name = 'my-bucket' #獲取一個S3客戶端對象 s3_client = boto3.client('s3',region_name=region) s3_client.create_bucket(Bucket=bucket_name)打印桶名
#s3 s3對象 #s3.buckets.all() 獲得s3中的所有桶對象 #bucket.name 桶名 s3 = boto3.resource('s3') for bucket in s3.buckets.all():print(bucket.name)刪除存儲桶
s3_client = boto3.client('s3',region_name=region) s3_client.delete_bucket(Bucket='mybucket')上傳文件
#文件方式 s3 = boto3.resource('s3') s3.Bucket('mybucket').upload_file('/tmp/hello.txt', 'hello.txt')#對象方式 s3 = boto3.resource('s3') with open('filename', 'rb') as data:s3.Bucket('mybucket').upload_fileobj(data, 'mykey')#s3.Bucket()方法返回指定的桶對象 #put_object() key:保存的文件名, Body:對象數據 s3 = boto3.resource('s3') with open('filename', 'rb') as data:s3.Bucket('my-bucket').put_object(Key='test.jpg', Body=data)#使用客戶端對象上傳文件 s3_client = boto3.client('s3',region_name=region) s3_client.upload_file('myfile', Bucket='my-bucket', Key='mys3file')#使用客戶端對象上傳對象 s3_client = boto3.client('s3',region_name=region) with open('filename', 'rb') as data:s3_client.upload_fileobj(data, 'mybucket', 'mykey')分段上傳
關于分段上傳這里解析一下:分段上傳是將一個大型對象,切分為若干個中小片段,并對這若干個片段進行并行上傳,從上傳速度來將,分段上傳可以明顯比普通上傳要快。
分段上傳是一個三步過程:啟動上傳,上傳對象部分,然后在上傳所有部分之后,完成分段上傳。
分段上傳都有一個對應的ID號來識別唯一的上傳操作。
s3_client = boto3.client('s3',region_name=region) #創建分段上傳 response = s3_client.create_multipart_upload(Bucket='my-bucket',Key='myfile') #拿到上傳ID ID = response['UploadId'] #讀取一個大型文件 data = open('file', 'rb') #進行多段上傳 s3_client.upload_part(Body=data,Bucket='my-bucket',Key='myfile',PartNumber=5,UploadId=ID) #對上傳到服務端多段數據發起合并請求 response2 = client.complete_multipart_upload(Bucket='examplebucket',Key='myfile',UploadId=ID)從s3中下載文件
- bucket S3存儲桶名字
- path 桶文件路徑
- localhost_path 本地路徑名
刪除一個S3中的對象
#通過客戶端刪除 s3_client = boto3.client('s3',region_name=region) s3_client.delete_object(Bucket='mybucket',Key='cat.jpg')#通過桶對象刪除 s3 = boto3.resource('s3') s3.Bucket('mybucket').download_file('hello.txt', '/tmp/hello.txt')獲取區域名
boto3.Session.region_name2.boto3調用sagemaker
2.1使用sagemakerRuntime
SageMakerRuntime.Client是一個運行時低級的客戶端類,提供一些簡易的方法供程序員調用sagemaker上的資源。
client = boto3.client('sagemaker-runtime')SageMakerRuntime.Client提供了以下方法:
- can_paginate()
- generate_presigned_url()
- get_paginator()
- get_waiter()
- invoke_endpoint()
can_paginate()和get_paginator()
can_paginate(operation_name)用于判斷一個方法是否允許分頁。
get_paginator()用于個一個操作創建分頁。
關于分頁請求這個概念,這里簡單描述一下:有些AWS操作返回的結果不完整,需要后續請求才能獲得整個結果集。在前一個請求未處理的情況下發送后續請求以繼續的過程稱為分頁。例如,amazon s3的list objects操作一次最多返回1000個對象,您必須使用適當的標記發送后續請求,以便檢索下一頁的結果。
這里引用官方的案例:
import botocore.session# Create a session and a client session = botocore.session.get_session() client = session.create_client('s3', region_name='us-west-2')# Create a reusable Paginator paginator = client.get_paginator('list_objects')# Create a PageIterator from the Paginator page_iterator = paginator.paginate(Bucket='my-bucket')for page in page_iterator:print(page['Contents'])invoke_endpoint()
這個方法比較常用,該方法用于調用一個sagemaker終端節點去做模型的結果推斷。
- sagemaker終端節點是sagemaker的一項服務,用于將訓練好的模型進行快速的部署并用于對數據集進行結果推斷。(一個容器化部署的模型)
invoke_endpoint()所有參數如下:
response = client.invoke_endpoint(EndpointName='string', #終端節點名字Body=b'bytes'|file, #推斷的數據ContentType='string', #數據的格式Accept='string', #推斷結果的格式CustomAttributes='string',TargetModel='string',TargetVariant='string',InferenceId='string' )一個小示例:
假設你有一個終端節點叫myEndPoint,用來做貓狗分類的推斷。
ENDPOINT_NAME = 'myEndPoint' with open('cat.jpg', 'wb') as data:response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,ContentType='image/jpeg',Body=data)#輸出結果print(response) #response的結構 #{ # 'Body': StreamingBody(), 結果 # 'ContentType': 'string', 結果格式 # 'InvokedProductionVariant': 'string', # 'CustomAttributes': 'string' #}3.sagemaker庫
3.1EstimatorBase類
sagemaker有一個Estimator Base類,用于執行端對端的sagemaker的訓練和部署任務
class sagemaker.estimator.Estimator其構造參數:
sagemaker.estimator.EstimatorBase(role, instance_count=None, instance_type=None, volume_size=30, volume_kms_key=None, max_run=86400, input_mode='File', output_path=None, output_kms_key=None, base_job_name=None, sagemaker_session=None, tags=None, subnets=None, security_group_ids=None, model_uri=None, model_channel_name='model', metric_definitions=None, encrypt_inter_container_traffic=False, use_spot_instances=False, max_wait=None, checkpoint_s3_uri=None, checkpoint_local_path=None, rules=None, debugger_hook_config=None, tensorboard_output_config=None, enable_sagemaker_metrics=None, enable_network_isolation=False, profiler_config=None, disable_profiler=False, **kwargs)3.1.1 具有以下方法:
獲取訓練鏡像
#返回為訓練用的一個docker鏡像路徑 training_image_uri() #如: training_image_uri(sess.boto_region_name, 'object-detection', repo_version="latest")設置超參
#設置算法的參數(這根據你用的是哪個算法) hyperparameters()判斷Estimator是否需要網絡隔離
#判斷Estimator是否需要網絡隔離,返回bool類型 enable_network_isolation()指定訓練名
#指定訓練名 prepare_workflow_for_training(job_name=None)執行訓練
#執行訓練任務, #inputs:訓練通道 logs:日志 job_name:訓練任務名 fit(inputs=None, wait=True, logs='All', job_name=None, experiment_config=None)Neo編譯
#使用Neo編譯一個模型 #target_instance_family:標識編譯后要運行模型的設備 #input_shape:通過dict的形象指定輸入通道, #如:{‘data’:[1,3,1024,1024]}, or {‘var1’: [1,1,28,28], ‘var2’:[1,1,28,28]} #output_path:編譯后的模型存儲路徑 #framework:框架 #framework_version:版本 #compile_max_run:設置編譯超時秒數 #target_platform_os:捆綁的操作系統,如:linux #target_platform_arch:系統位數,如:X86_64 #target_platform_accelerator:硬件加速器平臺,如NVIDIA compile_model(target_instance_family, input_shape, output_path, framework=None, framework_version=None, compile_max_run=900, tags=None, target_platform_os=None, target_platform_arch=None, target_platform_accelerator=None, compiler_options=None, **kwargs)附加訓練任務
#附加一個訓練任務 #作用:綁定某個訓練任務,可以獲取對應的任務的配置,如果綁定的訓練任務還在訓練,那么綁定操作將被阻塞。 # 返回結果是:Estimator實例,通過該實例可以實現deploy()等操作 #training_job_name:綁定的訓練任務名 #sagemaker_session: sagemaker的session #model_channel_name:模型路徑 classmethod attach(training_job_name, sagemaker_session=None, model_channel_name='model')打印log
#打印log logs()部署終端節點
#部署終端節點 #只展示部分參數,具體看官方文檔 #initial_instance_count:部署實例個數 #instance_type:實例類型 #返回:sagemaker.predictor.Predictor對象 #在sagemaker2.0中 RealTimePredictor已經被更名為Predictor deploy(initial_instance_count, instance_type) deploy(initial_instance_count, instance_type,endpoint_name=None)注冊模型包
#創建用于創建SageMaker模型或在市場上上市的模型包 #content_types:模型輸入MIME類型(模型輸入類型) #response_types:模型輸出MIME類型(模型輸出類型) #inference_instances:推斷實例允許的實例類型列表 #transform_instances:批轉換實例允許的實例類型 register(content_types, response_types, inference_instances, transform_instances)創建模型對象
#創建一個模型 #返回的是:sagemaker.model.Model對象 create_model(**kwargs) #接受以下參數: #image_uri:一個docker容器鏡像 #model_data:模型,一般是存放在s3中的模型(.tar.gz包) #role:角色(與IAM服務有關) #env:環境變量,dict類型,與image_uri指定的容器中有關變量 #name:模型名稱 #vpc_config:vpc配置,部署時會用到 #enable_network_isolation:網絡隔離,一般為false #model_kms_key:kms的密鑰(與kms服務有關)3.1.2 使用小示例
本示例使用的是官方的示例,由于這個示例 有點久遠,有些方法調用的還是sagemaker sdk v1版本的API,所有使用的時候可能會有提示警告。本人做了些許修改,完整代碼請查閱:https://github.com/aws/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/object_detection_pascalvoc_coco/object_detection_incremental_training.ipynb
第一步:獲取執行role
#本示例在jupyter notebook下運行 import sagemaker from sagemaker import get_execution_role#第一步獲取執行權限 role = get_execution_role()第二部:獲取數據并進行處理
#從官方指定的地址下載2007年和2012年Pascal VOC 數據集 # Download the dataset !wget -P /tmp http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar !wget -P /tmp http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar !wget -P /tmp http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar # # Extract the data. !tar -xf /tmp/VOCtrainval_11-May-2012.tar && rm /tmp/VOCtrainval_11-May-2012.tar !tar -xf /tmp/VOCtrainval_06-Nov-2007.tar && rm /tmp/VOCtrainval_06-Nov-2007.tar !tar -xf /tmp/VOCtest_06-Nov-2007.tar && rm /tmp/VOCtest_06-Nov-2007.tar#如果你打算使用自己放在s3中的數據可以運行以下代碼 #!aws s3 cp s3://my-bucket/data-path ./localhost-path#運行官方提供的腳本文件 #這幾行腳本代碼是用于生成rec序列文件 #該文件在上面提供的網址的github目錄下 !python tools/prepare_dataset.py --dataset pascal --year 2007,2012 --set trainval --target VOCdevkit/train.lst !python tools/prepare_dataset.py --dataset pascal --year 2007 --set test --target VOCdevkit/val.lst --no-shuffle#關于使用自己只定義的數據 #在使用官方提供的腳本時應該注意:如果你的數據集是按照Pascal VOC2007和Pascal VOC2012數據集 #構建的目錄結構,請到腳本目錄下的pascal_voc.names,更改你數據集中對應的便簽名,官方提供的腳 #本將會讀取該文件的label,用作生成.rec .lst等文件。更多的Pascal VOC目錄結構請根據需要自行 #查找。第三步:上傳處理的數據到S3存儲桶中
#上傳到S3有很多方式,請參考上面boto3對s3的控制 import boto3 s3 = boto3.resource('s3')#訓練集的上傳 train_localhost_path = '' train_S3_path = '' s3.Bucket('mybucket').upload_file(train_localhost_path, train_S3_path)#驗證集的上傳 val_localhost_path = '' val_S3_path = '' s3.Bucket('mybucket').upload_file(val_localhost_path, val_S3_path)第四步:獲取內置算法鏡像
#舊的API #from sagemaker.amazon.amazon_estimator import get_image_uri #training_image = get_image_uri(sess.boto_region_name, 'object-detection', repo_version="latest")#新的API sess = sagemaker.Session() training_image = sagemaker.image_uris.retrieve("object-detection", sess.boto_region_name)第五步:創建Estimator實例
s3_output_location = 's3的輸出路徑' model = sagemaker.estimator.Estimator(training_image,role, instance_count=1, instance_type='ml.p3.2xlarge',volume_size = 50,max_run = 360000,input_mode= 'File',output_path=s3_output_location,sagemaker_session=sess)第六步:設置超參數
關于sagemaker內置算法:目標檢測算法,其是用那種方式實現的。sagemaker中的目標檢測算法是使用SSD (Single Shot multibox Detector)框架實現的。并支持兩個基本網絡: VGG 和 ResNet。 可以從頭開始訓練網絡,也可以使用已在 ImageNet 數據集上預先訓練的模型進行訓練。
#不同的內置算法會有不同的超參數 #目標檢測的超參數可以在以下網址中找到: #https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object-detection.html model.set_hyperparameters(base_network='resnet-50',use_pretrained_model=1,num_classes=20,mini_batch_size=32,epochs=1,learning_rate=0.001,lr_scheduler_step='3,6',lr_scheduler_factor=0.1,optimizer='sgd',momentum=0.9,weight_decay=0.0005,overlap_threshold=0.5,nms_threshold=0.45,image_shape=300,label_width=350,num_training_samples=16551)第七步:訓練
#舊的API #train_data = sagemaker.session.s3_input(s3_train_data, distribution='FullyReplicated', # content_type='application/x-recordio', s3_data_type='S3Prefix') #validation_data = sagemaker.session.s3_input(s3_validation_data, distribution='FullyReplicated', # content_type='application/x-recordio', s3_data_type='S3Prefix') #data_channels = {'train': train_data, 'validation': validation_data}#新的API如下: from sagemaker.inputs import TrainingInput train_data = '訓練集S3路徑' validation_data = '驗證集的S3路徑' train_channel = TrainingInput(train_data, content_type='application/x-recordio') valid_channel = TrainingInput(validation_data, content_type='application/x-recordio') data_channels = {'train': train_channel, 'validation': valid_channel} #開啟訓練 model.fit(inputs=data_channels, logs=True)第八步:部署
object_detector = model.deploy(initial_instance_count = 1,instance_type = 'ml.m4.xlarge')第九步:驗證模型
驗證模型之前,請下載一張用于驗證的圖片。
file_name = 'test.jpg' with open(file_name, 'rb') as image:f = image.read()b = bytearray(f)ne = open('n.txt','wb')ne.write(b)import json #預測 object_detector.content_type = 'image/jpeg' results = object_detector.predict(b) detections = json.loads(results) print (detections) #結果格式 #https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object-detection-in-formats.html#可視化函數 def visualize_detection(img_file, dets, classes=[], thresh=0.6):"""visualize detections in one imageParameters:----------img : numpy.arrayimage, in bgr formatdets : numpy.arrayssd detections, numpy.array([[id, score, x1, y1, x2, y2]...])each row is one objectclasses : tuple or list of strclass namesthresh : floatscore threshold"""import randomimport matplotlib.pyplot as pltimport matplotlib.image as mpimgimg=mpimg.imread(img_file)plt.imshow(img)height = img.shape[0]width = img.shape[1]colors = dict()for det in dets:(klass, score, x0, y0, x1, y1) = detif score < thresh:continuecls_id = int(klass)if cls_id not in colors:colors[cls_id] = (random.random(), random.random(), random.random())xmin = int(x0 * width)ymin = int(y0 * height)xmax = int(x1 * width)ymax = int(y1 * height)rect = plt.Rectangle((xmin, ymin), xmax - xmin,ymax - ymin, fill=False,edgecolor=colors[cls_id],linewidth=3.5)plt.gca().add_patch(rect)class_name = str(cls_id)if classes and len(classes) > cls_id:class_name = classes[cls_id]plt.gca().text(xmin, ymin - 2,'{:s} {:.3f}'.format(class_name, score),bbox=dict(facecolor=colors[cls_id], alpha=0.5),fontsize=12, color='white')plt.show()object_categories = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']# Setting a threshold 0.20 will only plot detection results that have a confidence score greater than 0.20. threshold = 0.20# Visualize the detections. visualize_detection(file_name, detections['prediction'], object_categories, threshold)最后一步:關閉終端節點
sagemaker.Session().delete_endpoint(object_detector.endpoint)部署基于SSD的目標檢測模型上AWS deeplens
1.AWS deeplens的兩版本
AWS deeplens有兩個版本,分別是:V1.1,和V1.0
關于這兩個版本的硬件區別:https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-hardware.html
關于硬件和軟件的版本區別這里就不多說,這里主要介紹如何將自己的深度學習模型部署到deeplens上面。
2.關于注冊
關于注冊我就不多說了,官方文檔有具體說明https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-getting-started-register.html
2.1關于攝像頭恢復出廠設置后注冊的坑
如果你重置攝像頭恢復了出廠設置,(假設你當前的設備為V1.1版本)使用V1.1版本的注冊方法,但是控制臺中怎么都無法檢測到攝像頭的USB注冊口,那可能是重置后的版本沒有裝好USB注冊口的驅動,那么你應該使用一下V1.0的方式注冊,V1.0注冊中有一個步驟是更新設備軟件,更新完軟件后可以改為V1.1的方式進行設備的注冊。
3.支持的框架
當前AWS deeplens支持一下深度學習框架:MXNet,TensorFlow,Caffe
如果你使用的是其他的算法框架,并要部署到AWS deeplens上面部署,你可能需要一些使用工具將你當前使用的框架訓練出來的模型轉換為MXNet,TensorFlow,Caffe這三個框架模型。
之所以使用這三個框架,很大一部分原因是:他那個AWS deeplens攝像頭里面用的是Intel? Atom 處理器因為攝像頭會使用英特爾的一些模型優化工具將這三個框架訓練處理的模型轉換為攝像頭可以處理的優化中間件,關于這個中間件,我后面會詳細說明。
現在你需要知道的是AWS deeplens只支持三種框架,而sagemaker內置算法訓練處理的模型用的是MXNet,所以如果你使用的是sagemaker訓練的深度學習模型,基本可以無縫地放到AWS deeplens上面跑。(但是如果是基于SSD的目標檢測模型,可以還需要一些格外的處理。)
4.選擇算法
改步驟主要針對sagemaker和AWS deeplens集成服務,因為這里選擇的是SSD的目標檢測模型(一種目標檢測算法),所以在選擇算法的時候請選擇:Object Detection
關于更多的算法需要去官方文檔看。
AWS DeepLens 是一款支持深度學習的視頻攝像機。它與多個 AWS 機器學習服務集成,并可根據從 AWS 云預配置的部署模型執行本地推理。所以DeepLens主要是搭載那些機器視覺模型的,主要還是:Object Detection,image classification,圖像風格轉換
5.將MXNet框架下的SSD模型轉發為可部署模式
這個只針對MXNet框架下的訓練的SSD模型。
關于將SSD模型轉發為可部署模式,這里需要說明一下為什么要轉換為部署模式,在sagemaker訓練的過程中,sagemaker的內置算法會在模型的網絡結構中添加一些只在訓練中才有用的網絡結構:如dropout,smooth等,但我們部署模型時是不需要這些層的,這時我們需要將模型轉化為部署模式。
官網文檔中提供的地址不對了(不知道現在改了沒),現在打開這個地址:https://github.com/apache/incubator-mxnet/tree/master/,然后使用GitHub將MXnet整個庫下載下來,然后在git中運行如下命令:
git reset --hard 73d88974f8bca1e68441606fb0787a2cd17eb364該命令是將GitHub的本地倉庫回滾到指定的版本,因為官方是要求用這個版本的MXnet的進行部署模式的轉換。
然后進入到這個庫目錄中,部署腳本就在MXnet項目目錄下的:
cd incubator-mxnet/example/ssd/然后將模型放到model文件夾下面然后對模型壓縮包進行解壓,解壓后會發現兩個文件,一個叫:
- model_algo_1-0000.params
- model_algo_1-symbol.json
后綴為.params的文件是模型,.json的文件是模型網絡的拓撲結構。
轉化為部署模式
然后運行以下命令:
python deploy.py --network resnet50 --prefix F:\Mxnet\incubator-mxnet\example\ssd\model\model_algo_1 --data-shape 300 --num-class 2這里只解析我使用的參數,更多的參數自己看那個腳本或者使用 –help。
- –network 網絡結構
- –prefix 模型的工程前綴(去掉文件后綴后的路徑就是你的工程前綴)
- –data-shape 模型輸入成的大小(這里300,是指圖片是300*300的格式,圖片通道數默認是3)
- –num-class 檢測分類的個數
保存到S3存儲桶
將轉化為部署模式的SSD模型,重新打包成tar.gz壓縮包,并放到存儲桶進行存儲。如果你用的是window系統的話,去下載個7Z壓縮,7Z壓縮能制作tar.gz壓縮包。如果你是使用Linux系統,在命令行輸入:
tar czvf my.tar.gz file1 file2 ....fileN- file1 file2 …fileN是要壓縮的文件
- my.tar.gz是壓縮后壓縮包的名字
6.創建樣例模板的lambda函數
官方文檔的lambda樣例比較舊,所以使用控制臺中官方樣例中的lambda樣例,進入AWS deeplens控制臺選擇Projects,創建項目
然后到lambda函數服務的控制臺,會發現多出一個lambda函數,如下:
進入這個lambda函數的編輯頁
編輯好自定義的lambda函數,記得發布版本,只有發布了的版本才能部署到deeplens上
7.關于lambda函數
AWS deeplens需要lambda函數協助,利用lambda函數AWS deeplens可以調用模型進行推斷,AWS deeplens里面保存了模型和lambda函數,在AWS deeplens中創建項目需要綁定一個模型和一個lambda函數,當攝像頭進行模型部署的時候,AWS deeplens將會上傳模型和lambda函數到攝像頭設備上。當攝像頭運行時,將調用lambda的函數將視頻幀傳遞給模型進行處理,并將處理后的視頻幀傳到項目流那里。
在AWS deeplens攝像頭注冊成功時,會創建如下兩個lambda函數,請勿刪除:
- deeplens_admin_version_poller
- deeplens_admin_model_downloader
關于編寫lambda函數
lambda函數可以使用官方的簡單案例的模板,然后看他那個核心代碼。因為要調用模型對視頻幀進行處理,所以要調用一些核心接口:
關于設備庫看官方文檔:https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-device-library.html
mo模塊
mo模塊是用來優化模型并生成AWS DeepLens 表示形式(也就是中間件)
import mo error, model_path = mo.optimize(model_name, input_width, input_height, platform, aux_inputs)- model_path 中間件路徑
awscam模塊
awscam模塊用來獲取視頻幀
import awscam #獲取視頻幀,video_frame是視頻幀 ret, video_frame = awscam.getLastFrame()awscam模塊有個Model類,用來加載機器學習模型
import awscam #加載的是經過mo模塊優化后的模型 #model = awscam.Model(model_topology_file, loading_config),如: model = awscam.Model(model_path, {'GPU': 1})#調用模型的接口進行視頻幀推斷 #raw_inference_results = model.doInference(video_frame) #解析結果 #result = model.parseResult(model_type, raw_infer_result) #如:parsed_inference_results = model.parseResult(model_type,model.doInference(frame_resize))8.deeplens的模型中間件
將 AWS DeepLens 模型構件從 Caffe(.prototxt 或 .caffemodel)、MXNet(.json 和 .params)或 TensorFlow (.pb) 表示形式轉換為 AWS DeepLens 表示形式并執行必要的優化。
關于這個優化模塊去Intel優化工具OpenVINO的官網看:https://docs.openvinotoolkit.org/latest/index.html
關于這個中間件去這里看:https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html
- .xml -描述網絡拓撲
- .bin -包含權重并偏置二進制數據。
deeplens中的優化腳本在目錄
cd /opt/awscam/intel/deeplearning_deploymenttoolkit/deployment_tools/model_optimizer有幾個優化腳本:
- mo_caffe.py
- mo_kaldi.py
- mo_mxnet.py
- mo_onnx.py
- mo_tf.py
- mo.py
我用的mxnet框架,所以使用的是mo_mxnet.py
#查看有哪些參數 python3 mo_mxnet.py -h#一些使用案例 python3 mo_mxnet.py --input_model /home/aws_cam/model/model_algo_1-0000.params --data_type FP16 --scale 1 --model_name model_algo_1 --reverse_input_channels --input_shape [1,3,300,300] --legacy_mxnet_model當然我們一般不用這些腳本,我們一般在lambda函數中通過mo.optimize來進行模型的轉化和優化。
本地上傳模型到deeplens攝像頭并生成中間件,避免模型下載慢問題
不過這里也引出了一些小技巧,因為AWS deeplens只在部分區開放了服務,當涉及到跨區域時,就可能會面臨網絡帶寬問題。因為上傳模型到云端,然后通過攝像頭自動化部署從云端的下載模型到攝像頭本地并部署,這個下載的過程可能十分緩慢。這是我們可以優先在本地上傳模型到攝像頭內部,然后通過腳本在deeplens內部生成模型中間件,然后在lambda函數指明模型中間件位置即可。而云端可以捆綁的一個空殼的模型和一個改寫好路徑的lambda函數,然后調用自動部署功能。
9.進行部署
部署步驟如下:
9.1導入模型
導入模型可以從一下地方導入:
9.2創建項目
創建一個項目需要兩樣東西:一個是模型,一個是lambda函數
模型只能有一個,而lambda函數至少有一個。
9.3部署
因為是自動化部署,選擇好部署的項目一鍵部署即可,這個部署過程并不難,好部署好項目核心內容主要還是如何使用lambda函數進行視頻幀的處理,和如何對深度學習的網絡的輸出進行解析。
10.在瀏覽器中查看項目輸出流
deeplens本來就是一臺計算機,設備開放4000端口,供給其他計算機用瀏覽器訪問,并查看項目視頻流的輸出,
地址:https://your-device-ip-address:4000,your-device-ip-address是你設備的私網IP地址。
用瀏覽器對攝像頭的指定開放端口進行訪問前請確保你是有下載證書的,關于證書下載去官方文檔看,整個執行的過程可以分一下基本分:
11.制作U盤成為可引導設備
這里主要是制作USB 閃存驅動器成為可引導設備,這是為了制作將AWS Deeplens恢復到出廠設置的引導U盤。官方文檔提供的在Ubuntu下制作為引導U盤,我這里在window系統下制作。
11.1格式化U盤并對U盤分區
U盤要分兩個區
- 第一個分區:2 GB 的 FAT32
- 第二個分區:至少 9 GB 的 NTFS
第一分區是用來引導設備安裝,而第二分區就是你的攝像頭系統鏡像了。
分區可以使用分區助手或其他分區軟件,window系統自帶的分區功能應該也能分U盤, FAT32和NTFS是U盤的兩種系統,式化時可以選擇的。
11.2 將第一個盤制作成可引導盤
去下載一個叫unetbootin的軟件,軟件長這樣,然后安裝我給的截圖操作即可。
11.3 剩余步驟
剩余步驟按官方文檔操作即可,https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-device-factory-reset-preparation.html
12.排坑
deeplens連接到WiFi了,但是還控制臺還是長時間顯示offline
可能是greengrassd服務卡住了,在deeplens終端運行一下代碼:
sudo systemctl restart greengrassd.service --no-block總結
以上是生活随笔為你收集整理的sagemaker+deeplens学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云电脑来了阿里出的云电脑
- 下一篇: REST API解析