Prophet์œผ๋กœ ์˜ˆ์ธก ์ˆ˜ํ–‰

Prophet์€ ๋ฉ”ํƒ€๋ฅผ ํ†ตํ•ด ์œ ์ง€๋˜๋Š” ์˜ˆ์ธก ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ธ๋ถ€์ •๋ณด๋Š” Prophet ์ž๋ฃŒ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

BigQuery ML ARIMA_PLUS์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Prophet์€ ๊ฐ ์‹œ๊ณ„์—ด์„ ํŠธ๋ Œ๋“œ, ๊ณ„์ ˆ, ๊ณตํœด์ผ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์˜ ์ถ”๋ก  ์ง‘๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ BQML ARIMA+๋Š” ARIMA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ Œ๋“œ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐ˜๋ฉด Prophet์€ ๊ฐœ๋ณ„ ๋กœ์ง€์Šคํ‹ฑ ๋˜๋Š” ์„ ํ˜• ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณก์„ ์— ๋งž์ถ”๋ ค ์‹œ๋„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Google Cloud ๋Š” Prophet ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ Prophet ๋ชจ๋ธ์—์„œ ์ผ๊ด„ ์ถ”๋ก ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํŒŒ์ดํ”„๋ผ์ธ ๋ชจ๋‘ Google Cloud ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ์š”์†Œ(GCPC)์˜ Vertex AI Pipelines์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

Prophet์„ Vertex AI์™€ ํ†ตํ•ฉํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Vertex AI ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ๋ฐ ์œˆ๋„์ž‰ ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Cloud Storage์— ์ €์žฅ๋œ BigQuery ํ…Œ์ด๋ธ”์ด๋‚˜ CSV์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. Vertex AI๋Š” ๊ฐ ํ–‰์˜ ํ˜•์‹์ด Vertex AI ์˜ˆ์ธก๊ณผ ๋™์ผํ•œ ํ˜•์‹์„ ๊ฐ€์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

Prophet์€ ๋‹ค๋ณ€๋Ÿ‰ ๋ชจ๋ธ์ด์ง€๋งŒ Vertex AI๋Š” ์ผ๋ณ€๋Ÿ‰ ๋ฒ„์ „๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ์›Œํฌํ”Œ๋กœ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…Œ์ด๋ธ” ํ˜•์‹ ์›Œํฌํ”Œ๋กœ์˜ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์›Œํฌํ”Œ๋กœ API

์ด ์›Œํฌํ”Œ๋กœ์—์„œ๋Š” ๋‹ค์Œ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Vertex AI
  • Dataflow
  • BigQuery
  • Cloud Storage

Prophet์œผ๋กœ ๋ชจ๋ธ ํ•™์Šต

Prophet์€ ๋‹จ์ผ ์‹œ๊ณ„์—ด์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Vertex AI๋Š” ์‹œ๊ณ„์—ด ID๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•˜๊ณ  ๊ฐ ์‹œ๊ณ„์—ด์— ๋Œ€ํ•ด Prophet ๋ชจ๋ธ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ๊ทธ๋ฆฌ๋“œ ๊ฒ€์ƒ‰ ๋ฐ Prophet์˜ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๋ฐฑํ…Œ์ŠคํŠธ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‹œ๊ณ„์—ด์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ดํ”„๋ผ์ธ์€ Vertex AI ์ปค์Šคํ…€ ํ•™์Šต ์ž‘์—… ๋ฐ Dataflow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ Prophet ๋ชจ๋ธ์„ ๋ณ‘๋ ฌ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ํ•™์Šต๋˜๋Š” ๋ชจ๋ธ ์ˆ˜๋Š” ์‹œ๊ณ„์—ด ์ˆ˜์™€ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ • ์‹œ๋„ ํšŸ์ˆ˜์˜ ๊ณฑ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ƒ˜ํ”Œ ์ฝ”๋“œ์—์„œ๋Š” Prophet ๋ชจ๋ธ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

job = aiplatform.PipelineJob(
    ...
    template_path=train_job_spec_path,
    parameter_values=train_parameter_values,
    ...
)
job.run(service_account=SERVICE_ACCOUNT)

job.run()์˜ ์„ ํƒ์  service_account ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Vertex AI Pipelines ์„œ๋น„์Šค ๊ณ„์ •์„ ์›ํ•˜๋Š” ๊ณ„์ •์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์€ ๋‹ค์Œ ํ•จ์ˆ˜๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

(
    train_job_spec_path,
    train_parameter_values,
) = utils.get_prophet_train_pipeline_and_parameters(
    ...
)

๋‹ค์Œ์€ get_prophet_train_pipeline_and_parameters ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ์œ ํ˜• ์ •์˜
project ๋ฌธ์ž์—ด ํ”„๋กœ์ ํŠธ ID
location ๋ฌธ์ž์—ด ๋ฆฌ์ „.
root_dir ๋ฌธ์ž์—ด ์ถœ๋ ฅ์„ ์ €์žฅํ•  Cloud Storage ์œ„์น˜์ž…๋‹ˆ๋‹ค.
target_column ๋ฌธ์ž์—ด ์ด ๋ชจ๋ธ์—์„œ ์˜ˆ์ธกํ•  ์—ด(๊ฐ’)์ž…๋‹ˆ๋‹ค.
time_column ๋ฌธ์ž์—ด ์‹œ๊ฐ„ ์—ด. ์‹œ๊ฐ„ ์—ด์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ ์ด ์—ด์— ๋ชจ๋“  ํ–‰์˜ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์—ด์€ ์ง€์ •๋œ ๊ด€์ฐฐ์ด ์ˆ˜ํ–‰๋œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
time_series_identifier_column ๋ฌธ์ž์—ด ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์ž…๋‹ˆ๋‹ค. ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ ์ด ์—ด์—๋Š” ๋ชจ๋“  ํ–‰์˜ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ธก ํ•™์Šต ๋ฐ์ดํ„ฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์‹œ๊ณ„์—ด์ด ํฌํ•จ๋˜๋ฉฐ, ์‹๋ณ„์ž๋Š” ํ•™์Šต ๋ฐ์ดํ„ฐ์—์„œ ์ง€์ •๋œ ๊ด€์ฐฐ์ด ์†ํ•œ ์‹œ๊ณ„์—ด์„ Vertex AI์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ํŠน์ • ์‹œ๊ณ„์—ด์˜ ๋ชจ๋“  ํ–‰์€ ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์˜ ๊ฐ’์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์‹œ๊ณ„์—ด ์‹๋ณ„์ž๋Š” ์ œํ’ˆ ID, ๋งค์žฅ ID ๋˜๋Š” ๋ฆฌ์ „์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ํ–‰์— ๋™์ผํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ ๋‹จ์ผ ์‹œ๊ณ„์—ด๋กœ ์˜ˆ์ธก ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Vertex AI๋Š” ์‹œ๊ณ„์—ด์ด ๋‘ ๊ฐœ ์ด์ƒ ํฌํ•จ๋œ ํ•™์Šต ๋ฐ์ดํ„ฐ์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์—ด์— ์‹œ๊ณ„์—ด์„ 10๊ฐœ ์ด์ƒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
data_granularity_unit ๋ฌธ์ž์—ด ํ•™์Šต ๋ฐ์ดํ„ฐ, ์˜ˆ์ธก ๋ฒ”์œ„, ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์˜ ์„ธ๋ถ€์‚ฌํ•ญ์— ์‚ฌ์šฉํ•  ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. minute, hour, day, week, month, ๋˜๋Š” year์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์„ธ๋ถ€์‚ฌํ•ญ ์„ ํƒ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.
data_source_csv_filenames ๋ฌธ์ž์—ด Cloud Storage์— ์ €์žฅ๋œ CSV์˜ URI์ž…๋‹ˆ๋‹ค.
data_source_bigquery_table_path ๋ฌธ์ž์—ด BigQuery ํ…Œ์ด๋ธ”์˜ URI์ž…๋‹ˆ๋‹ค.
forecast_horizon ์ •์ˆ˜ ์˜ˆ์ธก ๋ฒ”์œ„๋Š” ๋ชจ๋ธ์ด ์˜ˆ์ธก ๋ฐ์ดํ„ฐ ๊ฐ ํ–‰์˜ ํƒ€๊ฒŸ ๊ฐ’ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•  ํ–ฅํ›„ ๊ธฐ๊ฐ„์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ธก ๋ฒ”์œ„๋Š” ๋ฐ์ดํ„ฐ ์„ธ๋ถ€์‚ฌํ•ญ ๋‹จ์œ„๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ
optimization_objective ๋ฌธ์ž์—ด ๋ชจ๋ธ์˜ ์ตœ์ ํ™” ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ
max_num_trials ์ •์ˆ˜ ์‹œ๊ณ„์—ด๋‹น ์ˆ˜ํ–‰ํ•  ์ตœ๋Œ€ ์กฐ์ • ์‹œ๋„ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.

Dataflow ํŒŒ๋ผ๋ฏธํ„ฐ

๋‹ค์Œ์€ Dataflow ๋งž์ถค์„ค์ •์„ ์œ„ํ•œ get_prophet_train_pipeline_and_parameters ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ์œ ํ˜• ์ •์˜
trainer_dataflow_machine_type ๋ฌธ์ž์—ด ํ•™์Šต์— ์‚ฌ์šฉํ•  Dataflow ๋จธ์‹  ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
trainer_dataflow_max_num_workers ์ •์ˆ˜ ํ•™์Šต์— ์‚ฌ์šฉํ•  Dataflow ์ž‘์—…์ž์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค.
evaluation_dataflow_machine_type ๋ฌธ์ž์—ด ํ‰๊ฐ€์— ์‚ฌ์šฉํ•  Dataflow ๋จธ์‹  ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
evaluation_dataflow_max_num_workers ์ •์ˆ˜ ํ‰๊ฐ€์— ์‚ฌ์šฉํ•  ์ตœ๋Œ€ Dataflow ์ž‘์—…์ž ์ˆ˜์ž…๋‹ˆ๋‹ค.
dataflow_service_account ๋ฌธ์ž์—ด Dataflow ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ปค์Šคํ…€ ์„œ๋น„์Šค ๊ณ„์ •์ž…๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ IP์™€ ํŠน์ • VPC ์„œ๋ธŒ๋„ท์„ ์‚ฌ์šฉํ•˜๋„๋ก Dataflow ์ž‘์—…์€ ๋น„๊ณต๊ฐœ IP์™€ ํŠน์ • VPC ์„œ๋ธŒ๋„ท์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ธฐ๋ณธ Dataflow ์ž‘์—…์ž ์„œ๋น„์Šค ๊ณ„์ •์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Prophet ํ•™์Šต ์ž‘์—…์€ Dataflow์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ดˆ๊ธฐ ์‹œ์ž‘ ์‹œ๊ฐ„์€ 5~7๋ถ„์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋Ÿฐํƒ€์ž„์„ ์ค„์ด๋ ค๋ฉด ์ˆ˜์ง ํ™•์žฅ ๋˜๋Š” ์ˆ˜ํ‰ ํ™•์žฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์ง ํ™•์žฅ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋จธ์‹  ์œ ํ˜•์„ n1-standard-1์—์„œ e2-highcpu-8๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ‰ ํ™•์žฅํ•˜๋ ค๋ฉด ์ž‘์—…์ž ์ˆ˜๋ฅผ 1์—์„œ 200์œผ๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ถ„ํ•  ํŒŒ๋ผ๋ฏธํ„ฐ

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ฐ์ดํ„ฐ ๋ถ„ํ• ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ถ„ํ•  ์„ค๋ช… ํŒŒ๋ผ๋ฏธํ„ฐ
๊ธฐ๋ณธ ๋ถ„ํ•  Vertex AI๋Š” ํ•™์Šต ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ 80%๋ฅผ ํ•™์Šต ์„ธํŠธ๋กœ, 10%๋ฅผ ๊ฒ€์ฆ ์„ธํŠธ๋กœ, 10%๋ฅผ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ฌด์ž‘์œ„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Vertex AI๋Š” ์‹œ๊ฐ„ ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํ–‰์˜ ์‹œ๊ฐ„ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์—†์Œ
๋น„์œจ ๋ถ„ํ•  Vertex AI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต ์„ธํŠธ, ๊ฒ€์ฆ ์„ธํŠธ, ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. Vertex AI๋Š” ์‹œ๊ฐ„ ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํ–‰์˜ ์‹œ๊ฐ„ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • training_fraction
  • validation_fraction
  • test_fraction
ํƒ€์ž„์Šคํƒฌํ”„ ๋ถ„ํ•  Vertex AI๋Š” training_fraction, validation_fraction, test_fraction ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต ์„ธํŠธ, ๊ฒ€์ฆ ์„ธํŠธ, ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. Vertex AI๋Š” timestamp_split_key ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํ–‰์˜ ์‹œ๊ฐ„ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • training_fraction
  • validation_fraction
  • test_fraction
  • timestamp_split_key
์ˆ˜๋™(์‚ฌ์ „ ์ •์˜) ๋ถ„ํ•  Vertex AI๋Š” predefined_split_key ์—ด์˜ TRAIN, VALIDATE, TEST ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.
  • predefined_split_key

๋‹ค์Œ๊ณผ ๊ฐ™์ด get_prophet_train_pipeline_and_parameters์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ์œ ํ˜• ์ •์˜
predefined_split_key ๋ฌธ์ž์—ด TRAIN, VALIDATE, TEST ๊ฐ’์„ ํฌํ•จํ•œ ์—ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™(์‚ฌ์ „ ์ •์˜) ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
training_fraction ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜ ํ•™์Šต ์„ธํŠธ์— ํ• ๋‹นํ•  ๋ฐ์ดํ„ฐ์˜ ๋ฐฑ๋ถ„์œจ์ž…๋‹ˆ๋‹ค. ๋น„์œจ ๋ถ„ํ•  ๋˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
validation_fraction ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜ ๊ฒ€์ฆ ์„ธํŠธ์— ํ• ๋‹นํ•  ๋ฐ์ดํ„ฐ์˜ ๋ฐฑ๋ถ„์œจ์ž…๋‹ˆ๋‹ค. ๋น„์œจ ๋ถ„ํ•  ๋˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
test_fraction ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜ ํ…Œ์ŠคํŠธ ์„ธํŠธ์— ํ• ๋‹นํ•  ๋ฐ์ดํ„ฐ์˜ ๋ฐฑ๋ถ„์œจ์ž…๋‹ˆ๋‹ค. ๋น„์œจ ๋ถ„ํ•  ๋˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
timestamp_split_key ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ๋ถ„ํ• ์„ ์œ„ํ•ด ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํฌํ•จ๋œ ์—ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ํƒ€์ž„์Šคํƒฌํ”„ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๊ฐ„ ํŒŒ๋ผ๋ฏธํ„ฐ

Vertex AI๋Š” ์ˆœํ™˜ ๊ธฐ๊ฐ„ ์ „๋žต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์—์„œ ์˜ˆ์ธก ๊ธฐ๊ฐ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๋ฉด Vertex AI์—์„œ ๊ธฐ๋ณธ ์ตœ๋Œ€๊ฐ’์ด 100,000,000์ธ Count ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœํ™˜ ๊ธฐ๊ฐ„ ์ „๋žต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ˆœํ™˜ ๊ธฐ๊ฐ„ ์ „๋žต ์„ค๋ช… ํŒŒ๋ผ๋ฏธํ„ฐ
์นด์šดํŠธ Vertex AI์—์„œ ์ƒ์„ฑ๋œ ๊ตฌ๊ฐ„ ์ˆ˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ตœ๋Œ“๊ฐ’์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ํ–‰ ์ˆ˜๊ฐ€ ์ตœ๋Œ€ ๊ตฌ๊ฐ„ ์ˆ˜๋ณด๋‹ค ์ ์œผ๋ฉด ๋ชจ๋“  ํ–‰์ด ๊ตฌ๊ฐ„์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vertex AI๊ฐ€ ๋ฌด์ž‘์œ„ ์ƒ˜ํ”Œ๋ง์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ ๊ตฌ๊ฐ„ ์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ 100,000,000์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ ๊ตฌ๊ฐ„ ์ˆ˜๋Š” 100,000,000๊ฐœ๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. window_max_count
Stride Vertex AI๋Š” ๋ชจ๋“  X ์ž…๋ ฅ ํ–‰ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ 100,000,000๊ฐœ์˜ ๊ตฌ๊ฐ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ๊ณ„์ ˆ๋ณ„ ๋˜๋Š” ๊ธฐ๊ฐ„๋ณ„ ์˜ˆ์ธก์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ŠคํŠธ๋ผ์ด๋“œ ๊ธธ์ด ๊ฐ’์„ 7๋กœ ์„ค์ •ํ•˜์—ฌ ์˜ˆ์ธก์„ ํŠน์ • ์š”์ผ๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ 1์—์„œ 1000 ์‚ฌ์ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. window_stride_length
์—ด ๊ฐ’์ด True ๋˜๋Š” False์ธ ์—ด์„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Vertex AI๋Š” ์—ด์˜ ๊ฐ’์ด True์ธ ๋ชจ๋“  ์ž…๋ ฅ ํ–‰์˜ ๊ตฌ๊ฐ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. True ํ–‰์˜ ์ด ๊ฐœ์ˆ˜๊ฐ€ 100,000,000 ๋ฏธ๋งŒ์ด๋ฉด True ๋ฐ False ๊ฐ’์„ ์›ํ•˜๋Š” ์ˆœ์„œ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์ด ์„ ํ˜ธ๋˜์ง€๋งŒ ๋ฌธ์ž์—ด ๊ฐ’๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๊ฐ’์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. window_column

get_prophet_train_pipeline_and_parameters์—์„œ ๊ธฐ๊ฐ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ์œ ํ˜• ์ •์˜
window_column ๋ฌธ์ž์—ด True ๋ฐ False ๊ฐ’์ด ์žˆ๋Š” ์—ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
window_stride_length ์ •์ˆ˜ ์ŠคํŠธ๋ผ์ด๋“œ ๊ธธ์ด์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.
window_max_count ์ •์ˆ˜ ์ตœ๋Œ€ ์œˆ๋„์šฐ ์ˆ˜์ž…๋‹ˆ๋‹ค.

Prophet์œผ๋กœ ์ถ”๋ก  ์ˆ˜ํ–‰

Prophet์„ ์œ„ํ•œ Vertex AI ๋ชจ๋ธ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐ ์‹œ๊ณ„์—ด์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ Propet ๋ชจ๋ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ถ”๋ก  ํŒŒ์ดํ”„๋ผ์ธ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ณ„์—ด ID๋ณ„๋กœ ์ง‘๊ณ„ํ•˜๊ณ  ๊ฐ ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์ถ”๋ก ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ํ›„ ํŒŒ์ดํ”„๋ผ์ธ์€ Vertex AI ์˜ˆ์ธก ํ˜•์‹๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ถ”๋ก  ๊ฒฐ๊ณผ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” Prophet ์ถ”๋ก  ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

job = aiplatform.PipelineJob(
    ...
    template_path=prediction_job_spec_path,
    parameter_values=prediction_parameter_values,
    ...
)
job.run(...)

ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์€ ๋‹ค์Œ ํ•จ์ˆ˜๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

(
    prediction_job_spec_path,
    prediction_parameter_values,
) = utils.get_prophet_prediction_pipeline_and_parameters(
    ...
)

๋‹ค์Œ์€ get_prophet_prediction_pipeline_and_parameters ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ์œ ํ˜• ์ •์˜
project ๋ฌธ์ž์—ด ํ”„๋กœ์ ํŠธ ID
location ๋ฌธ์ž์—ด ๋ฆฌ์ „.
model_name ๋ฌธ์ž์—ด ๋ชจ๋ธ ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์˜ ํ˜•์‹์„ projects/{project}/locations/{location}/models/{model}๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
time_column ๋ฌธ์ž์—ด ์‹œ๊ฐ„ ์—ด. ์‹œ๊ฐ„ ์—ด์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ ์ด ์—ด์— ๋ชจ๋“  ํ–‰์˜ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์—ด์€ ์ง€์ •๋œ ๊ด€์ฐฐ์ด ์ˆ˜ํ–‰๋œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
time_series_identifier_column ๋ฌธ์ž์—ด ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์ž…๋‹ˆ๋‹ค. ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ ์ด ์—ด์—๋Š” ๋ชจ๋“  ํ–‰์˜ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ธก ํ•™์Šต ๋ฐ์ดํ„ฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์‹œ๊ณ„์—ด์ด ํฌํ•จ๋˜๋ฉฐ, ์‹๋ณ„์ž๋Š” ํ•™์Šต ๋ฐ์ดํ„ฐ์—์„œ ์ง€์ •๋œ ๊ด€์ฐฐ์ด ์†ํ•œ ์‹œ๊ณ„์—ด์„ Vertex AI์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ํŠน์ • ์‹œ๊ณ„์—ด์˜ ๋ชจ๋“  ํ–‰์€ ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์˜ ๊ฐ’์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์‹œ๊ณ„์—ด ์‹๋ณ„์ž๋Š” ์ œํ’ˆ ID, ๋งค์žฅ ID ๋˜๋Š” ๋ฆฌ์ „์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ณ„์—ด ์‹๋ณ„์ž ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ํ–‰์— ๋™์ผํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ ๋‹จ์ผ ์‹œ๊ณ„์—ด๋กœ ์˜ˆ์ธก ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Vertex AI๋Š” ์‹œ๊ณ„์—ด์ด ๋‘ ๊ฐœ ์ด์ƒ ํฌํ•จ๋œ ํ•™์Šต ๋ฐ์ดํ„ฐ์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์—ด์— ์‹œ๊ณ„์—ด์„ 10๊ฐœ ์ด์ƒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
target_column ๋ฌธ์ž์—ด ์ด ๋ชจ๋ธ์—์„œ ์˜ˆ์ธกํ•  ์—ด(๊ฐ’)์ž…๋‹ˆ๋‹ค.
data_source_csv_filenames ๋ฌธ์ž์—ด Cloud Storage์— ์ €์žฅ๋œ CSV์˜ URI์ž…๋‹ˆ๋‹ค.
data_source_bigquery_table_path ๋ฌธ์ž์—ด BigQuery ํ…Œ์ด๋ธ”์˜ URI์ž…๋‹ˆ๋‹ค.
bigquery_destination_uri ๋ฌธ์ž์—ด ์„ ํƒํ•œ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ URI์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌ์†Œ์Šค๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ƒˆ ๋ฐ์ดํ„ฐ ์„ธํŠธ ์•„๋ž˜์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
machine_type ๋ฌธ์ž์—ด ์ผ๊ด„ ์ถ”๋ก ์— ์‚ฌ์šฉํ•  ๋จธ์‹  ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
max_num_workers ์ •์ˆ˜ ์ผ๊ด„ ์ถ”๋ก ์— ์‚ฌ์šฉํ•  ์ตœ๋Œ€ ์ž‘์—…์ž ์ˆ˜์ž…๋‹ˆ๋‹ค.