Các thành phần hàm Python tùy chỉnh

Định nghĩa thành phần dựa trên hàm Python giúp bạn tạo các thành phần tùy chỉnh TFX dễ dàng hơn bằng cách giúp bạn tiết kiệm công sức xác định lớp đặc tả thành phần, lớp thực thi và lớp giao diện thành phần. Trong kiểu định nghĩa thành phần này, bạn viết một hàm được chú thích bằng các gợi ý kiểu. Gợi ý loại mô tả các tạo phẩm đầu vào, các tạo phẩm đầu ra và các tham số của thành phần của bạn.

Viết thành phần tùy chỉnh của bạn theo phong cách này rất đơn giản, như trong ví dụ sau.

class MyOutput(TypedDict):
  accuracy: float

@component
def MyValidationComponent(
    model: InputArtifact[Model],
    blessing: OutputArtifact[Model],
    accuracy_threshold: Parameter[int] = 10,
) -> MyOutput:
  '''My simple custom model validation component.'''

  accuracy = evaluate_model(model)
  if accuracy >= accuracy_threshold:
    write_output_blessing(blessing)

  return {
    'accuracy': accuracy
  }

Tóm lại, điều này xác định một thành phần tùy chỉnh là một lớp con của BaseComponent và các lớp Spec và Executor của nó.

Nếu bạn muốn xác định một lớp con của BaseBeamComponent sao cho bạn có thể sử dụng đường dẫn chùm với cấu hình chia sẻ theo đường ống TFX, tức là, beam_pipeline_args khi biên dịch đường ống ( Chicago Taxi Pipeline Ví dụ ), bạn có thể đặt use_beam=True trong trình trang trí và thêm một BeamComponentParameter khác có giá trị mặc định None trong hàm của bạn như ví dụ sau:

@component(use_beam=True)
def MyDataProcessor(
    examples: InputArtifact[Example],
    processed_examples: OutputArtifact[Example],
    beam_pipeline: BeamComponentParameter[beam.Pipeline] = None,
    ) -> None:
  '''My simple custom model validation component.'''

  with beam_pipeline as p:
    # data pipeline definition with beam_pipeline begins
    ...
    # data pipeline definition with beam_pipeline ends

Nếu bạn chưa quen với quy trình TFX, hãy tìm hiểu thêm về các khái niệm cốt lõi của quy trình TFX .

Đầu vào, đầu ra và tham số

Trong TFX, đầu vào và đầu ra được theo dõi dưới dạng đối tượng Artifact mô tả vị trí và thuộc tính siêu dữ liệu được liên kết với dữ liệu cơ bản; thông tin này được lưu trữ trong Siêu dữ liệu ML. Các tạo phẩm có thể mô tả các kiểu dữ liệu phức tạp hoặc các kiểu dữ liệu đơn giản, chẳng hạn như: int, float, byte hoặc chuỗi unicode.

Tham số là một đối số (int, float, byte hoặc chuỗi unicode) cho một thành phần đã biết tại thời điểm xây dựng đường ống. Các tham số rất hữu ích để chỉ định các đối số và siêu tham số như số lần lặp đào tạo, tỷ lệ bỏ học và cấu hình khác cho thành phần của bạn. Các tham số được lưu trữ dưới dạng thuộc tính của việc thực thi thành phần khi được theo dõi trong Siêu dữ liệu ML.

Sự định nghĩa

Để tạo một thành phần tùy chỉnh, hãy viết một hàm triển khai logic tùy chỉnh của bạn và trang trí nó bằng trình trang trí @component từ mô-đun tfx.dsl.component.experimental.decorators . Để xác định lược đồ đầu vào và đầu ra của thành phần, hãy chú thích các đối số của hàm và giá trị trả về bằng cách sử dụng các chú thích từ mô-đun tfx.dsl.component.experimental.annotations :

  • Đối với mỗi đầu vào tạo tác , hãy áp dụng chú thích gợi ý loại InputArtifact[ArtifactType] . Thay thế ArtifactType bằng loại tạo phẩm, là lớp con của tfx.types.Artifact . Những đầu vào này có thể là đối số tùy chọn.

  • Đối với mỗi tạo phẩm đầu ra , hãy áp dụng chú thích gợi ý loại OutputArtifact[ArtifactType] . Thay thế ArtifactType bằng loại tạo phẩm, là lớp con của tfx.types.Artifact . Các tạo phẩm đầu ra của thành phần phải được chuyển dưới dạng đối số đầu vào của hàm để thành phần của bạn có thể ghi kết quả đầu ra vào một vị trí do hệ thống quản lý và đặt các thuộc tính siêu dữ liệu tạo tác thích hợp. Đối số này có thể là tùy chọn hoặc đối số này có thể được xác định bằng giá trị mặc định.

  • Đối với mỗi tham số , hãy sử dụng chú thích gợi ý loại Parameter[T] . Thay thế T bằng loại tham số. Hiện tại chúng tôi chỉ hỗ trợ các loại python nguyên thủy: bool , int , float , str hoặc bytes .

  • Đối với đường truyền chùm tia , hãy sử dụng chú thích gợi ý loại BeamComponentParameter[beam.Pipeline] . Đặt giá trị mặc định là None . Giá trị None sẽ được thay thế bằng một đường dẫn chùm được khởi tạo bởi _make_beam_pipeline() của BaseBeamExecutor

  • Đối với mỗi đầu vào kiểu dữ liệu đơn giản ( int , float , str hoặc bytes ) chưa được xác định tại thời điểm xây dựng đường ống, hãy sử dụng gợi ý kiểu T . Lưu ý rằng trong bản phát hành TFX 0.22, các giá trị cụ thể không thể được chuyển vào thời điểm xây dựng đường ống cho loại đầu vào này (thay vào đó hãy sử dụng chú thích Parameter , như được mô tả trong phần trước). Đối số này có thể là tùy chọn hoặc đối số này có thể được xác định bằng giá trị mặc định. Nếu thành phần của bạn có các đầu ra kiểu dữ liệu đơn giản ( int , float , str hoặc bytes ), bạn có thể trả về các đầu ra này bằng cách sử dụng TypedDict làm chú thích kiểu trả về và trả về một đối tượng dict thích hợp.

Trong phần thân hàm của bạn, các tạo phẩm đầu vào và đầu ra được truyền dưới dạng đối tượng tfx.types.Artifact ; bạn có thể kiểm tra .uri của nó để có được vị trí do hệ thống quản lý và đọc/đặt bất kỳ thuộc tính nào. Các tham số đầu vào và đầu vào kiểu dữ liệu đơn giản được truyền dưới dạng đối tượng thuộc loại đã chỉ định. Đầu ra kiểu dữ liệu đơn giản phải được trả về dưới dạng từ điển, trong đó các khóa là tên đầu ra thích hợp và các giá trị là giá trị trả về mong muốn.

Thành phần chức năng đã hoàn thành có thể trông như thế này:

from typing import TypedDict
import tfx.v1 as tfx
from tfx.dsl.component.experimental.decorators import component

class MyOutput(TypedDict):
  loss: float
  accuracy: float

@component
def MyTrainerComponent(
    training_data: tfx.dsl.components.InputArtifact[tfx.types.standard_artifacts.Examples],
    model: tfx.dsl.components.OutputArtifact[tfx.types.standard_artifacts.Model],
    dropout_hyperparameter: float,
    num_iterations: tfx.dsl.components.Parameter[int] = 10
) -> MyOutput:
  '''My simple trainer component.'''

  records = read_examples(training_data.uri)
  model_obj = train_model(records, num_iterations, dropout_hyperparameter)
  model_obj.write_to(model.uri)

  return {
    'loss': model_obj.loss,
    'accuracy': model_obj.accuracy
  }

# Example usage in a pipeline graph definition:
# ...
trainer = MyTrainerComponent(
    examples=example_gen.outputs['examples'],
    dropout_hyperparameter=other_component.outputs['dropout'],
    num_iterations=1000)
pusher = Pusher(model=trainer.outputs['model'])
# ...

Ví dụ trước định nghĩa MyTrainerComponent là thành phần tùy chỉnh dựa trên hàm Python. Thành phần này sử dụng một tạo phẩm examples làm đầu vào và tạo ra một tạo phẩm model làm đầu ra. Thành phần này sử dụng artifact_instance.uri để đọc hoặc ghi tạo phẩm tại vị trí do hệ thống quản lý. Thành phần này lấy tham số đầu vào num_iterations và giá trị loại dữ liệu đơn giản dropout_hyperparameter , đồng thời thành phần này đưa ra các chỉ số lossaccuracy dưới dạng giá trị đầu ra của loại dữ liệu đơn giản. Sau đó, tạo phẩm model đầu ra sẽ được thành phần Pusher sử dụng.