Đị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ừ 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ủatfx.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ủatfx.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ặcbytes
.Đố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ủaBaseBeamExecutor
Đối với mỗi đầu vào kiểu dữ liệu đơn giản (
int
,float
,str
hoặcbytes
) 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ểuT
. 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íchParameter
, 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ặcbytes
), bạn có thể trả về các đầu ra này bằng cách sử dụngTypedDict
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ố về loss
và accuracy
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.