首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从自定义ai平台模型登录

如何从自定义ai平台模型登录
EN

Stack Overflow用户
提问于 2020-02-11 06:29:08
回答 2查看 2K关注 0票数 5

最近,我在google云的ai-平台上部署了一个自定义模型,我正在尝试调试预处理逻辑的某些部分。但是,我的print语句没有被记录到堆栈驱动程序输出中。我还尝试使用从google.cloud导入的日志记录客户端,但没有效果。以下是我的自定义预测文件:

代码语言:javascript
复制
import os
import pickle

import numpy as np
from sklearn.datasets import load_iris
import tensorflow as tf

from google.cloud import logging

class MyPredictor(object):
  def __init__(self, model, preprocessor):
    self.logging_client = logging.Client()
    self._model = model
    self._preprocessor = preprocessor
    self._class_names = ["Snare", "Kicks", "ClosedHH", "ClosedHH",  "Clap", "Crash", "Perc"]

  def predict(self, instances, **kwargs):
    log_name = "Here I am"
    logger = self.logging_client.logger(log_name)
    text = 'Hello, world!'
    logger.log_text(text)
    print('Logged: {}'.format(text), kwargs.get("sr"))

    inputs = np.asarray(instances)

    outputs = self._model.predict(inputs)

    if kwargs.get('probabilities'):
      return outputs.tolist()
      #return "[]"
    else:
      return [self._class_names[index] for index in np.argmax(outputs.tolist(), axis=1)]

  @classmethod
  def from_path(cls, model_dir):
    model_path = os.path.join(model_dir, 'model.h5')
    model = tf.keras.models.load_model(model_path, custom_objects={"adam": tf.keras.optimizers.Adam, 
 "categorical_crossentropy":tf.keras.losses.categorical_crossentropy, "lr":0.01, "name": "Adam"})

    preprocessor_path = os.path.join(model_dir, 'preprocessor.pkl')
    with open(preprocessor_path, 'rb') as f:
      preprocessor = pickle.load(f)

    return cls(model, preprocessor)

我在网上找不到任何东西,因为为什么我的日志没有出现在堆栈驱动程序中(没有打印语句,也没有日志库调用)。有人面对过这个问题吗?

谢谢尼基塔

注:如果你有足够的代表创建标签,请添加谷歌-ai-平台标签到这篇文章。我认为这会对处在我这个位置的人有帮助。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-19 19:58:27

来自文档

如果要启用联机预测日志记录,则必须在创建模型资源或创建模型版本资源时配置它,具体取决于要启用的日志记录类型。有三种类型的日志记录,可以独立启用: 访问日志记录,它记录每个请求的时间戳和延迟等信息。 您可以在创建模型资源时启用访问日志记录。 流日志记录,它记录从预测节点到Stackdriver的stderr和stdout流,对于调试非常有用。这种类型的日志记录处于beta状态,计算机引擎( Compute,N1)机器类型不支持它。 您可以在创建模型资源时启用流日志记录。 请求-响应日志,它记录在线预测请求的示例和对BigQuery表的响应。这种类型的日志正在测试中。 您可以通过创建模型版本资源,然后更新该版本来启用请求响应日志记录。

对于用例,请使用以下模板将自定义信息记录到StackDriver中:

模型

代码语言:javascript
复制
gcloud beta ai-platform models create {MODEL_NAME} \
 --regions {REGION} \
 --enable-logging \
 --enable-console-logging

模型版本

代码语言:javascript
复制
gcloud beta ai-platform versions create {VERSION_NAME} \
    --model {MODEL_NAME} \
    --origin gs://{BUCKET}/{MODEL_DIR} \
    --python-version 3.7 \
    --runtime-version 1.15 \
    --package-uris gs://{BUCKET}/{PACKAGES_DIR}/custom-model-0.1.tar.gz \
    --prediction-class=custom_prediction.CustomModelPrediction \
    --service-account custom@project_id.iam.gserviceaccount.com

我试过了,效果很好:

  • 由于@classmethod装饰器,我对构造函数做了一些修改。
  • 创建一个服务帐户并授予它"Stackdriver用户“角色,在创建模型版本时使用它
  • google-cloud-logging库添加到setup.py
  • 考虑启用StackDriver日志的额外成本
  • 使用log_struct时,检查是否传递了正确的类型。(如果使用str,请确保在Python3中使用.decode('utf-8')bytes转换为str )
  • 在Stackdriver创建project_id期间定义logging.Client()参数,否则您将得到:
代码语言:javascript
复制
ERROR:root:Prediction failed: 400 Name "projects//logs/my-custom-prediction-log" is missing the parent component. Expected the form projects/[PROJECT_ID]/logs/[ID]" 

代码如下:

代码语言:javascript
复制
%%writefile cloud_logging.py

import os
import pickle
import numpy as np

from datetime import date
from google.cloud import logging

import tensorflow.keras as keras
LOG_NAME = 'my-custom-prediction-log'

class CustomModelPrediction(object):
    def __init__(self, model, processor, client):    
        self._model = model
        self._processor = processor
        self._client = client

    def _postprocess(self, predictions):
        labels = ['negative', 'positive']
        return [
            {
                "label":labels[int(np.round(prediction))],
                "score":float(np.round(prediction, 4))
            } for prediction in predictions]

    def predict(self, instances, **kwargs):
        logger = self._client.logger(LOG_NAME)
        logger.log_struct({'instances':instances})
        preprocessed_data = self._processor.transform(instances)
        predictions =  self._model.predict(preprocessed_data)
        labels = self._postprocess(predictions)
        return labels

    @classmethod
    def from_path(cls, model_dir):        
        client = logging.Client(project='project_id') # Change to your project
        model = keras.models.load_model(
          os.path.join(model_dir,'keras_saved_model.h5'))
        with open(os.path.join(model_dir, 'processor_state.pkl'), 'rb') as f:
            processor = pickle.load(f)    
        return cls(model, processor, client)

# Verify model locally

from cloud_logging import CustomModelPrediction
classifier = CustomModelPrediction.from_path('.')

requests = ["God I hate the north", "god I love this"]
response = classifier.predict(requests)
response

然后我向样本库查询

代码语言:javascript
复制
python snippets.py my-custom-prediction-log list
Listing entries for logger my-custom-prediction-log:
* 2020-02-19T19:51:45.809767+00:00: {u'instances': [u'God I hate the north', u'god I love this']}
* 2020-02-19T19:57:18.615159+00:00: {u'instances': [u'God I hate the north', u'god I love this']}

为了可视化这些日志,在StackDriver > Logging > Select和您的日志名称中,如果您想看到模型日志,您应该能够选择。

您可以在这里使用我的文件:模型预处理器

票数 6
EN

Stack Overflow用户

发布于 2020-03-31 01:06:23

如果您只希望您的打印工作,而不使用前面的日志记录方法,您只需在打印中添加刷新标志,

代码语言:javascript
复制
print(“logged”,flush=True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60163113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档