[KFServing] Invalid argument: NodeDef mentions attr 'allowed_devices' 이슈 해결

노하람·2022년 3월 10일
0
2022-03-10 00:52:21.727009: I tensorflow_serving/util/retrier.cc:33] Retrying of Loading servable: {name: dqn-op version: 1} retry: 1
2022-03-10 00:52:21.744881: I external/org_tensorflow/tensorflow/contrib/session_bundle/bundle_shim.cc:363] Attempting to load native SavedModelBundle in bundle-shim from: /mnt/models/1
2022-03-10 00:52:21.744927: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:31] Reading SavedModel from: /mnt/models/1
2022-03-10 00:52:21.753499: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:54] Reading meta graph with tags { serve }
2022-03-10 00:52:21.778289: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:202] Restoring SavedModel bundle.
2022-03-10 00:52:21.816753: E external/org_tensorflow/tensorflow/core/framework/op_segment.cc:54] Create kernel failed: Invalid argument: NodeDef mentions attr 'allowed_devices' not in Op<name=VarHandleOp; signature= -> resource:resource; attr=container:string,default=""; attr=shared_name:string,default=""; attr=dtype:type; attr=shape:shape; is_stateful=true>; NodeDef: {{node default_policy/default_policy/dense_1/kernel/Adam}}. (Check whether your GraphDef-interpreting binary is up to date with your GraphDef-generating binary.).
2022-03-10 00:52:21.816788: E external/org_tensorflow/tensorflow/core/common_runtime/executor.cc:641] Executor failed to create kernel. Invalid argument: NodeDef mentions attr 'allowed_devices' not in Op<name=VarHandleOp; signature= -> resource:resource; attr=container:string,default=""; attr=shared_name:string,default=""; attr=dtype:type; attr=shape:shape; is_stateful=true>; NodeDef: {{node default_policy/default_policy/dense_1/kernel/Adam}}. (Check whether your GraphDef-interpreting binary is up to date with your GraphDef-generating binary.).
	 [[default_policy/default_policy/dense_1/kernel/Adam]]
2022-03-10 00:52:21.816929: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:311] SavedModel load for tags { serve }; Status: fail. Took 72003 microseconds.

위처럼 KFserving에서 모델 서빙 시 tensorflow 오류가 발생하는 경우가 있다.
이는 텐서플로 버전이 모델 빌드에 사용하는 버전과 KFServing에서 사용하는 Tensorflow 버전이 다르기 때문에 발생하는 오류이다.

가장 좋은 해결 방법은 현재 사용하는 KFserving 버전과, 이에 사용되는 Tensorflow 버전을 알아내서 빌드 시 버전을 맞춰주는 것이나 KFserving 릴리즈 별 텐서플로 버전을 알아내기가 어려워서
모델 빌드 시 텐서플로 버전을 다운그레이드하면서 맞춰주어 해결하였다.

환경

설치한 Kubeflow의 버전은 v1.4.1 버전이고, 해당 버전에 KFServing은 v0.6.1 버전이다.
하지만 빌드한 kfserving은 v0.5.1을 기반으로 제작된 컴포넌트이다.
그럼 v0.6.1을 기반으로 한 컴포넌트를 찾아내야할까?

kfserving_launcher_op = components.load_component_from_url(
        "https://raw.githubusercontent.com/kubeflow/pipelines/master/components/kubeflow/kfserving/component.yaml"
    )

시도

  1. KFServing -> Kserve로 최신화 한다.(실패)
  • load_component_from_url을 kserve 기반으로, apiVersion도 kserve로 변경해주었다.
  • 해당 url은 내용은 모두 비슷하나, kserve v0.7.0을 이용한다. image: quay.io/aipipeline/kserve-component:v0.7.0
def create_kfserving_task(name, namespace, tfjob_op, model_volume_op):
    """
    Create a Kubeflow Pipelines job for KFServing inference.
    
    Args:
        name(str): KatibOp의 이름입니다.
        namespace(str): kubeflow-user-example-com만 사용합니다.
        tfjob_op: create_tfjob_task의 리턴으로 받아오는 ContainerOp입니다.
        model_volume_op: dsl.VolumeOp로 생성한 ConatainerOp입니다.
    """

    inference_service = """
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: {}
  namespace: {}
  annotations:
    "sidecar.istio.io/inject": "false"
spec:
  predictor:
    tensorflow:
      storageUri: "pvc://{}/"
""".format(name, namespace, str(model_volume_op.outputs["name"]))

    # kfserving_launcher_op = components.load_component_from_url(
    #     "https://raw.githubusercontent.com/kubeflow/pipelines/master/components/kubeflow/kfserving/component.yaml"
    # ) # serving.kubeflow.org/v1beta1
    kfserving_launcher_op = components.load_component_from_url(
        "https://raw.githubusercontent.com/kubeflow/pipelines/master/components/kserve/component.yaml"
    )
    kfserving_launcher_op(
        action="apply", inferenceservice_yaml=inference_service
    ).after(tfjob_op)

해결

ray[rllib] 코드에서 모델을 TF 형식으로 export할 때 TF1 버전으로 저장되는 문제였다!
강화학습 agent config로 framework를 tf로 지정해놨었는데, tf2로 지정해야한다.. 하하..(관련한 코드는 ray 깃허브에서 확인하실 수 있습니다!)

profile
MLOps, MLE 직무로 일하고 있습니다😍

0개의 댓글