SnowflakeとDaskを使用した機械学習パイプラインの構築
この投稿では、私が最近調査しているツールのいくつかを共有し、それらの使用方法と、それらがワークフローの効率の向上にどのように役立ったかを示したいと思います。 特にお話しするのは、スノーフレークとダスクのXNUMXつです。 XNUMXつの非常に異なるツールですが、特にMLライフサイクルの一部として互いに補完し合うツールです。
By ダニエル・フォーリー、データサイエンティスト
概要
最近、私はデータサイエンティストとして、ワークフローを改善するためのより良い方法を見つけようとしています。 私は自分の仕事でETLのモデリングと構築にかなりの時間を費やす傾向があります。 これは、大規模なデータセットを確実かつ効率的に処理するためにツールに依存する必要性がますます高まっていることを意味しています。 これらのデータセットを操作するためにパンダを使用することは必ずしも良いアプローチではないことにすぐに気付き、これが他の選択肢を検討するように促しました。
この投稿では、私が最近調査しているツールのいくつかを共有し、それらの使用方法と、それらがワークフローの効率の向上にどのように役立ったかを示したいと思います。 特にお話しするのは、スノーフレークとダスクのXNUMXつです。 XNUMXつの非常に異なるツールですが、特にMLライフサイクルの一部として互いに補完し合うツールです。 この投稿を読んだ後、SnowflakeとDaskが何であるか、それらを効果的に使用する方法、および独自のユースケースを開始して実行できる方法をよく理解できることを願っています。
具体的には、SnowflakeとPythonを使用してETLパイプラインを構築し、機械学習タスクのトレーニングデータを生成する方法を紹介します。 次に、Daskを紹介します。 土星の雲 また、クラウドでの並列処理を利用してMLトレーニングプロセスを実際に高速化し、データサイエンティストとしての生産性を向上させる方法を示します。
SnowflakeとPythonでETLを構築する
コーディングに取り掛かる前に、スノーフレークとは何かを簡単に説明します。 これは、私のチームがそれを使い始めることを決めたときに私が最近尋ねた質問です。 大まかに言えば、それはクラウド内のデータウェアハウスです。 しばらく遊んだ後、そのパワフルさに気づきました。 私にとって、最も便利な機能のXNUMXつは、使用できる仮想ウェアハウスだと思います。 仮想ウェアハウスを使用すると、同じデータにアクセスできますが、他の仮想ウェアハウスから完全に独立しているため、コンピューティングリソースがチーム間で共有されることはありません。 これは、他のユーザーがXNUMX日を通してクエリを実行することによって引き起こされるパフォーマンスの問題の可能性を排除するため、非常に便利であることが証明されています。 これにより、クエリの実行を待つためのフラストレーションと時間の浪費が少なくなりました。
スノーフレークを使用するので、セットアップ方法の概要を簡単に説明し、自分で実験を開始します。 次のことを行う必要があります。
- スノーフレークアカウントを設定する
- スノーフレークにデータを取得する
- SQLとSnowflakeUIを使用してクエリを記述してテストします
- クエリを実行してモデリング用の最終データセットを生成できるPythonクラスを作成します
アカウントの設定は、無料トライアルにサインアップするのと同じくらい簡単です。 ウェブサイト。 それが済んだら、snowsqlCLIをダウンロードできます。 こちら。 これにより、Snowflakeにデータを簡単に追加できます。 これらの手順を実行した後、クレデンシャルとコマンドラインを使用してSnowflakeに接続してみることができます。
snowsql -a <account_name> -u <user_name>
Snowflake UIにログインすると、URLでアカウント名を見つけることができます。 xxxxx.europe-west2.gcpのようになります。 では、次のステップに進み、データをSnowflakeに取り込みましょう。 ここで従う必要のあるいくつかのステップがあります。
- 仮想倉庫を作成する
- データベースを作成する
- テーブルを定義して作成する
- CSVファイルのステージングテーブルを作成します
- データをテーブルにコピーする
幸い、これはそれほど難しいことではなく、snowsqlCLIを使用してこれを完全に行うことができます。 このプロジェクトでは、必要なデータセットよりも小さいデータセットを使用しますが、残念ながら、会社のデータを使用できず、オンラインで適切な大きなデータセットを見つけるのが非常に難しい場合があります。 しかし、私はダンハンビーからいくつかのトランザクションデータを見つけました。これはで無料で入手できます。 Kaggle。 キックのためだけに、このデータを使用してはるかに大きな合成データセットを作成し、Daskがsklearnと比較してチャレンジをどれだけうまく処理できるかをテストします。
まず、Snowflake UIで次のコマンドを使用して、仮想ウェアハウスとデータベースをセットアップする必要があります。
作ります or replace 倉庫analytics_wh
Warehouse_size =” X-SMALL”
auto_suspend = 180
auto_resume = true
initial_suspended = true;
作ります or replace データベース ダンハンビー;
データは6つのCSVで構成され、6つのテーブルに変換されます。 この投稿はデータの解釈ではなくスノーフレークとダスクの使用に関するものなので、データセットを調べるのにあまり時間をかけません。
以下は、テーブルの作成に使用できるコマンドです。 事前に知っておく必要があるのは、使用する列とデータ型だけです。
create or replace table campaign_desc ( description string, campaign number,
start_day number,
end_day number ); create or replace table campaign_table ( description string, Household_key number, campaign number ); create or replace table coupon ( COUPON_UPC number, product_id number, campaign number ); create or replace table coupon_redempt ( household_key number, day number, coupon_upc number, campaign number ); create or replace table transactions ( household_key number, BASKET_ID number, day number, product_id number, quantity number, sales_value number, store_id number, retail_disc decimal, trans_time number, week_no number, coupon_disc decimal, coupon_match_disc decimal ); create or replace table demographic_data ( age_dec string, marital_status_code string, income_desc string, homeowner_desc string, hh_comp_desc string, household_size_desc string, kid_category_desc string, Household_key number);
テーブルが作成されたので、データをテーブルに取り込む方法について考え始めることができます。 このために、CSVファイルをステージングする必要があります。 これは基本的に中間ステップにすぎないため、Snowflakeはファイルをステージからテーブルに直接ロードできます。 使用できます PUT ローカルファイルをステージに配置してから、 にコピー このデータを配置する場所をSnowflakeに指示するコマンド。
use database dunnhumby; create or replace stage dunnhumby_stage; PUT file://campaigns_table.csv @dunnhumby.public.dunnhumby_stage; PUT file://campaigns_desc.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon_d=redempt.csv @dunnhumby.public.dunnhumby_stage; PUT file://transaction_data.csv @dunnhumby.public.dunnhumby_stage; PUT file://demographics.csv @dunnhumby.public.dunnhumby_stage;
簡単なチェックとして、このコマンドを実行して、ステージング領域に何があるかをチェックできます。
ls @dunnhumby.public.dunnhumby_stage;
次に、以下のクエリを使用してデータをテーブルにコピーする必要があります。 これらは、Snowflake UIまたはSnowflakeにログインした後のコマンドラインで実行できます。
copy into campaign_table from @dunnhumby.public.dunnhumby_stage/campaigns_table.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into campaign_desc from @dunnhumby.public.dunnhumby_stage/campaign_desc.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon from @dunnhumby.public.dunnhumby_stage/coupon.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon_redempt from @dunnhumby.public.dunnhumby_stage/coupon_redempt.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into transactions from @dunnhumby.public.dunnhumby_stage/transaction_data.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into demographic_data from @dunnhumby.public.dunnhumby_stage/demographics.csv.gz file_format = ( type = csv skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’);
幸運なことに、最初にテーブルにデータがあります。 ああ、それがそれほど単純だったとしても、このプロセス全体で、正しく理解するために数回の試行が必要でした(スペルが間違っていることに注意してください)。 うまくいけば、あなたはこれに沿って従うことができて、行ってもいいです。 興味深いものに近づいていますが、上記の手順はプロセスの重要な部分であるため、これらの各手順を必ず理解してください。
SQLでパイプラインを書く
この次のステップでは、ターゲットと機能を生成するクエリを記述し、最後にトレーニングデータセットを生成します。 モデリング用のデータセットを作成するXNUMXつのアプローチは、このデータをメモリに読み込み、パンダを使用して新しい機能を作成し、すべてのデータフレームを結合することです。 これは通常、Kaggleや他のオンラインチュートリアルで見られるアプローチです。 これに関する問題は、特に適度なサイズのデータセットで作業している場合は、あまり効率的ではないということです。 このため、大規模なデータセットを非常にうまく処理し、時間を大幅に節約できるスノーフレークのようなものに手間のかかる作業をアウトソーシングすることをお勧めします。 ここでデータセットの詳細を詳しく説明することに多くの時間を費やすことはありません。これは、私が表示しようとしているものにとってそれほど重要ではないためです。 ただし、一般的には、モデリングを開始する前に、データの調査と理解にかなりの時間を費やす必要があります。 これらのクエリの目標は、データを前処理し、後でモデルで使用できるいくつかの単純な機能を作成することです。
ターゲット定義
明らかに、教師あり機械学習の重要な要素は、予測する適切なターゲットを定義することです。 このユースケースでは、ユーザーがカットオフ週から2週間以内に別の訪問を行うかどうかを計算することにより、チャーンを予測します。 XNUMX週間の選択はかなり恣意的であり、解決しようとしている特定の問題によって異なりますが、このプロジェクトには問題ないと仮定しましょう。 一般に、顧客を注意深く分析して、訪問間のギャップの分布を理解し、チャーンの適切な定義に到達する必要があります。
ここでの主なアイデアは、テーブルごとに、各機能の値を含むhousehold_keyごとにXNUMXつの行を作成することです。
キャンペーンの特徴
トランザクション機能
以下では、平均、最大、標準偏差などの集計統計に基づいて、いくつかの簡単なメトリックを作成します。
人口統計学的特徴
このデータセットには欠測データがたくさんあるので、ここで代入を使用することにしました。 欠測データの削除から高度な代入方法まで、欠測データの手法はたくさんあります。 私はここで自分の生活を楽にし、不足している値をモードに置き換えました。 このデータが欠落している理由を理解することは、データの処理方法を決定する上で非常に重要であるため、一般的にこのアプローチを取ることを必ずしもお勧めしませんが、この例の目的のために、先に進んで簡単なアプローチを取ります。 最初に各機能のモードを計算し、次に合体を使用して、データが欠落している場合は各行をモードに置き換えます。
トレーニングデータ
最後に、メインテーブルを結合してトレーニングデータのクエリを作成し、モデルの作成に使用できるターゲット、キャンペーン、トランザクション、人口統計機能を含むテーブルを作成します。
簡単に言うと、スノーフレークの機能とニュアンスについてもっと知りたい人には、次の本をお勧めします。 スノーフレーククックブック。 私はこの本を読み始めました、そしてそれはスノーフレークを使う方法についての本当に役に立つ情報でいっぱいで、私がここでするよりはるかに詳細に行きます。
ETLのPythonコード
このETLに必要な最後の部分は、それを実行するためのスクリプトを作成することです。 現在、これは、このようなETLを定期的に実行することを計画している場合にのみ本当に必要ですが、これは良い習慣であり、必要に応じてETLを実行するのがはるかに簡単になります。
EtlTrainingクラスの主なコンポーネントについて簡単に説明しましょう。 私たちのクラスは、カットオフ週であるXNUMXつの入力を取ります。 これは、データセットでのデータの定義方法によるものですが、通常、これは、トレーニングデータを生成するために選択するカットオフ日に対応する日付形式になります。
クエリのリストを初期化して、これらを簡単にループして実行できるようにします。 また、Snowflake接続に渡すパラメーターを含む辞書を作成します。 ここでは、SaturnCloudで設定した環境変数を使用します。 ここに これを行う方法のガイドです。 Snowflakeに接続するのはそれほど難しくありません。必要なのは、Snowflakeコネクタを使用して、資格情報の辞書を渡すことだけです。 これをSnowflakeconnectメソッドに実装し、この接続を属性として返します。
これらのクエリの実行を少し簡単にするために、各クエリをPython文字列変数としてml_query_pipeline.pyファイルに保存します。 execute_etlメソッドは、缶に書かれていることを正確に実行します。 各クエリをループしてフォーマットし、実行して、Snowflake接続を閉じて終了します。
このETLを実行するには、以下のコマンドをターミナルに入力するだけです。 (ここで、ml_pipelineは上記のスクリプトの名前です。)
python -m ml_pipeline -w 102 -j ‘train’
簡単に言うと、このようなETLを定期的に実行することをお勧めします。 たとえば、毎日の予測を行いたい場合は、モデルに渡すために毎日このようなデータセットを生成する必要があります。これにより、どの顧客が解約する可能性が高いかを特定できます。 ここでは詳しく説明しませんが、私の仕事では、Airflowを使用してETLを調整しているので、興味があればチェックすることをお勧めします。 実際、私は最近本を購入しました 'ApacheAirflowを使用したデータパイプライン'これは素晴らしいと思います。エアフローの使用方法に関する確かな例とアドバイスを実際に提供します。
Daskとモデリング
データパイプラインが構築されたので、モデリングについて考え始めることができます。 この投稿のもうXNUMXつの主な目標は、ML開発プロセスの一部としてDaskを使用することの利点を強調し、使いやすさを皆さんに示すことです。
プロジェクトのこの部分では、私も使用しました 土星の雲 これは私が最近出会った本当に素晴らしいツールであり、クラウド内のコンピューターのクラスター全体でDaskのパワーを活用することができます。 私にとってSaturnを使用する主な利点は、作業を共有するのが本当に簡単で、必要に応じてコンピューティングをスケールアップするのが非常に簡単で、無料枠オプションがあることです。 一般に、モデル開発はDaskの非常に優れたユースケースです。通常、さまざまなモデルをトレーニングして、何が最適かを確認したいからです。 モデル開発の他の重要な側面に集中する時間が増えるので、これをより速く行うことができれば、より良い結果が得られます。 Snowflakeと同様に、サインアップする必要があります こちら そして、Jupyterラボのインスタンスを非常にすばやく起動して、自分で実験を開始できます。
さて、この時点で私はDaskについて何度か言及しましたが、それが何であるかを実際に説明したことは一度もないことに気付きました。 それでは、Daskの非常に高レベルの概要と、それが素晴らしいと思う理由を少しお話ししましょう。 非常に簡単に言えば、Daskは並列コンピューティングを利用して非常に大きなデータセットで操作を処理および実行できるようにするPythonライブラリです。 そして、最良の部分は、Pythonに既に精通している場合、構文が非常に似ているため、Daskは非常に単純なはずです。
以下のグラフは、Daskの主要コンポーネントを示しています。
情報源: Daskドキュメント
コレクションを使用すると、タスクのグラフを作成して、複数のコンピューターで実行できます。 配列やデータフレームなど、これらのデータ構造のいくつかはおそらくかなり馴染みがあるように聞こえます。これらはPythonで見られるものと似ていますが、いくつかの重要な違いがあります。 たとえば、Daskデータフレームは、操作を並行して実行できるように構築されたパンダデータフレームの束と考えることができます。
コレクションから移動すると、スケジューラーがあります。 タスクグラフを作成すると、スケジューラーが残りを処理します。 ワークフローを管理し、これらのタスクを単一のマシンに送信するか、クラスター全体に分散します。 うまくいけば、それはあなたにDaskがどのように機能するかについての非常に簡単な概要を与えるでしょう。 詳細については、 ドキュメント またはこの 本。 どちらも、このトピックを深く掘り下げるための非常に優れたリソースです。
モデリング用のPythonコード
モデリングするとき、私は常に最初に試す少数の頼りになるアルゴリズムを持っている傾向があります。 これは一般的に、私が抱えている特定の問題に何が適しているかについての良い考えを私に与えてくれます。 これらのモデルは、ロジスティック回帰、ランダムフォレスト、およびGradientBoostingです。 私の経験では、表形式のデータを操作する場合、これらのアルゴリズムは通常、かなり良い結果をもたらします。 以下では、これら3つのモデルを使用してsklearnモデリングパイプラインを構築します。 ここで使用する正確なモデルは、パイプラインがどのsklearn分類モデルでも機能するはずなので、それほど重要ではありません。これは私の好みです。
さらに面倒なことはせずに、コードに飛び込みましょう。 幸い、前処理のほとんどをSnowflakeにアウトソーシングしたので、ここでトレーニングデータをいじくり回す必要はありませんが、sklearnパイプラインを使用していくつかの手順を追加します。
以下の最初のコードスニペットは、sklearnを使用する場合のパイプラインを示しています。 データセットは単純な古いパンダデータフレームであり、前処理ステップはすべてsklearnメソッドを使用して実行されることに注意してください。 ここで特に異常なことは何も起こっていません。 Snowflake ETLによって生成されたテーブルからデータを読み込み、これをsklearnパイプラインに渡します。 ここでは、通常のモデリング手順が適用されます。 データセットをトレーニングとテストに分割し、いくつかの前処理を行います。つまり、中央値を使用して欠落値を代入し、データをスケーリングし、カテゴリデータをワンホットエンコードします。 私はsklearnパイプラインの大ファンであり、基本的に、最近モデルを開発するときはいつでもそれらを使用します。これらは、クリーンで簡潔なコードを本当に容易にします。
このパイプラインは、約2万行のデータセットでどのように機能しますか? ハイパーパラメータを調整せずにこのモデルを実行するには、約34分かかります。 痛い、ちょっと遅い。 あらゆるタイプのハイパーパラメータ調整を実行したい場合、これに非常に長い時間がかかることを想像できます。 わかりました。理想的ではありませんが、Daskがどのように課題を処理するかを見てみましょう。
Dask MLPythonコード
ここでの私たちの目標は、上記のsklearnパイプラインを打ち負かすことができるかどうか、ネタバレ注意を喚起することです。 Daskの優れた点は、Pythonに既に精通している場合の参入障壁がかなり低いことです。 わずかな変更を加えるだけで、このパイプラインをDaskで稼働させることができます。
おそらく最初に気付く変更は、いくつかの異なるインポートがあることです。 このパイプラインと前のパイプラインの主な違いのXNUMXつは、モデルのトレーニングにパンダデータフレームの代わりにDaskデータフレームを使用することです。 Daskデータフレームは、それぞれに対して同時に計算を実行できるパンダデータフレームの束と考えることができます。 これはDaskの並列処理の中核であり、このパイプラインのトレーニング時間を短縮するものです。
使用していることに注意してください @ dask.delayed 私たちのデコレータとして トレーニングデータのロード 関数。 これにより、Daskはこの関数を並列化するように指示されます。
また、Daskからいくつかの前処理メソッドとパイプラインメソッドをインポートします。最も重要なのは、モデルをトレーニングするためのクラスターを作成できるようにするSaturnClusterをインポートする必要があることです。 このコードとのもうXNUMXつの重要な違いは、 dask.persist 私たちの列車のテスト分割後。 この時点まで、Daskの遅延評価のため、実際には関数は計算されていません。 Daskにデータをワーカーに送信し、この時点までに作成したタスクを実行して、これらのオブジェクトをクラスターに残すように指示していますが、persistメソッドを使用するとします。
最後に、遅延法を使用してモデルをトレーニングします。 繰り返しますが、これにより、パイプラインを怠惰な方法で作成できます。 このコードに到達するまで、パイプラインは実行されません。
fit_pipelines = dask.compute(*pipelines_)
今回は、まったく同じデータセットでこのパイプラインを実行するのに約10分しかかかりませんでした。 これは3.4倍のスピードアップであり、それほど粗末ではありません。 さて、必要に応じて、土星のボタンに触れるだけでコンピューティングリソースをスケールアップすることで、これをさらに高速化できます。
パイプラインの展開
エアフローのようなものを使用して、このようなパイプラインをかなり定期的に実行することをお勧めします。 エアフロー用にすべてをセットアップするという最初の面倒な作業を望まない場合、SaturnCloudはJobsで簡単な代替手段を提供します。 ジョブを使用すると、コードをパッケージ化して、定期的または必要に応じて実行できます。 あなたがする必要があるのは、既存のプロジェクトに行き、ジョブを作成するをクリックすることです。 これを行うと、次のようになります。
情報源: 土星
ここから、上記のpythonファイルが画像のディレクトリにあることを確認するだけで、上記のpythonコマンドを入力できます。
python -m ml_pipeline -w 102 -j 'train'
必要に応じて、cron構文を使用してスケジュールを設定し、ETLを毎日実行することもできます。 興味のある方のために、ここにあります チュートリアル それはすべての核心に入る。
結論とポイント
さて、この時点でプロジェクトは終了しました。 明らかに、ハイパーパラメータの調整やモデルのデプロイなど、ML開発サイクルのいくつかの重要な部分を省略しましたが、おそらくそれは別の日に残しておきます。 Daskを試してみるべきだと思いますか? 私は決して専門家ではありませんが、これまでのところ、確かに非常に役立つように思われます。さらに実験して、データサイエンティストとしての日常業務に組み込む機会を見つけることに非常に興奮しています。 うまくいけば、これが便利で、スノーフレークとダスクの利点のいくつかを見ることができ、自分でそれらを試してみることができます。
リソース
あなたが面白いと思うかもしれない私の他の投稿のいくつか
注:この投稿のリンクの一部はアフィリエイトリンクです。
バイオ: ダニエル・フォーリー は、モバイルゲーム業界で働く元エコノミストからデータサイエンティストに転向しました。
元の。 許可を得て転載。
関連する
過去30日間の人気記事 | |||||
---|---|---|---|---|---|
|
|
出典:https://www.kdnuggets.com/2021/07/building-machine-learning-pipelines-snowflake-dask.html
- "
- &
- 102
- 2021
- アクセス
- NEW
- 利点
- アドバイス
- 提携
- アルゴリズム
- すべて
- Amazon
- アパッチ
- AREA
- 周りに
- オート
- BEST
- ビット
- ビルド
- 建物
- 束
- キャンペーン
- 例
- 生じました
- 挑戦する
- 変化する
- 点検
- 分類
- クローザー
- クラウド
- コード
- コーディング
- コンポーネント
- 計算
- コンピューター
- コンピューティング
- Coursera
- 作成
- Credentials
- Customers
- データ
- データサイエンス
- データサイエンティスト
- データセット
- データウェアハウス
- データベース
- 中
- 取引
- 深い学習
- 人口動態
- 詳細
- 開発する
- 開発
- DID
- 取締役
- 効率
- エンジニア
- 環境
- 実験
- 特徴
- 最後に
- 終わり
- 名
- フォーカス
- 形式でアーカイブしたプロジェクトを保存します.
- 無料版
- フル
- function
- 賭博
- ゲーム業界
- 良い
- GPU
- 素晴らしい
- ガイド
- こちら
- ハイ
- 特徴
- 認定条件
- How To
- HTTPS
- 巨大な
- アイデア
- 識別する
- 画像
- 増える
- 産業を変えます
- info
- 情報
- 問題
- IT
- ジョブ
- Jobs > Create New Job
- join
- ジャンプ
- キー
- 大
- LEARN
- 学習
- レベル
- 図書館
- LINE
- リスト
- 負荷
- ローカル
- 長い
- 機械学習
- メトリック
- 百万
- ML
- モバイル
- 携帯ゲーム
- すなわち
- 新しい特徴
- オファー
- オンライン
- 業務執行統括
- オプション
- その他
- パフォーマンス
- プレンティ
- 投稿
- 電力
- 予測
- 生産された
- 生産性
- プロジェクト
- 公共
- Python
- リーディング
- 減らします
- 回帰
- リソース
- REST
- 結果
- ラン
- ランニング
- 規模
- スケーリング
- 科学
- 科学者たち
- シリーズ
- セッションに
- 設定
- シェアする
- shared
- 簡単な拡張で
- 小さい
- So
- 解決する
- スピード
- 過ごす
- 支出
- スピン
- split
- SQL
- ステージ
- start
- 開始
- 統計
- ストーリー
- ストリーミング
- ターゲット
- test
- 考え
- 時間
- top
- touch
- トレーニング
- トランザクション
- 取引
- トライアル
- チュートリアル
- ui
- us
- users
- バーチャル
- 倉庫
- 週間
- 何ですか
- 以内
- 仕事
- 労働者
- ワークフロー
- 作品
- 書き込み
- X
- 年