概要
弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。
今回はこれまでに投稿してきたSageMakerの使い方記事をまとめました。いわゆるAI/MLを活用したPoCの範囲で扱うSageMakerの基本的な機能を一通り網羅しています。
続きを読むこんにちは。弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。
SageMakerにはProcessingJobという機能があり、こちらはコマンドをジョブの形でサーバ上から実行できるというものです。重い計算を実行したり、再現性のある実験を行うために有用な機能ですが、実はPythonラッパーで簡単に実行することができます。今回はそのラッパーについて紹介します。
続きを読むこんにちは。弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。
SageMakerにはProcessingJobという機能があり、こちらはコマンドをジョブの形でサーバ上で実行できるというものです。重い計算を実行したり、再現性のある実験を行うために有用な機能ですが、同時に実行できるジョブの数には制限があります。今回は、この使用可能なジョブ数を上げる方法を紹介します。
ProcessingJobでジョブを作成しようとしたところ、ジョブ多すぎ!という感じのエラーが。。。
なお、ジョブの作成には、下記のPythonラッパーを使用しました。
https://sagemaker.readthedocs.io/en/stable/api/training/processing.html
ERROR:sagemaker:Please check the troubleshooting guide for common errors: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-python-sdk-troubleshooting.html#sagemaker-python-sdk-troubleshooting-create-processing-job Traceback (most recent call last): File "/home/sagemaker-user/processing-job-sample/trigger.py", line 116, in <module> main() File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 1157, in __call__ return self.main(*args, **kwargs) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 1078, in main rv = self.invoke(ctx) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 1434, in invoke return ctx.invoke(self.callback, **ctx.params) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/click/core.py", line 783, in invoke return __callback(*args, **kwargs) File "/home/sagemaker-user/processing-job-sample/trigger.py", line 105, in main run_processor( File "/home/sagemaker-user/processing-job-sample/src/processing_job_sample/processing.py", line 109, in run_processor processor.run( File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/workflow/pipeline_context.py", line 346, in wrapper return run_func(*args, **kwargs) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/processing.py", line 1781, in run return super().run( File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/workflow/pipeline_context.py", line 346, in wrapper return run_func(*args, **kwargs) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/processing.py", line 681, in run self.latest_job = ProcessingJob.start_new( File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/processing.py", line 917, in start_new processor.sagemaker_session.process(**process_args) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 1589, in process self._intercept_create_request(process_request, submit, self.process.__name__) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 6606, in _intercept_create_request return create(request) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 1587, in submit raise e File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/sagemaker/session.py", line 1577, in submit self.sagemaker_client.create_processing_job(**request) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/botocore/client.py", line 569, in _api_call return self._make_api_call(operation_name, kwargs) File "/home/sagemaker-user/.cache/pypoetry/virtualenvs/processing-job-sample-KaeK58QC-py3.10/lib/python3.10/site-packages/botocore/client.py", line 1023, in _make_api_call raise error_class(parsed_response, operation_name) botocore.errorfactory.ResourceLimitExceeded: An error occurred (ResourceLimitExceeded) when calling the CreateProcessingJob operation: The account-level service limit 'ml.m5.24xlarge for processing job usage' is 10 Instances. Please use AWS Service Quotas to request an increase for this quota. If AWS Service Quotas is not available, contact AWS support to request an increase for this quota.
現在の設定では、使用しているインスタンスでは同時に10件のジョブまでしか利用できないとのことでした。
この件数を引き上げたいと思います。
まずAWSコンソールを開きます。
次に検索欄に "Service Quotas" と入力し、表示されたリンクをクリックします。
"AWSのサービス" の欄に "SageMaker" と入力し、"クォータの表示" を押します。
"クォータ名で検索" 欄に "<インスタンスタイプ> for processing job usage" と入力して検索します。
この際、インスタンスタイプは実際に使用しているものを設定してください。エラーメッセージ上にも表示されています。
表示されたクォータを開きます。
"アカウントレベルでの引き上げをリクエスト" をクリックします。
"クォータ値を引き上げる" の欄でクォータ値を設定し "リクエスト" を押せば完了!
SageMakerのProcessingJobでジョブを作成する際にResourceLimitExceededが発生した場合、Service Quotasからジョブの最大数を引き上げることで解決できます。
本記事は下記の記事と同じ内容です。 アクセス解析を目的としてマルチポストしています。
弥生では一緒に働く仲間を募集しています。 ぜひエントリーお待ちしております。
こんにちは、かとあず(@kato_az)です。弥生でQAエンジニアをしています。
好きな勘定科目は未払金です。
テスト自動化ツールMagicPodを導入しましたので、紹介をします。
私が担当している「スマート証憑管理」は、2週間スプリントで開発を進めています。
2022年にサービス運用を開始した直後は搭載している機能が限定的で、全機能を対象としたリグレッションテストをすることが開発スケジュールに影響することはありませんでした。
毎回手動でテストをすることで、機能を理解する、お客さまが実際に使っている操作を知ることにつながるというメリットもあったように感じています。
しかし、機能が増えるにつれて、テストする内容も増え、「テストが間に合わないのでリリース日を調整する必要がでてきそう」という状態になってきました。
また、レトロスペクティブの中で、アジャイルテスト4象限のQ3やQ4のところに力を入れていきたいという話題があがることがありました。
引用元:https://www.scrum.org/resources/blog/how-the-four-agile-testing-quadrants-support-scrum-teams-jp
アジャイルテスト4象限のQ3やQ4を推進するために、Q2領域のテストを自動化して手離れをしなければ新しい取り組みには着手できないと感じるようになってきました。
そこで、ローコードでテストシナリオが作成できるMagicPodを導入することにしました。
ちょうど他のサービスを担当しているQAエンジニアもテスト自動化ツールを検討していたため、一緒に協力してMagicPodの導入を進めることになりました。
まずは利用ができるかの確認です。本番環境で「基本機能」と位置付けている動作シナリオをツールで実行できるかを確認する作業に着手しました。
シナリオの作り方がわからない場合は、画面右下に配置されている「お問合せ・ヘルプ」に入力して問い合わせをします。
何度かお問合せをしました。すべて翌営業日に回答をいただくことができました。回答の速さと回答内容の適切さに救われました。
私たちのチームが予定しているテストシナリオの作成が可能であることがわかりました。
本番環境からURLやログインアカウントを変えるだけでテスト実行できそうではありましたが、本番環境と異なりテスト環境は社内からしかアクセスができないよう制限をかけています。
私たちのチームでは、テスト環境で毎日リグレッションテストができることを目標にしていたため、「ローカル端末」を使ってテスト実施をすることにしました。
そして、日々テスト実行を続けながら、シナリオのパターンを増やしていきました。
テストを実行するという点では目的は達成できていますが、「ローカル端末」を使うとテスト実行開始は手動で行わなければならず、事前にスケジュールを設定しての定期実行ができません。
このため、テスト実行担当者が不在だとテスト実行が行われないことや、「MagicPodDesktop」をインストールしているPCでしかテスト実行ができないといった不便さがありました。
また、「ローカル端末」での実行では、CIサービスを使用して定期的にテストを実行するということができません。
これらの問題点は、テスト環境においてもクラウド実行ができるようになることで解消できます。
テスト環境でクラウド実行をするには、「接続元IPアドレス制限」の対応が必要です。また、「ユーザー固定IP」も設定したいという希望がありました。これらの対応は、必要になっていた他のチームが先に対応着手していました。
チーム間協力、万歳!
契約プランをスタンダードプランからエンタープライズプランに変更したり、インフラチームに協力を仰いで「接続元IPアドレス制限」の対応を進めてくれていました。
私たちのチームがスケジュール実行を開始したかったタイミングではすでにこれらの対応が完了していたため、追加の作業をすることなく、テスト環境でのクラウド実行を始めることができるようになっていました。
対応してくださったみなさん、ありがとうございます。
スマート証憑管理チームでは、テスト環境で毎朝5:00からシナリオを流して実行結果をSlackに通知するようにしています。
出勤したらSlackの通知を確認することで、テスト環境に意図しない変更が入っていないかをチェックできます。
また、日中にテスト環境にデプロイをしたら、追加機能に関して手動でテストを開始するとともにリグレッションテストはMagicPodで実行をすることで、テストの期間を短縮することができるようになりました。
2024/09/09のスマート証憑管理チームのMagicPodヘルススコアです。
99点!けっこうがんばっています。
不足している1点は、「安定したロケータの使用」です。テストシナリオの見直しや、エンジニアとの協力によって、残りの1点を取りに行きます。
また、ヘルススコアが高いからといってテストの内容がシステムを網羅できているというわけではないということは注意しなければいけません。
作成を予定しているテストシナリオはまだすべて作り終わっていません。
メンテナンスして運用を続けながら、引き続きテストシナリオを増やしていきます。
デプロイごとのリグレッションテストを目的にしていること、開発者自身でもしっかりと動作確認をしているチームであることから、デプロイしたらMagicPodのテストがまったく動かなくなったということは発生していません。
安心安全のチームです。
それでも、意図しない変更が入ってしまうことはあります。
「スマート証憑管理」では、はじめて利用するお客さまにチュートリアルを表示する機能があります。
このチュートリアル画面の動画の位置がなぜか突然左に寄ってしまうといった事象が発生しました。
この事象をMagicPodのテストで差分として検知しました。
手動のテストでは「はじめて利用するお客さま」の観点を省略してしまうことが多く、毎回チュートリアルの表示詳細までは確認していません。
このため、手動テストだけを実施していたら検知が遅れたことと思います。
ちなみに、このチュートリアル、「スマート証憑管理」にログイン後、画面右上にある「?」をクリックして、「使い方ガイド」を開くメニューからいつでも表示することができます。
「スマート証憑管理」でできることにどんなことがあっただろう?という方がいらっしゃいましたら、ぜひご覧ください。
いろいろと試行錯誤をしているところなので、別の記事で紹介できればと考えています。
MagicPodを使った自動テストは、QAエンジニアだけではなく、チームみんなで運用して育てていきたいと感じています。
開発者も開発者以外も知らず知らずのうちにMagicPodが身近な存在になったらいいなと思い、「ソフトウェアテスト関係者くらいしか使わない絵文字」を社内Slackのスタンプとして登録しています。
magicpod.com
「mp-」から始まるスタンプ名で登録しています。
登録する・しないの選別は完全に私の好みです。
もうすでに弥生全員がMagicPodユーザーになり始めています。
弥生では、一緒に働く仲間を募集しています。
こんにちは!もくテク運営岩佐です。
7月18日(木)にもくテク「AIを活用した業務効率化 ~ChatGPT導入事例集~」を開催しました。
イベントページはこちら(※開催は終了) https://mokuteku.connpass.com/event/322629/mokuteku.connpass.com
普段から業務でChatGPTを活用されている4名の方にLTをしていただきました。
イベントのアーカイブ動画をYouTubeで公開しています!
イベントの内容については、ぜひ上記YouTube動画をご覧ください!
各LTの資料も公開していますので、興味のある発表があれば目を通してみてください。
もくテクでは今後も様々なテーマで勉強会を開催していきます!
興味のある回へのご参加や、メンバー登録などしていただけると嬉しいです。
https://mokuteku.connpass.com/mokuteku.connpass.com
弥生では一緒に働く仲間を募集しています! herp.careers
こんにちは。弥生R&D室のsiidaです。R&D室ではSageMakerを使用して機械学習 (ML) のプロジェクトを進めています。SageMakerはMLのための様々な機能が搭載されたサービスであり、データ分析からモデル訓練、ひいてはワークフローの構築まで、SageMakerの中で完結させることができます。
SageMakerは元々JupyterLabのIDEを備えていましたが、こちらはNotebookの実行に最適化されたIDEであるため、データ分析であればともかくモデリングやMLシステムの構築には不向きな点がありました。
そこでCode Editorの出番です。こちらはVSCodeを元に作られたIDEで、事実上ブラウザで動作するVSCodeとして扱うことができます。ターミナルもVSCode同様の扱いとなっているため、あえてターミナルを全画面に表示することでiTermのようなローカルのターミナルと同じように操作することもできます。Vim派のユーザーにもおすすめなツールです。
本日はこのCode Editorの使い方を紹介します。
続きを読むこんにちは、弥生の開発本部でPMをしているシダです。 「弥生会計オンライン」の開発に携わっています。
システム開発においては、サービスプラットフォームやソフトウェア、フレームワークなど数多くの必要な要素があります。
本ブログでもそういった情報を多く取り扱っております。
ですが、仕事としてものづくりをするにあたっては「誰のために、どういった価値を届けるか」という点も重要だと私は考えています。
中でも「実際のお客さまの声」というのは「世に出したものがどう受け入れられたか」を知るうえで非常に大事な情報となります。
そういった背景もあり、私のチームでは今年から顧客サービス本部*1(以下、CS本部)との交流の取り組みを行っています。
以前から他のチームでも実践していたことなのですが、今年から私のチームでも開始しました。
過去に本ブログでも「弥生会計」開発チームの同様の取り組みを紹介しています。
重複する内容もあるかもしれませんが、PMの目線、オンラインサービスの目線など、異なる目線でお伝えできることがあると考えたため、その取り組みについてご紹介したいと思います。
開発本部では2023年10月より「本部をまたいだコミュニケーション、意思決定の速度を向上させる」という目標を掲げていました。 その実現のために、他本部が通常業務で行っている内容を把握できるよう、以下のような施策を実施しています。
・開発本部内で実施しているLT大会に、他本部の方に特別講演という形で参加してもらう
・営業現場を知るため、パートナービジネス本部の会計事務所訪問に同行する
・他本部と意見交換や質疑応答を行う場を設ける
今回の「お客さまの声を聴く」施策も、この一環で企画されたものです。
まずはCS本部のメンバーとのオンライン交流会の場を設けました。
弥生は日本各地に拠点がありますが、開発本部の拠点は東京、CS本部の拠点は大阪・札幌ということで、メンバー同士が直接を顔合わせる機会は殆どありません。
そのためZoomを用いてのオンライン交流会を行いました。
私はPMという立場上、CS本部の方とは定期的にコミュニケーションをとる機会があります。
ただ、それはあくまで各本部のリーダークラス同士の交流であり、現場に近い方とのコミュニケーションの機会は殆どありませんでした。
また、両本部の現場に近いメンバーは、そもそも部横断でのコミュニケーションの機会自体がありません。
そのため、普段は耳にできない現場レベルでの声を共有しあえる機会、という点において価値のある取り組みだと考えました。
私自身も、実際にお客さま対応をされている方と話すのは初めてであり、現場目線での話が聴けたのは非常にためになりました。
・サービスの初期化処理の動線を変更したことで、誤操作やお問い合わせを削減できた
・画面項目に説明(ツールチップ等)を増やすことでお問い合わせを抑制でき、お問い合わせへの回答も容易になった
・決算時における按分処理などの複雑な処理を自動で処理するようにしたことで、お問い合わせを抑制できた
・法令対応を行ったが、そもそも制度自体が非常に難解なため、お客さまへの説明が大変
・法令対応に伴い設定画面に項目を追加したが、それらをお客さまに理解してもらったうえで、正しいものを選択してもらうよう誘導するのが大変
・確定申告に必要な情報を入力する際には、必要な人に、必要な情報のみを見せるようにしたい
・確定申告が簡単すぎて、却って不安に感じているようなお問い合わせがある
良かった声については「対応して良かったな」と心から思いました。自分たちの作ったものが実際にお客さまや現場のメンバーの方々に受け入れられており、非常に嬉しく思いました。
一方で課題を感じた声については、今後どう解消していくか考えていく必要があります。お客さまの事だけでなく、お問い合わせ対応をするCS本部の方の事も考えたうえでの製品開発が必要だなと改めて感じました。
また、過去にCS本部から上がった要求について「本当にこの改善は効果があるのか…?」と内心思っていたものもあったのですが、それらがお客さまにどのような印象を与えているか、CS本部におけるお客さま対応にどう役立っているか、という点を聴けたのは非常に良かったです。
今まで以上に自信を持って開発に取り組めると感じました。
※余談ですが、会自体は非常にアットホームな雰囲気で進めることができました。製品品質やリリース頻度に対する不満などを受けることはなく、内心ホッとしました。
続いて、CS本部が実際にお客さま対応をした際の音声ログの視聴会を実施しました。
開発本部のメンバーは普段はお客さまの声を直接聴くことはありません。そのため実際のお客さまの声を聴くことで今後の製品開発に活かせないか、というのが目的です。
ここでは上がった声のうち2種類を紹介したいと思います。
お客さまの操作において「〇〇といった操作はできないか?」という声がありました。
現状対応予定がないもの、いずれ対応する予定は立っているもの、そもそも開発側で認知していなかったものなど、様々でした。
あくまで一部の声かもしれませんが、対応されていないことによる落胆される方や、逆に熱い要望を送って下さる方もおり、非常に考えさせられました。
とはいえ、あくまで一部の声であるため、すべてを安易に受け止めるのではなく『より多くのお客さまを幸せにするにはどうすればいいか?』はしっかりと考える必要があります。
こういった点はCS本部とも協力し、少しでも解消していくことが必要だと改めて感じました。
弥生のオンライン製品は「初心者にも使いやすく」をモットーにしています。そのため「操作説明やFAQを充実させる」「必要な箇所のみを入力させる」「迷いにくい画面構成とする」など、多くの工夫をしております。
ただ、それでも操作や仕様に関する質問はゼロにはなりません。
特に、昨年対応したインボイス制度*2については、製品内での説明を手厚くしたものの、やはりお客さまからは多くのお問い合わせが発生していることがわかりました。
インボイス制度への対応では、画面項目も新たに追加しております。
この対応は2年以上にも渡ったため、私を含めた開発チームはいつの間にか追加した画面項目に対してあまり違和感を感じなくなっていました。
が、音声ログを聞いたことで、それらがお客さまに驚きを持って迎えられたことを実感しました。
私も、慣れ親しんだwebページやアプリなどが急に変わったら大きく戸惑いますし、単純に使い慣れていないというだけで「分かりにくい、使いづらい」という印象を抱いてしまいます。
特に会計ソフトは個人事業主や法人のお客さまにとって『必ずしも、積極的に使いたいものではない』と考えています。可能なら本業によりリソースを割きたい、という思いもあるはずだと私は考えます。 そういった背景も踏まえると、機能追加によりお客さまが感じたストレスは相当のものであったはずです。 お客さまの目の前で起こっていたことを知るという意味で、大きな収穫のあった取り組みだと感じています。
今回は2つの取り組みを紹介しました。
私自身はCS本部の代表の方とのコミュニケーションは頻繁にとっていましたが、実際の現場の声を聴くとまた違った刺激がありました。
また、普段CS本部とあまり接点がないメンバーにとっては、私以上に得られたものが多かったと考えます。
この取り組みを経て新たな刺激を受け、それを製品開発に還元してもらえれば、PMとしても非常に嬉しく思います。
私の現在の役割は文字通り「プロジェクトマネージャー」の側面が強く、「お客さまのためにどういった製品を作るべきか」よりも「開発チームの成功」により重きをおいているのが正直なところです。
もちろん、それだけでは真に価値のある製品は作れないことは自覚しております。
ですがCS本部の存在により、お客さまが困っていること、お客さまが求めているものを間接的に知ることができます。
弥生のカスタマーセンターは業界でも随一の規模であり、また弥生シリーズの有償契約者数も100万件を超えています。
そういった多数のお客さまの声を聴き、製品開発に活かせることは開発側にとっても非常に大きいメリットです。だからこそ私も「開発チームの成功」に全力を注ぐことができています。
今後もこの強みを最大限に活かし、より多くのお客さまに満足してもらえる製品を開発していきます。
弥生では一緒に働く仲間を募集しています。 herp.careers