সম্পূর্ণ কাস্টম উপাদান নির্মাণ

একটি সম্পূর্ণ কাস্টম উপাদান তৈরি করতে কিভাবে TFX API ব্যবহার করতে হয় তা এই নির্দেশিকা বর্ণনা করে। সম্পূর্ণ কাস্টম উপাদানগুলি আপনাকে কম্পোনেন্ট স্পেসিফিকেশন, এক্সিকিউটর এবং কম্পোনেন্ট ইন্টারফেস ক্লাস নির্ধারণ করে উপাদান তৈরি করতে দেয়। এই পদ্ধতিটি আপনাকে আপনার প্রয়োজনের সাথে মানানসই করার জন্য একটি মানক উপাদান পুনরায় ব্যবহার এবং প্রসারিত করতে দেয়।

আপনি যদি TFX পাইপলাইনে নতুন হন, তাহলে TFX পাইপলাইনের মূল ধারণা সম্পর্কে আরও জানুন

কাস্টম নির্বাহক বা কাস্টম উপাদান

কম্পোনেন্টের ইনপুট, আউটপুট এবং এক্সিকিউশন প্রোপার্টিগুলি বিদ্যমান কম্পোনেন্টের মতো একই হলে শুধুমাত্র কাস্টম প্রসেসিং লজিকের প্রয়োজন হলে, একটি কাস্টম এক্সিকিউটর যথেষ্ট। যেকোনও ইনপুট, আউটপুট বা এক্সিকিউশন প্রপার্টি যেকোন বিদ্যমান TFX কম্পোনেন্ট থেকে আলাদা হলে একটি সম্পূর্ণ কাস্টম কম্পোনেন্ট প্রয়োজন।

কিভাবে একটি কাস্টম উপাদান তৈরি করতে?

একটি সম্পূর্ণ কাস্টম উপাদান বিকাশের জন্য প্রয়োজন:

  • নতুন উপাদানের জন্য ইনপুট এবং আউটপুট আর্টিফ্যাক্ট স্পেসিফিকেশনের একটি সংজ্ঞায়িত সেট। বিশেষভাবে, ইনপুট আর্টিফ্যাক্টের ধরনগুলি সেই উপাদানগুলির আউটপুট আর্টিফ্যাক্টের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত যেগুলি শিল্পকর্মগুলি তৈরি করে এবং আউটপুট আর্টিফ্যাক্টগুলির প্রকারগুলি যদি থাকে তবে সেই উপাদানগুলির ইনপুট আর্টিফ্যাক্টের প্রকারের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত যা যদি থাকে৷
  • নন-আর্টিফ্যাক্ট এক্সিকিউশন প্যারামিটার যা নতুন উপাদানের জন্য প্রয়োজন।

কম্পোনেন্ট স্পেক

ComponentSpec ক্লাস একটি কম্পোনেন্টে ইনপুট এবং আউটপুট আর্টিফ্যাক্ট এবং সেইসাথে কম্পোনেন্ট এক্সিকিউশনের জন্য ব্যবহৃত প্যারামিটারগুলি সংজ্ঞায়িত করে কম্পোনেন্ট কন্ট্রাক্টকে সংজ্ঞায়িত করে। এর তিনটি অংশ রয়েছে:

  • ইনপুটস : ইনপুট আর্টিফ্যাক্টগুলির জন্য টাইপ করা প্যারামিটারগুলির একটি অভিধান যা কম্পোনেন্ট এক্সিকিউটরে পাস করা হয়। সাধারণত ইনপুট আর্টিফ্যাক্টগুলি আপস্ট্রিম উপাদানগুলি থেকে আউটপুট হয় এবং এইভাবে একই ধরণের ভাগ করে।
  • আউটপুটস : আউটপুট আর্টিফ্যাক্টের জন্য টাইপ করা প্যারামিটারের একটি অভিধান যা উপাদানটি তৈরি করে।
  • প্যারামিটার : অতিরিক্ত এক্সিকিউশন প্যারামিটার আইটেমের একটি অভিধান যা কম্পোনেন্ট এক্সিকিউটরে পাস করা হবে। এগুলি নন-আর্টিফ্যাক্ট প্যারামিটার যা আমরা পাইপলাইন ডিএসএল-এ নমনীয়ভাবে সংজ্ঞায়িত করতে চাই এবং কার্যকর করতে চাই।

এখানে ComponentSpec এর একটি উদাহরণ রয়েছে:

class HelloComponentSpec(types.ComponentSpec):
  """ComponentSpec for Custom TFX Hello World Component."""

  PARAMETERS = {
      # These are parameters that will be passed in the call to
      # create an instance of this component.
      'name': ExecutionParameter(type=Text),
  }
  INPUTS = {
      # This will be a dictionary with input artifacts, including URIs
      'input_data': ChannelParameter(type=standard_artifacts.Examples),
  }
  OUTPUTS = {
      # This will be a dictionary which this component will populate
      'output_data': ChannelParameter(type=standard_artifacts.Examples),
  }

নির্বাহক

এর পরে, নতুন উপাদানের জন্য নির্বাহক কোড লিখুন। মূলত, একটি নতুন সাবক্লাস base_executor.BaseExecutor এর Do ফাংশন ওভাররাইড করে তৈরি করতে হবে। Do ফাংশনে, আর্গুমেন্ট input_dict , output_dict এবং exec_properties যা INPUTS , OUTPUTS এবং PARAMETERS এ যথাক্রমে ComponentSpec-এ সংজ্ঞায়িত করা হয়েছে। exec_properties এর জন্য, মান একটি অভিধান সন্ধানের মাধ্যমে সরাসরি আনা যেতে পারে। input_dict এবং output_dict এ আর্টিফ্যাক্টগুলির জন্য, artifact_utils ক্লাসে সুবিধাজনক ফাংশন উপলব্ধ রয়েছে যা আর্টিফ্যাক্ট ইনস্ট্যান্স বা আর্টিফ্যাক্ট uri আনতে ব্যবহার করা যেতে পারে।

class Executor(base_executor.BaseExecutor):
  """Executor for HelloComponent."""

  def Do(self, input_dict: Dict[Text, List[types.Artifact]],
         output_dict: Dict[Text, List[types.Artifact]],
         exec_properties: Dict[Text, Any]) -> None:
    ...

    split_to_instance = {}
    for artifact in input_dict['input_data']:
      for split in json.loads(artifact.split_names):
        uri = artifact_utils.get_split_uri([artifact], split)
        split_to_instance[split] = uri

    for split, instance in split_to_instance.items():
      input_dir = instance
      output_dir = artifact_utils.get_split_uri(
          output_dict['output_data'], split)
      for filename in tf.io.gfile.listdir(input_dir):
        input_uri = os.path.join(input_dir, filename)
        output_uri = os.path.join(output_dir, filename)
        io_utils.copy_file(src=input_uri, dst=output_uri, overwrite=True)

ইউনিট একটি কাস্টম নির্বাহক পরীক্ষা

কাস্টম এক্সিকিউটরের জন্য ইউনিট পরীক্ষাগুলি এর মতোই তৈরি করা যেতে পারে

কম্পোনেন্ট ইন্টারফেস

এখন যেহেতু সবচেয়ে জটিল অংশটি সম্পূর্ণ হয়েছে, পরবর্তী পদক্ষেপটি হল এই অংশগুলিকে একটি উপাদান ইন্টারফেসে একত্রিত করা, যাতে উপাদানটিকে একটি পাইপলাইনে ব্যবহার করা যায়। বেশ কয়েকটি ধাপ রয়েছে:

  • কম্পোনেন্ট ইন্টারফেসটিকে base_component.BaseComponent এর একটি সাবক্লাস করুন
  • ComponentSpec ক্লাসের সাথে একটি ক্লাস ভেরিয়েবল SPEC_CLASS বরাদ্দ করুন যা আগে সংজ্ঞায়িত করা হয়েছিল
  • এক্সিকিউটর ক্লাসের সাথে একটি ক্লাস ভেরিয়েবল EXECUTOR_SPEC বরাদ্দ করুন যা আগে সংজ্ঞায়িত করা হয়েছিল
  • ComponentSpec ক্লাসের একটি উদাহরণ তৈরি করতে ফাংশনের আর্গুমেন্ট ব্যবহার করে __init__() কনস্ট্রাক্টর ফাংশনটি সংজ্ঞায়িত করুন এবং একটি ঐচ্ছিক নামের সাথে সেই মান সহ সুপার ফাংশনটি চালু করুন

যখন কম্পোনেন্টের একটি উদাহরণ তৈরি করা হয়, তখন base_component.BaseComponent ক্লাসে চেকিং লজিক টাইপ করুন যাতে পাস করা আর্গুমেন্টগুলি ComponentSpec ক্লাসে সংজ্ঞায়িত টাইপ তথ্যের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে আহ্বান করা হবে।

from tfx.types import standard_artifacts
from hello_component import executor

class HelloComponent(base_component.BaseComponent):
  """Custom TFX Hello World Component."""

  SPEC_CLASS = HelloComponentSpec
  EXECUTOR_SPEC = executor_spec.ExecutorClassSpec(executor.Executor)

  def __init__(self,
               input_data: types.Channel = None,
               output_data: types.Channel = None,
               name: Optional[Text] = None):
    if not output_data:
      examples_artifact = standard_artifacts.Examples()
      examples_artifact.split_names = input_data.get()[0].split_names
      output_data = channel_utils.as_channel([examples_artifact])

    spec = HelloComponentSpec(input_data=input_data,
                              output_data=output_data, name=name)
    super(HelloComponent, self).__init__(spec=spec)

একটি TFX পাইপলাইনে একত্রিত করুন

শেষ ধাপ হল নতুন কাস্টম উপাদানটিকে একটি TFX পাইপলাইনে প্লাগ করা। নতুন উপাদানের একটি উদাহরণ যোগ করার পাশাপাশি, নিম্নলিখিতগুলিও প্রয়োজন:

  • নতুন কম্পোনেন্টের আপস্ট্রিম এবং ডাউনস্ট্রিম কম্পোনেন্টকে সঠিকভাবে ওয়্যার করুন। এটি নতুন কম্পোনেন্টে আপস্ট্রিম কম্পোনেন্টের আউটপুট উল্লেখ করে এবং ডাউনস্ট্রীম কম্পোনেন্টে নতুন কম্পোনেন্টের আউটপুট রেফারেন্স করে করা হয়
  • পাইপলাইন নির্মাণের সময় উপাদান তালিকায় নতুন উপাদান উদাহরণ যোগ করুন।

নীচের উদাহরণটি উল্লিখিত পরিবর্তনগুলিকে হাইলাইট করে। সম্পূর্ণ উদাহরণ TFX GitHub রেপোতে পাওয়া যাবে।

def _create_pipeline():
  ...
  example_gen = CsvExampleGen(input_base=examples)
  hello = component.HelloComponent(
      input_data=example_gen.outputs['examples'], name='HelloWorld')
  statistics_gen = StatisticsGen(examples=hello.outputs['output_data'])
  ...
  return pipeline.Pipeline(
      ...
      components=[example_gen, hello, statistics_gen, ...],
      ...
  )

একটি সম্পূর্ণ কাস্টম উপাদান স্থাপন

কোড পরিবর্তনের পাশাপাশি, সমস্ত নতুন যোগ করা অংশগুলি ( ComponentSpec , Executor , কম্পোনেন্ট ইন্টারফেস) পাইপলাইন সঠিকভাবে চালানোর জন্য পাইপলাইন চলমান পরিবেশে অ্যাক্সেসযোগ্য হতে হবে।