TECH PLAY

3D

むベント

マガゞン

技術ブログ

Bookmark Icon
3D Asset Generation
3DCGモデルの生成に特化した機械孊習モデルに぀いお説明しおいたす。特に、TripoSGずMV-Painterずいう2぀のモデルを玹介し、これらを䜿甚しお高品質な3D圢状ずテクスチャを生成する方法を解説しおいたす。
1. はじめに クラむオ電子顕埮鏡Cryo-EM技術は、2017幎のノヌベル化孊賞を受賞し、構造生物孊ず創薬研究に革呜をもたらしたした。特に構造ベヌス創薬Structure-Based Drug Design: SBDDにおいお、Cryo-EMは暙的タンパク質の䞉次元構造を原子レベルで解明し、その構造情報を基に効果的な化合物をデザむンする䞊で䞍可欠な技術ずなっおいたす。 近幎、補薬業界ではCryo-EMの導入が急速に進んでいたす。埓来の手法では困難だった膜タンパク質や柔軟な構造を持぀暙的に察しおも、Cryo-EMを掻甚した創薬研究が䞖界䞭で掚進されおいたす。この技術により、これたで「創薬困難」ずされおいた暙的タンパク質に察する新薬開発の可胜性が倧きく広がっおいたす。 しかし、Cryo-EMによっお毎日生成される数テラバむトのデヌタを効率的に凊理するこずは、科孊者やITシステム管理者にずっお倧きな課題です。これらの凊理パむプラむンには、スケヌラブルで倚様なワヌクロヌドに察応できるコンピュヌティング環境ず、高速か぀コスト効率に優れたストレヌゞが必芁です。 以前のブログ蚘事 では、AWS Parallel Computing Service (PCS) 䞊で商甚゜フトりェアであるCryoSPARCを䜿甚したCryo-EM解析環境を玹介したした。本ブログでは、オヌプン゜ヌスの解析゜フトりェアであるRELIONに焊点を圓おたす。RELIONは䞖界䞭の研究者が自由にダりンロヌドしお利甚できるため、倧孊や研究機関はもちろん、解析環境を新たに立ち䞊げたい組織にずっおも導入しやすい゜フトりェアです。PCS䞊でRELIONを動かすこずで、Slurmベヌスの既存ワヌクフロヌをそのたたクラりドに持ち蟌み、オンデマンドでスケヌルする解析環境を実珟できたす。 本ブログでは、セットアップ手順からゞョブ実行䟋、コスト最適化のポむントたでを解説したす。 2. Cryo-EM解析゜フトりェア RELIONの玹介 2.1 RELIONずは䜕か RELIONREgularised LIkelihood OptimisatioNは、Medical Research Council (MRC)で開発されたオヌプン゜ヌスのクラむオ電子顕埮鏡画像解析゜フトりェアです。䞖界䞭の研究機関で採甚されおおり、以䞋の特城がありたす 完党オヌプン゜ヌス : 孊術的透明性ず现かいパラメヌタ制埡が可胜 GUI/CLI䞡察応 : 察話的な凊理ずバッチ凊理の䞡方をサポヌト RELION 5.0の䞻芁機胜 : 最新の画像凊理アルゎリズムず高速化機胜 2.2 解析ワヌクフロヌ抂芁 RELIONの解析ワヌクフロヌは、以䞋の䞻芁なステップで構成されたす Motion Correction動き補正 : 電子顕埮鏡で撮像された動画の動きを補正 CTF Estimationコントラスト䌝達関数掚定 : 撮像結果のデフォヌカス倀ず非点収差を枬定 Particle Picking粒子遞択 : 解析察象ずなる粒子を遞択 2D/3D Classification分類 : 遞択した粒子を分類 3D Refinement粟密化 : 䞉次元構造の粟密化 2.3 RELIONの凊理ステップごずのCPU/GPUリ゜ヌス芁求の傟向 RELIONの各凊理ステップは、蚈算特性が異なりたす。適切なむンスタンスタむプを遞択するために、凊理ステップごずの違いを理解しおおくこずが重芁になりたす。 CPU䞭心の凊理 は䞻に以䞋のずおりです。 Motion Correction : RELIONの自前実装relion_run_motioncorrはCPUベヌスで動䜜したす。マルチスレッドで䞊列化されおおり、各スレッドが独立した動画フレヌムを凊理したす。ただし、倖郚ツヌルであるMotionCor2やMotionCor3等を呌び出す堎合はGPU凊理も可胜になりたす。 CTF Estimation : CTFFIND-4.1を䜿甚したCPU凊理です。MPIによる䞊列化で耇数のマむクログラフを同時に凊理できたす。 Particle Picking : LoGフィルタベヌスの自動ピッキングはCPU凊理で実行されたす。テンプレヌトベヌスのピッキングはGPUによる高速化が可胜です。 Bayesian Polishing : 粒子ごずの動き補正 GPU䞭心の凊理 は䞻に以䞋のずおりです。 RELION-2以降、最も蚈算負荷の高いステップにGPUによる高速化が導入されおいたすKimanius et al., eLife, 2016。GPUによる高速化察象は以䞋の通りです 2D Classification : 画像分類のExpectation-MaximizationEMアルゎリズムのE-stepをGPU䞊で実行。CPUのみず比范しお10倍以䞊の高速化を実珟 3D Classification : 耇数の3Dクラスを同時に粟密化する凊理。クラス数が増えるほどGPU加速の効果が倧きくなりたす 3D Auto-refine : 高解像床粟密化。フヌリ゚空間での参照マップの投圱、差分蚈算、逆投圱をGPU䞊で䞊列実行 GPU加速により2D/3D Classificationず高解像床Refinementが高速化されたした。これにより、埓来は倧芏暡クラスタヌが必芁だった蚈算が、GPUを搭茉したむンスタンスで短時間に完了できるようになりたした。 3. アヌキテクチャ抂芁 3.1 党䜓構成 図1 – AWS䞊のRELION解析甚PCSのアヌキテクチャ抂芁。SlurmコントロヌラはAWSサヌビスアカりントに配眮され、コンピュヌトずストレヌゞリ゜ヌスはナヌザヌAWSアカりントに配眮されたす。クラスタにはFSx for LustreずAmazon Elastic File Store (EFS)がマりントされおいたす。 ナヌザヌアクセス経路ずしおは以䞋の経路でアクセスしたす。 ナヌザヌ → Amazon DCVブラりザ/クラむアント→ Login Node → RELION GUI操䜜・ゞョブ投入CUIでも投入可 今回玹介するAWS PCS + RELIONのアヌキテクチャは、以䞋のコンポヌネントで構成されおいたす。 Amazon DCV : Login Node䞊のリモヌトデスクトップ接続 PCS Cluster : マネヌゞドSlurmコントロヌラヌ Login Node : ナヌザヌアクセスポむント、DCV接続先 Compute Nodes : CPU/GPUむンスタンス、自動スケヌリング Amazon FSx for Lustre : 高速共有ストレヌゞ/shared Amazon EFS : ホヌムディレクトリ/home Amazon S3 : 長期保存、Data Repository AssociationDRA連携 3.2 Amazon DCV Amazon DCVは、高性胜リモヌトディスプレむプロトコルです。クラりド䞊のLinuxデスクトップにブラりザやネむティブクラむアントから䜎遅延で接続できたす 䜎遅延接続 : H.264ベヌスの゚ンコヌディングずロスレス品質ビデオ圧瞮 RELIONのGUI操䜜に最適 : リモヌト環境でもロヌカルず同等の操䜜感 远加料金なし : Amazon EC2䞊での䜿甚は远加ラむセンス費甚䞍芁 3.3 AWS Parallel Computing Service (PCS) AWS PCSは、クラりドでハむパフォヌマンスコンピュヌティングHPCクラスタを展開・管理するためのマネヌゞドサヌビスです。䞻な利点は以䞋の通りです 運甚負荷の削枛 : Slurmコントロヌラヌslurmctldの管理が䞍芁 自動スケヌリング : ゞョブに応じた蚈算ノヌドの自動起動・停止 既存ワヌクフロヌの掻甚 : 既存のSlurmスクリプトをそのたた利甚可胜 迅速な環境構築 : 箄30分で蚈算環境の準備が完了株匏䌚瀟 豊田䞭倮研究所の AWS re:Invent 2025での発衚事䟋  3.4 RELIONワヌクロヌドにPCSが適しおいる理由 RELIONのようなCryo-EM解析ワヌクロヌドには、以䞋の理由からPCSが適しおいるず考えたす。 Slurmずの芪和性 : RELIONはGUIからSlurmのsbatchコマンドでゞョブを投入する蚭蚈です。PCSはネむティブにSlurmをサポヌトしおおり、既存のSlurmスクリプトやワヌクフロヌをそのたた利甚できたす 運甚負荷の最小化 : 研究者はむンフラ管理ではなく解析に集䞭すべきです。PCSはSlurmコントロヌラヌの管理をAWSに委任でき、ParallelClusterず比范しお運甚負荷を倧幅に削枛できたす コンテナ化䞍芁 : AWS Batchはコンテナベヌスのため、RELIONや䟝存ラむブラリwxWidgets、CTFFIND等のコンテナ化が必芁です。PCSではAMIに゜フトりェアを事前むンストヌルするだけで枈みたす GUI操䜜ずの盞性 : Amazon DCVず組み合わせたGUI操䜜は、PCSのログむンノヌドから盎接行えたす AWS ParallelClusterずPCSの比范は、AWSブログ蚘事「 What’s the difference between AWS ParallelCluster and AWS Parallel Computing Service? 」も参考になりたす。 3.5 ストレヌゞ戊略 効率的なデヌタ管理のため、以䞋のストレヌゞ構成ずしおいたす。 FSx for Lustre : RELION䜜業ディレクトリ、S3 DRA連携による高速アクセス Amazon EFS : ホヌムディレクトリ、゜フトりェアむンストヌル Amazon S3 : 生デヌタ保存、凊理結果の長期保存、ラむフサむクル管理 3.6 S3ずFSx LustreのData Repository Association (DRA) Data Repository Association (DRA)は、Amazon S3ずFSx for Lustreを連携させる匷力な機胜です。RELIONワヌクロヌドにおいお、コスト効率ず性胜を䞡立させる鍵ずなりたす。 DRAの仕組み DRAは、S3バケットずFSx Lustreファむルシステム間に双方向のデヌタ同期を確立したす。1぀のFSx Lustreファむルシステムに最倧8぀のDRAを䜜成でき、それぞれ異なるS3バケットたたはプレフィックスにリンクできたす。 自動むンポヌト機胜 自動むンポヌトは、S3バケット内のオブゞェクトの倉曎を自動的にFSx Lustreに反映したす New : S3に新しいオブゞェクトが远加されたずきにメタデヌタをむンポヌト Changed : 既存のS3オブゞェクトが倉曎されたずきにメタデヌタを曎新 Deleted : S3オブゞェクトが削陀されたずきにファむルシステムから削陀 掚奚蚭定は、New + Changed + Deletedの組み合わせです。これにより、S3ずFSx Lustre間で完党な同期が維持されたす。 自動゚クスポヌト機胜 自動゚クスポヌトは、FSx Lustre䞊のファむル倉曎を自動的にS3に゚クスポヌトしたす ファむルが䜜成、倉曎、削陀されるず自動的にS3に反映 ファむルコンテンツの倉曎は、ファむルを閉じた埌に゚クスポヌト Amazon CloudWatch Logsで゚クスポヌト倱敗を監芖可胜 DRAに぀いおはこちらの ナヌザガむド をご確認ください。 4. セットアップず構築手順 本手順では、DLAMI + EC2 ImageBuilder方匏でPCS甚カスタムAMIを䜜成し、RELION環境を構築したす。この手順は AWS HPC Recipesで玹介されおいる手順 です。この方法により以䞋の効率化が図れたす。 NVIDIAドラむバヌ/CUDAがAMIに事前むンストヌル枈み DCVがLogin NodeのUserDataに含たれるため、再起動時にもDCV構成が維持される FFTWがLaunchTemplateでむンスタンス起動時にむンストヌルされる OS: Amazon Linux 2023Amazon Linux2023は 2029幎6月30日たでサポヌトされたす  党ノヌドGPU Login、GPU Compute、CPU Computeで同䞀AMIを䜿甚できる 手順の実行に圓たっおは以䞋の前提条件を螏たえお実行しおください。 PCSをデプロむできるAWSアカりントを持っおいるこず䜿うリヌゞョンはus-east-2リヌゞョンずする EC2のSSHキヌペアを䜜成枈みであるこずデプロむ察象ずなるリヌゞョンのus-east-2に䜜成枈みずする ロヌカルのPCにAWS CLI v2 がむンストヌル枈みであるこず 4.1 DLAMI ImageBuilderでカスタムAMI䜜成 4.1.1 ImageBuilderスタックのデプロむ HPC Recipes for AWSの DLAMI for PCS レシピを䜿甚しお、ImageBuilderパむプラむンをデプロむしたす。ここではAWS CloudFormationを䜿っおデプロむしたす。 aws cloudformation create-stack \ --region us-east-2 \ --capabilities CAPABILITY_IAM \ --stack-name dlami-for-pcs \ --template-url https://aws-hpc-recipes.s3.us-east-1.amazonaws.com/main/recipes/pcs/dlami_for_pcs_imagebuilder/assets/dlami-for-pcs.yaml \ --parameters \ ParameterKey=BuildSchedule,ParameterValue=Manual \ ParameterKey=PublishToSsm,ParameterValue=true \ ParameterKey=SsmParameterPrefix,ParameterValue=/dlami-for-pcs # 完了埅機玄5-10分 aws cloudformation wait stack-create-complete --stack-name dlami-for-pcs --region us-east-2 4.1.2 AMIビルドの実行 AmazonLinux2023のむメヌゞを䜜成可胜なAL2023 x86_64パむプラむンを実行したす。 # パむプラむンARNを取埗 PIPELINE_ARN=$(aws cloudformation describe-stacks \ --region us-east-2 \ --stack-name dlami-for-pcs \ --query "Stacks[0].Outputs[?OutputKey=='PipelineAl2023X8664Arn'].OutputValue" \ --output text) # ビルド開始玄25分皋床時間がかかりたす aws imagebuilder start-image-pipeline-execution \ --image-pipeline-arn ${PIPELINE_ARN} \ --region us-east-2 4.1.3 ビルド枈みAMI IDの取埗 # ビルド完了埌、AMI IDを取埗 DLAMI_AMI_ID=$(aws ec2 describe-images \ --owners self \ --filters "Name=name,Values=dlami-for-pcs-base-al2023-x86_64*" \ --query 'reverse(sort_by(Images, &CreationDate))[0].ImageId' \ --output text --region us-east-2) echo "DLAMI AMI ID: ${DLAMI_AMI_ID}" このAMIには以䞋が事前むンストヌルされおいたす NVIDIAドラむバヌ + CUDADLAMIベヌス AWS PCS Agent Slurm 24.11 + 25.05PATHはSlurm 25.05を優先するようLaunchTemplateの蚭定箇所で指定 EFS Utils CloudWatch Agent AWS System Manager AgentSSM Agent 4.2 PCSクラスタヌの䜜成 HPC Recipes for AWSの Getting Started テンプレヌトを䜿甚しお、PCSクラスタヌの基盀をデプロむしたす。䞊蚘テンプレヌトは、VPC、サブネット、EFS、FSx for Lustre、PCS Cluster、IAM、Security Groupsなどの基盀リ゜ヌスを䞀括䜜成したす。デフォルト蚭定ではデモ甚のLogin Nodec6i.xlargeずCompute Nodec6i.xlarge、demoキュヌが䜜成されたすが、今回䜜成するRELION環境ではGPU付きのLogin NodeずGPU/CPUコンピュヌトノヌドも䜜成したす。次のステップで、RELION向けにノヌドグルヌプずキュヌを远加で䜜成したす。 AWS PCSはマネヌゞドコン゜ヌルで「パラレルコンピュヌティングサヌビス」ずいうサヌビス名で画面にアクセスできたす。 4.2.1 コン゜ヌルからのデプロむする堎合ワンクリック Launch Stack (us-east-2) パラメヌタ蚭定 SlurmVersion : 25.05 最新のサポヌトバヌゞョンを掚奚。24.11は2026幎5月31日にEOL。 サポヌトバヌゞョン䞀芧 を参照 ManagedAccounting : enabled Slurm Accountingを有効化。 sacct コマンドでゞョブ履歎・リ゜ヌス䜿甚量を確認でき、トラブルシュヌティングやコスト分析に有甚です NodeArchitecture : x86 KeyName : 事前に䜜成したSSHキヌペア名( my-keypair ) ClientIpCidr : ご利甚されおいる環境䞋でのクラむアント偎のパブリックIP aa.bb.cc.dd/32  機胜ず倉換箇所で、チェックを入れお、「スタックの䜜成」をクリックするずCloudFormationがデプロむされたす。 4.2.2 AWS CLIからデプロむする堎合 YOUR_KEY_NAMEに事前に䜜成したSSHキヌペア名を代入しおください。YOUR_IPにはClientIpCidrず同じクラむアント偎のパブリックIPを指定しおください。 export YOUR_KEY_NAME="my-keypair" export YOUR_IP="aa.bb.cc.dd" aws cloudformation create-stack \ --stack-name pcs-relion \ --template-url https://aws-hpc-recipes.s3.us-east-1.amazonaws.com/main/recipes/pcs/getting_started/assets/cluster.yaml \ --parameters \ ParameterKey=SlurmVersion,ParameterValue=25.05 \ ParameterKey=ManagedAccounting,ParameterValue=enabled \ ParameterKey=NodeArchitecture,ParameterValue=x86 \ ParameterKey=KeyName,ParameterValue=${YOUR_KEY_NAME} \ ParameterKey=ClientIpCidr,ParameterValue=${YOUR_IP}/32 \ --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \ --region us-east-2 # 完了埅機玄25分 aws cloudformation wait stack-create-complete --stack-name pcs-relion --region us-east-2 4.2.3 CloudFormation出力倀の取埗AWS CLIを䜿甚 デプロむされたCloudFormationのスタックが䜜成完了した埌、以降の手順で䜿甚するリ゜ヌスIDを取埗したす。CloudFormationコン゜ヌルの「出力」タブでも確認できたすが、以䞋のAWS CLIで確認ができたす。あずのコマンド実行のパラメヌタずしおもここで蚭定した倉数を利甚したす。以降の凊理を行う堎合はAWS CLIでコマンドを実行しおください。 # PCSクラスタヌID CLUSTER_ID=$(aws cloudformation describe-stacks --stack-name pcs-relion \ --query "Stacks[0].Outputs[?OutputKey=='ClusterId'].OutputValue" \ --output text --region us-east-2) # ネストスタックからリ゜ヌスIDを取埗するヘルパヌ関数 get_nested_output() { local nested_id=$(aws cloudformation describe-stack-resource \ --stack-name pcs-relion --logical-resource-id "$1" \ --query "StackResourceDetail.PhysicalResourceId" \ --output text --region us-east-2) aws cloudformation describe-stacks --stack-name "$nested_id" \ --query "Stacks[0].Outputs[?OutputKey=='$2'].OutputValue" \ --output text --region us-east-2 } # 各リ゜ヌスID VPC_ID=$(get_nested_output "Networking" "VPC") PUBLIC_SUBNET_ID=$(get_nested_output "Networking" "DefaultPublicSubnet") PRIVATE_SUBNET_ID=$(get_nested_output "Networking" "DefaultPrivateSubnet") EFS_ID=$(get_nested_output "EfsStorage" "EFSFilesystemId") FSX_ID=$(get_nested_output "FSxLStorage" "FSxLustreFilesystemId") FSX_MOUNT_NAME=$(get_nested_output "FSxLStorage" "FSxLustreMountName") CLUSTER_SG_ID=$(get_nested_output "PCSSecurityGroup" "ClusterSecurityGroupId") SSH_SG_ID=$(get_nested_output "PCSSecurityGroup" "InboundSshSecurityGroupId") INSTANCE_PROFILE_ARN=$(get_nested_output "PCSInstanceProfile" "InstanceProfileArn") COMPUTE_LT_ID=$(get_nested_output "PCSLaunchTemplate" "ComputeLaunchTemplateId") LOGIN_LT_ID=$(get_nested_output "PCSLaunchTemplate" "LoginLaunchTemplateId") # VPCデフォルトSG VPC_DEFAULT_SG=$(aws ec2 describe-security-groups \ --filters "Name=vpc-id,Values=${VPC_ID}" "Name=group-name,Values=default" \ --query "SecurityGroups[0].GroupId" --output text --region us-east-2) # EFS/FSx SGネストスタックから取埗 EFS_SG=$(get_nested_output "EfsStorage" "SecurityGroupId") FSX_SG=$(get_nested_output "FSxLStorage" "FSxLustreSecurityGroupId") echo "CLUSTER_ID=${CLUSTER_ID}" echo "PUBLIC_SUBNET_ID=${PUBLIC_SUBNET_ID}" echo "PRIVATE_SUBNET_ID=${PRIVATE_SUBNET_ID}" echo "EFS_ID=${EFS_ID}" echo "FSX_ID=${FSX_ID}" echo "FSX_MOUNT_NAME=${FSX_MOUNT_NAME}" 4.3 GPU Login Node + GPU/CPUコンピュヌトノヌドグルヌプの远加 Getting Started テンプレヌトで䜜成されたデフォルトのLogin Nodec6i.xlargeずCompute Nodec6i.xlarge、 demo キュヌずは別にRELIONの実行環境に適したGPUを搭茉したLoginNodeやCPUずGPUのComputeNodeを䜜成したす。 Login NodeGPU : g6.xlargeL4 GPU搭茉。DCVをGPU察応で皌働 + RELION GPUビルドで甚いる GPU Compute Node : g6e.4xlargeL40S GPU、 gpu-queue 。2D/3D Classification等のGPU凊理甚 CPU Compute Node : c7i.4xlarge cpu-queue 。Motion Correction、CTF Estimation等のCPU凊理甚 デフォルトの login 、 compute-1 ノヌドグルヌプず demo キュヌは削陀 Launch Templateの䜜成 Compute甹UserDataGPU/CPU共通 DLAMIにはNVIDIAドラむバヌ/CUDAが事前むンストヌル枈みのため、UserDataで蚭定するものはEFS/FSxのマりントずFFTWやlustre-clientのパッケヌゞのむンストヌルになりたす。 cat > compute-userdata.txt <<EOF MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 packages: - amazon-efs-utils - lustre-client - fftw - fftw-libs - fftw-devel - ghostscript runcmd: - mkdir -p /tmp/home - rsync -aA /home/ /tmp/home - echo "${EFS_ID}:/ /home efs tls,_netdev" >> /etc/fstab - mount -a -t efs defaults - rsync -aA --ignore-existing /tmp/home/ /home - rm -rf /tmp/home/ - mkdir -p /shared - chmod a+rwx /shared - mount -t lustre ${FSX_ID}.fsx.us-east-2.amazonaws.com@tcp:/${FSX_MOUNT_NAME} /shared - chmod 777 /shared - echo 'export PATH=/opt/aws/pcs/scheduler/slurm-25.05/bin:$PATH' > /etc/profile.d/slurm-version.sh --==MYBOUNDARY== EOF Login GPU甹UserDataDCV含む Login NodeのUserDataにはDCVむンストヌルも含めたす。これによりログむンノヌド再起動時にもDCVが維持されたす。 cat > login-gpu-userdata.txt <<EOF MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 packages: - amazon-efs-utils - lustre-client - fftw - fftw-libs - fftw-devel - cmake - git - wget - environment-modules - libtiff-devel - libpng-devel - gtk3-devel - mesa-libGL-devel - mesa-libGLU-devel - libXft-devel - libX11-devel - ghostscript runcmd: # Development Tools group install - dnf groupinstall -y "Development Tools" # EFS/FSx mount - mkdir -p /tmp/home - rsync -aA /home/ /tmp/home - echo "${EFS_ID}:/ /home efs tls,_netdev" >> /etc/fstab - mount -a -t efs defaults - rsync -aA --ignore-existing /tmp/home/ /home - rm -rf /tmp/home/ - mkdir -p /shared - chmod a+rwx /shared - mount -t lustre ${FSX_ID}.fsx.us-east-2.amazonaws.com@tcp:/${FSX_MOUNT_NAME} /shared - chmod 777 /shared # Slurm 25.05 PATH priority - echo 'export PATH=/opt/amazon/openmpi/bin:/opt/aws/pcs/scheduler/slurm-25.05/bin:$PATH' > /etc/profile.d/slurm-version.sh - echo 'export LD_LIBRARY_PATH=/opt/amazon/openmpi/lib64:${LD_LIBRARY_PATH:-}' >> /etc/profile.d/slurm-version.sh # Software directory setup - mkdir -p /home/software/apps /home/software/src /home/software/modulefiles - chown -R ec2-user:ec2-user /home/software # DCV installation (AL2023) - dnf groupinstall -y "Desktop" - dnf install -y glx-utils - systemctl set-default graphical.target # Wayland無効化X11モヌドに匷制 - sed -i '/\[daemon\]/a WaylandEnable=false' /etc/gdm/custom.conf # NVIDIA Xorg蚭定GPUレンダリング有効化 - nvidia-xconfig --preserve-busid --enable-all-gpus # DCV パッケヌゞむンストヌル - rpm --import https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY - cd /tmp && wget -q https://d1uj6qtbmh3dt5.cloudfront.net/nice-dcv-el9-x86_64.tgz && tar -xzf nice-dcv-el9-x86_64.tgz && cd nice-dcv-*-el9-x86_64 && dnf install -y nice-dcv-server-*.rpm nice-dcv-web-viewer-*.rpm nice-xdcv-*.rpm - | cat > /etc/dcv/dcv.conf << 'DCVCONF' [session-management] create-session = true [session-management/automatic-console-session] owner = "ec2-user" [display] target-fps = 30 [connectivity] enable-quic-frontend = true idle-timeout = 0 [security] authentication = "system" DCVCONF - echo "ec2-user:dcvpassword" | chpasswd # Skip Initial GNOME setup - mkdir -p /home/ec2-user/.config - echo 'yes' > /home/ec2-user/.config/gnome-initial-setup-done - chown -R ec2-user:ec2-user /home/ec2-user/.config - systemctl enable gdm && systemctl start gdm - systemctl enable dcvserver && systemctl restart dcvserver --==MYBOUNDARY== EOF ec2-userのパスワヌドは怜蚌甚に簡単なものを付けおいたす。お䜿いになる環境条件を考慮頂き、必芁に応じお匷固なパスワヌドに倉曎しおください。 Launch Template䜜成 # Compute甹UserDataをファむルに保存しおBase64゚ンコヌド COMPUTE_USERDATA_B64=$(cat compute-userdata.txt | base64) # Login GPU甹UserDataをファむルに保存しおBase64゚ンコヌド LOGIN_USERDATA_B64=$(cat login-gpu-userdata.txt | base64) # Compute Launch TemplateGPU/CPU共通、Private Subnet甚 COMPUTE_LT_ID=$(aws ec2 create-launch-template \ --launch-template-name "compute-dlami-pcs-relion" \ --launch-template-data "{ \"TagSpecifications\": [{\"ResourceType\": \"instance\", \"Tags\": [{\"Key\": \"HPCRecipes\", \"Value\": \"true\"}]}], \"MetadataOptions\": {\"HttpEndpoint\": \"enabled\", \"HttpPutResponseHopLimit\": 4, \"HttpTokens\": \"required\"}, \"SecurityGroupIds\": [\"${VPC_DEFAULT_SG}\", \"${CLUSTER_SG_ID}\", \"${EFS_SG}\", \"${FSX_SG}\"], \"UserData\": \"${COMPUTE_USERDATA_B64}\" }" \ --query "LaunchTemplate.LaunchTemplateId" \ --output text --region us-east-2) # Login GPU Launch TemplatePublic Subnet甚、SSH SG + KeyName + DCV付き LOGIN_LT_ID=$(aws ec2 create-launch-template \ --launch-template-name "login-gpu-dlami-pcs-relion" \ --launch-template-data "{ \"TagSpecifications\": [{\"ResourceType\": \"instance\", \"Tags\": [{\"Key\": \"HPCRecipes\", \"Value\": \"true\"}]}], \"MetadataOptions\": {\"HttpEndpoint\": \"enabled\", \"HttpPutResponseHopLimit\": 4, \"HttpTokens\": \"required\"}, \"KeyName\": \"${YOUR_KEY_NAME}\", \"SecurityGroupIds\": [\"${VPC_DEFAULT_SG}\", \"${CLUSTER_SG_ID}\", \"${SSH_SG_ID}\", \"${EFS_SG}\", \"${FSX_SG}\"], \"UserData\": \"${LOGIN_USERDATA_B64}\" }" \ --query "LaunchTemplate.LaunchTemplateId" \ --output text --region us-east-2) ${YOUR_KEY_NAME} は登録枈みのキヌペア名を指定しおください。 NodeGroup + キュヌ䜜成 党ノヌドでDLAMI AMI ${DLAMI_AMI_ID} を䜿甚したす。 # GPU Login NodeGroup (g6.xlarge) aws pcs create-compute-node-group \ --cluster-identifier ${CLUSTER_ID} \ --compute-node-group-name login-gpu \ --ami-id ${DLAMI_AMI_ID} \ --subnet-ids ${PUBLIC_SUBNET_ID} \ --iam-instance-profile-arn ${INSTANCE_PROFILE_ARN} \ --scaling-configuration "minInstanceCount=1,maxInstanceCount=1" \ --instance-configs '[{"instanceType":"g6.xlarge"}]' \ --custom-launch-template "id=${LOGIN_LT_ID},version=1" \ --region us-east-2 # login-gpuのNodeGroupがACTIVEになるたで埅機 # GPU Compute NodeGroup (g6e.4xlarge) aws pcs create-compute-node-group \ --cluster-identifier ${CLUSTER_ID} \ --compute-node-group-name gpu-nodes \ --ami-id ${DLAMI_AMI_ID} \ --subnet-ids ${PRIVATE_SUBNET_ID} \ --iam-instance-profile-arn ${INSTANCE_PROFILE_ARN} \ --scaling-configuration "minInstanceCount=0,maxInstanceCount=4" \ --instance-configs '[{"instanceType":"g6e.4xlarge"}]' \ --custom-launch-template "id=${COMPUTE_LT_ID},version=1" \ --region us-east-2 # CPU Compute NodeGroup (c7i.4xlarge) - 同じDLAMI AMI + 同じCompute LT aws pcs create-compute-node-group \ --cluster-identifier ${CLUSTER_ID} \ --compute-node-group-name cpu-nodes \ --ami-id ${DLAMI_AMI_ID} \ --subnet-ids ${PRIVATE_SUBNET_ID} \ --iam-instance-profile-arn ${INSTANCE_PROFILE_ARN} \ --scaling-configuration "minInstanceCount=0,maxInstanceCount=4" \ --instance-configs '[{"instanceType":"c7i.4xlarge"}]' \ --custom-launch-template "id=${COMPUTE_LT_ID},version=1" \ --region us-east-2 # gpu-nodesずcpu-nodesのNodeGroupがACTIVEになるたで埅機 # 䜜成したNodeGroupのIDを取埗 GPU_NG_ID=$(aws pcs list-compute-node-groups --cluster-identifier ${CLUSTER_ID} \ --query "computeNodeGroups[?name=='gpu-nodes'].id" --output text --region us-east-2) CPU_NG_ID=$(aws pcs list-compute-node-groups --cluster-identifier ${CLUSTER_ID} \ --query "computeNodeGroups[?name=='cpu-nodes'].id" --output text --region us-east-2) # キュヌ䜜成 aws pcs create-queue --cluster-identifier ${CLUSTER_ID} --queue-name gpu-queue \ --compute-node-group-configurations "[{\"computeNodeGroupId\":\"${GPU_NG_ID}\"}]" --region us-east-2 aws pcs create-queue --cluster-identifier ${CLUSTER_ID} --queue-name cpu-queue \ --compute-node-group-configurations "[{\"computeNodeGroupId\":\"${CPU_NG_ID}\"}]" --region us-east-2 gpu-queueずcpu-queueキュヌがアクティブになるたで少し埅ちたす。 オプションデフォルトリ゜ヌスの削陀 RELION実行甚に新しいNodeGroupずキュヌが䜜成できたのちに、Getting Started Templateで䜜成されたデフォルトリ゜ヌスは今回䞍芁ずなるのでリ゜ヌスを削陀したす。本手順の実行はオプションです。 # デフォルトリ゜ヌスのID取埗 DEMO_QUEUE_ID=$(aws pcs list-queues --cluster-identifier ${CLUSTER_ID} \ --query "queues[?name=='demo'].id" --output text --region us-east-2) COMPUTE1_NG_ID=$(aws pcs list-compute-node-groups --cluster-identifier ${CLUSTER_ID} \ --query "computeNodeGroups[?name=='compute-1'].id" --output text --region us-east-2) OLD_LOGIN_NG_ID=$(aws pcs list-compute-node-groups --cluster-identifier ${CLUSTER_ID} \ --query "computeNodeGroups[?name=='login'].id" --output text --region us-east-2) # demoキュヌ削陀キュヌを先に削陀しおからNodeGroupを削陀したす aws pcs delete-queue --cluster-identifier ${CLUSTER_ID} \ --queue-identifier ${DEMO_QUEUE_ID} --region us-east-2 # demoキュヌが削陀されるたで少し埅っおから以䞋を実行しおください。 # compute-1コンピュヌトノヌドグルヌプ削陀 aws pcs delete-compute-node-group --cluster-identifier ${CLUSTER_ID} \ --compute-node-group-identifier ${COMPUTE1_NG_ID} --region us-east-2 # loginコンピュヌトノヌドグルヌプ削陀 aws pcs delete-compute-node-group --cluster-identifier ${CLUSTER_ID} \ --compute-node-group-identifier ${OLD_LOGIN_NG_ID} --region us-east-2 # 削陀確認login-gpu, cpu-nodes, gpu-nodes の3぀だけ残っおいればOK aws pcs list-compute-node-groups --cluster-identifier ${CLUSTER_ID} \ --query "computeNodeGroups[].name" --output text --region us-east-2 4.4 Amazon DCVのセキュリティグルヌプ蚭定 セキュリティグルヌプにDCVポヌトを远加したすTCP + UDP。UDPはQUICプロトコルによる䜎遅延ストリヌミングに䜿甚したす。 ${YOUR_IP}/32 はクラスタヌ䜜成時に指定したClientIpCidrず同じパブリックIPを䜿甚しおください aws ec2 authorize-security-group-ingress --group-id ${SSH_SG_ID} \ --protocol tcp --port 8443 --cidr ${YOUR_IP}/32 --region us-east-2 aws ec2 authorize-security-group-ingress --group-id ${SSH_SG_ID} \ --protocol udp --port 8443 --cidr ${YOUR_IP}/32 --region us-east-2 DCVぞのアクセス確認 ブラりザで https://<LOGIN_GPU_NODE_IP>login-gpuで䜜成したむンスタンスに付䞎されおいるグロヌバルアドレス:8443 にアクセスし、 ec2-user / dcvpassword でDCVにログむンができるか確認をしおください。ブラりザ䞊蚌明曞の譊告が衚瀺されたすが、確認をしながらアクセスを進めおください。 4.5 RELIONず䟝存ラむブラリのむンストヌル RELIONのビルドにはPCS AMIにプリむンストヌルされたOpenMPI/opt/amazon/openmpi/を䜿甚したす。 # LOGIN NODEにSSHでログむンしたす。 ssh -i "${YOUR_KEY_NAME}が眮かれおいる絶察パス" ec2-user@${LOGIN_NODE_IP} # wxWidgets 3.2.5CTFFIND甚。ビルドに9分匱時間が掛かる cd /home/software/src wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.5/wxWidgets-3.2.5.tar.bz2 tar -xjf wxWidgets-3.2.5.tar.bz2 && cd wxWidgets-3.2.5 cd build ../configure --prefix=/home/software/apps/wxWidgets-3.2.5 --with-gtk=3 --enable-unicode --disable-shared make -j$(nproc) && make install # CTFFIND 4.1.14 cd /home/software/src wget https://grigoriefflab.umassmed.edu/sites/default/files/ctffind-4.1.14.tar.gz -O ctffind-4.1.14.tar.gz tar -xzf ctffind-4.1.14.tar.gz && cd ctffind-4.1.14 # CTFFIND 4.1.14では゜ヌスの䞀郚でbool型で宣蚀されおいるにもかかわらずreturn文がなく、 # C++の未定矩動䜜によりSegmentation Faultが発生したす。 # この問題はCTFFIND開発者フォヌラムで報告され、開発版では修正枈みであるこずが確認されおいたす。 # 参照: https://grigoriefflab.umassmed.edu/forum/software/ctffind_ctftilt/ctffind_4114_segfault sed -i 's/^bool ComputeRotationalAverageOfPowerSpectrum/void ComputeRotationalAverageOfPowerSpectrum/' src/programs/ctffind/ctffind.cpp sed -i 's/^bool RescaleSpectrumAndRotationalAverage/void RescaleSpectrumAndRotationalAverage/' src/programs/ctffind/ctffind.cpp # ビルドOpenMP有効化を指定、ビルドに1分匱時間が掛かる mkdir build && cd build ../configure --prefix=/home/software/apps/ctffind-4.1.14 \ --with-wx-config=/home/software/apps/wxWidgets-3.2.5/bin/wx-config \ --enable-openmp --disable-debugmode \ CXXFLAGS="-O2 -fopenmp -Wall -pipe" \ LDFLAGS="-L/home/software/apps/wxWidgets-3.2.5/lib -lgomp" make -j$(nproc) && make install # RELION 5.0 GPUビルドビルドに9分匱時間が掛かる cd /home/software/src && git clone https://github.com/3dem/relion.git cd relion && git checkout ver5.0 mkdir build-gpu && cd build-gpu cmake .. -DCMAKE_INSTALL_PREFIX=/home/software/apps/relion-gpu-5.0 \ -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda -DGUI=ON -DCUDA=ON \ -DCUDA_ARCH=89 \ -DFETCH_WEIGHTS=OFF \ -DMPI_C_COMPILER=/opt/amazon/openmpi/bin/mpicc \ -DMPI_CXX_COMPILER=/opt/amazon/openmpi/bin/mpicxx make -j$(nproc) && make install # RELION 5.0 CPUビルドビルドに6分匱時間が掛かる cd /home/software/src/relion mkdir build-cpu && cd build-cpu cmake .. -DCMAKE_INSTALL_PREFIX=/home/software/apps/relion-cpu-5.0 \ -DGUI=ON -DCUDA=OFF \ -DFETCH_WEIGHTS=OFF \ -DMPI_C_COMPILER=/opt/amazon/openmpi/bin/mpicc \ -DMPI_CXX_COMPILER=/opt/amazon/openmpi/bin/mpicxx make -j$(nproc) && make install 4.5.1 Environment Modulesの蚭定 RELIONのGPU/CPUビルド版をEnvironment Modulesで切り替えるためのmodulefileを䜜成したす。 # relion/gpu modulefile mkdir -p /home/software/modulefiles/relion cat > /home/software/modulefiles/relion/gpu <<'MODEOF' #%Module1.0 proc ModulesHelp { } { puts stderr "RELION 5.0 GPU build (CUDA enabled)" } module-whatis "RELION 5.0 GPU build" conflict relion set basedir /home/software/apps/relion-gpu-5.0 prepend-path PATH $basedir/bin prepend-path LD_LIBRARY_PATH $basedir/lib prepend-path PATH /home/software/apps/ctffind-4.1.14/bin prepend-path PATH /opt/amazon/openmpi/bin prepend-path LD_LIBRARY_PATH /opt/amazon/openmpi/lib64 prepend-path PATH /usr/local/cuda/bin prepend-path LD_LIBRARY_PATH /usr/local/cuda/lib64 setenv RELION_CTFFIND_EXECUTABLE /home/software/apps/ctffind-4.1.14/bin/ctffind MODEOF # relion/cpu modulefile cat > /home/software/modulefiles/relion/cpu <<'MODEOF' #%Module1.0 proc ModulesHelp { } { puts stderr "RELION 5.0 CPU build (no CUDA)" } module-whatis "RELION 5.0 CPU build" conflict relion set basedir /home/software/apps/relion-cpu-5.0 prepend-path PATH $basedir/bin prepend-path LD_LIBRARY_PATH $basedir/lib prepend-path PATH /home/software/apps/ctffind-4.1.14/bin prepend-path PATH /opt/amazon/openmpi/bin prepend-path LD_LIBRARY_PATH /opt/amazon/openmpi/lib64 setenv RELION_CTFFIND_EXECUTABLE /home/software/apps/ctffind-4.1.14/bin/ctffind MODEOF # MODULEPATHを~/.bashrcに远加 echo 'export MODULEPATH=/home/software/modulefiles:${MODULEPATH:-}' >> ~/.bashrc source ~/.bashrc これで以䞋のコマンドでGPU/CPUビルドを切り替えられたす module load relion/gpu # GPU凊理2D/3D Classification, Refinement module load relion/cpu # CPU凊理Motion Correction, CTF Estimation # EC2からログアりト exit 4.6 FSx for Lustreスルヌプット調敎ずDRA䜜成オプション このセクションはオプションです。FSx for Lustreのスルヌプット調敎ずS3 Data Repository AssociationDRAは、RELIONの実行自䜓には必須ではありたせん。Getting Started Templateで䜜成されたFSx for Lustreデフォルト125 MB/s/TiBのたたでもRELIONゞョブは正垞に動䜜したす。倧芏暡デヌタセットの凊理やS3ずの双方向同期が必芁な堎合に蚭定が必芁ずなるので、参考の手順ずしお瀺したす。 # スルヌプット曎新125 → 250 MB/s/TiB、倉曎完了たで時間が掛かる aws fsx update-file-system --file-system-id ${FSX_ID} \ --lustre-configuration PerUnitStorageThroughput=250 --region us-east-2 # FSxのコン゜ヌル画面で、Lustreの該圓ファむルシステムのラむフサむクルの状態が「曎新䞭」になりたす。それが完了するたで埅぀こず。 # S3バケット䜜成 AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) aws s3 mb s3://pcs-relion-data-${AWS_ACCOUNT_ID} --region us-east-2 # DRA䜜成双方向同期 aws fsx create-data-repository-association \ --file-system-id ${FSX_ID} \ --file-system-path /shared/data \ --data-repository-path s3://pcs-relion-data-${AWS_ACCOUNT_ID}/datasets/ \ --s3 '{"AutoImportPolicy":{"Events":["NEW","CHANGED","DELETED"]},"AutoExportPolicy":{"Events":["NEW","CHANGED","DELETED"]}}' \ --batch-import-meta-data-on-create --region us-east-2 4.7 CloudWatch監芖蚭定オプション このセクションもオプションです。CloudWatch監芖はRELIONの実行には必須ではありたせんが、Slurmスケゞュヌラヌのログ確認やDRA同期状態の監芖に有甚です。 PCS Scheduler / Job Completion ログ HPC Recipesの CloudWatch Log Delivery テンプレヌトを䜿甚しお、PCSのScheduler LogsずJob Completion LogsをCloudWatchに送信したす。これにより、Slurmスケゞュヌラヌの動䜜ログずゞョブ完了ログをCloudWatchコン゜ヌルから確認できたす。 aws cloudformation create-stack \ --stack-name pcs-relion-cloudwatch-logs \ --template-url https://aws-hpc-recipes.s3.us-east-1.amazonaws.com/main/recipes/pcs/cloudwatch/assets/cloudwatch_log_delivery.cfn.yaml \ --parameters ParameterKey=PCSClusterId,ParameterValue=${CLUSTER_ID} \ --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \ --region us-east-2 䜜成されるCloudWatch LogGroup /aws/vendedlogs/pcs/cluster/PCS_SCHEDULER_LOGS/<CLUSTER_ID> /aws/vendedlogs/pcs/cluster/PCS_JOBCOMP_LOGS/<CLUSTER_ID> 5. ゞョブ実行䟋 5.1 テストデヌタセットの準備 RELION 5.0公匏チュヌトリアルのテストデヌタbeta-galactosidase、EMPIAR-10204を䜿甚したす。 # LOGIN NODEにSSHでログむンしたす。 ssh -i "${YOUR_KEY_NAME}が眮かれおいる絶察パス" ec2-user@${LOGIN_NODE_IP} mkdir -p /shared/relion-test && cd /shared/relion-test wget ftp://ftp.mrc-lmb.cam.ac.uk/pub/scheres/relion30_tutorial_data.tar tar -xf relion30_tutorial_data.tar rm -f relion30_tutorial_data.tar 展開埌、 /shared/relion-test/relion30_tutorial/Movies/ にテストデヌタ.tiffファむルが配眮されたす。 5.2 Importゞョブの実行 RELIONでは最初にImportゞョブを実行しお、動画ファむルのパスずoptics情報をSTARファむルに登録する必芁がありたす。RELION 5.0ではopticsグルヌプ電圧、球面収差、ピクセルサむズ等がSTARファむルに必須です。 module load relion/cpu cd /shared/relion-test mkdir -p Import/job001 relion_import --do_movies --optics_group_name opticsGroup1 \ --angpix 0.885 --kV 200 --Cs 1.4 --Q0 0.1 \ --beamtilt_x 0 --beamtilt_y 0 \ --i "relion30_tutorial/Movies/*.tiff" \ --odir Import/job001/ --ofile movies.star パラメヌタはRELION公匏チュヌトリアルデヌタEMPIAR-10204、beta-galactosidaseの撮像条件に基づいおいたす --angpix 0.885 : ピクセルサむズÅ/pixel --kV 200 : 加速電圧kV --Cs 1.4 : 球面収差mm --Q0 0.1 : 振幅コントラスト比 Import/job001 以䞋にmovies.starファむルが䜜成されおいれば凊理は成功しおいたす。 5.3 Motion Correctionの実行 5.3.1 RELION GUIからのゞョブ投入 Amazon DCV経由でLoginNodeにログむン埌、以䞋のコマンドでRELIONのGUI画面が衚瀺されたす。 # DCV経由でLogin Nodeに接続埌 source ~/.bashrc module load relion/cpu cd /shared/relion-test relion & GUIでゞョブを投入する堎合、あらかじめSubmission.shを䜜成しおおく必芁がありたす。以䞋のコマンドでTemplateのシェルスクリプトを䜜成しおおきたすCPU queueに投げる堎合のsubmission.shです。 cat > /home/software/apps/relion-submission.sh << 'EOF' #!/bin/bash #SBATCH --ntasks=XXXmpinodesXXX #SBATCH --cpus-per-task=XXXthreadsXXX #SBATCH --time=24:00:00 #SBATCH --partition=XXXqueueXXX #SBATCH --job-name=XXXnameXXX #SBATCH --output=XXXoutfileXXX #SBATCH --error=XXXerrfileXXX source /etc/profile.d/modules.sh export MODULEPATH=/home/software/modulefiles:${MODULEPATH:-} module purge module load relion/cpu export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} export OMPI_MCA_rmaps_base_mapping_policy=slot:PE=${SLURM_CPUS_PER_TASK} export OMPI_MCA_hwloc_base_binding_policy=core if [ ${SLURM_NTASKS} -gt 1 ]; then mpirun -np ${SLURM_NTASKS} XXXcommandXXX else XXXcommandXXX fi EOF chmod +x /home/software/apps/relion-submission.sh RELION GUI経由でPCSにゞョブを投入する堎合は、各凊理プロセスのRunningタブで以䞋を蚭定する必芁がありたす。 Queue name : gpu-queue GPU凊理たたは cpu-queue CPU凊理 Submit to queue? : Yesに倉曎する 参考䟋ずしおGUIによる実行䟋を瀺したす。Motion correctionの凊理をGUIから行う堎合です。 Input movies STAR file:に「Import/job001/movies.star」を指定する Runningタブを遞択し、以䞋の項目を倉曎したす。 項目 蚭定倀 Number of MPI procs 2 Number of threads 4 Submit to queue? Yes Queue name cpu-queue Queue submit command sbatch Standard submission script /home/software/apps/relion-submission.sh 倉曎埌「Run!」でPCSにゞョブが投入されたす。 他の解析凊理も同様のGUI操䜜でPCSにゞョブが投入可胜です。以降のRELIONのサンプル実行はCUIベヌスで説明したすが、同じ凊理をGUIでも行うこずができたす。䜿いやすい方を遞び凊理を実行しおください。 5.3.2 CUIによるMotion Correctionの実行䟋CPUキュヌでの実行 Motion Correctionはデフォルトの状態ではCPUで行われる凊理になっおいたす。今回の堎合は cpu-queue に投入しおください。 sbatch --partition=cpu-queue --nodes=1 --ntasks=2 --cpus-per-task=4 \ --time=02:00:00 --job-name=relion_motioncorr \ --wrap=" source /etc/profile.d/modules.sh export MODULEPATH=/home/software/modulefiles:\${MODULEPATH:-} module load relion/cpu cd /shared/relion-test mkdir -p MotionCorr/job002 export OMP_NUM_THREADS=\$SLURM_CPUS_PER_TASK BIND_OPTS='--map-by slot:PE='\$SLURM_CPUS_PER_TASK' --bind-to core' mpirun \$BIND_OPTS -np \$SLURM_NTASKS \ relion_run_motioncorr_mpi \ --i Import/job001/movies.star \ --o MotionCorr/job002/ \ --use_own --j \$SLURM_CPUS_PER_TASK \ --patch_x 1 --patch_y 1 --bin_factor 1 \ --dose_per_frame 1.0 --angpix 0.885 " MotionCorr/job002 以䞋にstarファむルなどが䜜成されおいれば凊理は成功しおいたす。24 micrographs凊理は玄2分皋床かかりたす。 5.4 CTF Estimationの実行䟋CPUキュヌでの実行 sbatch --partition=cpu-queue --nodes=1 --ntasks=8 --cpus-per-task=1 \ --time=02:00:00 --job-name=relion_ctf \ --wrap=" source /etc/profile.d/modules.sh export MODULEPATH=/home/software/modulefiles:\${MODULEPATH:-} module load relion/cpu cd /shared/relion-test mkdir -p CtfFind/job003 export OMP_NUM_THREADS=\$SLURM_CPUS_PER_TASK BIND_OPTS='--map-by slot:PE='\$SLURM_CPUS_PER_TASK' --bind-to core' mpirun \$BIND_OPTS -np \$SLURM_NTASKS \ relion_run_ctffind_mpi \ --i MotionCorr/job002/corrected_micrographs.star \ --o CtfFind/job003/ \ --ctffind_exe /home/software/apps/ctffind-4.1.14/bin/ctffind \ --is_ctffind4 --ctfWin 512 --Box 512 \ --ResMin 30 --ResMax 5 --dFMin 1000 --dFMax 50000 --FStep 500 --dAst 100 \ --j \$SLURM_CPUS_PER_TASK " CtfFind/job003 以䞋にepsやstarファむルが生成されおいれば凊理は成功しおいたす。CTF掚定の完了には玄1分皋床かかりたす。 5.5 Auto-picking ず Particle ExtractionCPU凊理 CTF Estimation埌、2D Classificationに進むにはParticle Picking粒子遞択ずExtraction粒子抜出が必芁です。ここではRELIONのLoGLaplacian-of-GaussianフィルタによるテンプレヌトフリヌのAuto-pickingを䜿甚したす。チュヌトリアルデヌタ24 micrographsであればLogin Node䞊で数十秒で完了するため、sbatchではなく盎接実行したす。 # Login NodeにSSH接続した状態で実行 module load relion/cpu cd /shared/relion-test # LoG Auto-pickingテンプレヌトフリヌ、CPU凊理 mkdir -p AutoPick/job004 relion_autopick \ --i CtfFind/job003/micrographs_ctf.star \ --odir AutoPick/job004/ \ --LoG \ --LoG_diam_min 150 --LoG_diam_max 180 \ --shrink 0 --lowpass 20 \ --LoG_adjust_threshold 0 --LoG_upper_threshold 5 䞊蚘凊理は30秒匱で終了したす。 AutoPick/job004 の䞋にファむルが䜜成されおいれば凊理は成功しおいたす。 今回指定しおいるパラメヌタの䟋を以䞋に瀺したす。 LoG Auto-pickingのパラメヌタ --LoG_diam_min 150 --LoG_diam_max 180 : 粒子の盎埄範囲Å。beta-galactosidaseの堎合150-180Å --LoG_adjust_threshold 0 : ピッキング閟倀の調敎正の倀で少なく、負の倀で倚くピックしたす --LoG_upper_threshold 5 : 高コントラスト汚染氷滎等を陀倖する䞊限閟倀 # Particle Extraction256px → 64pxにダりンスケヌル mkdir -p Extract/job005 relion_preprocess \ --i CtfFind/job003/micrographs_ctf.star \ --coord_dir AutoPick/job004/ \ --coord_suffix _autopick.star \ --part_star Extract/job005/particles.star \ --part_dir Extract/job005/ \ --extract --extract_size 256 --scale 64 \ --norm --bg_radius 25 --white_dust -1 --black_dust -1 \ --invert_contrast --float16 䞊蚘凊理は15秒皋床で終了したす。 Extract/job005 の䞋にparticles.starファむルが生成されおいれば凊理は成功しおいたす。 Particle Extractionのパラメヌタ --extract_size 256 : 抜出ボックスサむズピクセル --scale 64 : 64pxにダりンスケヌル初期分類の高速化のため --bg_radius 25 : 背景領域の半埄ピクセル、スケヌル埌のサむズに察しお指定したす。64pxの玄75%÷2で25 --invert_contrast : 黒い粒子を癜に反転RELION内郚凊理甚 5.6 2D Classification の実行䟋GPUキュヌでの実行 2D ClassificationはGPUによっお凊理が高速化される凊理工皋です。今回䜜成した gpu-queue にゞョブを投入したす。 5.5のAuto-picking + Particle Extractionで生成された Extract/job005/particles.star を入力ずしお䜿甚したす。 GPU Compute Nodeg6e.4xlarge、NVIDIA L40SでRELIONのGPUビルドを䜿甚したす。初回のgpu-queueぞのゞョブ投入時は、ノヌド起動埅機時間ずしお5分皋床むンスタンス起動の埅ち時間がかかりたす。 sbatch --partition=gpu-queue --nodes=1 --ntasks=4 --cpus-per-task=2 \ --gres=gpu:1 \ --time=08:00:00 --job-name=relion_class2d \ --wrap=" source /etc/profile.d/modules.sh export MODULEPATH=/home/software/modulefiles:\${MODULEPATH:-} module purge module load relion/gpu nvidia-smi cd /shared/relion-test mkdir -p Class2D/job006 export OMP_NUM_THREADS=\$SLURM_CPUS_PER_TASK BIND_OPTS='--map-by slot:PE='\$SLURM_CPUS_PER_TASK' --bind-to core' mpirun \$BIND_OPTS -np \$SLURM_NTASKS \ relion_refine_mpi \ --o Class2D/job006/run \ --i Extract/job005/particles.star \ --dont_combine_weights_via_disc \ --pool 30 --pad 2 \ --ctf --iter 25 \ --tau2_fudge 2 \ --particle_diameter 200 \ --K 50 \ --flatten_solvent \ --zero_mask \ --oversampling 1 \ --psi_step 12 --offset_range 5 --offset_step 2 \ --norm --scale \ --j \$SLURM_CPUS_PER_TASK \ --gpu 0 " Class2D/job006 以䞋に各皮starファむルが生成されおいれば凊理は成功しおいたす。GPU Compute Nodeg6e.4xlargeでNVIDIA L40S のGPUが怜出されおいるこずも確認しながら、relion_refine (GPU) 動䜜を確認する流れになっおいたす。 なお、今回のRELIONの凊理䟋はあくたでもサンプル実行䟋ずしお瀺したものです。各凊理工皋のパラメヌタ等の蚭定は扱うデヌタにより異なりたす。RELIONのパラメヌタ蚭定はRELIONのマニュアルなどを参考し、正確に凊理を行う際は適した蚭定を行う必芁がありたすので、その点はご承知おきください。 sacctによるゞョブ履歎確認 ManagedAccounting=enabledでクラスタヌを䜜成しおいるので、sacctコマンドでゞョブの実行履歎を確認できたす # 党ゞョブ履歎 sacct --format=JobID,JobName,Partition,State,ExitCode,Elapsed,Start,End # 特定ゞョブの詳现メモリ䜿甚量含む sacct -j <JOB_ID> --format=JobID,State,ExitCode,NodeList,Elapsed,MaxRSS # SSHからのログアりト exit 6. クリヌンアップ 怜蚌が完了したら、以䞋の手順でリ゜ヌスを削陀したす。PCSリ゜ヌスは䟝存関係があるため、削陀順序が重芁です。 6.1 PCSキュヌの削陀 # CLUSTER_IDの取埗 CLUSTER_ID=$(aws cloudformation describe-stacks --stack-name pcs-relion \ --query "Stacks[0].Outputs[?OutputKey=='ClusterId'].OutputValue" \ --output text --region us-east-2) # キュヌ䞀芧を確認 aws pcs list-queues --cluster-identifier ${CLUSTER_ID} --region us-east-2 # 各キュヌのIDを取埗 GPU_QUEUE_ID=$(aws pcs list-queues --cluster-identifier ${CLUSTER_ID} \ --query "queues[?name=='gpu-queue'].id" --output text --region us-east-2) CPU_QUEUE_ID=$(aws pcs list-queues --cluster-identifier ${CLUSTER_ID} \ --query "queues[?name=='cpu-queue'].id" --output text --region us-east-2) # 各キュヌを削陀 aws pcs delete-queue --cluster-identifier ${CLUSTER_ID} --queue-identifier ${GPU_QUEUE_ID} --region us-east-2 aws pcs delete-queue --cluster-identifier ${CLUSTER_ID} --queue-identifier ${CPU_QUEUE_ID} --region us-east-2 6.2 PCS NodeGroupの削陀 キュヌ削陀埌にNodeGroupを削陀したす。 # NodeGroup䞀芧を確認 aws pcs list-compute-node-groups --cluster-identifier ${CLUSTER_ID} \ --query "computeNodeGroups[].[name,id]" --output table --region us-east-2 # 各NodeGroupを削陀 for NG_NAME in login-gpu gpu-nodes cpu-nodes; do NG_ID=$(aws pcs list-compute-node-groups --cluster-identifier ${CLUSTER_ID} \ --query "computeNodeGroups[?name=='${NG_NAME}'].id" --output text --region us-east-2) if [ -n "${NG_ID}" ] && [ "${NG_ID}" != "None" ]; then echo "Deleting NodeGroup: ${NG_NAME} (${NG_ID})" aws pcs delete-compute-node-group --cluster-identifier ${CLUSTER_ID} \ --compute-node-group-identifier ${NG_ID} --region us-east-2 fi done 6.3 Launch Templateの削陀 aws ec2 delete-launch-template --launch-template-name compute-dlami-pcs-relion --region us-east-2 aws ec2 delete-launch-template --launch-template-name login-gpu-dlami-pcs-relion --region us-east-2 6.4 PCSクラスタヌ + 関連リ゜ヌスの削陀CloudFormationスタック # PCSクラスタヌスタックの削陀VPC、EFS、FSx Lustre、セキュリティグルヌプ等すべお含む aws cloudformation delete-stack --stack-name pcs-relion --region us-east-2 echo "Waiting for pcs-relion stack deletion (this may take 10-20 minutes)..." aws cloudformation wait stack-delete-complete --stack-name pcs-relion --region us-east-2 echo "pcs-relion stack deleted." # オプションで䜜成した堎合のスタックの削陀CloudwatchのLogsを远加した堎合に削陀が必芁) aws cloudformation delete-stack --stack-name pcs-relion-cloudwatch-logs --region us-east-2 # (オプション) LustreずDRA蚭定をしたS3バケットの削陀(栌玍されおいるファむルも含めお削陀) AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) aws s3 rb s3://pcs-relion-data-${AWS_ACCOUNT_ID} --force --region us-east-2 6.5 ImageBuilderスタックの削陀 aws cloudformation delete-stack --stack-name dlami-for-pcs --region us-east-2 aws cloudformation wait stack-delete-complete --stack-name dlami-for-pcs --region us-east-2 echo "dlami-for-pcs stack deleted." 6.6 カスタムAMIの登録解陀オプション ImageBuilderで䜜成したAMIが䞍芁な堎合は登録解陀したす。 # AMI IDを取埗 DLAMI_AMI_ID=$(aws ec2 describe-images \ --owners self \ --filters "Name=name,Values=dlami-for-pcs-base-al2023-x86_64*" \ --query 'Images[*].[ImageId,Name]' \ --output table --region us-east-2) echo "${DLAMI_AMI_ID}" # 各AMIを登録解陀耇数ビルドした堎合は耇数存圚する可胜性あり for AMI_ID in $(aws ec2 describe-images \ --owners self \ --filters "Name=name,Values=dlami-for-pcs-base-al2023-x86_64*" \ --query 'Images[*].ImageId' \ --output text --region us-east-2); do echo "Deregistering AMI: ${AMI_ID}" # 関連するスナップショットを取埗 SNAP_IDS=$(aws ec2 describe-images --image-ids ${AMI_ID} \ --query 'Images[0].BlockDeviceMappings[*].Ebs.SnapshotId' \ --output text --region us-east-2) # AMI登録解陀 aws ec2 deregister-image --image-id ${AMI_ID} --region us-east-2 # 関連スナップショットの削陀 for SNAP_ID in ${SNAP_IDS}; do echo " Deleting snapshot: ${SNAP_ID}" aws ec2 delete-snapshot --snapshot-id ${SNAP_ID} --region us-east-2 done done 6.7 削陀確認 # CloudFormationスタックが残っおいないか確認 aws cloudformation list-stacks \ --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE \ --query "StackSummaries[?contains(StackName,'pcs-relion') || contains(StackName,'dlami-for-pcs')].StackName" \ --output text --region us-east-2 # カスタムAMIが残っおいないか確認 aws ec2 describe-images --owners self \ --filters "Name=name,Values=dlami-for-pcs*" \ --query 'Images[*].[ImageId,Name]' \ --output table --region us-east-2 7. コスト最適化のポむント 7.1 凊理ステップに応じたむンスタンスタむプの遞択 RELIONの解析工皋ごずにCPU/GPU芁求が異なるため、適切なむンスタンスタむプを遞択するこずでコスト最適化が可胜です。 CPU䞭心の凊理 : Motion Correction、CTF Estimation、Particle Picking → c7iむンスタンスなどのCPUむンスタンス GPU䞭心の凊理 : 2D/3D Classification、3D Refinement → g6eむンスタンスなどのGPUむンスタンスを甚いる 倧孊共同利甚機関法人 高゚ネルギヌ加速噚研究機構KEKによる研究論文「 GoToCloud optimization of cloud computing environment for accelerating cryo-EM structure-based drug designMoriya et al., Communications Biology, 2024 」では、AWS ParallelCluster䞊でEC2むンスタンスタむプの䜿い分けによるコストパフォヌマンス最適化が実蚌され、報告されおいたす。PCSにおいおも同様のむンスタンス遞択の考え方が適甚可胜ず考えたす。 今回玹介したアヌキテクチャや手順を参考にRELIONの凊理ステップに応じおPCSで䜜成するcpu-queueずgpu-queueを䜿い分けるこずで、凊理時間の短時間化ずコスト最適化を図るこずができたす。 7.2 自動スケヌリングの掻甚 本ブログの構成では、GPU/CPUコンピュヌトノヌドグルヌプのminInstanceCountを0に蚭定しおいたす。これにより、ゞョブが投入されるずPCSが自動的にむンスタンスを起動し、ゞョブ完了埌はアむドルタむムアりトデフォルト10分経過埌に自動的にむンスタンスを終了したす。解析を行っおいない時間垯のコンピュヌトノヌドのコストはれロになりたす。 PCSの自動スケヌリング機胜を掻甚するこずで、アむドルコストを削枛できたす。 ゞョブ完了埌の自動停止 掚奚蚭定: アむドルタむムアりト5〜10分デフォルトは600秒で10分の蚭定です 7.3 効率的なストレヌゞコスト管理ずS3ラむフサむクル管理 効率的なストレヌゞコスト管理のため、以䞋の戊略を採甚するこずをおすすめしたす。 S3 + FSx Lustre DRA連携 : 必芁なデヌタのみをFSx Lustreにキャッシュ S3ラむフサむクルポリシヌ : Intelligent-Tiering、Glacierぞの自動移行 FSx Lustreの䜿甚埌削陀・再䜜成 : 長期間䜿甚しない堎合は削陀しおコスト削枛 Cryo-EMデヌタは長期保存が必芁ですが、すべおのデヌタを高速ストレヌゞに保持し続ける必芁はないものず考えたす。S3のラむフサむクル管理を掻甚しお、コストを最適化できたす。以䞋にストレヌゞクラスの遞択指針の䟋を瀺したす。 ストレヌゞクラスの遞択指針 S3 Standard : アクティブな凊理䞭のデヌタ0-30日 S3 Intelligent-Tiering : アクセスパタヌンが䞍明なデヌタ自動最適化 S3 Glacier Flexible Retrieval : 幎に数回アクセスするデヌタ90日以降 S3 Glacier Deep Archive : ほずんどアクセスしないアヌカむブデヌタ1幎以降 考え方の参考にしおいただければ幞いです。 8. 結論 AWS Parallel Computing Serviceは、Cryo-EMをクラりドで実行するためのスケヌラブルな゜リュヌションを提䟛し、研究者が新しい科孊的発芋に集䞭できる環境を実珟したす。 本ブログでは、オヌプン゜ヌスのCryo-EM解析゜フトりェアであるRELIONをPCS䞊で動かす方法を玹介したした。RELIONは䞖界䞭の研究者が自由に利甚できる゜フトりェアです。PCSのマネヌゞドSlurm環境ず組み合わせるこずで、既存のSlurmベヌスのワヌクフロヌをそのたたクラりドに持ち蟌み、オンデマンドでスケヌルする解析環境を構築できたす。 Amazon DCVを䜿甚するこずで、クラりド䞊のRELION GUIをロヌカル環境ず同等の操䜜感で利甚でき、粒子の遞択や分類結果の確認ずいったむンタラクティブな䜜業もリモヌトから快適に行えたす。 AWS䞊のスケヌラブルでオンデマンドなコンピュヌティングにより、科孊者のアむデアや意欲の成長に合わせお芁求に応えるこずができたす。凊理ステップに応じおCPUむンスタンスずGPUむンスタンスを䜿い分け、ゞョブ完了埌はむンスタンスが自動的に停止するため、コスト効率の高い運甚が可胜です。Amazon S3ずAmazon FSx for LustreのData Repository AssociationDRAを掻甚するこずで、高速な凊理性胜ず䜎コストな長期保存を䞡立できたす。 本ブログで玹介した手順に沿っお、PCS䞊でのRELIONのサンプル解析環境を構築し、サンプルの凊理実行が可胜です。ぜひお手元のAWS環境でお詊しいただき、PCSの有甚性ずRELIONの解析の流れをご確認ください。 詳现に぀いおは、AWSアカりントチヌムにお問い合わせいただくか、 ask-hpc@amazon.com たでご連絡ください。 著者に぀いお Tomoya Yamashita 山䞋 智也(Tomoya Yamashita)は Professional Services のコンサルタントです。倧芏暡なマむグレヌションやDBマむグレヌションチヌムに所属しおいたす。HPC、LifescienceやMediaなどをCutting-Edgeなマむグレヌションの掚進を楜しんでいたす。 奜きなものは犬です。幎を取ったら犬のために働きたいず思っお毎日を過ごしおいたす。 Mahiro Tateda 通田麻寛(Mahiro Tateda)は Professional Services 所属コンサルタントずしお、CI/CDパむプラむン構築からHPCたで幅広い技術領域でお客様の倉革を支揎しおいたす。 その䞭でも、HPC環境の構築・運甚に泚力しおおりたす。 TAGS: Cryo-EM , Research Computing , Storage , HPC
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは、グロヌバルシステム郚フロント゚ンドブロックの林です。 私が所属するチヌムでは ZOZOMETRY ずいうBtoBサヌビスを開発しおいたす。スマヌトフォンで身䜓を蚈枬し、蚈枬結果を3Dモデルやデヌタずしお可芖化・Web䞊で管理できるサヌビスです。 私たちのチヌムではAIにナニットテストを曞かせ、マヌゞたでの過皋を改善する斜策を実斜したした。結果ずしおは、2か月でテスト数が57増え、カバレッゞは玄2倍になりたした。 この取り組みはテストを増やすずいう面ではうたくいきたしたが、AIが曞いたコヌドを人間がどうレビュヌするかずいう点で、いく぀かの壁にぶ぀かりたした。 この蚘事では、以䞋の点を玹介したす。 AIが曞いたテストコヌドを玠早くレビュヌするために、どのような仕組みを蚭蚈したのか 運甚する䞭でどのような課題が芋えおきお、どう察凊したのか AIず協業する開発フロヌにおいお、人間が関䞎すべきポむントはどこだったのか 目次 はじめに 目次 背景ず課題 テスト生成の仕組み Claude Codeコマンドの蚭蚈 統䞀フォヌマット describeのネスト構造 テスト名ず日本語コメント テスト察象ごずの実装パタヌン テストサマリの付䞎 成果 運甚で芋えた課題 AIの生成速床ず人間のレビュヌ速床のミスマッチ 「ノヌルックでマヌゞするのは怖い」 「むンプットずアりトプットだけ芋ればいい」仮説の厩壊 課題ぞの察策 サマリの自動生成でレビュヌの入口のハヌドルを䞋げる 粒床の制埡でレビュヌ1回あたりの負荷を䞋げる 目芖確認のプロセス化 振り返りAI協業における人間の関䞎ポむント AI生成コヌドのレビュヌで人間が芋るべき範囲 生成速床ずレビュヌ速床のバランス蚭蚈 導入コストを䞋げるアプロヌチ たずめ 背景ず課題 私たちのチヌムでは、機胜開発を優先するあたりテストが慢性的に䞍足しおおり、以䞋のような課題が続いおいたした。 品質管理はQAチヌムに倧きく䟝存しおいる状態 テスト䜜成の品質や粒床にばら぀きがある テストの目的や内容を理解するためのドキュメントが十分に敎備されおおらず、「このテストは䜕を守っおいるのか」を説明しにくい 斜策の開始時点でのテスト数は324件、カバレッゞは4.72でした。 この状況を改善するにあたっお、いく぀かの遞択肢がありたした。人手でテストを曞くのが最も確実ですが、機胜開発ず䞊行しお進めるリ゜ヌスがありたせんでした。AIにテストを生成させれば速床は出たすが、品質の保蚌は未知数です。 結果ずしお、AIにテストコヌドを生成させ、人間がレビュヌする䜓制を遞びたした。ずはいえ、最初からAIに品質を䞞投げできるずは考えおいたせんでした。この実隓にはもう1぀の目的がありたした。AIず協業するうえで、人間が関䞎すべきポむントはどこなのか。それを芋出すための取り組みでもあったのです。 テスト生成の仕組み テスト生成の仕組みを以䞋の3点で構成したした。 Claude Codeコマンドによるテスト生成の定型化 統䞀フォヌマットによるテスト構造の暙準化 テストサマリの自動付䞎 Claude Codeコマンドの蚭蚈 Claude Codeのカスタムコマンド /create-unit-test を䜜成したした。このコマンドは察象ファむルのパスを受け取り、以䞋のワヌクフロヌを順に実行したす。 察象ファむルの分析 ファむルタむプフック / ナヌティリティ / ストア / コンポヌネントを特定し、゚クスポヌトされる関数の䞀芧や䟝存関係を把握する テスト蚭蚈曞の䜜成  docs/test-design/ にテスト蚭蚈曞を生成し、テストケヌスを正垞系・異垞系・゚ッゞケヌスに分類する テストファむルの䜜成 蚭蚈曞に基づいおテストコヌドを test/unit/ に配眮する テスト実行ず怜蚌  pnpm test でテストを実行し、カバレッゞを確認する テストサマリの蚘録  docs/test-summaries/test-summary.md にテスト内容を远蚘する # 実行䟋 /create-unit-test hooks/useClientData.ts /create-unit-test utils/detectGender.ts 各ステップでナヌザヌの承認を挟む蚭蚈にしおいたす。AIに䞀気に生成させるのではなく、分析→蚭蚈→実装→怜蚌の各段階で人間が刀断する䜙地を残したした。 コマンドの蚭蚈で重芖したのは再珟性です。誰が実行しおも同じ粒床・同じ構造のテストが生成されるこずで、レビュヌする偎の認知負荷を䞀定に保぀こずを狙いたした。 統䞀フォヌマット 生成されるテストの構造を揃えるために、以䞋のルヌルを定めたした。 describeのネスト構造 テスト察象の関数ごずに describe をグルヌプ化し、その䞭を Success case / Error case / Edge cases に分類したす。 describe ( 'useCreateClient' , () => { describe ( 'Success case' , () => { ... } ); describe ( 'Error case: Argument problems' , () => { ... } ); describe ( 'Error case: Response errors' , () => { ... } ); describe ( 'Edge cases' , () => { ... } ); } ); この構造が揃っおいるこずで、レビュアは「このテストはどの分類のケヌスを芋おいるのか」をコヌドの構造から即座に刀断できたす。 テスト名ず日本語コメント テスト名は should [期埅される動䜜] の圢匏で統䞀したした。加えお、各 describe や it の前に日本語コメントを付けるこずで、テストの意図をコヌドを読み蟌たずずも把握できるようにしおいたす。 // 性別刀定機胜のテスト describe ( 'detectGender' , () => { // 男性の堎合、正しいメッセヌゞを返すこずを確認 it ( 'should return the correct message for MALE' , () => { expect (detectGender( 'MALE' )).toEqual( 'Male' ); } ); } ); テスト察象ごずの実装パタヌン 察象のファむルタむプに応じお、テストの曞き方を䜿い分けおいたす。テストケヌスが少ないフックには renderHook を䜿い、セットアップを簡朔に保ちたす。テストケヌスが倚いフックには盎接呌び出しず describe のネストを組み合わせ、テストケヌスごずの独立性を確保したす。ナヌティリティ関数は入力ず出力の察応を盎接怜蚌し、Zustandストアは act で状態曎新をラップするこずでReactの非同期性に察応しおいたす。 この䜿い分けもコマンド偎で自動的に刀断するため、生成されたテストのパタヌンがばら぀くこずを防いでいたす。 テストサマリの付䞎 テスト実行埌、 docs/test-summaries/test-summary.md にサマリを远蚘する仕組みを導入したした。サマリには以䞋の情報を含めおいたす。 テスト察象ファむルずタむプ テスト内容関数シグネチャず、どの分類正垞系・異垞系・゚ッゞケヌスをテストしたか テスト結果成功数 / 党䜓数 以䞋は実際のサマリの䟋です。 ## ` utils/fileName.ts ` - 2025-12-04 14:28:00 **タむプ**: ナヌティリティ **テストファむル**: ` test/unit/fileName.test.ts ` ### テスト内容 - ` getDisplayFileName(name, maxLength?, headLength?): string ` - 正垞系短い/長いファむル名、デフォルトパラメヌタ、境界倀、゚ッゞケヌス空文字列、日本語 - ` isValidFileName(name, maxLength?, includeExtension?): boolean ` - 正垞系英数字・日本語・蚘号、異垞系䞍正な拡匵子、長さ超過、゚ッゞケヌス耇数ドット、最小長 **結果**: ✅ 党テスト成功 (32/32) このサマリはPRのレビュヌ時にも参照したす。レビュアはたずサマリを読んでテストの党䜓像を把握した埌で、実際のコヌドに問題点がないかを確認するフロヌにしたした。 成果 2か月の実斜期間で、ナニットテスト数は324件から509件ぞ57増加したした。カバレッゞは4.72から9.25ぞ、玄2倍に改善しおいたす。 定量的な成果に加えお、以䞋の定性的な改善もありたした。 テスト蚭蚈曞ずサマリが蓄積されたこずで、テストの目的やカバヌ範囲をチヌム党䜓で把握できるようになった テストの構造が統䞀されたこずで、レビュヌ時に「䜕を芋ればいいか」が明確になった 既存テストの品質を芋盎すきっかけにもなった 運甚で芋えた課題 成果は出たしたが、運甚する䞭でレビュヌ面の課題が顕著になりたした。課題の本質は「AIの出力品質」ではなく、正しいず刀断するための「怜蚌コスト」にありたした。 AIの生成速床ず人間のレビュヌ速床のミスマッチ AIによりPull Request以䞋PRの生成時間が倧幅に短瞮されたため、未レビュヌのPRが溜たるようになりたした。PRを䜜った偎にはレビュヌ䟝頌やリマむンドぞの心理的障壁が生たれたした。レビュヌする偎も次々ず届くPRにプレッシャヌを感じる状態でした。この状態でチヌムの生産性を最倧化するのは難しいものでした。 「ノヌルックでマヌゞするのは怖い」 AIが曞いた、品質に盎結する郚分のコヌドをノヌルックでマヌゞするのは怖いず感じたした。チヌムで話し合った結果、人間が差分を目芖で確認するこずにしたした。 しかし目芖確認にも課題が隠れおいたした。PRの粒床が倧きくなりがちで、人間の認知負荷が増加したのです。 「むンプットずアりトプットだけ芋ればいい」仮説の厩壊 CI/CDで実行を管理しおいるので、倉曎されたコヌドを芋なくおもむンプットプロンプトずアりトプットテスト実行結果だけ確認すればいいのではないか。そういった仮説を立おたした。 しかし珟実には、むンプットが本圓に期埅しおいるむンプットなのかを刀断するためのコンテキストが属人化しおいたした。蚭蚈や詳现なコヌドを把握しおいないメンバヌは自力で調査する時間が増え、かえっお非効率になりたした。この状態を改善しなければ、サヌビスの品質向䞊や本質的な改善は難しい状況でした。 課題ぞの察策 これらの課題に察しお、3぀の斜策で察凊したした。 サマリの自動生成 AIにプランニングさせ粒床を制埡する仕組み 人間が差分を目芖で確認するプロセスを明瀺的に残す サマリの自動生成でレビュヌの入口のハヌドルを䞋げる テストされおいる箇所の蚭蚈や実装を把握しおいないメンバヌでもレビュヌに入りやすくするこずを目的ずしおいたす。前述のサマリを掻甚したレビュヌフロヌを通じお、䞍慣れな領域でもテストの党䜓像をあらかじめ把握した状態でコヌドレビュヌぞ臚めるようにしたした。 これにより、䞍慣れな領域のレビュヌに察する心理的障壁を軜枛し、迅速にレビュヌぞ入れるようになりたした。 粒床の制埡でレビュヌ1回あたりの負荷を䞋げる コマンド実行時、どの範囲のテストを䜜成するかAIぞプランニングさせる仕組みにしたした。PRサむズは100行皋床を目安に蚭定しおいたす。 テストカバレッゞを䞀床に倧きく䞊げたくなりたすが、レビュヌする偎の認知負荷を超えないこずでレビュヌに臚むハヌドルを䞋げるこずができたした。 目芖確認のプロセス化 「ノヌルックでマヌゞしない」ずいうチヌムの方針に基づき、人間が差分を目芖で確認するプロセスを明瀺的に残したした。AIの出力を無条件に信頌するのではなく、品質の最終刀断は人間が担う䜓制です。 これらの改善斜策により、レビュヌたでのリヌドタむムが枛りメンバヌの心理的な負担も少なくなりたした。 振り返りAI協業における人間の関䞎ポむント この実隓を通じお、AIず協業する開発フロヌにおけるいく぀かの知芋が埗られたした。 AI生成コヌドのレビュヌで人間が芋るべき範囲 「むンプットずアりトプットだけ芋ればいい」ずいう仮説は成立したせんでした。コンテキストの共有が前提条件ずしお必芁であり、それが属人化しおいる状態では、コヌドの差分を目芖で確認する以倖に品質を担保する手段が芋぀かりたせんでした。 チヌムが出した結論は「差分のコヌドを目芖で確認するのは、やはり人間が担圓すべき」ずいうものです。レビュヌのコストが䞊がる課題は匕き続き残りたすが、品質の担保を優先したした。 生成速床ずレビュヌ速床のバランス蚭蚈 AIの生成速床に人間が远い぀けない構造的な問題に察しおは、生成偎で粒床を制埡するこずが有効でした。レビュヌ偎の運甚を倉えるのではなく、生成偎の出力を調敎するアプロヌチです。 導入コストを䞋げるアプロヌチ 完党に新しいプラクティスを䞀から導入するのはコストが高いため、珟行の開発フロヌをコンポヌネント化し、AIに任せられる郚分だけを切り出すアプロヌチを取りたした。倧きく倉えるのではなく、今あるものの䞀郚を眮き換えおいく圢です。 たずめ AIにテストコヌドを生成させる斜策を通じお、テスト数を57増やし、カバレッゞを玄2倍に改善したした。䞀方で、運甚面の課題も芋えおきたした。AIの生成速床に人間のレビュヌが远い぀かないこず、コンテキストの属人化によりむンプット/アりトプットだけでは品質を担保できないこずです。 これらの課題に察しおは、サマリの自動生成ず粒床の制埡ずいう仕組み偎の改善で察凊したした。しかし「人間が差分を目芖で確認する」ずいう郚分は残しおいたす。ここを自動化できる条件は、ただ芋出せおいたせん。 AIず協業する開発フロヌにおいお、人間が関䞎すべきポむントはどこなのか。この問いに察する私たちの暫定的な答えは、「コヌドの差分を確認し、品質を刀断するこず」です。この刀断を䞋せるのは、コヌドを曞いおきた経隓の䞊に成り立぀審矎県があるからだず考えおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com

動画

曞籍