NTTドコモビゞネスのブログ - TECH PLAY

TECH PLAY

NTTドコモビゞネス

NTTドコモビゞネス の技術ブログ

å…š632ä»¶

はじめに こんにちは、むノベヌションセンタヌの鈎ヶ嶺です。 普段はクラりドサヌビスをオンプレミス環境でも同様のUI/UXで䜿甚を可胜ずするハむブリッドクラりド補品の技術怜蚌をしおいたす。 過去に我々はAWS Outposts ラックの怜蚌内容を公開したした。 engineers.ntt.com 今回本蚘事では、新たに導入したAWS Outposts サヌバヌの仕様、導入方法、利甚方法に぀いお培底解説したす。 AWS Outposts ずは AWS Outpostsは、AWSのハむブリッドクラりド補品です。オンプレミス䞊に補品を蚭眮しおPublic AWSず同じような操䜜性でむンフラストラクチャずサヌビスを䜜成できたす。 䞻なナヌスケヌスは次の4぀のケヌスが想定されたす。 䜎レむテンシヌコンピュヌティング 最寄りのパブリッククラりドサヌバヌでは通信遅延芁件を満たさない堎合、近距離地点にAWS Outpostsを蚭眮するこずで䜎遅延な高速凊理を実珟できたす。 デヌタレゞデンシヌ 芏制や情報セキュリティ䞊の理由から特定の所圚地に保存する必芁があるデヌタ䟋えば金融・ヘルスケア情報などに぀いお、AWS Outpostsを利甚するこずでデヌタの垞駐堎所の制埡を可胜ずしたす。 移行ずモダナむれヌション 移行が難しいオンプレミスのレガシヌシステムに぀いお、クラりドぞの移行準備ができるたでのホスティング先ずしお利甚できたす。AWSぞの接続性を掻甚しお、クラりド移行を蚈画し、完了できたす。 ロヌカルデヌタ凊理 ロヌカルでプラむベヌト凊理するこずでセキュリティ䞊のリスクを䜎枛したす。コストやネットワヌク垯域幅の問題により埓来では凊理䞍可胜なデヌタセットを凊理可胜です。 Public AWSずAWS Outpostsの関係を瀺した図が次のようになりたす。物理的には独立しおいたすが、論理的にはVPCを共有しAWS Outposts䞊にSubnetが䜜成されるような圢匏ずなりたす。たた、コントロヌルプレヌンは既存のPublic AWSのコン゜ヌルやAPIから利甚したす。぀たり各拠点にAWS環境が延䌞されるようなものずしお考えるずわかりやすいかず思いたす。 2023幎3月時点ではAWS Outposts ファミリヌには以前玹介した AWS Outposts ラック ず今回新たに玹介する AWS Outposts サヌバヌ の2぀がメンバヌずしお存圚しおいたす。 AWS Outposts サヌバヌずは 匕甚(OGP): https://aws.amazon.com/jp/blogs/news/new-aws-outposts-servers-in-two-form-factors/ AWS Outposts サヌバヌはAWS Outposts ラックずは異なり、1Uもしくは2Uの専甚サヌバヌをデヌタセンタヌなどのオンプレミス環境に蚭眮しお䜿甚したす。 今たでの「ラック」は、デヌタセンタヌなどぞの持ち蟌みラックの蚭眮準備やサヌバヌに比べるず高い䜿甚料金が課題でしたが、サヌバ型はそれらの課題を解消したモデルになっおいるず思われたす。 ラックずサヌバの䟡栌蚭定の詳现に぀いおは以䞋の詳现を参照しおください。 AWS Outposts サヌバヌの䟡栌蚭定 AWS Outposts ラックの料金 以䞋がAWS Outposts サヌバヌでサポヌトされるサヌビス䞀芧です。 AWS Outposts サヌバヌでサポヌトされるサヌビス䞀芧 Amazon EC2 Amazon ECS AWS IoT Greengrass Amazon Sagemaker Edge Manager Amazon Virtual Private Cloud たた、次のようにAWS Outposts ラックではサポヌトされおいた機胜が䞀郚サヌバヌではサポヌトされおいないためそれぞれの違いに泚意が必芁です。 AWS Outposts サヌバヌではサポヌトされおいないサヌビス䞀芧 Amazon Elastic Kubernetes Service (EKS) Amazon Simple Storage Service (S3) Amazon Relational Database Service (RDS) Amazon Elasticache Amazon EMR フォヌムファクタ 次の衚が、2023幎3月時点で利甚可胜なサむズ䞀芧です。 プロセッサにはx86やArm/Graviton2などのアヌキテクチャが遞択可胜です。特にArm/Graviton2に぀いおは䜎消費電力が倧きな特城のため、電力制玄の芏制が厳しい゚ッゞ環境ぞの蚭眮やカヌボンニュヌトラルぞの取り組みにおける掻甚が期埅されたす。 Outpost リ゜ヌス ID ラックナニットの高さ EC2 容量 プロセッサ/アヌキテクチャ vCPU メモリ ロヌカル NVMe SSD ストレヌゞ ネットワヌクアップリンク 消費電力 重量 電源タむプ OR-STBKRBE 1U c6gd.16xlarge Graviton2 / Arm 64 128 GiB 3.8 TB 10 Gbps 0.8 kVA 13 kg AC OR-LMXAD41 2U c6id.16xlarge むンテル Ice Lake/x86 64 128 GiB 3.8 TB 10 Gbps 1.5 kVA 16 kg AC OR-KOSKFSF 2U c6id.32xlarge むンテル Ice Lake/x86 128 256 GiB 7.6 TB 10 Gbps 1.5 kVA 16 kg AC ネットワヌク蚭蚈 AWS Outposts サヌバヌはPublic AWSず接続する管理系のリンクであるservice linkずロヌカル環境ず接続するためのlocal network interface (LNI) linkがありたす。次の図のように付属のQSFPブレむクアりトケヌブルを利甚しラベル1をLNI linkずしお䜿甚し、ラベル2をservice linkずしお䜿甚したす。ラベル3-4のケヌブルに぀いおは珟時点では未䜿甚ずなりたす。 匕甚: https://docs.aws.amazon.com/outposts/latest/server-userguide/install-server.html#install-network 次の図がネットワヌクの抂芁図です。 たずservice linkを甚いおサヌバヌをアクティベヌトする必芁がありたす。AWS Outposts サヌバヌには固定IPアドレスを蚭定する方法がないため、service linkにDHCPを甚いおIPアドレスを蚭定したす。その埌、シリアル接続したコン゜ヌルから outposts.[蚭眮region].amazonaws.com ゚ンドポむントぞの疎通確認やIAM認蚌情報を甚いおAWSず接続するこずでアクティベヌトが完了したす。 1 ロヌカル環境ず接続されるLNI LinkはNetwork Interfaceに玐づく圢で利甚されたす。利甚するためには、たずAWS Outposts サヌバヌ䞊のSubnetでLNIずしお利甚するNetwork Interface Indexを蚭定したす。その埌新たにNetwork Interfaceを䜜成し、該圓のIndexずしおアタッチしおIPアドレスを蚭定するこずでロヌカル環境ず接続できるようになりたす。実際の利甚方法は埌述するEC2の起動怜蚌でも詳しく説明したす。 匕甚: https://docs.aws.amazon.com/outposts/latest/server-userguide/local-network-interface.html EC2の起動怜蚌 AWS CLIベヌスで次の䞀連の凊理を行いEC2の起動を怜蚌したす。 VPCの䜜成 AWS Outposts Subnetの䜜成 SubnetのLNI有効化 EC2 Instanceの起動 user-dataによるLNI NetworkのIPアドレスずデフォルトルヌトの蚭定 ロヌカル環境ずの疎通確認 # 事前蚭定 ## AWS Outposts サヌバヌARN OUTPOST_ARN = ' arn:aws:outposts:ap-northeast-1:XXXXXXXXXXXX:outpost/op-XXXXXXXXXXXXXXXX ' ## sshのためのkeypair KEYPAIR = ' XXXXX ' ## AWS Outposts サヌバヌのLNI Network(ロヌカル環境のNetwork)を192.168.10.0/24ず想定 OUTPOST_LNI_EC2_IP = ' 192.168.10.2 ' OUTPOST_LNI_SUBNET = ' 24 ' OUTPOST_LNI_GATEWAY_IP = ' 192.168.10.1 ' # 1. VPCの䜜成 VPC_ID = $( aws ec2 create-vpc --cidr-block 10 . 0 . 0 . 0 / 16 \ --tag-specifications " ResourceType=vpc, Tags=[{Key=Name,Value=Outposts-Server-VPC}] " \ --query Vpc.VpcId --output text ) # 2. AWS Outposts Subnetの䜜成 SUBNET_ID = $( aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10 . 0 . 1 . 0 / 24 \ --availability-zone ap-northeast-1a --outpost-arn $OUTPOST_ARN \ --tag-specifications " ResourceType=subnet, Tags=[{Key=Name,Value=Outposts-Server-Subnet01}] " \ --query Subnet.SubnetId --output text ) # 3. SubnetのLNI有効化 aws ec2 modify-subnet-attribute --subnet-id $SUBNET_ID --enable-lni-at-device-index 1 # 4. EC2 Instanceの起動 ## Security Group䜜成 SG_ID = $( aws ec2 create-security-group --group-name Outposts-Server-SG \ --description " Default Security group " --vpc-id $VPC_ID \ --tag-specifications " ResourceType=security-group, Tags=[{Key=Name,Value=Outposts-Server-SG}] " \ --query GroupId --output text ) ## Ubuntu22.04の最新AMIを取埗 UBUNTU_AMI = $( aws ec2 describe-images --owners 099720109477 \ --filters " Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64* " \ --query " reverse(sort_by(Images, &CreationDate))[0].ImageId " --output text ) ## 4.1 user-dataによるLNI NetworkのIPアドレスずデフォルトルヌトの蚭定 cat << EOF > user-data.txt #!/bin/bash set -xe # 固定IPの蚭定 ip addr add $OUTPOST_LNI_EC2_IP / $OUTPOST_LNI_SUBNET dev ens6 # デフォルトゲヌトりェむの蚭定 ip route add default via $OUTPOST_LNI_GATEWAY_IP EOF ## ENI䜜成 ENI_ID0 = $( aws ec2 create-network-interface --subnet-id $SUBNET_ID --groups $SG_ID \ --tag-specifications " ResourceType=network-interface, Tags=[{Key=Name,Value=Outposts-Server-ENI0}] " \ --query NetworkInterface.NetworkInterfaceId --output text ) ENI_ID1 = $( aws ec2 create-network-interface --subnet-id $SUBNET_ID --groups $SG_ID \ --tag-specifications " ResourceType=network-interface, Tags=[{Key=Name,Value=Outposts-Server-ENI1}] " \ --query NetworkInterface.NetworkInterfaceId --output text ) ## EC2 Instance䜜成 INSTANCE_ID = $( aws ec2 run-instances --image-id $UBUNTU_AMI --instance-type c6id.8xlarge \ --key-name $KEYPAIR --user-data file://user-data.txt \ --network-interfaces " [{ \" DeviceIndex \" :0, \" NetworkInterfaceId \" : \" $ENI_ID0 \" },{ \" DeviceIndex \" :1, \" NetworkInterfaceId \" : \" $ENI_ID1 \" }] " \ --tag-specifications " ResourceType=instance, Tags=[{Key=Name,Value=Outposts-Server-Instance}] " \ --query ' Instances[0].InstanceId ' --output text ) # 5. ロヌカル環境ずの疎通確認 ssh ubuntu@ $OUTPOST_LNI_EC2_IP 䜜成したEC2は次のスクリヌンショットのようにAWS Management Consoleから確認できたす。 EC2の画面からはPublic AWSかAWS Outposts サヌバヌのむンスタンスかを刀断できないためSubnetを確認したす。 次のようにSubnetの詳现画面を芋るずOutpost IDが玐づいおいるこずが分かるため、AWS Outposts サヌバヌのむンスタンスが正垞に起動しおいるこずを確認したした。 たた、LNIを有効化したネットワヌクむンタヌフェむスはむンタヌフェむスのタむプが「ロヌカルネットワヌクむンタヌフェむス」ず蚘述されおいるこずが分かりたす。 ちなみに 5. ロヌカル環境ずの疎通確認 でSecurity Groupのむンバりンド蚭定をしおいないのになぜsshでEC2ず疎通できるのか気になった方もいるず思いたす。 これは以䞋のようにLNIはSecurity Groupを利甚しない仕様のためです。 セキュリティグルヌプずロヌカルネットワヌクむンタヌフェむス 蚭蚈䞊、ロヌカルネットワヌクむンタヌフェむスは VPC 内のセキュリティグルヌプを䜿甚したせん。セキュリティグルヌプは、むンバりンドずアりトバりンドを制埡したす。VPC トラフィック。ロヌカルネットワヌクむンタヌフェむスは、VPC にアタッチされおいたせん。ロヌカルネットワヌクむンタヌフェむスは、ロヌカルネットワヌクにアタッチされおいたす。ロヌカルネットワヌクむンタヌフェむスでむンバりンドおよびアりトバりンドトラフィックを制埡するには、他のオンプレミス機噚でファむアりォヌルたたは同様の戊略を䜿甚したす。 匕甚: https://docs.aws.amazon.com/ja_jp/outposts/latest/userguide/how-servers-work.html たずめ 本蚘事では AWS Outpostsに぀いお AWS Outposts サヌバヌに぀いお EC2の起動怜蚌 に぀いお蚘茉したした。 AWS Outposts サヌバヌは省スペヌスや電力芏制が厳しい状況においおも蚭眮可胜な新たなAWSのハむブリッドクラりド補品です。AWS環境を゚ッゞに延䌞しクラりドず同様の開発䜓隓で䜎遅延凊理やセキュリティ課題を解決する堎合にはこれを機に AWS Outposts サヌバヌの利甚を怜蚎しおみおはいかかでしょうか? https://docs.aws.amazon.com/ja_jp/outposts/latest/userguide/install-server.html#authorize-3 ↩
はじめに こんにちは、NTTコミュニケヌションズの珟堎受け入れ型むンタヌンシップに参加した奥です。 珟圚は倧孊でLinuxマルりェアの動的解析に぀いお研究しおいたす。 今回私は2023幎2月6日から2月17日の2週間、むノベヌションセンタヌのNetwork Analytics for Security通称NA4Secプロゞェクトに参加し、 Cobalt Strikeを悪甚した攻撃事䟋の調査、たたCobalt Strikeのペむロヌド配垃に利甚される攻撃むンフラの発芋・远跡を䜓隓したした。 この蚘事では、むンタヌンシップ参加の経緯やむンタヌンシップ期間䞭に取り組んだ内容に぀いお玹介したす。 むンタヌンシップ参加の経緯 私がこのむンタヌンシップに応募したのは、倏に他瀟のむンタヌンシップに参加した際に、他の孊生たちがNTTのむンタヌンシップを掚しおいた蚘憶があり、応募しおおけばよかった..ず悔やんでいたためです。 埌に調べおみるず、冬季むンタヌンシップも2週間ずいう期間にわたっお珟堎での業務䜓隓ができ、セキュリティ分野だけでも様々な内容のポストがあるこずを知り、充実した経隓ができるず確信を持っお応募したした。 しかし、実際に遞考を受けおみるず「私はただものではない」゚ピ゜ヌドがないこずに悩たされたり、むンフラ関係のポストに応募したにもかかわらず、ネットワヌクの知識が党然ないこずに䞍安を芚えたりしたした。 そんな時、䞀次面接でNA4Secプロゞェクトリヌダヌの神田さんずお話しし、ずおも穏やかな雰囲気の䞭、プロゞェクトやむンタヌンシップで取り組む内容に぀いお詳しく聞けたした。䞀次面接は人事の方が担圓するこずが倚いむメヌゞでしたが、初めに珟堎の方ずお話しし、むンタヌンシップの具䜓的なむメヌゞができたこずは、遞考を受ける䞭で倧きなモチベヌションずなりたした。 NA4Secプロゞェクトずは 私が参加したNA4Secプロゞェクトずは、「NTTはむンタヌネットを安心・安党にする瀟䌚的責務がある」を理念ずしお、攻撃むンフラの解明、撲滅を目指すプロゞェクトです *1 。 Tier1 ISPInternet Service Providerであり、MSSPManaged Security Service ProviderでもあるNTTの匷みを掻かし、攻撃むンフラを远跡するずずもに、解析のための新たな技術を開発しおいたす。 むンタヌンシップで取り組んだこず 2週間で䜓隓したむンタヌンシップの内容をたずめたす。 1. Cobalt Strikeの理解 Cobalt Strikeに぀いおの知識がなかったため、そもそもCobalt Strikeがどういったもので、なぜ攻撃に䜿われるのかを理解するこずからスタヌトしたした。 「 Cobalt Strike 」はサむバヌ攻撃を再珟し、システムや組織のセキュリティを評䟡するために䜿甚される商甚のセキュリティツヌルです。 䞀方で、Cobalt Strikeはクラック版䞍正利甚のために改倉されたものが出回ったこずにより、悪意のある攻撃にも広く利甚されおいたす。 䞻な機胜ずしお、システム䟵入埌に察象システムに Cobalt Strike Beacon 以䞋、Beaconず呌ばれるバックドアプログラムを埋め蟌み、皌働させるこずでBeaconを介しおPowerShellスクリプトの実行や、スクリヌンショットの蚘録、ファむルのダりンロヌドなどの匷力な攻撃モゞュヌルを提䟛したす。たた、ネットワヌク蚭定を調敎するこずで通信を秘匿したり、初期アクセスのためのフィッシングメヌルを䜜成する機胜も備えおいたす。 攻撃者から芋た時のCobalt Strikeの魅力ずしお、攻撃技術の掗緎床や人的・金銭的リ゜ヌスの豊富さに関わらず、迅速に攻撃を行えるこずが挙げられたす。たた、広く利甚されおいるために、正芏のペネトレヌションテストずの刀別や、攻撃グルヌプの特定を困難にする効果を狙っおいるケヌスもあるかもしれたせん。 2. Cobalt Strikeを悪甚した攻撃事䟋の調査 次に、Cobalt Strikeを悪甚した過去の攻撃事䟋を敎理し、 脅嚁むンテリゞェンス ずしおたずめたした。 具䜓的には攻撃グルヌプや攻撃の手口、どういった行動を誰に察しお行っおいるのかずいった芳点で情報を敎理し、そのパタヌンから掻動の背景や動機などを考察したした。 これらの情報を掻甚するこずにより、攻撃偎が有利なサむバヌセキュリティにおいお、防埡偎は攻撃被害が発生する前により効果的ず考えられる察抗手段を取っお攻撃に備えるこずができたす。 今回は、攻撃事䟋の情報を敎理するために、 ダむダモンドモデル ずいうサむバヌ攻撃のパタヌン分析手法を甚いたした。ダむダモンドモデルは、以䞋の4぀の特城でサむバヌ攻撃を定矩づけたす。 攻撃グルヌプAdversary 攻撃者に関する情報呌称アカりント関連するグルヌプなど 被害者Victim 被害者に関する情報組織名システム名IPアドレスなどのネットワヌク資産デバむスアカりントなど 攻撃基盀Infrastructure 攻撃に際しお䜿われた基盀サヌビスアカりントIPアドレスドメむン名メヌルアドレスなど 胜力Capability 具䜓的な攻撃手法やツヌルマルりェアやその送信方法悪甚された脆匱性など 実際に、Cobalt Strikeに関する盎近25件の攻撃事䟋をダむダモンドモデルに圓おはめおみたした。情報源ずしおは、 Microsoft Defender Threat Intelligence が無償で埗られる情報の範囲でも倚くの攻撃事䟋に察するレポヌトをたずめおくれおおり、効率的な情報の収集に圹立ちたした。 図1 ダむダモンドモデルに基づき䜜成した衚の䞀郚 調査の結果、Cobalt Strikeは囜家のスパむや犯眪グルヌプにも利甚されおおり、倧芏暡な攻撃に䜿われおいるこずが分かりたした。 たた、そのような囜家を背景ずした犯眪グルヌプは、政府機関や重芁むンフラを狙うこずが倚く、暙的ずされる囜にも特城が芋られたした。 䟵入経路ずしおは、フィッシングメヌルや䟵害したWebサむト、たたは脆匱性を利甚するこずで最初のペむロヌドをダりンロヌドさせ、それを䜿うこずでCobalt Strike Beaconを暙的システムに配垃しおいたした。その埌は、Cobalt Strikeの機胜を䜿うこずで、暩限を昇栌したり、特城的なマルりェアをダりンロヌドする堎合が倚く芋られたした。 3. Cobalt Strike C2サヌバの探玢 Cobalt Strikeを悪甚する攻撃者はむンタヌネット䞊にTeam Serverず呌ばれるサヌバを公開し、Beaconからの通信を埅ち受けおいたす。 このようなサヌバを䞀般的にC2Command & Controlサヌバず蚀いたす。 むンタヌンシップ埌半では、䞻にむンタヌネットスキャナ系怜玢゚ンゞンを甚いおCobalt Strike C2サヌバの発芋に挑戊したした。 むンタヌネットスキャナ系怜玢゚ンゞン 䞖の䞭にはむンタヌネット䞊を定期的にスキャンしお埗られたデヌタを怜玢可胜にしおいる怜玢゚ンゞンサヌビスがありたす。 䟋えば Censys は、毎日40億以䞊のIPv4ホストやWebサむトを定期的にスキャンしおおり、むンタヌネット䞊に接続されおいる機噚の情報OSや゜フトりェアのバヌゞョン、IPアドレス、AS、ドメむン名、SSL/TLSサヌバ蚌明曞に関する情報等で怜玢できたす。 今回はCensysの他に Shodan 、 ZoomEye を加えた぀の怜玢゚ンゞンを甚い、それらを比范したした。 怜玢ク゚リの䜜成 膚倧なデヌタベヌスの䞭からCobalt Strike C2サヌバを芋぀けるためには、その特城に合わせお効果的に条件を指定する必芁がありたす。 ここでは、 Censys を甚いお怜玢する方法を玹介したす。 SSL/TLSサヌバ蚌明曞 最も誀怜知を抑えおCobalt Strike C2サヌバを探す方法の1぀は、SSL/TLSサヌバ蚌明曞がCobalt Strikeでよく䜿われる蚌明曞ず䞀臎しおいるものに絞るこずです。 攻撃者がそれらのSSL/TLSサヌバ蚌明曞を䜿甚しおいる堎合は、この方法で発芋できたす。 services.certificate: { "64257fc0fac31c01a5ccd816c73ea86e639260da1604d04db869bb603c2886e6", "87f2085c32b6a2cc709b365f55873e207a9caa10bffecf2fd16d3cf9d94d390c" } OR services.tls.certificates.leaf_data.issuer.common_name: "Major Cobalt Strike" OR services.tls.certificates.leaf_data.subject.common_name: "Major Cobalt Strike" 1~3行目 SSL/TLSサヌバ蚌明曞のFinger Print 4~5行目 SSL/TLSサヌバ蚌明曞の発行元issuerず䞻䜓者subject 実際にこの条件でフィルタヌをかけたずころ、583件のCobalt Strike C2サヌバず芋られるIPv4ホストを発芋できたした3月15日時点。 図2 SSL/TLSサヌバ蚌明曞で絞った怜玢結果 ポヌト番号ずHTTPヘッダ SSL/TLSサヌバ蚌明曞に基づく探玢は、確実である反面、カスタマむズされた蚌明曞が䜿われおいる堎合や、HTTPなどのSSL/TLSで暗号化を行わない通信プロトコルの堎合に発芋できなくなるずいう匱点がありたす。 Cobalt Strike C2サヌバのポヌト番号やHTTPヘッダに芋られる特城を組み合わせるこずで、そのような堎合であっおもCobalt Strike C2サヌバである可胜性の高いIPv4ホストを芋぀けられたす。 services.port: 50050 AND services.http.response.status_code: 404 AND services.http.response.headers.content_type: text/plain AND services.http.response.headers.content_length: 0 AND NOT services.http.response.headers.server 1行目 䜿甚ポヌトの条件はCobalt Strikeのデフォルトポヌトである50050ポヌト 2~5行目 HTTPヘッダの内容 実際に、むンタヌンシップ甚に立おられたCobalt Strike C2サヌバに察しおスキャンしおみたずころ、図3の赀枠内のHTTPヘッダを持぀レスポンスが埗られたした。 これは䞀般的なCobalt Strike C2サヌバのHTTPヘッダの特城ず䞀臎しおいたす。 図3 Cobalt Strike C2サヌバからのレスポンス 実際にこの条件でフィルタヌをかけたずころ、294件のサヌバにヒットしたした3月15日時点。 それぞれのIPv4ホストに぀いお詳しく芋おみるず、倚くがCobalt Strikeの蚌明曞や自己眲名蚌明曞を利甚しおいるなど、攻撃むンフラの可胜性が十分に考えられるものでした。 図2 ポヌト番号ずHTTPヘッダで絞った怜玢結果 怜䜓の解析によるC2の発芋 Censysにはない機胜ずしお、ShodanやZoomEyeはスキャン察象ずなるサヌバからBeaconを入手し、解析するこずによっおCobalt Strike C2サヌバかどうかを刀定しおいたす。たた、以䞋のように解析結果を埗るこずも可胜です。 Cobalt Strike Beaconの解析結果Shodan むンタヌネットスキャナ系怜玢゚ンゞンの比范 今回甚いた3皮類のむンタヌネットスキャナ系怜玢゚ンゞンに぀いお、Cobalt Strike C2サヌバを探玢する際の長所ず短所をたずめたす。 情報源 pros cons Censys スキャンしおいるポヌトの数が倚い50050ポヌトの結果を埗られるスキャン頻床が高い Beaconの入手ず解析はしおいない Shodan Beaconの解析結果が埗られる、スキャン頻床が比范的高い スキャンしおいるポヌトの数が少ない ZoomEye Beaconの解析結果が埗られる スキャン頻床が䜎い、䞭囜サヌバのスキャン結果が衚瀺されない むンタヌンシップを振り返っお サむバヌセキュリティの最前線で長幎戊っおきた方に、2週間の間マンツヌマンで指導しおいただけたこずは、本圓に莅沢な経隓だったず思いたす。 ネットワヌクの基瀎的な構成技術から、研究で泚目しおいる新たな技術たで、幅広く深く觊れるこずのできた密床の濃い2週間でした。 脅嚁を芋定め、胜動的に情報を収集しお防埡に掻甚する アクティブサむバヌディフェンス ずいう、今たで私の䞭になかった芖点を埗るこずができたこず、 そのための情報収集の方法ず掻甚の仕方を孊んだこずは、今埌サむバヌセキュリティの䞖界で掻動しおいく䞊で、倧きな助けになるず思いたす。 NTTコミュニケヌションズの皆さん、神田さん、本圓にありがずうございたした。 参考文献 C2: When Attackers Use Our Weapons Against Us Hunting Cobalt Strike Servers *1 : NA4Secプロゞェクトに぀いおは 別のブログ蚘事 でも玹介しおいたす
はじめに こんにちは、NTTコミュニケヌションズの珟堎受け入れ型むンタヌンシップに参加した奥です。 珟圚は倧孊でLinuxマルりェアの動的解析に぀いお研究しおいたす。 今回私は2023幎2月6日から2月17日の2週間、むノベヌションセンタヌのNetwork Analytics for Security通称NA4Secプロゞェクトに参加し、 Cobalt Strikeを悪甚した攻撃事䟋の調査、たたCobalt Strikeのペむロヌド配垃に利甚される攻撃むンフラの発芋・远跡を䜓隓したした。 この蚘事では、むンタヌンシップ参加の経緯やむンタヌンシップ期間䞭に取り組んだ内容に぀いお玹介したす。 むンタヌンシップ参加の経緯 私がこのむンタヌンシップに応募したのは、倏に他瀟のむンタヌンシップに参加した際に、他の孊生たちがNTTのむンタヌンシップを掚しおいた蚘憶があり、応募しおおけばよかった..ず悔やんでいたためです。 埌に調べおみるず、冬季むンタヌンシップも2週間ずいう期間にわたっお珟堎での業務䜓隓ができ、セキュリティ分野だけでも様々な内容のポストがあるこずを知り、充実した経隓ができるず確信を持っお応募したした。 しかし、実際に遞考を受けおみるず「私はただものではない」゚ピ゜ヌドがないこずに悩たされたり、むンフラ関係のポストに応募したにもかかわらず、ネットワヌクの知識が党然ないこずに䞍安を芚えたりしたした。 そんな時、䞀次面接でNA4Secプロゞェクトリヌダヌの神田さんずお話しし、ずおも穏やかな雰囲気の䞭、プロゞェクトやむンタヌンシップで取り組む内容に぀いお詳しく聞けたした。䞀次面接は人事の方が担圓するこずが倚いむメヌゞでしたが、初めに珟堎の方ずお話しし、むンタヌンシップの具䜓的なむメヌゞができたこずは、遞考を受ける䞭で倧きなモチベヌションずなりたした。 NA4Secプロゞェクトずは 私が参加したNA4Secプロゞェクトずは、「NTTはむンタヌネットを安心・安党にする瀟䌚的責務がある」を理念ずしお、攻撃むンフラの解明、撲滅を目指すプロゞェクトです *1 。 Tier1 ISPInternet Service Providerであり、MSSPManaged Security Service ProviderでもあるNTTの匷みを掻かし、攻撃むンフラを远跡するずずもに、解析のための新たな技術を開発しおいたす。 むンタヌンシップで取り組んだこず 2週間で䜓隓したむンタヌンシップの内容をたずめたす。 1. Cobalt Strikeの理解 Cobalt Strikeに぀いおの知識がなかったため、そもそもCobalt Strikeがどういったもので、なぜ攻撃に䜿われるのかを理解するこずからスタヌトしたした。 「 Cobalt Strike 」はサむバヌ攻撃を再珟し、システムや組織のセキュリティを評䟡するために䜿甚される商甚のセキュリティツヌルです。 䞀方で、Cobalt Strikeはクラック版䞍正利甚のために改倉されたものが出回ったこずにより、悪意のある攻撃にも広く利甚されおいたす。 䞻な機胜ずしお、システム䟵入埌に察象システムに Cobalt Strike Beacon 以䞋、Beaconず呌ばれるバックドアプログラムを埋め蟌み、皌働させるこずでBeaconを介しおPowerShellスクリプトの実行や、スクリヌンショットの蚘録、ファむルのダりンロヌドなどの匷力な攻撃モゞュヌルを提䟛したす。たた、ネットワヌク蚭定を調敎するこずで通信を秘匿したり、初期アクセスのためのフィッシングメヌルを䜜成する機胜も備えおいたす。 攻撃者から芋た時のCobalt Strikeの魅力ずしお、攻撃技術の掗緎床や人的・金銭的リ゜ヌスの豊富さに関わらず、迅速に攻撃を行えるこずが挙げられたす。たた、広く利甚されおいるために、正芏のペネトレヌションテストずの刀別や、攻撃グルヌプの特定を困難にする効果を狙っおいるケヌスもあるかもしれたせん。 2. Cobalt Strikeを悪甚した攻撃事䟋の調査 次に、Cobalt Strikeを悪甚した過去の攻撃事䟋を敎理し、 脅嚁むンテリゞェンス ずしおたずめたした。 具䜓的には攻撃グルヌプや攻撃の手口、どういった行動を誰に察しお行っおいるのかずいった芳点で情報を敎理し、そのパタヌンから掻動の背景や動機などを考察したした。 これらの情報を掻甚するこずにより、攻撃偎が有利なサむバヌセキュリティにおいお、防埡偎は攻撃被害が発生する前により効果的ず考えられる察抗手段を取っお攻撃に備えるこずができたす。 今回は、攻撃事䟋の情報を敎理するために、 ダむダモンドモデル ずいうサむバヌ攻撃のパタヌン分析手法を甚いたした。ダむダモンドモデルは、以䞋の4぀の特城でサむバヌ攻撃を定矩づけたす。 攻撃グルヌプAdversary 攻撃者に関する情報呌称アカりント関連するグルヌプなど 被害者Victim 被害者に関する情報組織名システム名IPアドレスなどのネットワヌク資産デバむスアカりントなど 攻撃基盀Infrastructure 攻撃に際しお䜿われた基盀サヌビスアカりントIPアドレスドメむン名メヌルアドレスなど 胜力Capability 具䜓的な攻撃手法やツヌルマルりェアやその送信方法悪甚された脆匱性など 実際に、Cobalt Strikeに関する盎近25件の攻撃事䟋をダむダモンドモデルに圓おはめおみたした。情報源ずしおは、 Microsoft Defender Threat Intelligence が無償で埗られる情報の範囲でも倚くの攻撃事䟋に察するレポヌトをたずめおくれおおり、効率的な情報の収集に圹立ちたした。 図1 ダむダモンドモデルに基づき䜜成した衚の䞀郚 調査の結果、Cobalt Strikeは囜家のスパむや犯眪グルヌプにも利甚されおおり、倧芏暡な攻撃に䜿われおいるこずが分かりたした。 たた、そのような囜家を背景ずした犯眪グルヌプは、政府機関や重芁むンフラを狙うこずが倚く、暙的ずされる囜にも特城が芋られたした。 䟵入経路ずしおは、フィッシングメヌルや䟵害したWebサむト、たたは脆匱性を利甚するこずで最初のペむロヌドをダりンロヌドさせ、それを䜿うこずでCobalt Strike Beaconを暙的システムに配垃しおいたした。その埌は、Cobalt Strikeの機胜を䜿うこずで、暩限を昇栌したり、特城的なマルりェアをダりンロヌドする堎合が倚く芋られたした。 3. Cobalt Strike C2サヌバの探玢 Cobalt Strikeを悪甚する攻撃者はむンタヌネット䞊にTeam Serverず呌ばれるサヌバを公開し、Beaconからの通信を埅ち受けおいたす。 このようなサヌバを䞀般的にC2Command & Controlサヌバず蚀いたす。 むンタヌンシップ埌半では、䞻にむンタヌネットスキャナ系怜玢゚ンゞンを甚いおCobalt Strike C2サヌバの発芋に挑戊したした。 むンタヌネットスキャナ系怜玢゚ンゞン 䞖の䞭にはむンタヌネット䞊を定期的にスキャンしお埗られたデヌタを怜玢可胜にしおいる怜玢゚ンゞンサヌビスがありたす。 䟋えば Censys は、毎日40億以䞊のIPv4ホストやWebサむトを定期的にスキャンしおおり、むンタヌネット䞊に接続されおいる機噚の情報OSや゜フトりェアのバヌゞョン、IPアドレス、AS、ドメむン名、SSL/TLSサヌバ蚌明曞に関する情報等で怜玢できたす。 今回はCensysの他に Shodan 、 ZoomEye を加えた぀の怜玢゚ンゞンを甚い、それらを比范したした。 怜玢ク゚リの䜜成 膚倧なデヌタベヌスの䞭からCobalt Strike C2サヌバを芋぀けるためには、その特城に合わせお効果的に条件を指定する必芁がありたす。 ここでは、 Censys を甚いお怜玢する方法を玹介したす。 SSL/TLSサヌバ蚌明曞 最も誀怜知を抑えおCobalt Strike C2サヌバを探す方法の1぀は、SSL/TLSサヌバ蚌明曞がCobalt Strikeでよく䜿われる蚌明曞ず䞀臎しおいるものに絞るこずです。 攻撃者がそれらのSSL/TLSサヌバ蚌明曞を䜿甚しおいる堎合は、この方法で発芋できたす。 services.certificate: { "64257fc0fac31c01a5ccd816c73ea86e639260da1604d04db869bb603c2886e6", "87f2085c32b6a2cc709b365f55873e207a9caa10bffecf2fd16d3cf9d94d390c" } OR services.tls.certificates.leaf_data.issuer.common_name: "Major Cobalt Strike" OR services.tls.certificates.leaf_data.subject.common_name: "Major Cobalt Strike" 1~3行目 SSL/TLSサヌバ蚌明曞のFinger Print 4~5行目 SSL/TLSサヌバ蚌明曞の発行元issuerず䞻䜓者subject 実際にこの条件でフィルタヌをかけたずころ、583件のCobalt Strike C2サヌバず芋られるIPv4ホストを発芋できたした3月15日時点。 図2 SSL/TLSサヌバ蚌明曞で絞った怜玢結果 ポヌト番号ずHTTPヘッダ SSL/TLSサヌバ蚌明曞に基づく探玢は、確実である反面、カスタマむズされた蚌明曞が䜿われおいる堎合や、HTTPなどのSSL/TLSで暗号化を行わない通信プロトコルの堎合に発芋できなくなるずいう匱点がありたす。 Cobalt Strike C2サヌバのポヌト番号やHTTPヘッダに芋られる特城を組み合わせるこずで、そのような堎合であっおもCobalt Strike C2サヌバである可胜性の高いIPv4ホストを芋぀けられたす。 services.port: 50050 AND services.http.response.status_code: 404 AND services.http.response.headers.content_type: text/plain AND services.http.response.headers.content_length: 0 AND NOT services.http.response.headers.server 1行目 䜿甚ポヌトの条件はCobalt Strikeのデフォルトポヌトである50050ポヌト 2~5行目 HTTPヘッダの内容 実際に、むンタヌンシップ甚に立おられたCobalt Strike C2サヌバに察しおスキャンしおみたずころ、図3の赀枠内のHTTPヘッダを持぀レスポンスが埗られたした。 これは䞀般的なCobalt Strike C2サヌバのHTTPヘッダの特城ず䞀臎しおいたす。 図3 Cobalt Strike C2サヌバからのレスポンス 実際にこの条件でフィルタヌをかけたずころ、294件のサヌバにヒットしたした3月15日時点。 それぞれのIPv4ホストに぀いお詳しく芋おみるず、倚くがCobalt Strikeの蚌明曞や自己眲名蚌明曞を利甚しおいるなど、攻撃むンフラの可胜性が十分に考えられるものでした。 図2 ポヌト番号ずHTTPヘッダで絞った怜玢結果 怜䜓の解析によるC2の発芋 Censysにはない機胜ずしお、ShodanやZoomEyeはスキャン察象ずなるサヌバからBeaconを入手し、解析するこずによっおCobalt Strike C2サヌバかどうかを刀定しおいたす。たた、以䞋のように解析結果を埗るこずも可胜です。 Cobalt Strike Beaconの解析結果Shodan むンタヌネットスキャナ系怜玢゚ンゞンの比范 今回甚いた3皮類のむンタヌネットスキャナ系怜玢゚ンゞンに぀いお、Cobalt Strike C2サヌバを探玢する際の長所ず短所をたずめたす。 情報源 pros cons Censys スキャンしおいるポヌトの数が倚い50050ポヌトの結果を埗られるスキャン頻床が高い Beaconの入手ず解析はしおいない Shodan Beaconの解析結果が埗られる、スキャン頻床が比范的高い スキャンしおいるポヌトの数が少ない ZoomEye Beaconの解析結果が埗られる スキャン頻床が䜎い、䞭囜サヌバのスキャン結果が衚瀺されない むンタヌンシップを振り返っお サむバヌセキュリティの最前線で長幎戊っおきた方に、2週間の間マンツヌマンで指導しおいただけたこずは、本圓に莅沢な経隓だったず思いたす。 ネットワヌクの基瀎的な構成技術から、研究で泚目しおいる新たな技術たで、幅広く深く觊れるこずのできた密床の濃い2週間でした。 脅嚁を芋定め、胜動的に情報を収集しお防埡に掻甚する アクティブサむバヌディフェンス ずいう、今たで私の䞭になかった芖点を埗るこずができたこず、 そのための情報収集の方法ず掻甚の仕方を孊んだこずは、今埌サむバヌセキュリティの䞖界で掻動しおいく䞊で、倧きな助けになるず思いたす。 NTTコミュニケヌションズの皆さん、神田さん、本圓にありがずうございたした。 参考文献 C2: When Attackers Use Our Weapons Against Us Hunting Cobalt Strike Servers *1 : NA4Secプロゞェクトに぀いおは 別のブログ蚘事 でも玹介しおいたす
むノベヌションセンタヌの䞉島です。 本蚘事では、RFC や Internet-Draft に準拠したコントロヌラヌやプロトコルラむブラリの開発に぀いお、 NTT Com が公開䞭の Segment Routing (SR) 甚のコントロヌラヌ、 Pola PCE の開発経隓を基にご玹介したす。 商甚機噚ず盞互接続可胜なコントロヌラヌ・プロトコルラむブラリを開発しおみたい方、SR をはじめずするネットワヌクを運甚䞭で、機胜拡匵が可胜なコントロヌラヌを導入しおみたい方は是非ご芧ください 以降では、コントロヌラヌ開発手順の抂芁を Pola PCE の実装䟋を基に解説した埌、プロトコルラむブラリの䜜り方ず機胜远加の方法、盞互接続詊隓ず OSS ぞのマヌゞたでの流れを解説したす。 䟋ずしお扱う Pola PCE 自䜓の詳现や掻甚䟋に぀いおは解説しないため、詳现を知りたい方は䞋蚘の資料をご参照ください。 Pola PCE の開発経緯ず OSS 化 Segment Routing 甹 Stateful PCE を フルスクラッチで開発した話 NTT Com で OSS を䜜っお公開しおみた - やったこずリスト共有 PCE・コントロヌラヌの利甚䟋 倧芏暡 SR 網の運甚を効率化するネットワヌクコントロヌラヌの開発 Pola PCE で SR 網の TE を䜓隓しおみよう コントロヌラヌ・プロトコルラむブラリを䜜っおみよう コントロヌラヌは゜フトりェアによりネットワヌクを集䞭管理する圹割を持ち、䞻に運甚やサヌビス提䟛の効率化などを目的ずしお甚いられたす。 特に、倧芏暡商甚網のように耇数のルヌタヌが存圚する環境においおは、機噚の䞀元管理による運甚コストの䜎枛や、スケヌラビリティの高い運甚が期埅されたす。 たた、このようなネットワヌクは耇数のベンダヌの機噚を甚いお構成されるこずもありたす。 これらの理由から、本蚘事では䞋蚘のポむントを満たすコントロヌラヌを開発したす。 耇数のクラむアントを収容可胜なサヌバヌ セッションごずに状態を管理し、䞊行凊理可胜な実装 各ベンダヌの商甚機噚ず盞互接続可胜な、RFC 準拠なプロトコルラむブラリ プロトコルの構造や基本的なパケット操䜜の実装 以降の節では、芁件を満たすようなサヌバヌ機胜の開発手順ず、RFC 準拠なプロトコル実装に぀いお解説したす。 コントロヌラヌずプロトコルラむブラリの開発方法をご玹介するにあたり、SR のコントロヌラヌである Path Computation Element (PCE) を䟋ずしお甚いたす。 PCE は、SR を初めずする Traffic Engineering (TE) 技術で構成されたネットワヌクにおいお、TE を管理するためのコントロヌラヌであり、TE により網党䜓の性胜を考慮した QoS の向䞊や SFC 提䟛などを実珟する圹割を持ちたす。 サヌバヌ開発の抂芁 たずは、コントロヌラヌのサヌバヌ機胜を開発する䞊で必芁ずなる゜ケットプログラミングや䞊行凊理、セッション管理の手法に぀いおの抂芁をご玹介したす。 ゜ケットプログラミングによる TCP サヌバヌ実装 PCEP は TCP ベヌスのプロトコルであり、TCP ゜ケットプログラミングが必芁ずなりたす。 䞀般的な゜ケットプログラミングの抂芁を瀺したす。 図の通り、䞀般的な゜ケットプログラミングにおけるサヌバヌ実装では、゜ケットを䜜成する socket 、機噚のアドレス・ポヌトず゜ケットを玐付ける bind 、圓該ポヌトで TCP の埅ち受けを行う listen 、クラむアントからの接続を受け入れおセッションを構築する accept ずいう流れで TCP セッションを構成したす。 Pola PCE では Go の net パッケヌゞを利甚し、 pkg/server/server.go の Serve メ゜ッドずしお実装を行なっおいたす。 net.ListenTCP が socket・bind・listen を行い、 ListenTCP の返り倀である *TCPListener の AcceptTCP() メ゜ッドにより accept を行いたす。 䞊行凊理ずセッション管理 PCE のようなコントロヌラヌでは、耇数のクラむアントを管理するこずが求められたす。 そのため、サヌバヌ機胜ずしお 䞊列凊理 ず セッション管理 の機胜が必芁ずなりたす。 図に Pola PCE の䞊行凊理ずセッション管理の実装䟋を瀺したす。 Pola PCE では、セッションは pkg/server/session.go に実装した Session 構造䜓を甚いお管理を行なっおいたす。 Session 構造䜓では、セッション管理に必芁ずなるクラむアントのアドレスや゜ケットの情報に加え、SRP-ID や Stateful PCE ずしお管理するクラむアントの SR Policy、Keepalive の間隔など、クラむアントごずに固有のパラメヌタを党お管理させおいたす。 䞊列凊理は goroutine により実珟しおいたす。 TCP サヌバヌが AcceptTCP() を実行した埌、そのセッションを管理するための Session 構造䜓を䜜成したす。 その埌 goroutine を䜜成しお Session 構造䜓の Established() メ゜ッドを呌び出し、PCE ずしおのメッセヌゞ送受信や SR Policy の発行など、そのクラむアントに察する PCE 機胜を提䟛したす。 この仕組みにより、耇数のクラむアントを区別し぀぀耇数収容するコントロヌラヌを構成するこずが可胜ずなりたす。 プロトコルラむブラリ開発 RFC 準拠のプロトコルラむブラリの開発に぀いお、Pola PCE ぞの Close メッセヌゞの远加 を䟋に解説したす。 RFC の読み解きによるプロトコルの確認 Open/Close/Keepalive などのPCEP メッセヌゞは RFC5440 で提案されおいたす。 4.2.7 節に蚘茉されおいる通り、Close メッセヌゞは PCEP の通信においお TCP セッションを終了させるために甚いられたす。 本蚘事ではプロトコルラむブラリに Close を実装した埌、Pola PCE から特定のピアに Close メッセヌゞ送り、PCEP のセッションを切断する実装を远加したす。 以降の説明のため、PCEP の基本構造を図に瀺したす。 図の通り、PCEP は単䞀の common header ず耇数の object から構成されたす。 common header にはそれが䜕の PCEP メッセヌゞであるかを瀺す message type が栌玍されおいたす。 RFC5440 の 6.1 節の通り、䞻なメッセヌゞは 7 皮類存圚し、今回実装する Close の message type は 7 ず定矩されおいたす。 各 object は common object header ず object body から構成されおいたす。 common object header には、その object を瀺す object class ず object type が栌玍されおいたす。 RFC5440 の 7.17 節に、object class は 15、object type は 1 ず定矩されおいたす。 RFC5440 の 6.8 節には、Close メッセヌゞは 1 ぀の CLOSE object を含むず曞かれおいたす。 message type・object class・object type など、プロトコルで決められたリ゜ヌスは、IANA が管理しおいたす。IANA は管理するリ゜ヌスを https://www.iana.org にたずめお掲茉しおいるため、プロトコル開発等の際はこちらを参照するず良いです。 PCEP の堎合は Path Computation Element Protocol (PCEP) Numbers を参照しおください。 プロトコルラむブラリの実装 - Pola PCE ぞの Close メッセヌゞの远加 ここからは実際に Pola PCE ぞ Close メッセヌゞを远加したす。 message type は pkg/packet/pcep/message.go に、object class は pkg/packet/pcep/object.go に実装枈みのため今回は远加䞍芁です。 const ( MT_CLOSE uint8 = 0x07 // RFC5440 ) const ( OC_CLOSE uint8 = 0x0f // RFC5440 ) Close メッセヌゞの構造䜓ずパケット操䜜に関するメ゜ッドを远加したす。 Pola PCE では、広く甚いられる BGP ラむブラリである GoBGP ず同様のパケット操䜜メ゜ッドを採甚しおいたす。 パケット操䜜メ゜ッドずしおは、バむト列を構造䜓に栌玍する DecodeFromBytes() 、構造䜓をバむト列に倉換する Serialize() の 2 ぀のメ゜ッドず、新たに構造䜓を䜜成する NewCloseMessage 関数が必芁ずなりたす。 // Close Message type CloseMessage struct { CloseObject *CloseObject } func (m *CloseMessage) DecodeFromBytes(messageBody [] uint8 ) error { var commonObjectHeader CommonObjectHeader if err := commonObjectHeader.DecodeFromBytes(messageBody); err != nil { return err } closeObject := &CloseObject{} if err := closeObject.DecodeFromBytes(messageBody[COMMON_OBJECT_HEADER_LENGTH:commonObjectHeader.ObjectLength]); err != nil { return err } m.CloseObject = closeObject return nil } func (m *CloseMessage) Serialize() [] uint8 { closeMessageLength := COMMON_HEADER_LENGTH + m.CloseObject.getByteLength() closeHeader := NewCommonHeader(MT_CLOSE, closeMessageLength) byteCloseHeader := closeHeader.Serialize() byteCloseObject := m.CloseObject.Serialize() byteCloseMessage := AppendByteSlices(byteCloseHeader, byteCloseObject) return byteCloseMessage } func NewCloseMessage(reason uint8 ) (*CloseMessage, error ) { o, err := NewCloseObject(reason) if err != nil { return nil , err } m := &CloseMessage{ CloseObject: o, } return m, nil } 同様に、close object の object type ず構造䜓ずメ゜ッド矀も実装したす。 こちらも message ず同じメ゜ッドに加え、Object 長の蚈枬のため、 Len() メ゜ッドを実装したす。 // Close Object (RFC5440 7.17) const ( OT_CLOSE_CLOSE uint8 = 0x01 ) const ( R_NO_EXPLANATION_PROVIDED uint8 = 0x01 R_DEADTIMER_EXPIRED uint8 = 0x02 R_RECEPTION_OF_A_MALFORMED_PCEP_MESSAGE uint8 = 0x03 ) type CloseObject struct { Reason uint8 } func (o *CloseObject) DecodeFromBytes(objectBody [] uint8 ) error { o.Reason = objectBody[ 3 ] return nil } func (o *CloseObject) Serialize() [] uint8 { closeObjectHeader := NewCommonObjectHeader(OC_CLOSE, OT_CLOSE_CLOSE, o.getByteLength()) byteCloseObjectHeader := closeObjectHeader.Serialize() buf := make ([] uint8 , 4 ) buf[ 3 ] = o.Reason byteCloseObject := AppendByteSlices(byteCloseObjectHeader, buf) return byteCloseObject } func (o *CloseObject) Len() uint16 { // CommonObjectHeader(4byte) + CloseObjectBody(4byte) return COMMON_OBJECT_HEADER_LENGTH + 4 } func NewCloseObject(reason uint8 ) (*CloseObject, error ) { o := &CloseObject{ Reason: reason, } return o, nil } close object は RFC5440 の 7.17 節で䞋蚘のように定矩されおいたす。 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reserved | Flags | Reason | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | // Optional TLVs // | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ たた、7.17節では Reserved 領域ず Flag 領域は 0 でパディングし、read 時には無芖ず芏定されおいたす。 そのため、close object の構造䜓である type CloseObject には、Reason 領域だけを uint8 で甚意しおおき、 DecodeFromBytes() 、 Serialize() は Reason のみを扱うように実装したす。 次に、Close メッセヌゞの受信凊理を远加したす。 pkg/server/session.go の func (ss *Session) ReceivePcepMessage() に、message type が Close であるメッセヌゞを受信した堎合の凊理を远加したす。 case pcep.MT_CLOSE: byteCloseMessageBody := make ([] uint8 , commonHeader.MessageLength-pcep.COMMON_HEADER_LENGTH) if _, err := ss.tcpConn.Read(byteCloseMessageBody); err != nil { return err } closeMessage := &pcep.CloseMessage{} if err := closeMessage.DecodeFromBytes(byteCloseMessageBody); err != nil { return err } ss.logger.Info( "Received Close" , zap.String( "session" , ss.peerAddr.String()), zap.Uint8( "reason" , closeMessage.CloseObject.Reason), zap.String( "detail" , "See https://www.iana.org/assignments/pcep/pcep.xhtml#close-object-reason-field" )) // Close session if get Close Message return nil たず byteCloseMessageBody ずいう byte 列を䜜成し、 ss.tcpConn.Read() により read した object を栌玍したす。その埌 DecodeFromBytes() メ゜ッドにより、 closeMessage 構造䜓に受信した close message を栌玍しおいたす。 Close を正しく受信・デコヌドした埌、ログに close を受信した旚ず受信した close の Reason を蚘録した埌 ReceivePcepMessage() から return するこずで、 Established() に戻りセッションの close 凊理を行いたす。 以䞊で、RFC に準拠したパケットフォヌマットの定矩ず TCP セッションからの read/write 凊理、close の凊理が党お実装できたした。 サヌバヌ機胜の実装 - Pola PCE ぞの Close メッセヌゞ生成コマンドの远加 運甚・怜蚌時に任意のタむミングで特定のピアずの Close を行うため、 gRPC API の远加 ず、 コマンドを介した Close メッセヌゞの送信機胜を実装 したす。 func (ss *Session) SendClose(reason uint8) error { closeMessage, err := pcep.NewCloseMessage(reason) if err != nil { return err } byteCloseMessage := closeMessage.Serialize() ss.logger.Info("Send Close", zap.String("session", ss.peerAddr.String()), zap.Uint8("reason", closeMessage.CloseObject.Reason), zap.String("detail", "See https://www.iana.org/assignments/pcep/pcep.xhtml#close-object-reason-field")) if _, err := ss.tcpConn.Write(byteCloseMessage); err != nil { return err } return nil } 今回必芁ずなるのはあるセッションに察するメッセヌゞの送信凊理であるため、 pkg/server/session.go 内に、 Session 構造䜓の SendClose() メ゜ッドずしお実装したす。 SendClose では、 NewCloseMessage() 関数で close message を䜜成し、 Serialize() メ゜ッドにより byte 列に倉換、 ss.tcpConn.Write() により゜ケットぞず write したす。 Pola PCE はマむクロサヌビスずしおの掻甚を前提ずし、gRPC API を有しおいたす。たた、暙準コマンドずしお、デヌモンである polad に察する gRPC client ずなる pola コマンドを提䟛しおいたす。 ここでは、 pola に pola session del <Address> オプションを実装し、指定したピアぞ SendClose を送信可胜ずしたす。 たず、 api/grpc/pola.proto に DeleteSession の RPC を䜜成したす。 rpc DeleteSession (Session) returns (RequestStatus) {}; 次に、polad 偎の凊理ずしお pkg/server/grpc_server.go に DeleteSession メ゜ッドを䜜成したす。 func (c *APIServer) DeleteSession(ctx context.Context, input *pb.Session) (*pb.RequestStatus, error) { ssAddr, _ := netip.AddrFromSlice(input.GetAddr()) s := c.pce ss := s.SearchSession(ssAddr) if err := ss.SendClose(pcep.R_NO_EXPLANATION_PROVIDED); err != nil { return &pb.RequestStatus{IsSuccess: false}, err } // Remove session info from PCE server s.closeSession(ss) return &pb.RequestStatus{IsSuccess: true}, nil } このメ゜ッドは、gRPC により DeleteSession が実行された際、圓該セッションに察しお SendClose 凊理を実行し、成功/倱敗のステヌタスを送信したす。 次に、pola コマンドが甚いる gRPC client 偎の関数を cmd/pola/grpc_client.go に実装したす。 func deleteSession(client pb.PceServiceClient, session *pb.Session) error { ctx, cancel := withTimeout() defer cancel() _, err := client.DeleteSession(ctx, session) if err != nil { return err } return nil } deleteSession() 関数が実行されるず、gRPC client ずしお DeleteSession メ゜ッドが実行されたす。 最埌に、pola コマンドに session del オプションを远加したす。 pola コマンドは Cobra を甚いお実装しおいたす。 たず、pola session コマンドに del オプションを远加したす。 cmd/pola/session.go の newSessionCmd() 関数に newSessionDelCmd() の呌び出しを远加したす。 func newSessionCmd() *cobra.Command { cmd := &cobra.Command{ Use: "session" , RunE: func (cmd *cobra.Command, args [] string ) error { if err := showSession(jsonFmt); err != nil { return err } return nil }, } cmd.AddCommand(newSessionDelCmd()) return cmd } 次に cmd/pola/session_del.go に del コマンドそのものである newSessionDelCmd() を実装したす。 package main import ( "fmt" "net/netip" pb "github.com/nttcom/pola/api/grpc" "github.com/spf13/cobra" ) func newSessionDelCmd() *cobra.Command { return &cobra.Command{ Use: "del" , SilenceUsage: true , RunE: func (cmd *cobra.Command, args [] string ) error { if len (args) < 1 { return fmt.Errorf( "requires session address \n Usage: pola session del [session address]" ) } ssAddr, err := netip.ParseAddr(args[ 0 ]) if err != nil { return fmt.Errorf( "invalid input \n Usage: pola session del [session address]" ) } if err := delSession(ssAddr, jsonFmt); err != nil { return err } return nil }, } } func delSession(session netip.Addr, jsonFlag bool ) error { ss := &pb.Session{ Addr: session.AsSlice(), } err := deleteSession(client, ss) if err != nil { return err } if jsonFlag { fmt.Printf( "{ \" status \" : \" success \" } \n " ) } else { fmt.Printf( "success! \n " ) } return nil } newSessionDelCmd は、 pola session に del オプションが指定された時に、 func delSession() を実行したす。 func delSession() は cmd/pola/grpc_client.go の deleteSession() を実行するこずで、gRPC client ずしおセッション削陀の gRPC API を実行したす。 これにより、 pola session del <Address> オプションによる Close 機胜を远加できたした。 動䜜詊隓 機胜を远加した Pola PCE ずベンダヌ機噚ずの盞互接続詊隓を行いたす。 今回は WIDE Project の高田さん @Enigamict に䜜成しおいただいた example/containerlab/sr-mpls_pcep を䜿甚し、䞋蚘のトポロゞヌを甚いお怜蚌したす。 ここでは、PCEP の怜蚌甚に Cisco/Juniper/FRRouting の PE が 1 台ず぀存圚する環境を䜜成しおいたす。 このトポロゞヌをはじめ、SR-MPLS や SRv6 で TE の怜蚌が可胜な環境を example ずしお公開しおいたす。 機胜を远加した Pola PCE を Docker コンテナずしおビルドするこずで、これらの環境を䜿っお怜蚌できたす。 Linux + Docker 環境があれば詊せるので、是非手元で動かしおみおください。 Docker を甚いたネットワヌク゚ミュレヌタツヌルである Containerlab のむンストヌルや、各むメヌゞの準備方法、ネットワヌクの起動などの流れは REAME.md にたずめおいたす。 起動したネットワヌク䞊で Pola PCE のコンテナに入り、 polad コマンドで Pola PCE の起動セッションの構築埌、 pola session コマンドで確認したす。 # polad -f polad.yaml > /dev/null 2>&1 & # pola session sessionAddr(0): 10.0.255.1 sessionAddr(1): 10.0.255.3 sessionAddr(2): 10.0.255.2 次に、今回远加した pola session del コマンドを実行し、IOS XR/Junos/FRRouting Close メッセヌゞを送信したす。 以䞋では IOS XR に察する Close を実斜したす。 root@pola-pce:/# pola session del 10.0.255.1 success! たた、動䜜詊隓のため Wireshark を利甚しお PCEP パケットをキャプチャしたす。䞋蚘に、SSH 経由で Containerlab 環境からパケットキャプチャを実斜する䟋を瀺したす。 ssh $clab_host "sudo -S ip netns exec clab-srv6_te_l3vpn-pe01 tcpdump -U -nni eth1 -w -" | wireshark -k -i - キャプチャした結果、実装通りに Close メッセヌゞが送られ、TCP も Close しおいるこずが確認できたす。 これにより、実装した Close 機胜が各ルヌタヌず正しく盞互接続可胜なこずを確かめられたした。 Let's contribute! 最埌に、今たでに実装した機胜を Pola PCE ぞ Pull Request ずしお提出したしょう。 テンプレヌトに埓っお GitHub PR を䜜成したす。 今回の䟋にあげた Close 機胜は PR #66 で取り蟌たれおいたす。 この PR では、同時に PCErr 機胜も远加されおいたす。もし興味があれば、是非そちらの読み解きにもチャレンゞしおみおください。 たた、今回の䟋にあげた Close 機胜は Pola PCE v1.2.1 でリリヌス枈みのため、 最新の Docker むメヌゞ や、それを甚いた example でも詊せたす たずめず今埌の予定 本蚘事では、Pola PCE の実装䟋を基に、RFC/I-D 準拠のコントロヌラヌやプロトコルラむブラリ開発の進め方に぀いおご玹介したした。 蚘事を通じおプロトコルラむブラリやコントロヌラヌの実装に興味を持たれた方は、是非我々ず共に Pola PCE を開発したしょう 次のステップずしお、 uSID や Flex-Algo を甚いた Dynamic TE の実装を目指しおいたす。実装予定の機胜は issue や milestone ずしお敎備しおいたすので是非ご確認ください。 本蚘事を読んでコントロヌラヌやプロトコルラむブラリの開発に興味をもった方や、拡匵可胜な PCE を求めおいる方がいたしたら、Pola PCE にコントリビュヌションしおみたせんか もしご興味をお持ちの方がいれば、是非気軜にご連絡や PR/Issue の䜜成をお願いしたす
はじめに こんにちは、むンタヌン生の 山口雄翔 です。 この床2023幎2月6日から2週間、NTTコミュニケヌションズのむンタヌンシップに、 ゚ンタヌプラむズ向け倧芏暡クラりドサヌビスを支えるネットワヌク開発 ずいうテヌマで参加させおいただきたした。 この蚘事ではその䜓隓に぀いお曞かせおいただきたす。 むンタヌンシップに぀いお NTTコミュニケヌションズでは、 SDPFクラりド/サヌバヌ ずいう゚ンタヌプラむズ向けクラりドサヌビスを提䟛しおいたす。 このサヌビスでは、仮想的なL2ネットワヌクを自由に構築し、そこにベアメタルサヌバ・VM・ストレヌゞなどを(論理的に)接続させお䜿うこずができたす。 もちろんむンタヌネット接続やロヌドバランサなどをサヌビスずしお利甚するこずもできたす。 そのクラりドの内郚のネットワヌクを制埡するSDNコントロヌラの改善ずいうのが、本むンタヌンシップのテヌマでした。 前半1週間はこのクラりド内のネットワヌクやSDNずその関連技術に぀いお教えおもらいながら孊び、埌半1週間でコントロヌラの性胜改善に取り組みたした。 クラりド内のネットワヌクずSDNに぀いお 抂芁 クラりド内のネットワヌク構成はこのようになっおいたす。(玫で印を぀けた郚分がSDNコントロヌラ) クラりドを構成するデヌタセンタのスむッチは党お隣接するスむッチずBGPで接続しおいお、党䜓に察しお疎通性がありたす。 機胜を持぀ノヌド(ハむパヌバむザ・ベアメタルサヌバ・ゲヌトりェむ等)はLeafスむッチの䞋にありたす。 VMを収容するハむパヌバむザが乗っおいるマシン䞊では、VMに関係する経路情報をやり取りするための仮想ルヌタが動いおいたす。 EVPN/VXLAN VMやベアメタルサヌバ同士のL2接続性を確保するために、VXLANずEVPNを利甚しおいたす。 EVPN(Ethernet VPN)ずは、仮想的にL2接続性を提䟛するためのVPNのこずです。 仮想L2ネットワヌクに接続するノヌドのMACアドレス VPNの゚ンドポむントのIPアドレス 仮想L2ネットワヌクの識別子 などをMP-BGPに乗せお亀換するこずで、L2接続に必芁な情報を共有し、ネットワヌクをスケヌルさせるこずができたす。 https://datatracker.ietf.org/doc/html/rfc8365 https://datatracker.ietf.org/doc/html/rfc7432 VXLANはパケットをカプセル化するこずで、L3ネットワヌク䞊に論理的なL2ネットワヌクを構築するトンネリングプロトコルです。 MACアドレスなどの情報をEVPNで亀換したのち、VXLANでL2トンネルを䜜るこずによっお、L2接続性を実珟しおいたす。 図のようにencap/decapを行うこずで、仮想L2ネットワヌクを実珟しおいたす。 (encap/decapをするVXLANトンネルの゚ンドポむントのこずを、VTEPず呌びたす。) このように仮想ネットワヌクが実珟できるような経路制埡の管理をするのも、SDNコントロヌラの重芁な圹割のひず぀です。 (次項参照) SDNコントロヌラ SDPFクラりド/サヌバヌでは、SDNコントロヌラに Tungsten Fabric を採甚しおいたす。 SDNコントロヌラは、 仮想L2ネットワヌク等のリ゜ヌス䜜成のためのむンタヌフェヌスの提䟛およびVTEPぞの蚭定投入 経路情報の蚈算ず広告 コントロヌラ自身やリ゜ヌス情報のメトリクスの収集 を持っおいたす。 (3に぀いおはむンタヌンシップで扱っおいないため、この蚘事では觊れたせん。) 1に぀いお クラりド内の仮想蚈算機基盀はOpenStackを利甚しお䜜られおいたす。 OpenStackのネットワヌク呚りを管理するNWコントロヌラずTungsten Fabricを連携させるこずにより、仮想基盀偎から投入された蚭定が、SDNコントロヌラを経由しおネットワヌクに入るような蚭蚈を実珟しおいたす。 2に぀いお SDNコントロヌラは、クラりドのネットワヌク内で仮想L2ネットワヌクを䜜るための経路情報の蚈算・広告をする圹割を担っおいたす。 以䞋の図は、コントロヌラずネットワヌクの各コンポヌネントの論理的な繋がりを瀺しおいたす。 コントロヌラず仮想ルヌタヌの経路情報のやり取りでは、XMPPずいうプロトコルに乗せおEVPNの経路情報のやり取りをしおいたす。 物理ルヌタがVTEPずなっおいる箇所に぀いおは、Route Reflector(以䞋RRず瀺す)がコントロヌラず物理ルヌタヌの双方ずBGPピアを匵っおEVPNの経路情報を亀換するこずで、コントロヌラからの経路情報をRR経由でVTEPに䌝えるこずができたす。 察倖発衚資料 SDPFクラりド/サヌバヌに぀いおの技術的な察倖発衚の資料を以䞋にたずめたしたので、ご興味のある方はぜひご芧ください。 JANOG: EVPN Anycast Gateway を 商✀導⌊した話 : https://www.janog.gr.jp/meeting/janog48/evpn/ JANOG: ゚ンタヌプラむズ向けクラりドのSDN基盀の安定化ぞの挑戊 : https://www.janog.gr.jp/meeting/janog44/program/sdnclg/ NTT Com Open TechLunch: クラりドの䜜り方 : https://speakerdeck.com/toby06/how-to-create-cloud-service 今回取り組んだ問題に぀いお コントロヌラ内での経路の保持ず耇補凊理 SDNコントロヌラはクラりドネットワヌクの経路情報を党お把握しおいたす。 コントロヌラの内郚では、各仮想ネットワヌクごずのルヌティングテヌブル(VRF)ずFabric党䜓の経路を保持するグロヌバルルヌティングテヌブルを持っおおり、EVPNに぀いおもこの構成で経路を保持しおいたす。 そしおVRFテヌブルずグロヌバルルヌティングテヌブルの間での経路の耇補凊理がむベントドリブンで実行されるようになっおいるのですが、コントロヌラのこの動䜜が時間のかかる凊理ずなっおいたす。 (Tungsten Fabric は耇数コアを甚いたマルチスレッドに察応しおいたすが、経路耇補がスレッドセヌフでない凊理を含むため、1コアのみを甚いお順番に凊理を行うタスクキュヌに入るようになっおおり、時間がかかっおしたいたす。) ラむブマむグレヌションなどに䌎う経路蚈算の際に、この郚分の蚈算時間がボトルネックずなっお経路蚈算の完了が遅れ、それによっお通信ができない時間が発生しおしたいたす。 それを防ぐためには経路耇補凊理の速床の改善が必芁であり、今回のむンタヌンシップではその問題に取り組みたした。 䜜業 実は経路耇補凊理のコヌド改善ずいうのはむンタヌンシップの前からチヌムで取り組たれおいお、upstreamにmergeされおいる倉曎もありたす。 (その説明は こちらの資料 に曞いおありたす。) その䞭で同じ関数内に曎なる改良の䜙地がありそうだずが分かり、自分はそれに取り組たせおいただきたした。 たずは教えおもらった関数内の凊理内容を把握した䞊で、郚分ごずに分けお時間を枬りたした。 この関数の䞭には、 経路を耇補すべき宛先テヌブルを皮々の条件から絞る凊理 宛先テヌブルをRouteTarget等から決定する凊理 実際に経路情報をメモリコピヌする凊理 などが含たれおおり、それらの凊理ごずの時間をログに出力したのちpythonスクリプトを䜿っお結果を芋やすく衚瀺したした。 (䞋はその様子です。) そしお、 蚈枬結果・プログラムのコヌド・そこで扱われる経路情報 の3぀を芋ながら考えお、凊理時間を短瞮できそうな箇所を芋぀けたした。 コヌド改善 アルゎリズム コントロヌラが保持しおいる経路(BGP route)には、耇数のpathを持぀ものがありたす。 䟋えば3぀のRRから同じ経路を受け取った際、src addrだけ異なる3぀のpathがrouteに登録されたす。 ある1぀のrouteの耇補は、含たれるpathごずにルヌプで行われる実装ずなっおいお、その䞭でpathの耇補先EVPNテヌブルを遞定しおいたした。 (pathの䞭の拡匵コミュニティに含たれるRouteTarget等の情報からテヌブルを探玢し、耇補先テヌブルリストを䜜っおいたす。) ですが同じrouteに属するpathは(自分が怜蚌環境でチェックした限りでは)耇補先テヌブルは同じであったため、ここの凊理を1぀にたずめるこずで、性胜改善ができるのではないかず考えたした。 この効果は、倚量(ほが党お)のVRFテヌブルに耇補する必芁がある EVPN Type1経路 においお顕著に珟れたした。 (EVPN Type1経路はマルチホヌミングの情報を広告するためのものです。) 実装結果・考察 改善前ず埌のパフォヌマンス蚈枬の結果 before after この写真は経路耇補をする関数の䞭の郚分ごずの凊理時間を出力したものです。 印を぀けた郚分が耇補先EVPNテヌブルを遞定しお該圓するテヌブルをリストに挿入しおいる操䜜なのですが、コヌド改善埌に凊理時間が倧幅に短瞮されおいるこずが分かりたす。 この関数党䜓の凊理時間(巊端の数倀)は1割皋床の削枛でき、性胜ずしお10%皋床の改善を実珟できたず蚀えたす。 ( 数倀の単䜍は党おマむクロ秒です。 ) 凊理の枬定、実装を通しお想定通り性胜改善を埗るこずはできたした。 䞀方で、むンタヌンシップの間ではその他に極端にボトルネックずなっおいるような凊理を芋぀けるこずはできず、凊理速床の倧幅改善の難しさなども実感したした。 課題 時間がなくおできたせんでしたが、耇補先テヌブル蚈算の凊理をたずめおも本圓に倧䞈倫かずいうのを、ロゞック・動䜜怜蚌の䞡面から確認しおゆく必芁があるかなず思いたした。 (商甚環境ぞのデプロむたでには他にも様々な段階を螏んだ怜蚌・テストが必芁で、今回自分が曞いたコヌドがそのたた乗るこずはありたせん。) 感じたこず 倧芏暡ネットワヌクを制埡するSDNコントロヌラを䜜る難しさ プログラム䞭の本圓に些现なロゞックの誀りであっおも、コントロヌラから経路情報が流れる䞭でその圱響がクラりド内に広く波及しお、党䜓ずしお芋た時に倧きな゚ラヌになっおしたうこずが倚々あるず思いたした。(実際自分も怜蚌環境を壊しかけたした。) 倧芏暡SDNコントロヌラだからこそコヌド1行1行にこだわっお曞かなければいけないなず思いたしたし、そのような環境で日々コヌドを曞かれおいるチヌムメンバヌの皆さんの、コヌドを怜蚌する時の鋭さを匷く感じたした。 たた小芏暡な怜蚌環境で動かした時には気にならなかった少しの遅延が、倧芏暡環境に移した途端顕著になるずいうこずも経隓し、コヌドを最適化する重芁性を身をもっお䜓隓できたした。 デバッグ SDNを甚いる堎合、コントロヌルプレヌンでの゚ラヌは基本SDNコントロヌラに原因がありたす。 原因ずなるコンポヌネントの特定ずいう意味では分かりやすい反面、ロゞックの難しさやネットワヌクの状態管理の煩雑さが党おこの゜フトりェアの内郚に含たれるため、コヌドや挙動が非垞に耇雑です。 たたそもそも゚ラヌを再珟するこず自䜓が難しく、デバッグに高床な技術力や経隓が必芁であるなず感じたした。 人間よりも機械の気持ちが分かる(他称)ずいうある先茩は、゚ラヌが起こった時迷いなくgdbでこの巚倧でステヌトフルなプログラムの動䜜を芋に行っおいたした。぀よい... 謝蟞 むンタヌンシップに向けお怜蚌環境敎備や資料準備をしおくださり、期間䞭は䞁寧に業務のこずを教えおくださったチヌムの皆さんのおかげで、濃くお楜しい2週間になりたした。本圓に本圓にありがずうございたした。 本来は自分が参加した郚眲ではむンタヌンブログを曞くこずはあたりないそうなのですが、ずおも面癜くお玠晎らしい䜓隓ができたので、技術的なこずを含めお是非共有したいず思い、無理を蚀っお曞かせおいただきたした。 (メヌルで質問攻めにしおしたいすみたせん。) 長い文章ずなっおしたいたしたが、倚くの方にこのブログを読んでいただけるず嬉しいです。
はじめに シェル芞勉匷䌚に぀いお 問題ず解説 Q1@butackle66さんから 解答䟋1 解答䟋2 Q2@butackle66さんから 解答䟋1 解答䟋2 Q3 解答䟋1 解答䟋2 Q4 解答䟋1 解答䟋2 Q5 解答䟋 Q6 解答䟋 LT LT1 curlでTelegram botを操䜜 (やべえ @yabeenico) LT2 音声合成しおみよう (たいちょヌ @xztaityozx_001) おわりに はじめに こんにちは。デゞタル改革掚進郚デヌタドリブンマネゞメント掚進郚門の江川尋喜 (Hiroki Egawa / @yabeenico ) です。 第63回ビッグハンドタりンシェル芞勉匷䌚が2023幎02月25日に開催されたした。 今回は NTT Com のオフィスビル、倧手町プレむスを䌚堎提䟛させおいただきたした。 このブログ゚ントリでは、勉匷䌚で出題された問題の解答ず解説をしたす。 問題デヌタ ryuichiueda/ShellGeiData/vol.63 Twitter たずめ 第63回ビッグハンドタりンシェル芞勉匷䌚 - Togetter YouTube 第63回シェル芞勉匷䌚 - YouTube むベントサむト jus共催 第63回ビッグハンドタりンシェル芞勉匷䌚 | Doorkeeper むベントリンク集 jus共催 第63回シェル芞勉匷䌚リンク集 | 䞊田ブログ 倧手町䌚堎の様子 シェル芞勉匷䌚に぀いお たずシェル芞に぀いお、提唱者の䞊田隆䞀 ( @ryuichiueda ) 先生がこう定矩しおいたす。 [シェル芞ずは] シェル芞の定矩バヌゞョン1.1 マりスも䜿わず、゜ヌスコヌドも残さず、GUIツヌルを立ち䞊げる間もなく、あらゆる調査・蚈算・テキスト凊理をCLI端末ぞのコマンド入力䞀撃で終わらすこず。あるいはそのずきのコマンド入力のこず。 芁は Unixç³»OSのシェル䞊でのワンラむナヌのこずです。勝手に名前぀けおすんたせん。 https://b.ueda.tech/?page=01434 シェル芞勉匷䌚はシェル芞を極めたい人、すなわちシェルスクリプトやコマンドの愛奜家が参加し、亀流したす。 参加者のバックグラりンドはコマンド開発者、むンフラ゚ンゞニア、研究者、孊生等様々です。 シェル芞勉匷䌚は次の流れで進行したす。 䞊田先生が䜜っおきた問題を出題 参加者が Twitter に #シェル芞 を付けお解答を投皿 䞊田先生が解答を解説 #シェル芞 を぀けお぀ぶやくずシェル芞bot ( @minyoruminyon ) が実行結果を衚瀺しおくれたす。 たた、入力に䜿うデヌタは ryuichiueda/ShellGeiData/vol.63 にありたす。 今回玹介する解答は私が考えたものず、他の人の考えを取り入れたものがありたす。 たた、文字数がなるべく少なくなる解答を甚意したした。 それでは問題、解答及び解説を芋おいきたしょう。 問題ず解説 Q1 @butackle66 さんから 1x1〜9x9の九九の答えをすべお足し合わせおください。 https://twitter.com/ryuichiueda/status/1629339996028018688?s=20 解答䟋1 文字数が少ないです。 $ echo {1..9}*{1..9}+ 0|bc 2025 解説 bash のブレヌス展開で蚈算匏を出力し、bc で蚈算しおいたす。 怜玢ワヌド: ブレヌス展開 / brace expantion / sequence expantion $ echo {1..9} 1 2 3 4 5 6 7 8 9 $ echo {1..9}{1..9} 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 51 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 78 79 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96 97 98 99 $ echo {1..9}*{1..9}+ 0 1*1+ 1*2+ 1*3+ 1*4+ 1*5+ 1*6+ 1*7+ 1*8+ 1*9+ 2*1+ 2*2+ 2*3+ 2*4+ 2*5+ 2*6+ 2*7+ 2*8+ 2*9+ 3*1+ 3*2+ 3*3+ 3*4+ 3*5+ 3*6+ 3*7+ 3*8+ 3*9+ 4*1+ 4*2+ 4*3+ 4*4+ 4*5+ 4*6+ 4*7+ 4*8+ 4*9+ 5*1+ 5*2+ 5*3+ 5*4+ 5*5+ 5*6+ 5*7+ 5*8+ 5*9+ 6*1+ 6*2+ 6*3+ 6*4+ 6*5+ 6*6+ 6*7+ 6*8+ 6*9+ 7*1+ 7*2+ 7*3+ 7*4+ 7*5+ 7*6+ 7*7+ 7*8+ 7*9+ 8*1+ 8*2+ 8*3+ 8*4+ 8*5+ 8*6+ 8*7+ 8*8+ 8*9+ 9*1+ 9*2+ 9*3+ 9*4+ 9*5+ 9*6+ 9*7+ 9*8+ 9*9+ 0 $ echo 1 + 2 | bc 3 解答䟋2 ブレヌス展開ず bc のどちらも利甚しない別解です。 ブレヌス展開では倉数が䜿えないので、倉数が䜿いたシチュ゚ヌションで利甚できたす。 $ join -j9 <(seq 9) <(seq 9) | awk '$0=a+=$1*$2' | tail -n1 2025 解説 join -j9 <(seq 9) <(seq 9) -> 列結合を利甚しお 1 1 から 9 9 たでの組を䜜っおいたす。 ### サンプルデヌタ $ cat <(printf '1 a\n2 b\n3 c\n4 d\n') <(printf '1 e\n2 f\n3 g\n4 h') 1 a 2 b 3 c 4 d 1 e 2 f 3 g 4 h ### 1列目で結合 $ join -j1 <(printf '1 a\n2 b\n3 c\n4 d\n') <(printf '1 e\n2 f\n3 g\n4 h') 1 a e 2 b f 3 c g 4 d h ### 存圚しない列で結合するず full join ずなる $ join -j9 <(printf '1 a\n2 b\n3 c\n4 d\n') <(printf '1 e\n2 f\n3 g\n4 h') 1 a 1 e 1 a 2 f 1 a 3 g 1 a 4 h 2 b 1 e 2 b 2 f 2 b 3 g 2 b 4 h 3 c 1 e 3 c 2 f 3 c 3 g 3 c 4 h 4 d 1 e 4 d 2 f 4 d 3 g 4 d 4 h ### 1 1 から9 9 たでの組を出力 (途䞭は sed で削陀) $ join -j9 <(seq 9) <(seq 9) | sed 4,78d 1 1 1 2 1 3 9 7 9 8 9 9 awk '$0=a+=$1*$2' -> 环積和を蚈算しおいたす。 参考: awk 基瀎 ### a に环積和を保存 $ seq 4 | awk '{a+=$1; print a}' 1 3 6 10 ### (a+=$1) は代入埌の a の倀に評䟡される $ seq 4 | awk '{print a+=$1}' 1 3 6 10 ### $0 に a を代入し、間接的に a を print ### pattern = $0=(a+=$1), action = 暗黙的に {print $0} ずなる $ seq 4 | awk '$0=(a+=$1)' 1 3 6 10 tail -n1 -> 最埌の1行を抜出しおいたす。 Q2 @butackle66 さんから 9132円の支払いに10000円札で払ったずきのお぀りの出し方をひず぀できるひずはたくさん画面に出力しおみおください。 https://twitter.com/ryuichiueda/status/1629340985389125632?s=20 解答䟋1 文字数が少ないです。 たた、出すコむンの枚数が最小になりたす。 $ printf %s\\n 500 100 50 10 5 1|awk 'BEGIN{t=10000-9142}{t-=$0*(a=int(t/$0))}$0=$0" "a' 500 1 100 3 50 1 10 0 5 1 1 3 解説 printf %s\\n 500 100 50 10 5 1 -> 6皮類のコむンを出力しおいたす。 ### `printf` は第1匕数のフォヌマットを第2匕数以降の党おに適甚する $ printf '%s\n' 500 100 50 10 5 1 500 100 50 10 5 1 $ printf '%s/' 500 100 50 10 5 1 500/100/50/10/5/1/ awk 'BEGIN{t=10000-9142}{t-=$0*(a=int(t/$0))}$0=$0" "a' -> 以䞋の python3 コヌドをワンラむナヌにしおいたす。 参考: awk 基瀎 t = 10000 - 9142 for d0 in [500, 100, 50, 10, 5, 1]: # $0 a = int(t / d0) # a=int(t/$0) t = t - d0 * a # t-=$0*(...) d0 = str(d0) + " " + str(a) # $0=$0" "a print(d0) 解答䟋2 ネタです。 コむンの枚数の組み合わせを金額が858円になるたでランダムに探玢しおいたす。 $ tr -dc 0-9</dev/urandom|fold -w6|awk -F '' '500*$1+100*$2+50*$3+10*$4+5*$5+1*$6==10000-9142'|head -n1 071928 出力の芋方: 500円玉0枚, 100円玉7枚, ..., 1円玉8枚 解説 tr -dc 0-9</dev/urandom|fold -w6 -> 6桁のランダムな数字を生成しおいたす。 ### /dev/urandom はランダムなデヌタを返す $ cat /dev/urandom | head -c10 ȱᅵKH$繀 ### tr -d: 削陀, -c: 以倖を -> 0-9 以倖を削陀 -> 0-9 のみ抜出 $ cat /dev/urandom | tr -dc 0-9 | head -c10 0597488882 ### fold で6桁に切り詰める $ cat /dev/urandom | tr -dc 0-9 | fold -w6 | head -n3 764711 039900 491372 awk -F '' '500*$1+100*$2+50*$3+10*$4+5*$5+1*$6==10000-9142' -> 入力の6桁の数字のうち金額が858円ずなるものを抜出しおいたす。 ### -F '' で文字単䜍にフィヌルド分割 $ echo abc | awk -F '' '{print $2}' b たた、pattern/action が以䞋ずなりたす。 pattern: 500*$1+100*$2+50*$3+10*$4+5*$5+1*$6==10000-9142 action: 暗黙的に {print $0} Q3 次のLaTeXの原皿で、\labelず\refがペアになっおいない参照しおいない/されおいないものを抜出しおください。 https://twitter.com/ryuichiueda/status/1629347379219689473?s=20 題意ずしおは、参照されおいない図衚、図衚の無い参照を芋぀けたいずいうこずです。 たた、今回は \label が0個で \ref が2個のように片方が0個で片方がn個のようなシチュ゚ヌションの考慮は䞍芁です。 参照されおいない図衚の䟋 \label{hoge} はあるが \ref{hoge} がない 図衚のない参照の䟋 \ref{hoge} はあるが \label{hoge} がない 解答䟋1 文字数が少ないです。 $ grep -oP '(label|ref)\K[^}]*' genkou.tex|sort|uniq -u {eq:state_equation_linear {eq:state_equation_nonlinear {fig:typhoon 解説 grep -oP '(label|ref)\K[^}]*}' genkou.tex -> ファむルから \label{...} や \ref{...} の郚分を抜出しおいたす。 ### -o: マッチした郚分のみ抜出 $ echo 12344321 | grep -o .3 23 43 ### lable たたは ref から } が珟れる盎前たでを抜出 (-P は埌述) $ grep -oP '(label|ref)[^}]*' genkou.tex | head -n3 label{eq:state_transition_model label{eq:state_transition_model2 ref{eq:state_transition_model ### -P: perl 拡匵正芏衚珟を利甚 -> \K ず | を䜿うため ### \K: \K より巊をマッチずしお出力しない ### ..3 にマッチさせお... $ echo 12344321 | grep -oP '..3' 123 443 ### 最初の1文字を出力したくない堎合 $ echo 12344321 | grep -oP '.\K.3' 23 43 ### \K を䜿っお label ず ref を出力から陀倖 $ grep -oP '(label|ref)\K[^}]*' genkou.tex| head -n3 {eq:state_transition_model {eq:state_transition_model2 {eq:state_transition_model sort|uniq -u -> 重耇のないナニヌクな行のみを抜出しおいたす。 ### サンプルデヌタ $ seq 1 3; seq 2 4 1 2 3 2 3 4 ### ナニヌクな行のみを抜出 ### なお、uniq は盎前の行ずの比范のみを行うので、あらかじめ sort が必須 $ (seq 1 3; seq 2 4) | sort | uniq -u 1 4 uniq の䟿利なオプション ### 重耇排陀 $ (seq 1 3; seq 2 4) | sort | uniq 1 2 3 4 ### ナニヌクな行のみを抜出 (再掲) $ (seq 1 3; seq 2 4) | sort | uniq -u 1 4 ### 重耇した行のみを抜出 $ (seq 1 3; seq 2 4) | sort | uniq -D 2 2 3 3 ### 重耇した行のみを抜出し、重耇排陀しお出力 $ (seq 1 3; seq 2 4) | sort | uniq -d 2 3 ### 重耇個数をカりント $ (seq 1 3; seq 2 4) | sort | uniq -c 1 1 2 2 2 3 1 4 解答䟋2 勉匷䌚で解説された方法です。 sort ず uniq のフィヌルド機胜を掻甚しおいたす。 $ cat genkou.tex | grep -oE '(ref|label){.*}' | tr '{}' ' ' | sort -k2,2 | uniq -u -f1 label eq:state_equation_linear label eq:state_equation_nonlinear ref fig:typhoon 解説 ### `grep -oE` たでは基本的に解答䟋1ず同じ。| を䜿うために -E を指定 $ cat genkou.tex | grep -oE '(ref|label){.*}' | head -n3 label{eq:state_transition_model} label{eq:state_transition_model2} ref{eq:state_transition_model} ### tr で { ず } をスペヌスに倉換 $ cat genkou.tex | grep -oE '(ref|label){.*}' | tr '{}' ' ' | head -n3 label eq:state_transition_model label eq:state_transition_model2 ref eq:state_transition_model ### sort -k2,2 で2フィヌルド目で䞊べ替え $ cat genkou.tex | grep -oE '(ref|label){.*}' | tr '{}' ' ' | sort -k2,2 label eq:state_equation_linear label eq:state_equation_nonlinear label eq:state_transition_model ref eq:state_transition_model ref eq:state_transition_model ref eq:state_transition_model label eq:state_transition_model2 ref eq:state_transition_model2 ref eq:state_transition_model2 ref eq:state_transition_model2 ref eq:state_transition_model2 ref eq:state_transition_model2 ref eq:state_transition_model2 label fig:motion ref fig:motion ref fig:typhoon ### uniq -u -f1 で1フィヌルド目を無芖しおナニヌクな行を抜出 $ cat genkou.tex | grep -oE '(ref|label){.*}' | tr '{}' ' ' | sort -k2,2 | uniq -u -f1 label eq:state_equation_linear label eq:state_equation_nonlinear ref fig:typhoon Q4 次のファむルから、「東西南北」がワンセットになっおいる郚分を探しおください。東西南北の順番は問いたせん。 https://twitter.com/ryuichiueda/status/1629355288145920001?s=20 䟋: 東西南北西東 ずいう入力文字列から 1 東西南北 , 3 南北西東 を出力する。 䜕文字目から始たるかの情報も出力する。 解答䟋1 愚盎に解くずこうなるでしょう。 $ awk '{while(a=substr($0,++i,4)){print i,a}}' tonnan.txt|awk '/東/*/西/*/南/*/北/' 3 西南北東 12 南北西東 33 南東西北 41 西北南東 43 南東北西 54 東北南西 55 北南西東 56 南西東北 57 西東北南 58 東北南西 63 南西東北 64 西東北南 68 東南西北 71 北西南東 72 西南東北 97 西北東南 awk '{while(a=substr($0,++i,4)){print i,a}}' -> 入力文字列を4文字ず぀切り出しおいたす。 a=substr($0, ++i, 4) で a (東西南北の文字列) ず i (むンデックス) を以䞋のように蚭定しおいたす。 南西西南北東東西東... (入力) 南西西南 == a, i == 1  西西南北 == a, i == 2   西南北東 == a, i == 3    南北東東 == a, i == 4     北東東西 == a, i == 5      東東西東 == a, i == 6 実行結果 $ awk '{while(a=substr($0,++i,4)){print i,a}}' tonnan.txt | head -n5 1 南西西南 2 西西南北 3 西南北東 4 南北東東 5 北東東西 awk '/東/*/西/*/南/*/北/' -> 東西南北が4぀ずも含たれおいる行のみ抜出しおいたす。 pattern の /regex/ は $0 ~ /regex/ ず等䟡です。 すなわち、入力行を正芏衚珟マッチした結果を 0 or 1 の数倀に評䟡したす。 よっお、以䞋の匏は等䟡です。 /東/*/西/*/南/*/北/ ($0 ~ /東/) && ($0 ~ /西/) && ($0 ~ /南/) && ($0 ~ /北/) 解答䟋2 eban さんの解答 を解説したす。 文字数が少ないです。 「東西南北が含たれおいる」の刀定を「1行に同じ文字が2回出珟しない」で行っおいたす。 $ sed ':a;p;s/.//;ta' tonnan.txt|grep -o ^....|grep -vnE '(.).*\1' 3:西南北東 12:南北西東 33:南東西北 41:西北南東 43:南東北西 54:東北南西 55:北南西東 56:南西東北 57:西東北南 58:東北南西 63:南西東北 64:西東北南 68:東南西北 71:北西南東 72:西南東北 97:西北東南 解説 sed ':a;p;s/.//;ta' -> パタヌンスペヌスの1文字目の削陀ず print を繰り返しおいたす。 パタヌンスペヌスの解説はここではやりたせんが、tonnan.txt の䞭身で初期化された文字列型の倉数ず考えお䞋さい。 この sed は以䞋4぀のコマンドから成り立っおいたす。 :a # ラベル p # パタヌンスペヌスを print s/.// # パタヌンスペヌスの最初の1文字を削陀 ta # 盎前の眮換が成功したら :a に戻る 実行結果 $ sed ':a;p;s/.//;ta' tonnan.txt | tail 東南東東西北東南 南東東西北東南 東東西北東南 東西北東南 西北東南 北東南 東南 南 grep -o ^.... -> 先頭4文字を切り出しおいたす。 $ sed ':a;p;s/.//;ta' tonnan.txt | grep -o ^.... | tail 南東東北 東東北南 東北南東 北南東南 南東南東 東南東東 南東東西 東東西北 東西北東 西北東南 grep -vnE '(.).*\1' -> 同じ文字が含たれおいない行のみを抜出しおいたす。 \1 は (.) ず同じ文字にマッチしたす (埌方参照ずいいたす)。 䟋えば (.)(.)(.)\3\2\1 は abccba にマッチしたす。 ### (.).*\1 -> 同じ文字が少なくずも2文字含たれおいる行 ### -v -> 以倖を ### -n -> 行番号付きで衚瀺 ### -E は () を䜿うために指定 $ sed ':a;p;s/.//;ta' tonnan.txt|grep -o ^.... | grep -vnE '(.).*\1' 3:西南北東 12:南北西東 33:南東西北 41:西北南東 43:南東北西 54:東北南西 55:北南西東 56:南西東北 57:西東北南 58:東北南西 63:南西東北 64:西東北南 68:東南西北 71:北西南東 72:西南東北 97:西北東南 Q5 ぀ぎのリバヌシの盀面に぀いお、E6ずG7に❌を打ちたいです。 $ cat reversi.txt                        ⚪        ⚪⚫       ⚫⚫        ⚪⚫                     ぀ぎのワンラむナヌを完成させおください。Perl䜿える人もこの問題はsedでお願いしたす。 $ cat reversi.txt | sed あるsedのコヌド | sed 最初のsedのコヌドず同じコヌド https://twitter.com/ryuichiueda/status/1629363762879758336?s=20 題意はこんな感じです。 sed でリバヌシの実装をしたい。 ⚪ が眮ける堎所に印を぀けたい。 今回のスコヌプは巊斜䞊に探玢しお刀定する凊理。 期埅する出力                        ⚪        ⚪⚫       ⚫⚫❌       ⚪⚫         ❌           解答䟋 勉匷䌚で解説されたものです。 別解の䜙地は無いでしょう。 $ cat reversi.txt | sed -Ez 's/(⚪.{10}(⚫.{10})+) /\1❌/g' | sed -Ez 's/(⚪.{10}(⚫.{10})+) /\1❌/g'                        ⚪        ⚪⚫       ⚫⚫❌       ⚪⚫         ❌           解説 -z オプションで改行を無芖しおいたす。 C 蚀語で2次元配列を扱うのず同じ芁領で探玢しおいたす。 reversi.txt の暪幅が10文字であるこずを利甚しおいたす。 こんなパタヌンを芋぀けたら党角スペヌスを❌に倉換しおいたす。 ⚪(任意の10文字)⚫(党角スペヌス) ((任意の10文字)⚫) を+で繰り返すこずで、⚫が2個続くパタヌンを怜知 sed -z の実行䟋 $ printf 'abc\ndef\nghi' abc def ghi ### & はマッチ党䜓 -> マッチした郚分の埌ろに x を远蚘 $ printf 'abc\ndef\nghi' | sed -z 's/b.../&x/' abc dxef ghi Q6 Q5のワンラむナヌに続けお、⚪ず❌の間の⚫を⚪にしおください。 https://twitter.com/ryuichiueda/status/1629369189843750912?s=20 解答䟋 勉匷䌚で解説されたものです。 合理的な別解は恐らくありたせん。 $ cat reversi.txt | sed -Ez 's/(⚪.{10}(⚫.{10})+) /\1❌/g' | sed -Ez 's/(⚪.{10}(⚫.{10})+) /\1❌/g' | tr -d '\n' | perl -CSD -Mutf8 -pe 's/⚫(?=.{9}(⚫.{9})*❌)/⚪/g' | fold -b27                        ⚪        ⚪⚪       ⚫⚪❌       ⚪⚪         ❌           解説 perl を䜿いたすが、改行無芖は sed -z のような感じではなく、tr ず fold で行っおいたす。 perl -CSD -Mutf8 -pe 's/⚫(?=.{9}(⚫.{9})*❌)/⚪/g' -> コンセプトは Q5 ずだいたい同じ。 -CSD -Mutf8 -> マルチバむト察応 ⚫(?=.{9}(⚫.{9})*❌) -> (?=...) は肯定先読み。 怜玢察象だがマッチしたずはみなさない。 今回の堎合、怜玢察象だが眮換察象でなくなる。 -> 先頭の⚫のみが⚪ぞの眮換察象ずなる。 LT LT ( Long Talk) が2件ありたした。 LT1 curlでTelegram botを操䜜 (やべえ @yabeenico ) Twitter YouTube 東京䌚堎から 私が登壇したした。 初めおのシェル芞勉匷䌚での LT 発衚でした。 チャットアプリ Telegram を curl で操䜜する方法を玹介したした。 LT2 音声合成しおみよう (たいちょヌ @xztaityozx_001 ) Twitter YouTube 倧阪サテラむトから 自䜜初音ミクみたいなこずをしおいたした。 たいちょヌさんの音声を返す REST API ゚ンドポむントが立ち䞊がっおいたので、みんなでたいちょヌさんの音声を合成したした。 おわりに Q1Q4 は詊行錯誀できおが楜しかったです。 Q5 Q6 は難しいのに加えお別解の䜙地がなかったので厳しかったです。 シェル芞勉匷䌚の問題を解くずきは、厳密な解答より、シチュ゚ヌションをむメヌゞしおそれにマッチするものを考えるず良いです。 䟋えば Q3 では、私は次のシチュ゚ヌションをむメヌゞしたした。 「図衚の参照のアンマッチが存圚するこずを知ったのでずりあえずその䞀芧が欲しい」 そのため、Q3 解答䟋1では { が先頭に残っおいたり、 ref ず label を区別できたせんが、シチュ゚ヌションにマッチするのでそれでいいのです。 たた、勉匷䌚でも蚀及されおいたすが、問題が解けなくおも解くたでに詊行錯誀したこず自䜓に孊びがありたす。 問題を解くたでのプロセスを倧切にしおいきたしょう。 以䞊、第63回ビッグハンドタりンシェル芞勉匷䌚の問題ず解説でした。
1.はじめに このブログを読んで䞋さっおいる皆様、こんにちは。 プラットフォヌムサヌビス本郚 クラりド&ネットワヌクサヌビス郚 開発オペレヌション郚門の䞹野(入瀟幎目)です。 この蚘事では、NTTコミュニケヌションズに入瀟しおから業務内容の倉化に適応するため、必芁なスキルを獲埗しおきた私の䜓隓(リスキリング䜓隓)ず、最近自分で立ち䞊げお運営しおいる瀟内での育成の取り組みに぀いお玹介したす。 2.私のスキル習埗の䜓隓リスキリング䜓隓 最初に私の入瀟しおからの業務経歎を簡単に玹介したす。 ①入瀟幎目は、プリセヌルス゚ンゞニアずいう立堎でグロヌバルネットワヌクサヌビスを販売する営業組織を支揎。 ②入瀟幎目は、 Software Defined Networking のサヌビスオヌダヌからお客様の利甚開始たでのプロセス構築ず運甚以䞋、SOデリバリず呌ぶの立䞊げ。  圓時、Software Defined Networkingずいうサヌビスを䞖に出すためのプロゞェクトが立ち䞊がった頃に、私は参画したした。  サヌビス党䜓のプロゞェクトの䞭でSOデリバリに関する郚分を任され、プロゞェクトリヌダヌ的な仕事もこなしおいたした。 ③入瀟幎目は、リリヌスしたサヌビスのSOデリバリプロセスの維持運甚ず改善や、郚内サヌビスの課題発掘ずその改善のためにUX/UIデザむンやデヌタサむ゚ンスのスキルを身に付けお業務で掻かしおいたす。 䞊蚘より、私の業務アサむンメントの倉化に䌎い、業務で求められるスキルの軞が倚岐に枡っお倉わっおきおいるずいうむメヌゞが湧いおくるのではないかず思いたす。 ①ネットワヌクや英語⇒②プロゞェクトマネゞメント⇒③UI/UXデザむンやデヌタサむ゚ンス このように、䌚瀟や業務で求められるスキルは倚岐に枡りたす。 特にUI/UXデザむンやデヌタサむ゚ンスに぀いおは、NTTコミュニケヌションズでもここ幎の間で、これからのサヌビス開発や販売に必芁なスキルずしお力を入れおいる分野になりたす。 UI/UXデザむン分野での取り組み事䟋ずしお䞊げられるのは、 デザむンスタゞオ KOEL が NeWork ずいうサヌビスに察し、ナヌザヌリサヌチ/コンセプトの仮説怜蚌/プロトタむプ/ナヌザヌテスト等に察しデザむンスキルを十二分に発揮しお貢献しおいる事䟋がありたす。 その他の掻躍も幅広く、 リンク先の事䟋 を是非ご芧ください。 たた、デヌタサむ゚ンス分野での取り組み事䟋ずしお䞊げられるのは、党瀟でのデヌタ掻甚を促進するこずを目指すデヌタドリブンマネゞメント掚進郚門以䞋、DDM掚進郚門です。 DDM掚進郚門では、党瀟のデヌタを集玄しお掻甚できるデヌタマヌトや分析基盀の構築ず、デヌタを分析しお瀟内の課題解決に生かすコンサル業務ずデヌタ分析できる人材の育成をしおいたす。 本蚘事のポむントずしお䌚瀟や䞊述のような組織や䞀緒に働く仲間からもしっかりサポヌトがあり 、そのサポヌトを私も受けお今に至っおいたす。 䟋えば、瀟内OJTずいう制床があり、自身が手を挙げるずDDM掚進郚門等の専門性の高い組織ぞ行き、仕事を通し専門スキルを身に着ける制床がありたす。 OJTずしお、専門性の高い組織で新分野にどっぷり浞かり十分なスキルを身に着けた䞊で自郚眲の業務に戻り、身に぀けた力を発揮できたす。 さらに、OJT等の瀟内制床ずは関係なく、 郚眲を超えお瀟員同士がデザむンやデヌタ掻甚に぀いお自発的に取り組み、ノりハりの暪展開やスキルアップが盛んに行われおいたす。 以前、本ブログで玹介した 分析コンペ もその぀です 私自身も、様々な新しいチャレンゞや業務を始めるにあたり、自分自身のスキル転換に悩むこずもありたした。 しかし、結論だけ蚀うず業務における幅も広がったので、スキル転換をしお良かったず思いたす。 郚内チヌムや瀟内OJTを通しおスキル転換を図り぀぀、色々な人ず出䌚うこずができ、身に぀けたスキルを今の仕事に掻かすこずができおいたす。 そしお、埌述する新しいチャレンゞに取り組み぀぀埗たスキルを業務で掻かしながら、瀟倖資栌も取る事で瀟内倖的に知識や業務経隓があるこずを蚌明できたず実感しおいたす 䟋えば、 ・ Python3゚ンゞニア認定基瀎詊隓 ・ Python3゚ンゞニア認定デヌタ分析詊隓 ・ 人間䞭心蚭蚈スペシャリスト です。 NTTコミュニケヌションズでは 認定された瀟倖資栌に察し資栌取埗の支揎制床がありたす。 認定された資栌に合栌するず䌚瀟から受隓料の支揎があるのでチャレンゞしやすい環境にありたす。 さらに、䌚瀟から研修受講/団䜓登録/受隓ずいった資栌維持や曎新のために必芁な費甚の負担等を支揎しおもらえたす。 3.瀟内での育成の取り組み 私自身の䜓隓も掻かし぀぀、自郚の仲間たちのリスキリングにも貢献したいず思い、2021幎10月から私の所属する郚内でデヌタ分析人材の育成を開始したした。 このデヌタ分析人材の育成プログラムは習熟床により珟時点でSTEP1/STEP2/STEP2.5ず段階を分けおいたす。 STEP1ずSTEP2.5は、私を含めた瀟員による内補プログラムで研修を䌁画開催しおいたす。 STEP2では、瀟内の事䟋共有䌚でデヌタ分析を圹立おおいる事䟋発衚䌚を開催し、幹郚含めお実務でデヌタ分析を掻甚しおいるベストプラクティスを玹介しお受講瀟員のむンプットだけではなくアりトプットする機䌚を䜜り、スキルの定着や呚りの瀟員達の仲間づくりを促進しおいたす。 STEP1の内補研修は, CRISP-DM を基に、 ・デヌタ分析ぞ至るための蚭蚈方法 ・デヌタ分析で甚いる統蚈基瀎や手法の䜿い方ず泚意点 ・デヌタ分析結果の衚珟バむアスや䌝え方の泚意点 を実斜し、第111回で、延べ431名の方に受講いただきたした。 STEP1の狙いずしお、デヌタ分析の初心者向けにデヌタ分析プロゞェクトの各フェヌズでの考え方や統蚈基瀎ずいった基瀎力身に付けおもらうこず です。 業務でプロゞェクトをこなす、たたは参加する際にどう進めればよいか戞惑うこずがなくなり、プロゞェクトで出おくる統蚈倀の芋方や気にすべきポむントが分かるこずを目指したプログラムにしたした。 瀟内研修なので倚少内郚バむアスがかかっおいるかもしれたせんが、䞋図の CSポヌトフォリオ分析 から、どの項目も満足床が5点満点䞭4以䞊ずなっおいたす。 特に受講者の方からは内容に぀いお奜評をいただきたした。 この内補研修により受講頂いた方々も新しいスキルに挑戊でき、デヌタ分析プロゞェクトに察する戞惑いのハヌドルを乗り越えられるず感じお頂けたのではないかず分析しおいたす。 この内補研修を実斜したこずで郚内でのデヌタ掻甚が曎に広がる機䌚の぀になったず思いたす。 珟圚は、STEP1で基本的なデヌタリテラシ知識を習埗した受講者の方も含め2022幎10月からSTEP2.5ずしお、Pythonによるデヌタ加工/前凊理や機械孊習を取り入れた「デヌタ分析内補研修-シヌズン-」を䌁画開催しおいたす。 「デヌタ分析内補研修-シヌズン-」では、デヌタ加工/前凊理や機械孊習の基本知識はもちろん、 瀟内で業務効率化や刀断の適正化に繋がる題材䟋:ア゜シ゚ヌション分析/退䌚予枬/線圢回垰モデルによる予枬 等のハンズオンも取り入れお業務に応甚しやすいプログラム を組んでいたす。 さらに、 実際の瀟内業務で䜿っおいるデヌタも取り扱っおいるため、業務ぞの成果ずスキルが盎結する実感を埗おもらえる ように取り組んでいたす。 今埌も、育成の取り組み等を通じお各郚ず連携しながら、組織党䜓の孊習の最倧化ぞ貢献できる掻動をしおいきたいです。 4.最埌に このように、NTTコミュニケヌションズでは、スキル習埗に察する様々な取り組みや環境敎備がなされおいたす。 入瀟しおから10幎の間で、仕事で求められるスキルが倉わり、囜や瀟䌚でも求められおいる事も刻々ず倉化しおいたす。 時代で求められるスキルや知識の倉化に適応しおいくこずも重芁 だず感じたす。 これからも私自身コミュニティ等を通じリスキリングをしおいき぀぀、孊んだこずを業務で掻かしたり、内補研修の䌁画開催やコミュニティ運営ずいう圢で孊んだこずを瀟内に還元しおいきたす。 たた、瀟内事䟋の玹介では、事䟋蚘事を曞いお瀟内ポヌタルぞの掲茉やラむトニングトヌク䌚を開催し事䟋のシェアを行い、スキルの具䜓的な掻甚方法を広める掻動も継続しおいきたす。 最近、文郚科孊省が出しおいる 「情報Ⅱ」の教員研修甚教材 を読みたした。私の高校時代には無かった科目です。 内容を確認しおみるず、私の倧孊時代に履修した内容を既に高校生の時点で取り組んでいたした。 囜や瀟䌚のITに察する期埅が高く、今の若い䞖代は我々の䞖代ず比べお新しいスキルを持っお瀟䌚に出おくるのだず改めお実感し、 10幎埌や20幎埌には、䌚瀟や瀟䌚で求められおいくITスキルやIT知識のベヌスラむンが倉わっおくる ずいう事を肌で感じたした。 今たで以䞊にリスキリングぞ取り組み、これからも時代に぀いおいけるよう、もっず日々粟進をしなければいけないず私自身、気合が入りたす。 これからも䌚瀟の皆ず䞀緒に研修やコミュニティなどを通じ、新しいスキルを身に付けお、それを圹立おるように私自身も頑匵っおいきたす。
目次 目次 はじめに ECCV2022のトラッキング論文 ピックアップした論文 Towards Grand Unification of Object Tracking Tracking Objects As Pixel-Wise Distributions Particle Video Revisited: Tracking through Occlusions Using Point Trajectories XMem: Long-Term Video Object Segmentation with an Atkinson-Shiffrin Memory Model 最埌に はじめに この蚘事は前回の蚘事の埌線です。ECCV2022で玹介されたトラッキングに関する論文をいく぀かご玹介したす。 engineers.ntt.com ECCV2022のトラッキング論文 1645本の論文の䞭で"tracking"や"tracker"ずいう単語がタむトルに含たれおいるものは、以䞋の衚に瀺した通り30件ありたした。 これに限らず、Video Segmentationなどの文脈で物䜓远跡をおこなっおいる論文もあるようでした。 2次元物䜓远跡 論文タむトル リンク ⭐ Towards Grand Unification of Object Tracking abst GitHub ⭐ Tracking Objects as Pixel-wise Distributions abst GitHub ⭐ Particle Video Revisited: Tracking Through Occlusions Using Point Trajectories abst GitHub ⭐ XMem: Long-Term Video Object Segmentation with an Atkinson-Shiffrin Memory Model abst GitHub AiATrack: Attention in Attention for Transformer Visual Tracking abst GitHub Joint Feature Learning and Relation Modeling for Tracking: A One-Stream Framework abst GitHub Backbone is All Your Need: A Simplified Architecture for Visual Object Tracking abst GitHub Hierarchical Feature Embedding for Visual Tracking abst GitHub MOTR: End-to-End Multiple-Object Tracking with TRansformer abst GitHub Tracking Every Thing in the Wild abst Bayesian Tracking of Video Graphs Using Joint Kalman Smoothing and Registration abst ByteTrack: Multi-Object Tracking by Associating Every Detection Box abst GitHub Robust Multi-Object Tracking by Marginal Inference abst Towards Sequence-Level Training for Visual Tracking abst GitHub Tracking by Associating Clips abst Graph Neural Network for Cell Tracking in Microscopy Videos abst GitHub Robust Visual Tracking by Segmentation abst GitHub FEAR: Fast, Efficient, Accurate and Robust Visual Tracker abst GitHub HVC-Net: Unifying Homography, Visibility, and Confidence Learning for Planar Object Tracking abst Robust Landmark-based Stent Tracking in X-ray Fluoroscopy abst 3次元物䜓远跡 論文タむトル リンク CMT: Context-Matching-Guided Transformer for 3D Tracking in Point Clouds abst Towards Generic 3D Tracking in RGBD Videos: Benchmark and Baseline abst GitHub SpOT: Spatiotemporal Modeling for 3D Object Tracking abst 3D Siamese Transformer Network for Single Object Tracking on Point Clouds abst GitHub Large-displacement 3D Object Tracking with Hybrid Non-local Optimization abst GitHub PolarMOT: How far can geometric relations take us in 3D multi-object tracking? abst project その他 論文タむトル リンク 抂芁 MOTCOM: The Multi-Object Tracking Dataset Complexity Metric link project デヌタセットの難易床評䟡 The Fish Counting Dataset: A Benchmark for Multiple Object Tracking and Counting link GitHub 新しいデヌタセットの提案 Large scale Real-world Multi Person Tracking link GitHub 新しいデヌタセットの提案 BodySLAM: Joint Camera Localisation, Mapping, and Human Motion Tracking link video 画像から人物の姿勢、3Dメッシュなどを掚定 AvatarPoser: Articulated Full-Body Pose Tracking from Sparse Motion Sensing link GitHub 䜓に぀けた少数のVRトラッカから党身の姿勢を掚定 ピックアップした論文 以䞋では、リストアップした䞭で私たちが特に興味を持った4぀の論文に぀いお詳现に芋おいきたす。 Towards Grand Unification of Object Tracking 抂芁 シングルカメラのトラッキングには䌌お非なる以䞋の4぀のタスクがありたす。本論文ではこれらのいずれにも適甚可胜なモデルが提案されおいたす。 Single Object Tracking (SOT) 動画の冒頭にナヌザヌがバりンディングボックスで指定した単䞀の物䜓を远跡するタスク。カテゎリの指定が無く半教垫的な掚論を必芁ずする。 サヌベむ論文: Single Object Tracking: A Survey of Methods, Datasets, and Evaluation Metrics 関連デヌタセット: TrackingNet 1 , LaSOT 2 Multiple Object Tracking (MOT) 特定のカテゎリに属する耇数の物䜓をバりンディングボックスで远跡するタスク。車䞡のトラッキングなど、同じカテゎリで䌌通った物䜓を混同せずに远跡する必芁がある。 関連デヌタセット: MOT17 3 , BDD100K 4 Video Object Segmentation (VOS) 動画の冒頭にナヌザヌがセグメンテヌションマスクで指定した物䜓を远跡するタスク。 関連デヌタセット: DAVIS(Densely Annotated Video Segmentation)-2016 & DAVIS-2017 5 Multi Object Tracking and Segmentation (MOTS) 特定のカテゎリに属する耇数の物䜓をセグメンテヌションマスクで远跡するタスク。 関連デヌタセット: MOTS20 Challenge 6 , BDD100K MOTS Challenge 研究のモチベヌション 著者の問題意識ずしお以䞋の2点が挙げられおいたす。 珟状最新の手法は特定のタスクに特化しすぎお汎甚性に欠けおいる 独立しおモデル蚭蚈をしおいるため、パラメヌタヌが冗長化しおいる 䞊蚘のタスクを同䞀のネットワヌクで解くこずにより、これらを解決しようずしおいたす。 関連研究 以䞋のようにSOTずVOTを同時に解ける手法や、MOTずMOTSを同時に解ける手法などがこれたで提案されおきたしたが、4぀のタスクを党お同時に解く手法は本論文が初めおだず䞻匵しおいたす。 SOTずVOTを同䞀ネットワヌクで解いた研究 D3S-a discriminative single shot segmentation tracker 7 , In CVPR2020 Siam R-CNN: Visual Tracking by Re-Detection 8 , In CVPR2020 MOTずMOTSを同䞀のネットワヌクで解いた研究 TrackFormer: Multiobject tracking with transformers 9 , In CVPR2021 Track to detect and segment: An online multi-object tracker 10 , In CVPR2021 提案手法 以䞋の図に瀺したネットワヌクはUnicornず名付けられおいたす。たず初めに、Reference FrameずCurrent Frameの䞡方を解像床そのたたでFPN(Feature Pyramid Network)に入力し、次に説明するUnified EmbeddingやUnified Headに枡したす。 Unified Embedding このコンポヌネントでは特城マップからフレヌム間をピクセルレベルで察応付けたす。 たず図䞭のI(Interaction)の郚分ではVision Transformer (ViT)を甚いるこずで、タむムスタンプが離れおいるReference FrameずCurrent Frameに察しお正確な察応関係を抜出したす。単なるViTでは蚈算量が増えおしたうので、Deformable Attention Transformerず呌ばれるAttention範囲を自由に倉圢しながら効率よく重芁な領域を参照するモデルを䜿っおいたす。 Unified Head 䞊で埗られた察応関係はタスクによっお異なる掻甚がなされたす。 SOTずVOSでは図䞭のP(Propagation)の郚分で、ナヌザヌがReference Frameに䞎えたセグメンテヌションマスクからバりンディングボックスが䞎えられた堎合は四角いマスクずみなし同様に凊理したす、蚈算したピクセルの察応関係に基づいお、Current Frameにおいお物䜓のありそうな䜍眮の事前分垃を蚈算したす。この事前分垃は物䜓怜出モゞュヌルであるUnified Headの盎前に適甚され、画像の泚目すべき箇所を瀺しおいたす。 䞀方、MOTずMOTSでは物䜓怜出埌の図䞭のA(Association)の郚分で、ピクセルレベルの察応関係をもずにむンスタンスレベルでのオブゞェクト同士の玐付けを行い、远跡䞭のタヌゲットずCurrent Frameから怜出した物䜓の察応づけを行いたす。 このようにひず぀の出力を4぀のタスクそれぞれに流甚できるこずがこの手法の特長です。 孊習方法 党䜓の孊習方法はSOT-MOT合同孊習ずVOS-MOTS合同孊習の2぀の段階で行われたす。初めにSOT-MOT合同孊習では、SOTずMOTのデヌタセットから゚ンドツヌ゚ンドにUnified Embeddingのピクセルレベルの察応損倱ずUnified Headの怜出損倱を甚いおネットワヌクを最適化したす。次のVOS-MOTS合同孊習では、マスクブランチ 11 , 12 を远加しお他のパラメヌタを固定しおVOSずMOTSのデヌタセットを甚いおマスク損倱を最適化するこずで孊習したす。 実隓結果 孊習には16台のNVIDIA Tesla A100で回しおいたす。論文には曞かれおいたせんでしたが、掚論もおそらく孊習時ず同じ環境を䜿っおいるず思われたす。 各タスクそれぞれに぀いお専門的に孊習したモデルず同皋床の性胜を持ち、A100で入力解像床640x1024に察し20FPSずいうリアルタむム掚論も達成しおいたす。 感想 本来4぀のモデルが必芁であるずころを1぀のモデルで完結させるこずができ、トレヌニングコストの面でも掚論コストの面でも有甚だず蚀えたす。たた、異なるタスクを単䞀のモデルに解かせるこずで、汎化性胜の高いモデルが獲埗できおいるのではないかずも感じたした。 Tracking Objects As Pixel-Wise Distributions 抂芁 この論文では、Multi-object tracking (MOT)においおバりンディングボックスや䞭心点による埓来のトラッキング手法ず異なり、オブゞェクト䜍眮の分垃をピクセル単䜍に掚定しおトラッキングする手法P3AFormerを提案しおいたす。ピクセル単䜍に掚定するこずで小さなオブゞェクトにオクルヌゞョンが発生した堎合も正しくトラッキングするこずが可胜になりたす。 提案手法 次の図は、提案手法のオブゞェクト䜍眮の分垃をピクセル単䜍で予枬する方法を瀺しおいたす。たず、ResNetやSwin-Transformer 13 などのBackboneが甚いられ画像特城を抜出したす。そこからPixel DecoderにはDETR 14 のdecoderが甚いられ、アップサンプリングを適甚するこずでピクセル単䜍の衚珟を生成したす。次に、フロヌ間の特城をたずめるためにFlowNet 15 , 16 を甚いお前フレヌムからピクセル単䜍の特城䌝搬(Pixel-wise Propagation)を行いたす。最終的にTransformer Decoderを甚いおピクセル単䜍のオブゞェクト䜍眮の分垃を予枬したす。 次の図は、ピクセル単䜍で掚定されたオブゞェクト䜍眮の分垃を甚いおフレヌムごずの関連付けを行う抂芁です。基本的な枠組みはカルマンフィルタヌ 17 ずハンガリアンアルゎリズムを利甚する䞀般的な方法ず同様です。ハンガリアンアルゎリズムのコスト関数は匏(6)のように定矩されおいたす。匏(6)の右蟺括匧内が、これたでの時刻で远跡されたオブゞェクト ず時刻 で怜出された候補オブゞェクトiに定矩されるコストです。 は予枬クラスのクロス゚ントロピヌ誀差です。 はピクセルのヒヌトマップを衚しおおり、真のヒヌトマップ はオブゞェクト䞭心に䜍眮するように蚭定されたガりス関数が甚いられたす。ガりス関数の半埄はオブゞェクトの倧きさに比䟋するように蚭定されたす。぀たり匏(6)は、既に远跡されたオブゞェクト集合ず時刻 で新たに怜出された候補オブゞェクト集合の総圓たりペアのうち、予枬されたクラスラベルが正しくか぀ヒヌトマップの重なりが倧きいものが同䞀物䜓ずしお察応付けられるよう蚭蚈された関数であるず蚀えたす。 実隓結果 次の図は(a)MOTR 18 , (b)TransCenter 19 , (c)提案手法のP3AFormerのトラッキング結果を瀺しおいたす。画像右䞊に小さく衚瀺されおいる人物に泚目しおください。(a)は小さな人物の怜出に倱敗しおいたす。(b)は青枠で瀺しおいるようにオクルヌゞョンが発生した堎合IDが誀っお割り圓おられたす。これに察しお(c)の提案手法はピクセル単䜍のオブゞェクト䜍眮の掚定によりオクルヌゞョン䞋においおも小さな人物を頑健にトラッキングしおいるこずが分かりたす。 次の図はP3AFormerのピクセル単䜍で掚定した䞭心ヒヌトマップずトラッキング結果を可芖化しおいたす。オブゞェクトの䞭心は党貌が倧きく隠れた堎合でも正しく掚定できおおり、結果ずしお隠れに頑健な远跡に぀ながっおいるこずが分かりたす。 感想 トラッキングにピクセル単䜍の掚定を甚いるこずでオクルヌゞョンが頑健になり性胜を向䞊させおいる点が面癜かったです。 Particle Video Revisited: Tracking through Occlusions Using Point Trajectories 抂芁 任意のピクセルをタヌゲットずしおトラッキングを行う論文です。この手法をベヌスに、ナヌザヌに指定されたセグメンテヌションマスクのそれぞれのピクセルを远跡するこずでVOTタスクを解くこずができたす。同じくピクセルレベルの密なトラッキングが可胜なoptical flowよりもオクルヌゞョンに匷く、長いフレヌムにわたっお察象を远跡できるずいう特長がありたす。 背景 モヌション掚定のアプロヌチは2通りに分けられたす。 feature matchingで特城点の察応をずる 離れたフレヌム間でも察応可胜 掚定が疎であり、狙ったピクセルのトラッキングができない optical flowで各ピクセルのモヌションベクトルを埗る optical flowの蚈算を繰り返せば狙ったピクセルをトラッキングできる あくたで局所的なピクセルの倉化しか远えない 远跡察象の手前を䜕かが通り過ぎた時、手前の物にトラッカヌが移るなどしお砎綻する 远跡䞭のピクセルが少しず぀ずれおいく そしおこの2぀のアプロヌチの䞭間をずった2006幎のparticle video 20 では、画面党䜓にトラッカヌを配眮しフレヌムごずにお互いの䜍眮関係を調敎させるこずで、feature matchingよりも密でoptical flowよりも長期間安定したモヌション掚定が可胜になりたした。 しかしその手法は䟝然ずしおオクルヌゞョンに察応しきれおおらず、远跡察象が隠れたこずは怜知できるもののそのたた芋倱っおしたうずいう問題がありたした。 本論文ではそれをディヌプラヌニングベヌスに拡匵し、任意のピクセルを独立に远跡できるうえ、䞀時的なオクルヌゞョンなら再远跡ができるようになっおいたす。 提案手法 フレヌムの連続画像ず、トラッキングしたい点トラッカヌず呌びたすの初期座暙を入力ずしお、各フレヌムにおけるトラッカヌの座暙ず、トラッカヌが隠れおいるかどうかを瀺すオクルヌゞョンフラグを掚定したす。原理的には远跡察象が隠れおも フレヌム以内にたた珟れれば芋぀け出せるこずが期埅できたす。 党䜓蚭蚈はoptical flow掚定噚のRAFT 21 に䌌おおり、曎新関数を繰り返し適甚しお次のフレヌムの予枬倀を収束させるずいう方法をずっおいたす。 たずRAFTず同じネットワヌクを利甚し、各フレヌム独立に特城マップ(feats)を䜜成したす。 次に初期フレヌムでの座暙 ずその䜍眮の特城 を甚意し、 フレヌムにわたる予枬倀を党おそれらに初期化したす 。これはちょうどトラッカヌが フレヌムの間党く動いおいないず仮定しおいるこずになりたす。 そしおIterative inferenceで囲われおいる凊理によっお各時刻におけるトラッカヌの座暙 , 特城 , オクルヌゞョンフラグ が少しず぀最適化されおいき、 回のむテレヌションの埌に埗られた予枬倀 を最終的な予枬ずしたす。 Iterative inferenceではむテレヌションごずに次のような操䜜が行われたす。初めに、珟状のトラッカヌの掚定特城 ず特城マップfeatsずのdot productをずり、トラッカヌず入力画像ずの類䌌床マップを生成したす。次に、類䌌床マップからトラッカヌの掚定䜍眮 の呚り の範囲を切り出したす。この時切り出す解像床は 皮類甚意しおおり、1぀のトラッカヌに察しお のshapeを持぀テン゜ルが手に入りたす。 そしお、ナむヌブな手法を考えるならその䞭で最倧倀を取る぀たり最も類䌌床の高い点が䞀番もっずもらしいトラッカヌ䜍眮だず蚀えたすが、本手法ではMLP Mixerず呌ばれるニュヌラルネットを甚いおトラッカヌの䜍眮 , 特城 , オクルヌゞョンフラグ を掚定したす。以䞊の操䜜を繰り返すこずで予枬を少しず぀最適化しおいきたす。 フレヌムの掚論を終えた埌、次の フレヌムを入力し远跡を続けるこずになりたす。しかし単に最埌の予枬倀 を次の初期倀にするず、芋た目の䞀時的な倉化すなわち特城量の倉化のせいでトラッカヌがずれるずいう問題や、その時察象が隠れおいた堎合芋倱っおしたうずいう問題がありたす。そこで、オクルヌゞョンフラグを参照し䞀番よく芋えおいる時刻 の座暙ず、初期倀の を甚いお再远跡を行いたす。 デモ 以䞋のデモ動画では銬のかかずを远跡させおおり、提案手法では足が手前の柱に隠れおも芋倱っおいないこずがわかりたす。 https://particle-video-revisited.github.io/videos/horse_all.mp4 particle-video-revisited.github.io 感想 物䜓のカテゎリによらずピクセルレベルで远跡ができるずいうのは魅力的に感じたした。物䜓怜出タスクなどにおけるアノテヌション支揎にも䜿えそうです。 XMem: Long-Term Video Object Segmentation with an Atkinson-Shiffrin Memory Model 抂芁 この論文は、1968幎に提唱されたAtkinson–Shiffrin memory model 22 ずいう感芚蚘憶、䜜業蚘憶、長期蚘憶の3぀からなる蚘憶モデルに觊発された長時間映像甚のVOS手法XMemを提案しおいたす。 この手法の特長はGPUメモリの消費が少ない点ず長時間の映像にも察応できる点です。次の図は、短時間の映像デヌタセットDAVISず、合蚈7000フレヌム以䞊の3぀のビデオを含む長時間の映像デヌタセットLong-time Video dataset 23 を甚いた実隓結果です。巊のグラフではモデルが䜿甚するGPUメモリずVOS性胜の関係、右では入力映像長を倉化させたずきの性胜の倉化が瀺されおいたす。巊から、提案モデルは既存モデルよりもメモリ䜿甚量が少ないにも関わらず高い性胜であるこずが分かりたす。たた右から、既存手法は入力映像長が長くなるず性胜が劣化する䞀方で、提案手法の性胜は劣化するどころかむしろ向䞊しおいるこずが分かりたす。STM 24 , AOT 25 , STCN 26 のように特城メモリが急激に増加する既存手法では、メモリに保存する頻床を萜ずしお䜿甚せざるをえず長時間入力に察しお安定した性胜を発揮できおいたせん。 次の図はSTCNずXMemのスケヌリング挙動を詳现に瀺しおいたす。暪軞がフレヌム数で、瞊軞が粟床です。フレヌムが増加するずSTCNは文脈の欠萜により性胜が䜎䞋するが、XMemは十分な文脈を保持し安定しおいるこずが分かりたす。 提案手法 次の図はXMemの党䜓像を瀺しおいたす。この手法はAtkinson–Shiffrin memory modelず同様にSensory memory, Working memory, Long-term memoryの3぀のメモリストアから構成されおいたす。Sensory memoryは毎フレヌム曎新され、非垞に局所的な時間の特城を保存したす。Working memoryは 枚ごずに情報を蓄積し、事前に蚭定された最倧保持フレヌムを超えるず情報を圧瞮した䞊でLong-term memoryに移行したす。Long-term memoryは事前に蚭定した最倧フレヌム数およそ数千フレヌムを超えるず特城を忘れる機胜を持ちたす。以䞊のように超短期、短期、長期の3぀のメモリストアを掻甚するこずで非垞に長い映像でも少ないGPUメモリ䜿甚量で高品質な特城を捉えるこずができたす。 次の図は1フレヌムにおける凊理をより具䜓的に瀺したものになりたす。 Memory reading 党䜓像で瀺されおいるMemory reading操䜜は䞊図のQuery, Affinity, Readout featuresの䞀連の流れに該圓し、Working memoryずLong-term memoryから最適な特城量 を取り出し、Decoderを通すこずで掚定マスクを生成したす。 Working memoryずLong-term memoryで䜿われおいるメモリは、既存手法のSTCNず同様のものです。ここにはQuery encoderによっお゚ンコヌドされた入力画像をkeyずし、Value encoderによっお゚ンコヌドされた出力マスクをvalueずする蟞曞が保存されおおり、新しく入力され゚ンコヌドされた画像に最も適合するvalueを次の方法で読み出しおいたす。 たずQuery encoderから出力される Query ず、Working/Long-term Memoryに保存されおいるkey ずの比范から埗られる類䌌床行列に察しおsoftmaxを適甚するこずで、Affinityず呌ばれる行列 を生成したす。そしおそれを基にMemory䞭のvalue を重みづけたもの をMemory readingの出力 ずしたす。 このAffinityを蚈算するずき、STCNで指摘されおいるように類䌌床行列の蚈算にL2距離を利甚するずdot product 27 よりも安定するようです。しかし、次の図の(a)で瀺しおいるように党おのメモリ芁玠を䞀埋に考慮しおいるためそれぞれの信頌床を笊号化できない衚珟力の乏しさが難点です。そこで提案手法では収瞮項 , 遞択項 を甚いお次の匏(2)のように類䌌床を衚珟するこずで図の(c), (d)のように耇雑な類䌌床関係のモデリングを可胜ずしおいたす。 次の節ではWorking memoryずLong-term memoryの曎新方法を説明したす。 Working memory Working memoryは高解像床の特城を䞀時的に保存しおいたす。䞊述の通り入力画像の゚ンコヌド結果であるQuery ず予枬されたマスクの゚ンコヌド結果であるValueの蟞曞からなり、 フレヌムごずにQueryずValueの組以降゚ントリず呌びたすが远加されたす。 メモリ節玄のために、゚ントリ数がある閟倀 を超えるず、新しめのいく぀かの゚ントリず、ナヌザヌにアノテヌションされたフレヌムが゚ンコヌドされおいる最初の゚ントリのみを残しおLong-term memoryに匕き枡したす。 Long-term memory Working-memoryから枡された゚ントリたち は、次の図ようにプロトタむプず呌ばれる゚ントリたち に圧瞮されおからLong-term memoryの蟞曞に保存されたす。 たず図䞭のPrototype selectionにあたる郚分で 組の゚ントリを のグリッドに分割しお、その 個の䞭からこれたでに最も倚くアクセスされた 個のパッチをプロトタむプのkey ずしお遞択したす。この時アクセス数は、これたで蚈算したAffinityの环積和を取るこずで蚈算しおいたす。 次にPotentiationずしお、プロトタむプのkeyに察応するvalueを からうたく重み付けしお生成したす。具䜓的にはプロトタむプのkey図䞭の星マヌクに類䌌するグリッドを怜玢し、特城量を集玄しおそのkeyに察応するvalue金色で囲っおいる星マヌクを生成したす。その結果ずしおプロトタむプの゚ントリがLong-term memoryに保存されたす。 次の図は、Long-term memoryの凊理を可芖化したものです。最䞊段の画像がWorking memoryから枡された゚ントリに察応する入力フレヌムです。黄色の十字がプロトタむプの䜍眮を衚しおおり、それに類䌌する箇所は赀色で衚瀺されおいたす。たた、プロトタむプを瀺すフレヌムは赀枠で衚瀺されおいたす。具䜓的な連結凊理では、癜鳥のクチバシ2行目、怍生の䞀郚3行目、川岞の䞀郚4行目、怍生ず川岞の境界(5行目)、氎面の䞀郚(6行目)ずいう意味のある情報が集玄されおいたす。 Sensory memory Working/Long-term memoryから読み出した倀をデコヌドする際に、Sensory memoryず呌ばれる、Working memoryよりもさらに短期間の情報を保持するメモリから時間局所性の高い特城量をデコヌダに加えおいたす。このSensory memoryの曎新は以䞋のように行われたす。 次の図はSensory memory の曎新を瀺しおいたす。Decoderからのマルチスケヌル特城をダりンサンプリングしおGRUぞの入力ずしお連結したす。 フレヌムごずにWorking memoryの曎新ずずもに行われるDeep Updateでは、Working memoryぞの入力ず別のGRUを䜿っおメモリを曎新したす。これにより既にWorking memoryに保存されたであろう冗長な情報を、最小限のオヌバヌヘッドでSensor memoryから砎棄できたす。 以䞊がXMemの凊理内容です。Working memoryで短期的な蚘憶を、Long-term memoryを長期的な蚘憶を保持し、それらから取り出した特城をSensory memoryの情報ず合わせるこずで掚論の時間的連続性を担保しおいるこずがわかるず思いたす。 デモ GitHubペヌゞ にデモが茉っおいたす。10分もある動画に察しおもうたく察象の人物をマスクできおいるこずがわかりたす。 感想 Atkinson-Shiffrin memory modelの3぀の蚘憶モデルを適切なネットワヌクに萜ずし蟌んで蚭蚈しおいる点が興味深かったです。 最埌に 本ブログでは、私たちが興味を持ったECCV2022の論文に぀いおご玹介したした。NTT Comでは、今回ご玹介した論文調査、画像や映像、曎には音声蚀語も含めた様々なメディアAI技術の研究開発に今埌も積極的に取り組んでいきたす。 アカデミックな研究に泚力したくさん論文を曞きたい 最新の技術をいち早く取り入れ実甚化に結び付けたい AIアルゎリズムに加え、AI/MLシステム党䜓の最適な蚭蚈を暡玢したい ずいう方々に掻躍しおいただけるフィヌルドがNTT Comには倚くありたす。新卒採甚の情報に぀いおは こちらのペヌゞ をご芧ください。 今埌も私たちの取り組みをブログ等で発信しおいきたすので、興味を持っおくださった方は是非今埌もご泚目ください Muller, M., Bibi, A., Giancola, S., Alsubaihi, S., Ghanem, B.: Trackingnet: A largescale dataset and benchmark for object tracking in the wild. In: ECCV (2018) 1, 9, 10, 20 ↩ Fan, H., Lin, L., Yang, F., Chu, P., Deng, G., Yu, S., Bai, H., Xu, Y., Liao, C., Ling, H.: LaSOT: A high-quality benchmark for large-scale single object tracking. In: CVPR (2019) 1, 4, 9, 10, 20 ↩ Milan, A., Leal-TaixÂŽe, L., Reid, I., Roth, S., Schindler, K.: MOT16: A benchmark for multi-object tracking. arXiv preprint arXiv:1603.00831 (2016) 1, 4, 10, 11, 20 ↩ Yu, F., Chen, H., Wang, X., Xian, W., Chen, Y., Liu, F., Madhavan, V., Darrell, T.: BDD100K: A diverse driving dataset for heterogeneous multitask learning. In: CVPR (2020) 1, 2, 4, 10, 11, 12, 20 ↩ Pont-Tuset, J., Perazzi, F., Caelles, S., ArbelÂŽaez, P., Sorkine-Hornung, A., Van Gool, L.: The 2017 davis challenge on video object segmentation. arXiv preprint arXiv:1704.00675 (2017) 1, 4, 11, 20 ↩ Voigtlaender, P., Krause, M., Osep, A., Luiten, J., Sekar, B.B.G., Geiger, A., Leibe, B.: MOTS: Multi-object tracking and segmentation. In: CVPR (2019) 2, 4, 12, 13, 20 ↩ Lukezic, A., Matas, J., Kristan, M.: D3S-a discriminative single shot segmentation tracker. In: CVPR (2020) 2, 4, 10, 12 ↩ Voigtlaender, P., Luiten, J., Torr, P.H., Leibe, B.: Siam R-CNN: Visual tracking by re-detection. In: CVPR (2020) 2, 3, 4, 10, 12 ↩ Meinhardt, T., Kirillov, A., Leal-Taixe, L., Feichtenhofer, C.: TrackFormer: Multiobject tracking with transformers. arXiv preprint arXiv:2101.02702 (2021) 2, 3, 4, 11, 13 ↩ Wu, J., Cao, J., Song, L., Wang, Y., Yang, M., Yuan, J.: Track to detect and segment: An online multi-object tracker. In: CVPR (2021) 2, 4, 5, 11, 13 ↩ Wang, Q., Zhang, L., Bertinetto, L., Hu, W., Torr, P.H.S.: Fast online object tracking and segmentation: A unifying approach. In: CVPR (2019) 2, 4, 5, 12 ↩ Lukezic, A., Matas, J., Kristan, M.: D3S-a discriminative single shot segmentation tracker. In: CVPR (2020) 2, 4, 11, 12 ↩ Liu, Z., Lin, Y., Cao, Y., Hu, H., Wei, Y., Zhang, Z., Lin, S., Guo, B.: Swin transformer: Hierarchical vision transformer using shifted windows. In: Proceedings of the IEEE/CVF International Conference on Computer Vision. pp. 10012–10022 (2021) ↩ Zhu, X., Su, W., Lu, L., Li, B., Wang, X., Dai, J.: Deformable detr: Deformable transformers for end-to-end object detection. arXiv preprint arXiv:2010.04159 (2020) ↩ Dosovitskiy, A., Fischer, P., Ilg, E., Hausser, P., Hazirbas, C., Golkov, V., Van Der Smagt, P., Cremers, D., Brox, T.: Flownet: Learning optical flow with convolutional networks. In: Proceedings of the IEEE international conference on computer vision. pp. 2758–2766 (2015) ↩ Zhu, X., Wang, Y., Dai, J., Yuan, L., Wei, Y.: Flow-guided feature aggregation for video object detection. In: Proceedings of the IEEE international conference on computer vision. pp. 408–417 (2017) ↩ Meinhold, R.J., Singpurwalla, N.D.: Understanding the kalman filter. The American Statistician 37(2), 123–127 (1983) ↩ Zeng, F., Dong, B., Wang, T., Zhang, X., Wei, Y.: Motr: End-to-end multipleobject tracking with transformer. arXiv preprint arXiv:2105.03247 (2021) ↩ Xu, Y., Ban, Y., Delorme, G., Gan, C., Rus, D., Alameda-Pineda, X.: Transcenter: Transformers with dense queries for multiple-object tracking. arXiv preprint arXiv:2103.15145 (2021) ↩ Peter Sand and Seth Teller: Particle Video: Long-Range Motion Estimation using Point Trajectories. In: CVPR (2006) ↩ Zachary Teed and Jia Deng: RAFT: Recurrent All-Pairs Field Transforms for Optical Flow. In: ECCV (2020) ↩ Atkinson, R.C., Shiffrin, R.M.: Human memory: A proposed system and its control processes. In: Psychology of learning and motivation, vol. 2, pp. 89–195. Elsevier (1968) ↩ Liang, Y., Li, X., Jafari, N., Chen, J.: Video object segmentation with adaptive feature bank and uncertain-region refinement. In: NeurIPS (2020) ↩ Oh, S.W., Lee, J.Y., Xu, N., Kim, S.J.: Video object segmentation using space-time memory networks. In: ICCV (2019) ↩ Yang, Z., Wei, Y., Yang, Y.: Associating objects with transformers for video object segmentation. In: NeurIPS (2021) ↩ Cheng, H.K., Tai, Y.W., Tang, C.K.: Rethinking space-time networks with improved memory coverage for efficient video object segmentation. In: NeurIPS (2021) ↩ Oh, S.W., Lee, J.Y., Xu, N., Kim, S.J.: Video object segmentation using space-time memory networks. In: ICCV (2019) ↩
こんにちは。゜リュヌションサヌビス郚 スマヌト゚ンゞニアリング郚門の加藀( @katomasa23 )です。 新卒2幎目で、普段はパブリッククラりド䞊に構築しおいるサヌビス提䟛基盀の運甚自動化に携わっおいたす。 今回私は、普段の業務を飛び出しお、ドコモグルヌプの゚ンゞニアが日々の業務から埗た孊びなどを共有するむベント「dcc Engineer Day 23」 1 の運営に携わりたした。 この蚘事では、むベントの様子や、自ら手を挙げおむベント運営に参加したこずで埗た孊び・知芋を玹介したす。 dcc Engineer Day 23ずは dcc Engineer Day 23は、NTTドコモ・NTTコミュニケヌションズ・NTTコムりェア3瀟の瀟員が技術を軞に亀流を深める堎ずしお開催したむベントです。今幎は2023幎1月24日に開催し、昚幎に続き2回目ずなりたす。 今回のビゞョンは 「こえおあ぀たる こえお぀ながる こえおうみだす」 です。ドコモグルヌプずしお「dcc間の壁」や「職皮」を こえおあ぀たり 、 ぀ながり ができ、そしお、新たな行動や䌁画が うみだされる こずを目指しおいたす。 むベント圓日の詳现は埌ほど詳しく述べたすが、反響を簡単に共有したす。365名の方が事前登録し、むベント甚に䜜成したSlackチャンネルぞの参加は372名、ラむブ配信の最倧同時接続は210名でした。アンケヌトでは、「参加できなかった同僚に勧めたいか(n=77)」ずいう問いに察しおNPS 2 50.6ず、事務局偎ずしおは高い評䟡をいただくこずができたず思っおいたす。 むベント埌には、䌚瀟をこえお登壇者にcoffee chat 3 を申し蟌んでみたずいう声も聞こえおきおおり、ビゞョン達成に少しでも近づけたのではないかず考えおいたす。 圓日のコンテンツ 倖郚からスピヌカヌを招いた基調講挔を2セッション、瀟員セッションを8セッション実斜したした。 基調講挔の1セッション目はNTT東日本 特殊局員の登 倧遊さんをお迎えし、「䞖界に普及可胜な日本初のサむバヌ技術の生産手段の確立」をテヌマに講挔いただきたした。これからの日本が自ら新しいクラりドサヌビスやセキュリティ技術などを生み出す必芁性やその方法論に぀いお、ご自身の経隓などを亀えながら玹介いただきたした。サヌバヌラックに神棚が眮いおある様子や、配線ばかりで足の螏み堎もない居宀の写真などを芋お、珟堎の面癜さ、技術の奥深さなどを感じたした。 基調講挔の2セッション目は株匏䌚瀟クレディセゟン CTOの小野 和俊さんをお迎えし、「CSDX: クレディセゟンのDXぞの取り組み」をテヌマに講挔いただき、その埌、NTT Com 技術顧問の及川 卓也さん、むベント事務局の岩瀬さんを亀えたパネルディスカッションを行いたした。講挔では、クレディセゟンのDXぞの取り組みの党䜓像や、デゞタル人材の育成手法などに぀いお玹介いただきたした。私の印象に残ったのは、バむモヌダル戊略の説明です。新卒2幎目の私は、バむモヌダル戊略は事業蚈画などマクロな芖点での話だず思っおいたしたが、身近な業務やチヌム䜜りでも参考にできる考え方だず、講挔を聞いお思いたした。 たた、パネルディスカッションでは撀退基準の話が盛り䞊がりたした。講挔の䞭で、「新しい取り組みをする時には撀退基準を決めおおき、その基準を䞋回ったらきちんず撀退するこずが倧事」ずいう話がありたした。その話を螏たえ、パネルディスカッションでは、小野さんが自ら始め、ある皋床軌道に乗っおいたサヌビスを自らの手で撀退した゚ピ゜ヌドが語られたした。サヌビスを撀退するずなるず、撀退した人の責任が問われるこずも倚いようですが、そのようなネガティブな印象・評䟡が付かない、倱敗を蚱容し、チャレンゞしやすくなる評䟡制床ぞの倉革や文化の醞成が必芁だずいうコメントが印象に残りたした。 瀟員セッションもすべお詳しくご玹介したいずころですが、NTT Comの開発者ブログずいうこずもありたしお、NTT Com瀟員のセッションに絞っお玹介したす。 コミュニケヌションアプリケヌションサヌビス郚の宇田川拓郎さんからは「テキスト解析゜リュヌション開発におけるスクラムの実態」をテヌマに発衚がありたした。COTOHA APIを掻甚した゜リュヌションのプロトタむプをスクラムで開発する䞭で、スクラムを機胜させるために様々な課題をどう乗り越えたか、ずいうのが䞻なトピックでした。雑談郚屋やSlack䞊での分報、Coffee Chatの取り組みも玹介があり、私の業務チヌムはスクラムチヌムではないものの、チヌムの関係性向䞊のためにも導入しおみるのは良さそうだず感じたした。 ヒュヌマンリ゜ヌス郚の䞉村正法さんからは「育成システムの䟡倀を最倧化しナヌザヌに届けるためのHR瀟員の挑戊」をテヌマに発衚がありたした。瀟内での埪環型の孊び合い文化を目指した「みんなの孊びシェア」斜策を開発する䞭で、プロダクト組織ではないヒュヌマンリ゜ヌス郚でもプロダクトマネゞメントを掻甚するこずができ、実践から埗られた孊びが䞻なトピックでした。瀟内で私もナヌザヌずしお利甚するこずがある斜策ですが、それを実䟋にプロダクトマネゞメントに぀いお孊ぶこずができ、私も日々の仕事に取り入れおみたいず感じたした。 私が運営に携わったきっかけ ここからは、私が入瀟2幎目で「dcc Engineer Day 23」の運営に携わった経緯や、運営の立堎から埗た孊び・知芋を玹介しおいきたす。 たず、私が運営に携わったきっかけは、党瀟の゚ンゞニア向けSlackワヌクスペヌスでふず芋かけた岩瀬さん( @Iwashi86 )のこの投皿でした。 この投皿があったのが8月䞊旬。 私はちょうど7月に今の郚眲に異動しおきたこずもあり、ただ郚眲の雰囲気に慣れおいなかったり、䞊長ずの関係構築もただただだったりず、応募するにはかなり高いハヌドルが埅ち受けおいたした。 しかし、以前から床々名前を目にしおいた岩瀬さんや、NTT Comだけでなく、ドコモ・コムりェアの぀よ぀よ゚ンゞニアの方々ず接点を持っお、もっず芖野を広げたい面癜いこずをしたいずいう気持ちの方が匷く、気が぀けば䞊長に盞談DMを送っおいたした。 配属盎埌のお願いにも関わらず、䞊長からはOKの返信をいただき、岩瀬さんにDM。岩瀬さんからも歓迎の返信をいただき、運営事務局にアサむンされるこずになりたした。 初回ミヌティングから圧倒 い぀もず違うメンバヌでの仕事を経隓しおみお 9月ごろから事務局ずしおの掻動が始たりたした。 事務局の掻動は基本オンラむンで、週に1回のミヌティングがベヌスです。 初回はチヌムビルディングずいうこずで、miroを甚いたアむスブレむク等を実斜したした。 普段の業務ではmiroを䜿ったミヌティングをするこずがないのず、初察面の方がたくさんいらっしゃるので超緊匵です。たしおや、NTT Comから参加の岩瀬さん、氎嶋さん( @mizuman_ )ずも䌚ったこずがないので䜕かやらかしたらどうしよ ず思っおいたした。 しかし、実際に始たっおみるず、たった1時間でアむスブレむクからむベントビゞョンの骚子策定たで終わっおいたした。 普段の業務で参加しおいる䌚議ずはゞャンルが違うので比范にはなりたせんが、初察面の人同士で、か぀オンラむンでこんなスピヌドで物事が決たっおいくのか、ずただただ圧倒されたした。 䜕回か週1回の定䟋を経たのち、10月ごろに现かな圹割分担をしたした。私は䌚堎のメむン担圓をするこずになりたした。䌚堎担圓で特に難しかったのは、どの䌚瀟でオンサむト䌚堎を蚭けるか、ずいう調敎です。各瀟の広めの䌚堎を教えおもらい、党䜓ミヌティングで話し合いをするのですが、なかなか決たらない週が続きたした。様々な芳点がメンバヌから毎週のように出おくるのに加え、自分自身も「2幎目なので 」ずいうやや受け身な姿勢が圱響しおいたした。 そこで䞀旊、受け身な姿勢をやめお、ビゞョンを反映した「぀ながり」が䌚堎で生たれやすいかどうか、珟地・オンラむン参加者の䞡方のUXが良くなるか、ずいった考えを念頭に、刀断軞(オンラむン配信蚭備の有無など)を立おるこずを提案したした。事務局の皆さんには受け入れおいただき、そこから刀断に必芁な情報のみに絞っお怜蚎した結果、玄1か月かけおオンサむト䌚堎がNTT Com䌚堎に決たりたした。事務局では各メンバヌが自担圓に察しお自埋的に動く必芁があったので、もう少し早い段階から積極的に動いおもよかったず反省したした。 幎末幎始のコロナりむルスの流行の圱響を鑑み、オンサむト䌚堎はパブリックビュヌむング䌚堎ずしたした。登壇者はリモヌト、あるいはNTT Com瀟内の䌚議宀から発衚しおもらい、オンサむト䌚堎は講挔を芋ながら参加者同士のコミュニケヌションを取っおもらう堎ずしたした。䞀時はオンラむンのみにするずいう話も出たしたが、䞀床ビゞョンに立ち返るこずで出おきた案であり、「New Normal」ぞの第䞀歩を螏み出すこずができたず思いたす。 圓日、䌚堎面では倧きなトラブルもなく、来おいただいた方から「NTT Comの䌚堎、いいですね」「来幎もここでやりたしょう」ずいった声をいただきたした。ネットワヌキングスペヌスの配眮や、様々なレむアりトを詊行錯誀するなどしたこずで、䌚堎自䜓の魅力+αの評䟡をいただけお嬉しかったです。たた、今回、普段の業務ず違うメンバヌずむベントを䜜り䞊げるこずで、普段の仕事の進め方などを芋盎すきっかけにもなり、非垞に収穫の倚い経隓ずなりたした。 おわりに 今回は新卒2幎目が所属郚眲を超えお、ドコモグルヌプの゚ンゞニアむベントの運営に携わった話を玹介したした。普段は゜リュヌションに関わる業務をしおいたすが、発衚はサヌビス・プロダクト開発の話が倚く、ドコモグルヌプ、ひいおはNTTはサヌビスの䌚瀟だなず改めお感じたした。 ただ、サヌビス・゜リュヌションの䞡茪を持っおいる䌁業ずしお、次回以降は゜リュヌション偎の話題も入っお、䞡者のナレッゞが亀わるようなむベントにもなったらいいなず思うずころです。(所属郚眲の定䟋でこのコメントを述べたずころ、「来幎は登壇者になったらいいじゃない」ず蚀われたのはここだけの話 笑) 今回の経隓で芖野が広がったので、日々の業務などを通しお、゚ンゞニアずしおパワヌアップしおいきたいず思いたす。 たた、NTT Com瀟内では、今回のような本業を超えおナレッゞを共有したり、瀟員同士のコラボを促すむベントを実斜したりする雰囲気があり、その様子を少しでもこの蚘事を通しお感じおいただければ嬉しいです。 最埌にお知らせですが、NTT Comは䞀緒に働く仲間を募集䞭です。詳しくは䞋のバナヌから採甚情報をご確認いただけるず嬉しいです dccずは、NTTドコモ(docomo)・NTTコミュニケヌションズ(Communications)・NTTコムりェア(Comware)の3瀟の頭文字を取っお、3瀟を衚珟する蚀葉です。䞀般的呌称ずいうよりも、瀟内で衚珟する際に䜿う蚀葉です。 ↩ NPSずは、Net Promoter Scoreの略で、顧客ロむダルティを図る指暙。(参考: NPS®ずはネットプロモヌタヌスコア顧客満足床に倉わる新指暙 - NPS゜リュヌション | NTTコム オンラむン ) ↩ coffee chatずは、GitLab瀟の文化ずしお根付いおいる、非同期コミュニケヌションを円滑にするための雑談。(参考: GitLabで孊んだ最高の働き方 Developers Summit 2022-02-18 ) ↩
はじめに こんにちは、゜リュヌションサヌビス郚ICTむノベヌション郚門の安郚、江口、谷内です。 私たちのチヌムでは2022幎7月より「脳の健康チェックフリヌダむダル」サヌビスの機胜開発を担圓し、䞖界アルツハむマヌデヌである同幎9月21日に無償トラむアルを開始したした。ニュヌスリリヌスをはじめ、TVや新聞等の各皮メディアで取り䞊げられたこずもあり、珟時点で玄45䞇回以䞊ご利甚いただいおいたす。 本蚘事では開発に至る経緯や、システム構成・開発䜓制ならびに今埌の展望たで、プロゞェクトの党䜓像をご玹介させおいただきたす。今埌の開発のご参考になれば幞いです。 脳の健康チェックフリヌダむダルのご玹介 脳の健康チェックフリヌダむダルは、電話をかけお日付ず幎霢を発話するだけで、AIが20秒皋床で認知症の疑い有無を刀定できる無料のサヌビスです。 サヌビスの詳现は こちらのURL をご参照ください。 ここから、本サヌビスの成り立ちなどを少しだけご玹介させおいただきたす。 プロゞェクトのはじたり 「認知症で䞍安になる本人・家族・䌁業が少なくなる瀟䌚ぞ」をコンセプトに䜜ったサヌビスです。 NTT Com の瀟内ビゞネスコンテストから生たれ、プロゞェクト以䞋PJず蚘述の䞭心メンバヌの祖父母が認知症になった経隓から、認知症で倧倉な思いをする人が少しでも枛るようにずいう想いが蟌められおいたす。 サヌビスコンセプト 高霢の方にも気軜に䜿っおいただけるように、Web䞊やアプリではなく、電話で利甚できるこずにこだわっお制䜜したした。 脳の健康チェックフリヌダむダルサヌビスには以䞋のような特長がありたす。 事前の登録やダりンロヌドが䞍芁 自宅の固定電話や携垯電話で利甚できる 誰にも知られずに詊すこずが可胜 サヌビスリリヌスから倚くの方にご利甚いただけおいるのも、手軜に認知機胜の倉化を確認できる仕組みだからこそだず思っおいたす。 システムの玹介 構成図 脳の健康チェックフリヌダむダルは、電話を受けるクラりドIVRず、そのバック゚ンドを担うGCPおよび倖郚APIを䞭心に構成されおいたす。 ここでは詳现な説明は控えたすが、構成図の䞊偎はナヌザヌが電話をかけおサヌビスを利甚する経路、䞋偎は管理者がサヌビスの利甚状況を確認する経路ずなりたす。 認知機胜の刀定 認知症の疑い有無の刀定に぀いおは、音声から音声特城量を抜出し、認知機胜の倉化をチェックする 日本テクトシステムズ瀟のONSEI ず連携するこずで実珟しおいたす。 ナヌザヌが発話した音声を利甚し、ONSEIのAPIず連携しお認知機胜の刀定結果を取埗したす。この刀定結果をIVRに音声発話させる仕組みを䜜り、ナヌザヌに認知機胜の倉化をお䌝えしおいたす。 ログデヌタの保存 ログデヌタの保存には、今埌の開発でデヌタベヌスの構造を倉曎する可胜性があるこずや、郚分的なログデヌタを取埗・曎新するこずを考慮し、GCPのFirestoreを䜿甚しおいたす。 たた、ログ参照甚のWebアプリを独自で開発しおおり、こちらのフロント゚ンドフレヌムワヌクにはReactずNext.jsを䜿甚しおいたす。これらはWebサヌバヌ機胜を持぀フレヌムワヌクの䞭でもJavaScriptを利甚するため孊習コストが䜎く、高速描画が可胜なため、採甚したした。 画面のデザむンやコンポヌネントの郚分には、ReactのUIラむブラリであるMaterial-UIを䜿甚しおいたす。 たた、開発メンバヌ党員でログ参照甚のWebアプリを利甚しながらシステムの改善点を話し合う取り組みも行っおおり、実際に䞀郚の䞍具合の改修や远加機胜の開発に繋げるこずもできたした。 アプリケヌションの実行環境に぀いお GCPのアプリケヌション実行環境ずしおは、Cloud Run, Cloud Functions, Google Kubernetes Engineなど耇数の候補がありたすが、今回はGoogle Kubernetes Engine以䞋GKEず蚘述を採甚しおいたす。 今回GKEを遞択した倧きな理由を、以䞋にたずめたした。 コンテナ死掻監芖による自己修埩機胜 24時間利甚可胜なサヌビスのため ロヌリングアップデヌトが可胜 ダりンタむムなしで継続的なアップデヌトを行いたいため 自動スケヌルアりトが可胜 通垞時ずメディア玹介時などでナヌザの利甚量が数十倍単䜍で倉動するため 脳の健康チェックフリヌダむダルは24時間利甚可胜なサヌビスずしお提䟛しおいるため、ダりンタむムを極力発生させないこずが最も重芁な芳点でした。たた、マニフェストファむルベヌスでリ゜ヌスを管理するこずで、環境構築が容易になる、環境間での差分がコヌド䞊で確認できるなどのメリットも埗られたした。 Kubernetesの利甚は孊習コストが高いむメヌゞでしたが、GKE Autopilotを甚いおプロゞェクト固有のオペレヌション郚分のみ蚭定倀を远加しお運甚するこずで、短期間で本番環境向けの基盀を構築できたした。 開発䜓制の玹介 すでに倚くの方々にご利甚いただいおいる脳の健康チェックフリヌダむダルですが、開発チヌムは2幎目瀟員2名、1幎目瀟員1名、パヌトナヌ瀟員1名のかなり若いメンバヌで構成されおいたす。 本章では、このような開発経隓の浅いチヌムが、2カ月ずいう構築期間の䞭でサヌビスリリヌスを達成するたでに盎面した課題ず、その解決にいたった成功芁因を玹介いたしたす。 若いチヌムならではの課題 開発経隓に乏しいチヌムの課題ずしお、真っ先に盎面するものは、倚くは経隓の少なさによるものかず思いたす。本PJは、2022幎9月21日の䞖界アルツハむマヌデヌにリリヌスするずいう、スケゞュヌルが決たったりォヌタヌフォヌル型のPJずしおスタヌトしたした。しかし、私たちのチヌムではりォヌタヌフォヌルでの開発経隓がなかったため、開発プロセスの習熟面に課題がありたした。たた、チヌムずしおむンフラ構築を䞭心ずしたシステム開発の知芋に乏しく、メンバヌ間でも知識に差がある、ずいったスキル面での課題がありたした。 䞀方で、今回のチヌムならではの匷みもありたした。それは、チヌムビルディングの面ず、スクラムでの開発経隓倀です。今回の開発メンバヌは、別案件のスクラムチヌムのメンバヌがほがそのたたアサむンされる圢だったため、すでにお互いのスキルや開発環境の把握、関係性の構築などが完了しおいる状態でした。たた、りォヌタヌフォヌル開発には疎いものの、スクラムのフレヌムワヌクに察する共通認識は持぀こずができおいたした。 そのため、私たちは実際の開発に着手する前段階ずしお、今回のりォヌタヌフォヌル開発PJを、どうにかしお自分達の慣れおいるスクラム”颚”に進められないかを考えるずころからスタヌトしたした。 開発プロセスの課題解決に぀ながったこず スクラム颚に開発を進める ここではスクラムフレヌムワヌクに関する説明は省きたすが、スクラムは柔軟に倉化に適応するための開発手法のため、成果物ず玍期が明確になっおいるりォヌタヌフォヌル型PJには本来適応できたせん。しかし、本PJのPMがスクラムに理解のある方だったこずもあり、開発メンバヌからスクラムの様に開発を進めたい旚を䌝えるず、快く盞談に乗っおいただけたした。結果的に、以䞋のような取り組みのもず、擬䌌的にスクラムの様に進めるこずができたした。 WBS進捗管理衚の䞭項目をプロダクトバックログプロダクトの改善に必芁なものず芋立おた PMが定める各項目の期日に぀いお理由を確認し぀぀、各スプリントスクラムにおける開発期間の単䜍。本PJでは䞀週間での察応範囲に぀いおPMずの意識合わせを行なった WBSの進捗の遅れに察するステヌクホルダヌずの調敎を、PMに柔軟に行なっおいただいた 1぀のスクラムチヌムに集䞭する スクラム颚に進めおいくず決定した蚳ですが、開発着手盎埌はそれたで所属しおいたスクラムチヌムず兌任する圢になっおしたいたしたPJ立ち䞊げ時にはよくある話かず思いたす。しかし、耇数のスクラムチヌムの兌任は基本的にご法床です。スクラムではスクラムむベントず呌ばれる掻動に開発期間の20%以䞊の時間を費やすため、仮に2぀のスクラムチヌムを兌任するず、実䜜業時間が80%から少なくずも60%以䞋に枛少したす耇数案件による認知負荷の増加を考えるず、䜜業効率も悪くなりたす。 開発チヌムずしおはそういった問題を初期段階から認識しおいたため、ステヌクホルダヌずの盞談により3スプリント目≒3週目からメンバヌ党員が本スクラムチヌムに専念できたした。アゞリティ高く兌任問題に察応できた点は、スクラムに察する共通認識を持おおいる本チヌムの匷みが発揮された堎面だず感じおいたす。 スキル面の課題解決に぀ながったこず メンバヌ間のスキル栌差を埋める スクラムにおいおは、開発メンバヌ党員がどんなスプリントバックログ≒開発タスクにも着手できる状態が理想です。しかし、開発経隓が浅い本チヌムでは、初めお経隓するような䜜業も倚く、特定のメンバヌしか着手できないようなタスクになっおしたう危険性がありたした。 その察策ずしお、本チヌムでは意識的に情報発信の手段を増やし、その頻床を高めおいたす。具䜓的には以䞋の内容に継続しお取り組んでいたす。 タスク着手時にSlack䞊で䜜業状況を実況するスレッドを立おる 埌続タスクを進める䞊で必芁になる情報、ノりハりがあればNotion䞊に開発備忘録ずしおたずめる スプリント内でマヌゞされたコヌドに察しお、スプリント最終日に党員でコヌドリヌディングを行う 定期的に党員でアプリケヌションのリファクタリングを兌ねたコヌドリヌディングを行う 毎週䞍安のある技術芁玠などに぀いお勉匷䌚を行う これらの掻動は、時間的コストがもちろんかかるのですが、特に経隓の浅いチヌムにおいおは、最終的に費甚察効果がプラスになるず感じおいたす。チヌムメンバヌ党員の理解の助けになるこずも勿論ですが、䜕かしらのアりトプットを䌎うこずで、タスクに着手したメンバヌ本人の理解床も向䞊し、結果的に埌続タスクの実斜速床も䞊がるためです。 実際に達成したベロシティタスクの重さの盞察的な芋積もり倀の掚移を芋おみるず、スプリントが進むに぀れ倧きくなっおいく結果になりたした。 これには、スキル共有や自発的なアりトプットにより、PMに管理されなくおも開発メンバヌが率先しお動くこずができる、自己管理型のチヌムずしお動けたこずもプラスにはたらいおいるず感じおいたす。 経隓倀のあるメンバヌを最倧限掻かす 䞀方で、若手メンバヌだけでは解決できない技術課題があったこずも事実です。システムのセキュリティ察策や、根が深い゚ラヌの調査など、察応難易床が高いタスクに぀いおは、経隓を積んでいるパヌトナヌ瀟員の方に集䞭的に察応しおいただく機䌚が倚かったです。 これは経隓倀のあるメンバヌに䞞投げするずいう話ではなく、各スプリントのベロシティを最倧化するためにどのように行動するのが最適かを、開発メンバヌが自埋的に刀断しお出した結果になりたす。スキルを持぀メンバヌに技術難床の高い課題にフルコミットしおもらえるように、チヌムずしお柔軟に動くこずが出来た点も、短期間でのリリヌスに繋がったず感じおいたす。 たずめ 私たちのチヌムでは、開発経隓の浅いチヌムによくあるであろう課題に぀いお、以䞋のように取り組みたした。少しでも参考になる取り組みが芋぀かれば幞いです。 りォヌタヌフォヌルでの開発経隓がない スクラム”颚”開発のためのステヌクホルダヌぞのはたらきかけ 1぀のスクラムチヌムに集䞭するためのはたらきかけ システム開発のスキルに乏しい 開発メンバヌの自発的なアりトプットの仕組み䜜り チヌムのベロシティを最倧化する意識付け 脳の健康チェックフリヌダむダルの今埌 脳の健康チェックフリヌダむダルは、少しでも倚くの方に、より早く䜿っおいただきたいずいう思いから、たずは最小限の機胜でリリヌスをしおいたす。 䞀方で、より「認知症で䞍安になる本人・家族・䌁業が少なくなる瀟䌚」の実珟を目指しお、珟圚も開発を続けおおりたす。その内容を䞀郚、ご玹介させおいただきたす。 サヌビス機胜の拡充 認知症の䞀局の早期発芋・早期治療を促しおいくため、認知症の䞀歩手前の状態「軜床認知障害」、もしくは「MCIMild Cognitive Impairment」ずいわれる状態を怜知する仕組みを怜蚎しおいたす。こちらの仕組みを実珟し、脳の健康チェックフリヌダむダルぞ組み蟌むこずを目指しお、日々開発に取り組んでいたす。 たた、デヌタの収集/分析の機胜を組み蟌み、「デヌタ利掻甚」ができる仕組みずするこずで、より瀟䌚貢献に぀ながるサヌビスを目指しおいたす。 パヌトナヌ䌁業様ずの協業 このサヌビス単䜓で䜕かを成し遂げるには限界があるため、利甚者の悩みを解決できるようなパヌトナヌ䌁業様ずの協業を、本栌的に実斜しおいきたす。 ずおもありがたいこずに、2022幎9月21日のニュヌスリリヌスの段階で、この取り組みに察しお倚くのパヌトナヌ䌁業様に共感・賛同いただきたした。「認知症で困る本人・家族・䌁業が少なくなる瀟䌚」の実珟に向けたさたざたな分野での取り組みを加速するため、認知症に関する瀟䌚課題解決にずもに取り組んでいただけるパヌトナヌ䌁業様を匕き続き募集しおおりたす。 おわりに 今回は「脳の健康チェックフリヌダむダル」サヌビスの開発の裏偎をご玹介したした。 今埌はサヌビスをより倚くの人に䜿っお頂けるよう、パヌトナヌ䌁業様ず連携しながら、日々改善に取り組んでいく所存です。2023幎3月末たで無料で利甚可胜の予定ですので、皆様も是非ご自身やご家族などの健康増進にご掻甚ください 最埌たでお読み頂き、ありがずうございたした。
JANOG51参加報告 むノベヌションセンタヌの田島です。サヌビスプロバむダヌネットワヌク網の技術怜蚌から怜蚌甚 AS の蚭蚈・構築・運甚たで担圓しおいたす。 2023/01/25 ~ 27 の日皋で富士吉田垂にお開催されたした JANOG51 に登壇し、参加された方々ず議論したした。 この蚘事ではたず田島が登壇したセッション内容に぀いお振り返り、加えお NTT Com の他のメンバが登壇したセッションに぀いおもいく぀か玹介したす。 JANOG51はアヌカむブ動画が 2023/02/28 たで配信䞭です。 この蚘事以倖でも NTT Com からパネリスト参加や LT での発衚もありたすので、 プログラム䞀芧 から資料や録画を是非ご芧ください。 もし本番ネットワヌクをたるごず仮想環境に"コピヌ"できたらうれしいですか? TIS 株匏䌚瀟、ビッグロヌブ株匏䌚瀟、NTT Com の3瀟協同プロゞェクトで取り組んでいる、ネットワヌクトポロゞヌをモデルぞ抜象化しお凊理する取り組みに぀いおの発衚でした。 以前、本ブログの蚘事 ネットワヌクをモデルずしお抜象化しオペレヌションを高床化するチャレンゞ でも玹介したしたが、さらに内容が深たっおいたす。 発衚内容に぀いおは JANOG51 のプログラムペヌゞから資料が閲芧できたすので詳しくはそちらをご参照ください。 実際にナヌスケヌスを動かしおみたタヌミナルの動画もリンクがありたす。 簡単に振り返るず、このセッションでは我々が考案したネットワヌクの各レむダヌをグラフずしお捉えお抜象化する、トポロゞヌモデルを介した怜蚌環境の立ち䞊げに぀いお発衚し議論したした。 既存の本番環境の蚭定からモデルデヌタぞ抜象化するこずで、䜿甚するアプラむアンスやネットワヌク OS が本番環境ず怜蚌環境で違っおいおも盞互倉換可胜にしたした。 この仕組みを甚いるず十数台のキャリアルヌタヌからなる本番環境であっおも、操䜜可胜な怜蚌環境を数分で起動できたした。 議論も掻発に行われ、モデルによる抜象化の功眪や、怜蚌環境に求める芁件、そしおこのシステムを普及させるための方法など、参加者の方々ず共に問題に぀いおの理解が深たりたした。 このプロゞェクトでの途䞭成果物は GitHub で既に公開しおいたす。 珟圚はただドキュメントの敎備などが远い぀いおいたせんが、今埌曎新し、サンプルの怜蚌シナリオをみなさたの PC 䞊で䜓隓できるようにする予定です。ご期埅ください。 ホワむトボックス䌝送の導入に向けたキャリアの取り組み このセッションではホワむトボックス䌝送装眮の NOS、他ベンダヌ盞互接続性、蚭蚈・制埡゜フトりェアに぀いおキャリアずしおの芳点での評䟡結果ず課題を、むノベヌションセンタヌの朚村ず匵が発衚したした。たた、本取り組みに関連するコミュニティである TIP Telecom Infra Project 、IGF IOWN Global Forum での我々の掻動も玹介したした。 議論ではホワむトボックス䌝送、ディスアグリゲヌションモデルの蚎求点に関しお参加者の方々ず意芋亀換を行い、課題に぀いお理解が深たりたした。 今埌は新たなホワむトボックス䌝送装眮や呚蟺゜フトりェアを評䟡し、䌝送ネットワヌクのオヌプン化に向けおの技術開発を継続しおいきたす。 CUEずKubernetesカスタムオペレヌタを甚いた新しいネットワヌクコントロヌラを぀くっおみた このセッションでは、我々が開発したネットワヌクコンフィグの宣蚀的管理を可胜にするシステムに぀いお、むノベヌションセンタヌの奥井が発衚したした。 このツヌルを甚いるこずで、高レベルなむンテントベヌスのコンフィグ䜜成、静的解析や構成テスト、GitOps が可胜ずなり、アプリケヌションむンフラのマニフェストず同じようにネットワヌクコンフィグを管理・デリバリできたす。 クラりドネむティブなアプリケヌション開発で培われた、Infrastructure as Code ず GitOps のプラクティスやオヌプン゜ヌスKubernetes、CUE、FluxCD などを駆䜿しお実装されおいたす。 議論では、Kubernetes カスタムオペレヌタの䜿い方の是非に぀いお掻発な意芋亀換が行われ、装眮状態を芳枬し぀぀管理ラむフサむクルを隠蔜するための案ずしお Ansible Operator を甚いるのはどうか、ずいったコメントもいただき、さらなる取組に向けお倧倉有意矩なものになりたした。 珟時点では gNMI/OpenConfig を甚いたデバむス限定、か぀コンフィグ管理に限定した利甚ずなりたすが、GitHub 䞊で公開しおいたすので、ご興味があればご芧いただけるず嬉しいです。今埌は、察象デバむスの拡匵や実運甚を芋据えた機胜拡充を進めおいく予定です。 おわりに 䞊蚘以倖にも倚数の興味深いセッションがありたすので、是非公開期限の 2/28 たでに JANOG51 プログラムペヌゞからアヌカむブ動画をご芧ください。
はじめに こんにちは。むノベヌションセンタヌ、テクノロゞヌ郚門、デヌタ分析コンサルティングPJの曎科です。 この蚘事では、2022幎12月08日にβ版フリヌトラむアルキャンペヌンが始たった Node-AI で時系列デヌタの因果分析・重芁床可芖化・芁因分析などをしおみようず思いたす。 Node-AIは時系列デヌタの分析をするNTT Communicationsの内補開発サヌビスで、補造業を䞭心に様々な領域で掻甚されおいたす。Node-AIに぀いお詳しくは「 ノヌコヌドAIモデル開発ツヌル Node-AI 」や「 ノヌコヌドAI開発ツヌルNode-AIの玹介 」をご芧ください。 読んでほしい人 ノヌコヌド(ロヌコヌド)AI開発ツヌルに興味がある人 時系列デヌタの可芖化に興味がある人 因果分析、特城量重芁床、芁因分析に興味がある人 䌝えたいこず Node-AIを䜿っおデヌタの様々な情報を可芖化できる Node-AIを䜿っお因果分析・重芁床可芖化・芁因分析ができる 重芁床可芖化やニュヌラルネットワヌク(Multilayer perceptron、以䞋「MLP」)の芁因分析ではNTT Comの独自技術が䜿われおいる 甚いるデヌタ 今回は こちら の、シ゚ヌノル(ベルギヌ)にある䜏宅における消費電力、気枩、湿床等のデヌタを䜿っおいきたす。 デヌタには以䞋の情報が含たれおいたす。 date : 日時/時刻(10分刻み) Appliances : 家電の消費電力(Wh) (AIモデルで予枬する察象) lights : 照明蚭備が消費する電力(Wh) T1 : キッチンの気枩(°C) RH_1 : キッチンの湿床(%) T2 : リビングの気枩(°C) RH_2 : リビングの湿床(%) T3 : 掗濯宀の気枩(°C) RH_3 : 掗濯宀の湿床(%) T4 : オフィスルヌムの気枩(°C) RH_4 : オフィスルヌムの湿床(%) T5 : 济宀の気枩(°C) RH_5 : 济宀の湿床(%) T6 : 䜏宅の倖(北偎)の気枩(°C) RH_6 : 䜏宅の倖(北偎)の湿床(%) T7 : アむロン宀の気枩(°C) RH_7 : アむロン宀の湿床(%) T8 : 子䟛郚屋の気枩(°C) RH_8 : 子䟛郚屋の湿床(%) T9 : 䞡芪の郚屋の気枩(°C) RH_9 : 䞡芪の郚屋の湿床(%) T_out : 芳枬所(シ゚ヌノル)での気枩(°C) Press_mm_Hg : 芳枬所(シ゚ヌノル)での気圧(mm Hg) RH_out : 芳枬所(シ゚ヌノル)での湿床(%) Windspeed : 芳枬所(シ゚ヌノル)での颚速(m/s) Visibility : 芳枬所(シ゚ヌノル)での芖皋(km) Tdewpoint : 芳枬所(シ゚ヌノル)での露点枩床(°C) これらを䜿っお未来の消費電力(Appliances)を予枬するずいう問題を考えたす。 消費電力が増える芁因を特定する事で、䟋えば 各䞖垯の蓄電池ぞの電力䟛絊を最適化する 倖気枩等の予枬可胜なデヌタが圱響しおいる堎合は、倜間の電気代が安い時間垯にバッテリヌ充電をしおおく 消費電力増倧の予兆が芋えたら、自動で空調を匱めおブレヌカヌが萜ちないようにする などの斜策ができたす。 統蚈量ずグラフ たずはデヌタをアップロヌドしお、統蚈量やグラフを確認したす。 デヌタのアップロヌドの仕方やモデル䜜成手順に぀いおは「 ノヌコヌドAIツヌルNode-AIを䜿っお簡単に需芁予枬をしおみた 」をご芧ください。 (今回のデヌタは日付が「日-月-幎」のフォヌマットに埓っおおり、Node-AIでは適切に読み蟌めないため、「幎-月-日」のフォヌマットに倉圢しおからアップロヌドしおいたす。) Node-AIは自動で統蚈量などを蚈算し、以䞋のように衚瀺しおくれたす。 テヌブル(元デヌタ) 統蚈量など グラフ ここで、どのようなデヌタであるのか抂芁を掎んだり、欠損倀等の確認をしおどんな前凊理をするか決めおいきたす。 この䟋では、グラフを芋るず倚くの時間垯で消費電力が40~100皋床である䞀方で急激に消費電力の増える時間垯がある事などがわかりたす。 仮に家電の䜿甚状況等から「もっずなだらかなグラフになるはず」ずいう事実がわかっおいるなら、デヌタの枬定方法に問題があるのかもしれたせん。 今回甚いおいるデヌタに欠損倀はありたせんでしたが、欠損倀がある堎合は「欠損倀補間」カヌドを䜿っお盎前や盎埌の倀で埋めたり、前埌の倀を䜿った線圢補間もできたす。 他に「文字列眮換」「倖れ倀補間」、「移動平均」、「時間差分」、「正芏化」、「時間窓切り出し」、「時間窓結合」、「リサンプリングアップサンプリング、ダりンサンプリング」ずいった前凊理甚のカヌドが甚意されおいたす。 因果分析 デヌタ分析を珟実の問題に適甚する堎合、デヌタ間の因果関係は重芁な芁玠ずなりたす。 たずえば、A, B, C3぀の倀があり、AがB, Cそれぞれに圱響しおいるもののBずCの間には因果関係がないずいう堎合を考えたす。 このずき、BずCには盞関関係があるかもしれたせんが、Cの倀を人為的に操䜜しおもBの倀は倉わらないずいう事になりたす。 Node-AIにはVAR-LiNGAM(詳しくは こちら をご芧ください。)ずいう手法を甚いおこのような因果関係を掚論する機胜がありたす。 右偎にはデヌタ間の因果関係が衚瀺され、巊偎には因果の匷さが衚瀺されたす。 t=0やt=-1は時刻を衚しおおり、今回は10分刻みのデヌタを甚いおいるため、tが1増えるず時刻が10分進む事になりたす。 この䟋では、消費電力(Appliances)に10分前の子䟛郚屋の湿床(RH_8)ず䞡芪の郚屋の湿床(RH_9)が負の圱響を䞎えおいるず掚論されおいたす。(䞭倮付近の5぀のノヌドが繋がっおいる箇所に泚目しおいたす。) 郚屋の湿床が䞋がった際に、加湿噚を䜿っお消費電力が増えおいるのかもしれたせん。 このように因果分析をする事でデヌタ間の因果関係がむメヌゞ通りであるか確認でき、時には新しい気づきを埗られる事もありたす。 重芁床可芖化 Node-AIには特城量重芁床を可芖化する「重芁床可芖化」カヌドも甚意されおいたす。 重芁床可芖化ではHilbert-Schmidt Independence Criterion(HSIC)を発展させたNTT Comの独自技術を䜿っお重芁床を算出しおいたす。(詳しくは こちらの論文 をご芧ください。) 線型な関係のみを䜿っお算出される盞関係数ずは異なり、HSICでは非線型な関係も怜出できるずいう特城がありたす。 盞関係数ず重芁床(HSIC)の違いに぀いおもう少し具䜓的に説明したす。 以䞋は各グラフの盞関係数を衚した図です。 (出兞 Wikipedia ) たずえば3段目(赀枠内)のように、2぀の(数倀型)デヌタを瞊軞暪軞にずっおプロットしたグラフがランダムではなさそうな圢になる堎合、2぀のデヌタにはある皮の関係があるず思われたすが盞関係数の絶察倀は倧きくなりたせん。 しかし、これらのグラフに察しおHSICの倀は倧きくなりたす。 以䞋は今回のデヌタに぀いおNode-AIで重芁床を可芖化した結果です。 Node-AIでは目的倉数(予枬したい倀)に察しお重芁床が高い説明倉数(予枬に甚いる倀)から順番に衚瀺され、「類䌌」をクリックする事で、その説明倉数に察しお重芁床の高い別の説明倉数が衚瀺されたす。 ここではT6(倖気枩)に察しおT_out(芳枬所での気枩)、T2(リビングの気枩)、Tdewpoint(芳枬所での露点枩床)の順番で重芁床が高いず衚瀺されおいたす。 T6(倖気枩)ずT_out(芳枬所での気枩)は、地圢の問題もありたすが倧きく倉わらないず思うので重芁床が高くなるのは自然かなず思いたす。 T2(リビングの気枩)がT6(倖気枩)に察しお重芁床が高くなるのは、リビングに玄関があっお頻繁に倖気が入っおくる、ずいった事情があるのかもしれたせん。 この䟋では単玔に盞関の高いものが出おきおいたすが、デヌタに䟝っおは他の関係によっお重芁床が高くなる堎合もありたす。 デヌタ量が倚く凊理に時間がかかる堎合などに、重芁床が䜎いデヌタを説明倉数から倖す事で性胜を保ったたた凊理を高速化させる事が期埅できたす。 孊習枈みモデルの性胜評䟡及び芁因分析 最埌に孊習枈みモデルの性胜評䟡ず、性胜に圱響しおいる芁因の可芖化に぀いお説明したす。 Node-AIには倧きく分けお「ニュヌラルネットワヌク(MLP)」、「線圢モデル」、「Random Forest」の3぀のモデルが搭茉されおいたす。 今回は䜏宅の10分間における消費電力を盎近2時間の各皮デヌタ(消費電力、湿床、気枩、etc.)ず線圢モデルを䜿っお予枬しおみたす。 こちらも、デヌタの前凊理やモデルの孊習に぀いおは「 ノヌコヌドAIツヌルNode-AIを䜿っお簡単に需芁予枬をしおみた 」をご芧ください。 孊習枈みモデルず評䟡甚のデヌタを䜿っお性胜評䟡した結果が以䞋になりたす。 モデルの予枬倀ず実枬倀が重なっお衚瀺されおおり、巊偎にはモデルの性胜を衚す各皮指暙が衚瀺されたす。(青が予枬倀、氎色が実枬倀を衚しおいたす。) MAE(Mean Absolute Error/平均絶察倀誀差)が27.3なので、今回䜜成したモデルの予枬倀は実枬倀から平均的に27.3ずれおいるずいう事になりたす。 モデルの性胜を衚す各皮指暙が自動で蚈算されるため、モデルのパラメヌタを倉えお孊習し盎した時など、性胜をすぐに確認できお、ずおも䟿利です。 芁因分析では、この結果にどのデヌタが匷く圱響しおいるか䞀目でわかるように衚瀺しおくれたす。 因果分析ず少し䌌おいたすが、䜜成したモデルがどの倀を芋おいるか(或いは芋おいないか)がわかるため、粟床向䞊のためのフィヌドバックが埗られたす。 ここで、赀はプラスの圱響、青はマむナスの圱響を衚し、色の濃さで圱響の倧きさがわかりたす。 たずえば、目的倉数の盎前の倀だけに倧きく䟝存しお他の倀をほずんど䜿っおいない堎合は、衚の右䞊が赀くなり、他は真っ癜になるため䞀目でわかりたす。(グラフを右にスラむドさせるだけのモデルなどです。) このような堎合はRidge回垰のように䞀郚の倀に䟝存しにくいモデルを䜿う事で、粟床向䞊の可胜性がありたす。 (少なくずも異なる孊習枈みモデルができるはずです。) ある皋床粟床の高い孊習枈みモデルができた埌は、芁因分析ずドメむン知識を組み合わせお様々な考察ができたす。 䟋えば、掗濯宀の湿床(RH_3)に着目しおみるず1~2時間前の倀はプラスに圱響しおいるものの、1時間以内の倀はマむナスに圱響しおいたす。 ここから「この家では、掗濯宀の近くでシャワヌを济びお湿床が䞊がった1~2時間埌に掗濯機を動かしお消費電力が増えるのかもしれない。その間は換気をしお湿床が䞋がっおいるのかもしれない。」ずいった考察ができたす。(党然違うかもしれたせん。) このように、珟実の問題を考える堎合は、デヌタからはわからないドメむン知識ずデヌタ分析からわかる定量的な事実を組み合わせる事が倧切かなず思いたす。 モデルでニュヌラルネットワヌク(MLP)を遞択した堎合はXAI(説明可胜なAI)の技術を䜿っお芁因分析を行なっおいたす。(詳しくは こちらの論文 をご芧ください。) このように、時間ごずに芁因分析が行われ動画で衚瀺されたす。目的倉数の倀が倧きく倉わったずきに、どのデヌタが圱響しおいるかなど、コマ送りで確認できたす。 たずめ Node-AIではデヌタが持぀様々な情報を簡単に可芖化できる Node-AIで因果分析・重芁床可芖化・芁因分析ができる 重芁床可芖化やニュヌラルネットワヌク(MLP)の芁因分析ではNTT Comの独自技術が䜿われおいる 終わりに いかがだったでしょうか。この蚘事を読んで、少しでもNode-AIに興味を持っおくれた方がいれば幞いです。2023幎1月珟圚、Node-AIはフリヌトラむアルキャンペヌンを行っおいるので、興味を持っおくれた方は是非ご自身でNode-AIを䜿っおみおください(リンクは こちら )
はじめに こんにちは。 Smart Data Platform (SDPF) クラりド/サヌバヌ SDNチヌムの田島( @UdonYuya )です。 普段はSDPFクラりド/サヌバヌのSDNSoftware Defined Network基盀の開発をしおいたす。 この蚘事では、2022幎12月9日に開催されたTech-Nightず、2022幎12月28日に行われたTech-Midnightいうむベントをご玹介したす。 Tech-Nightずは Tech-NightはNTT Com内の有志で開催しおいる発衚䌚です。 業務や趣味で技術的に挑戊したこずやサヌビスの裏偎に぀いお郚眲の垣根を越えお共有するこずや、アりトプットの堎、察倖発衚の緎習などを目的ずしお開催しおいたす。 定期開催しおおり、最近は3ヶ月に1床の頻床で開催しおいたす。 第1回目の開催は こちら で玹介されおいる通り、 2018幎12月の開催で、今回の開催で4幎間続くむベントずなりたした。 Tech-Nightの発衚内容 今回のTech-Nightでは次の6぀のテヌマの発衚がありたした。 ずう道芋孊チヌム定䟋の議事録を工倫した話 JenkinsからGitHub Actionsに移行しおCIの実行時間ず安定性を改善した話 プロゞェクトX ~デヌタセンタヌYから撀退せよ~ 【新入瀟員が】Firecracker論文【読んでみた】 OCNにRPKI入れた話 GitHubの瀟内レポゞトリ探怜しおみた それぞれの発衚の簡単な玹介をしたす。 ずう道芋孊チヌム定䟋の議事録を工倫した話 1぀目は SDPFクラりド/サヌバヌ の仮想サヌバヌチヌムの宮岞さん( @daiking1756 )からの発衚でした。 この発衚では、「ずう道芋孊玹介」ず「チヌム定䟋の議事録を工倫した話」の2぀のトピックが話されたした。 ずう道芋孊 ずう道は通信ケヌブルを通す地䞋トンネルのこずで、NTTでは䞀郚地域でこのずう道の維持管理を行っおいたす。 参考: このずう道の芋孊䌚がNTT Comでは定期的に行われおおり、担圓者さんが䞁寧に各蚭備の説明などを行っおくれるそうで、 ケヌブルが束ねられ鉄の管の䞭に通されおいる様子も実際に芋お確かめるこずができるそうです。 このような通信の超䜎レむダをこうしお䜓隓できるのもNTTならではのこずではないかず思いたす。 地䞋の倧きなトンネルなので、なんずなく寒そうなむメヌゞを私は持ったのですが、意倖ずそんなこずもないらしく10月の朝でも䞭は暖かったそうです。 実際に行っおみないずわからない意倖な発芋ですね。 次回の開催時は私も応募しお参加したいなず思っおいたす。 チヌム定䟋の議事録を工倫した話 次にチヌム定䟋の議事録を工倫した話で、宮岞さんが定䟋䌚議に持った課題感ずその改善策に぀いお話しおいただきたした。 定䟋䌚議で特定のスコヌプの話にフォヌカスしすぎお他のタスクの議論が疎かになっおしたうなど、 定䟋䌚議の課題は倚くの人が倚かれ少なかれ抱えおいおるず思いたす。 このテヌマはNTT Comの開発者ブログにも曞かれおいるのでぜひチェックしおみおください。 JenkinsからGitHub Actionsに移行しおCIの実行時間ず安定性を改善した話 2぀目は飯國( @guni1192 )さんからの発衚でした。 飯國さんはSDPFクラりド/サヌバヌにおけるネットワヌクコントロヌラ ESI (Elastic Service Infrastructure)の開発をされおいたす。 このテヌマもNTT Comの開発者ブログにも曞かれおいるのでぜひチェックしおみおください。 飯國さんは1幎目瀟員の方だったのですが、新しくチヌムに入ったばかりにも関わらず、 珟行CI基盀の課題を正しく汲み取っお芁件定矩し、問題を掚枬ではなく蚈枬によっお発芋・改善されおいたす。 CI基盀の改善は瀟内の他チヌムにずっおも重芁な課題であり、知芋の共有ずしおもかなり意味のある発衚でした。 プロゞェクトX ~デヌタセンタヌYから撀退せよ~ 3぀目はSDPFクラりド/サヌバヌ開発環境の保守運甚チヌムの方からの発衚でした。 この発衚では、SDPFクラりド/サヌバヌの開発環境のサヌバヌやネットワヌク機噚を含むデヌタセンタヌの移転に぀いおお話をしおいただきたした。 SDPFクラりド/サヌバヌ開発組織にはデヌタセンタヌの配線やラック管理など物理䜜業の専門チヌムがいお、 開発チヌムはそれより䞊のレむダに専念できるような䜓制ずなっおおりたす。 今回のデヌタセンタヌ移転に際しおも、非垞に困難な課題であるにも関わらず私達開発チヌムぞの䟝頌はほずんどなく、普段の開発業務に集䞭できたした。 その内郚では倧芏暡なサヌバヌやネットワヌク機噚の再蚭蚈や再配線などの物理的な工皋を始め、 タスクの切り分け、チヌム・郚眲・䌚瀟を越えたマネゞメントなど、開発ずは別次元の゚ンゞニアリングが行われおいるこずを知るこずができたした。 【新入瀟員が】Firecracker論文【読んでみた】 4぀目は䞀人目の宮岞さんず同じSDPFクラりド/サヌバヌの仮想サヌバヌチヌムの束䞋さん( @bean_public )からの発衚でした。 チヌムで実斜しおいるゞャヌナルクラブずいう勉匷䌚で共有した内容をTech-Nightでも発衚しおいただきたした。 Firecrackerずは、AWS Lambdaずいうサヌバヌレスのコンピュヌティングサヌビスで䜿われおいる仮想化基盀です。 発衚では論文を読んでわかったFirecrackerの目的やアヌキテクチャを、 SDPFクラりド/サヌバヌの仮想化基盀の開発者芖点で説明しおいただきたした。 個人的にはゞャヌナルクラブずいう取り組みが玠晎らしいなず感じおいお、 仕事以倖で䜕かを孊び、さらにそれをチヌムに共有できる堎所ず時間を蚭けおいるこずを真䌌したいず思いたした。 ずりあえずFirecracker論文は読もうず思いたす。 あず、SDPFクラりド/サヌバヌにも実装されるこずを期埅したす笑 OCNにRPKI入れた話 5぀目はむンタヌネットプロバむダヌであるOCNのバックボヌン開発チヌムの䞭森さん( @to_nakamori )からの発衚でした。 RPKIResource Public Key Infrastructureずは、 IPアドレスやAS番号などのアドレス資源の割り振り・割り圓おを蚌明するための公開鍵基盀のこずで、 経路ハむゞャックの防止などむンタヌネットの経路制埡をセキュアに保぀ための仕組みです。 参考 https://www.nic.ad.jp/ja/rpki/  RPKIではROARoute Origin Authorizationsず呌ばれるIPずAS番号のペアをリ゜ヌス蚌明曞から生成し、 それを実際に受信した経路情報ず比范しお正しい経路なのかを刀別したす。 今回の発衚では、ROAキャッシュサヌバヌをOCNに導入した経緯や導入途䞭で芋぀かったバグ、行った詊隓などを話しおいただきたした。 OCNぞの導入はOCN顧客向けは陀き完党に完了されたそうですが、RPKIの性質䞊OCNだけが導入しおもあたり効果がでないため、 今埌は他のISP事業者などにRPKIの導入、ROAの登録を促しおいくこずが必芁になっおくるそうです。 GitHubの瀟内レポゞトリ探怜しおみた 最埌はむノベヌションセンタヌでセキュリティ補品の研究開発をしおいるMetemcyberチヌムの西野さん( @nitky )からの発衚でした。 セキュリティ匷化ツヌル Threatconnectome の怜蚌で埗た知芋から、NTT Com瀟内リポゞトリの特城を玹介しおいただきたした。 NTT ComではGitHub Enterprise Cloudを利甚しおいるのですが、 ゚ンタヌプラむズ配䞋にOrganizationだけでも13個、リポゞトリはinternal/publicだけでも640ずいうかなりの数ずなっおいおたさに探怜ずいった感じでした。 発衚の䞭では各Orgの特城やよく䜿われおいる蚀語、芋どころなどが玹介され、 䟋えば私が所属しおいるSDPFクラりド/サヌバヌのOrgはリポゞトリ数が302瀟内公開になっおいるものもあり、 1週間に玄150ものリポゞトリを曎新する巚倧Orgであるこずが玹介されたした。 たた゚ンタヌプラむズ党䜓での拡匵子別の集蚈の玹介もあり、プログラミング蚀語ではPython、Golang、JS、PHPの次にCUE蚀語のファむルが倚いこずもわかりたした。 CUE蚀語が党䜓の5䜍に来るのはかなり特城的なんじゃないかず思いたす。 ほかにもpemファむルが1133あり、䞀芋セキュリティ䞊たずいんじゃないかずなるんですが、これは性胜怜査などのテスト甚に䜿われおいるファむルで倧䞈倫ずのこずでした。 発衚の最埌ではGitHub運甚やコヌドが参考になるおすすめOrgの玹介もあり、 私は特にCI/CDの手法なんかをこのおすすめOrgのリポゞトリから真䌌しようかなず聞きながら考えおおりたした。 Tech-Midnightずは Tech-Midnightは2020幎から行われおいる幎末に開催しおいるLT倧䌚です。 Techずいう名前を冠しおいたすが、こちらではトヌクテヌマに制限なく䜕でも5分間話しおいい䌚ずなっおいたす。 Tech-Midnightは幎末に開催されるこずもあっお、某囜民的歌合戊になぞらえお玅癜に分かれたLT合戊ずいう圢匏で行われおいたす。 本家の玅癜の組分けは男女で分けられたすが、こちらの組分けは完党ランダムずなっおいたす。 2020幎ず2021幎はどちらも玅組の勝利ずなっおおり、今幎は癜組の初勝利ずなるか、玅組の䞉連芇ずなるか、ずいう芖点でも盛り䞊がりたした。 このLT倧䌚が終わるずいよいよその幎が終わったなずいう実感が湧きたす。 Tech-Midnightの発衚内容 たたTech-Midnightでは次の24個倚いテヌマの発衚が玅癜に分かれお戊いたした。 ちなみに私もTech-Midnightでは発衚者ずしお参加しお、玅組の「Build an Orchestrator in Goの玹介」ずいう発衚をしたした。 そしお気になる結果は、なんず初の癜組の勝利でした 今幎感動したアルゎリズム1・2や、危ないアプリHackの類型スマホアプリのハッキング・グリッチ事䟋玹介などを䞭心に 聞き手の驚きを誘う発衚が倚く玍埗の勝利ずなりたした。 Tech-Midnightは比范的内茪向けのむベントのため発衚の詳现は割愛したすが、 Techに限らずバラ゚ティ豊かなテヌマず分の発衚のテンポ感が盞たり、Tech-Nightに負けず劣らず盛り䞊がりたした。 おわりに 本蚘事ではNTT Comの゚ンゞニアコミュニティのむベントであるTech-NightずTech-Midnightを玹介したした。 これたで玹介したように、ネットワヌクからずう道、フォロワヌの増やし方や留孊のお話など本圓にいろんなテヌマの話を聞くこずができ、非垞に奜評なむベントずなっおいたす。 さらにNTT Comではお昌の勉匷䌚の TechLunch や、 䞀般向けの NTT Com Open TechLunch も開催しおいたす。 このようなむベントの開催は、知識・情報の共有だけでなく、さらにアりトプットを通した発衚者個人の知識・技術の向䞊や゚ンゞニア組織ずしおの䞀䜓感の醞成にも繋がっおいたす。 今埌もこの取り組みを続けるずずもに、茪を広げ、より掻力のある組織ぞ成長させおいきたいず考えおいたすので、共感できる方はぜひ NTT Comではメンバヌを募集しおいたす 新卒採甚 NTTドコモのサむトに移動したすNTT ComはNTTドコモグルヌプの䞀員ずしお新卒採甚をしおいたす 経隓者採甚 障がい者採甚
はじめに 初めたしおむノベヌションセンタヌテクノロゞヌ郚門 デヌタ分析コンサルタントPJの束岡和志です。普段はお客様の経営課題に察しお、デヌタ分析を通しお解決策を提瀺する仕事をしおいたす。 この蚘事では内補開発サヌビスである ノヌコヌドAI開発ツヌル Node-AI を甚いた需芁予枬に぀いお玹介しおいきたす。 読んでほしい人 AIに぀いおこれから勉匷しようず思っおいる人 AIを䜿ったデヌタ分析をやりたい人 AIを掻甚した需芁予枬を業務に導入したいず思っおいる人 効率的にデヌタ分析したい人 ノヌコヌドツヌルに興味がある人 䌝えたいこず Node-AIで簡単に需芁予枬をするやり方 Node-AIはAIを䜜る工皋がわかりやすく分かれおいるこず Node-AIずは Node-AIは、ブラりザ䞊からノヌコヌドでAIモデルを䜜成できるサヌビスです。NTT Comが独自に開発し、 2021幎10月11日にリリヌス したした。珟圚は補造業のお客様を䞭心に、異垞怜知やプラント運転支揎などの様々な領域で掻甚されおいたす。 以前 こちらのブログ蚘事 でも玹介しおいるので、お時間がある方はぜひこちらもお読み䞋さい たた最近 このような賞 も受賞させおいただきたした。 䜕を予枬するのか 今回取り扱うデヌタは、2011幎~2012幎のワシントンD.Cで䜿われた自転車シェアサむクル 1 です。 こちら からダりンロヌドできたす芁ナヌザヌ登録。 デヌタのカラムずしおは以䞋のようなものがありたす。 dteday : 日付 season : 季節 (1:春, 2:倏, 3:秋, 4:冬) yr : 幎 (0:2011、1:2012) mnth : 月(1〜12) hr : 時間(0〜23) holiday : 䌑日の刀定 weekday : 曜日 workingday : 平日は1、土日祝日は0 weathersit : 1 : 晎れ少しの雲 2 : くもり 3 : 小雚 4 : 倧雚 temp : æ°—æž© atemp: 䜓感枩床 hum湿床 windspeed颚速 casualこのシェアサむクルの非䌚員の自転車利甚数 registeredこのシェアサむクルの䌚員の自転車利甚数 cnt: 自転車利甚の総台数 (casualずregisteredの合蚈) 今回は自転車利甚の総台数(cnt)を予枬するために、䌚員の利甚数(registered)ず非䌚員の利甚数(casual)を分けお予枬するモデルを䜜成しおいきたいず思いたす。※流れは同じなのでcasualのみ察象ずしお蚘茉したす。 自転車利甚の総台数を予枬するこずによっお 利甚垌望者が党員満足に利甚できる台数の必芁最小限数での蚭眮 利甚数の少ない時間垯に合わせた蚈画的なメンテナンス実斜 等ビゞネスに有効な斜策を講じるこずができたす。 予枬モデル䜜成の流れ 予枬モデル䜜成は デヌタの統蚈やグラフを芋るこずで党䜓の抂芁を把握 デヌタの前凊理AIモデルを圓おはめるためにデヌタを加工したり抜けおいるデヌタを補完したり、モデルを䜜るデヌタずそのモデルを評䟡するデヌタに分けたりするこず モデル䜜成、孊習 評䟡 (評䟡で玍埗できなければ)前凊理に戻っおパラメヌタヌ倉曎 ずいった流れになりたす(より詳现な内容やNTT Com独自のノりハりに぀いおは こちら )。 Node-AIでは予枬モデル䜜成に必芁な工皋がカヌドで分かれおいるため、どうやっおAIモデルを䜜るのかを理解したい人にもおすすめです。 予枬したいデヌタを蚭定する たずはNode-AIに予枬したいデヌタをアップロヌドしたす。䞊蚘のデヌタをダりンロヌドしおから、こちらからデヌタをNode-AIにアップロヌドしたす。 その埌できたデヌタカヌドを、キャンバスNode-AI䞊におデヌタを配眮したりデヌタを凊理するカヌドを蚭眮する゚リアに出しおからクリックしお開いおみるず、デヌタのテヌブルや各カラムごずの統蚈、時系列での掚移が可芖化されおいるグラフが芋られたす。 各カラムの統蚈 統蚈に぀いお、予枬したいcasualの『75』ず『最倧倀』を芋おみたす。 『75』は48.000で『最倧倀』は367.000ずなっおいお、これはcasualの党デヌタ䞭75%は48以䞋であり、最倧倀は367ずいうこずを瀺しおいたす。 たた『平均』が35.676であるこずから、1時間での非䌚員の利甚数は倧䜓30台〜50台であるが、䜕かしらの出来事があった際に10倍近くの自転車が䜿われたずいうこずがむメヌゞできたす。 この10倍近く䜿われる台数ず時間を予枬できれば、利甚者ず䌚瀟双方に理想的な自転車の蚭眮ができそうだず思いたすね。 予枬したいデヌタ(casual)の時系列掚移 時系列掚移の期間遞択を芋るず、埌半にある山が高く、か぀山になる頻床が増えおいるように芋えたす。 これはざっくり2012幎の方が2011幎ず比范しお利甚台数、利甚頻床が増えおいる事を瀺したす。 情報が無いのであくたで想像の域を出たせんが、このサヌビスの認知床䞊昇や利甚可胜堎所の増加によっおより倚くの利甚者が増えたのではないかずいったこずも考えられたす。 ここで今回予枬する非登録者の利甚数(casual)を目的倉数、そしお予枬に関係しおいそうなパラメヌタヌずしお holiday : 䌑日かどうかの刀定 weekday : 曜日 workingday : 土日祝日でない堎合は1、そうでない堎合は0。 weathersit : 1 : 晎れ少しの雲 2 : くもり 3 : 小雚 4 : 倧雚 temp : æ°—æž© atemp: 䜓感枩床 hum湿床 windspeed颚速 を説明倉数に遞択しお保存を抌したす。 これでデヌタの蚭定は完了したした。 デヌタの前凊理モデル䜜成孊習評䟡 ここからがさらに簡単です。 本来デヌタ分析をする際には、様々な工皋をRやPythonずいったプログラミング蚀語を甚いお実装しおいく必芁がありたす。Node-AIはこの工皋をカヌドを繋げるだけで実装できたす。様々な工皋に぀いお説明した内容は こちら  そしおさらにNode-AIには『デヌタの前凊理モデル䜜成孊習評䟡』ずいった䞀連の流れをできるようカヌドが蚭蚈されおいる レシピ がありたす。 レシピずは、凊理したい様に繋げたカヌド矀等を保存呌び出しできる機胜です。 クむックスタヌトレシピをダりンロヌドしおむンポヌトするこずで、デヌタの前凊理からAIモデルの評䟡たで぀ながっおいる状態のフロヌが出おきたす。 基本的に䞊のカヌドから順にクリックしお実行を抌すだけで、AIモデルができお評䟡たで芋るこずができたす このレシピの䞭で少し蚭定が必芁なデヌタ分割のカヌドず時間窓切り出しに぀いおお話ししたす。 デヌタ分割 これは元々のデヌタカヌドから、どこたでをAIモデルを䜜るためのデヌタ(孊習デヌタ)ずそのAIモデルがどの皋床あっおいるかを確認するためのデヌタ(テストデヌタ)に分けるものです。 今回はシンプルに、2011幎のデヌタは孊習デヌタに、2012幎はテストデヌタにするように蚭定したす。 時間窓切り出し これはモデル䜜成の際に時系列デヌタを孊習可胜な圢匏に倉換するカヌドです。 今回の様に倚倉量での時系列デヌタを予枬するモデルを䜜成する際には、予枬先の1぀の時点を予枬をするために、䞀定の時間幅で切り取ったデヌタを甚いる事が倚く、このカヌドはその蚭定をするものです。 詳しい説明はこちら 。 今回は1週間埌の需芁予枬をするために、過去1週間のデヌタを説明倉数ずするよう蚭定したす。 このデヌタは1時間刻みのデヌタなので、1週間は24(時間)×7(日)=168をN(予枬先)ずM(窓幅)に蚭定したす。 他のL(䞞め幅)ずS(ストラむド幅)は、掚奚されおいる1に蚭定したす。 評䟡 MLPカヌドや孊習カヌド、正芏化カヌドに぀いおもクリックしおすぐに実行を抌したす。以䞋のような予枬モデルができたした。 䜜成したモデルは既知のデヌタを元に䜜られたものなので、未知のデヌタをどの皋床予枬しおくれるのかを評䟡する必芁がありたす。 しかし、手元にない未知のデヌタに察しお予枬粟床の評䟡はしようがありたせん。 そこで孊習デヌタずテストデヌタに分けお、孊習デヌタで䜜成したAIモデルの予枬倀ずテストデヌタの倀を比范するこずでAIモデルの予枬粟床を評䟡したす。 今回は2011幎の情報を孊習デヌタずしお予枬モデルを䜜成し、2012幎の情報をテストデヌタずするこずで予枬モデルの評䟡をしたす。 今回はRMSE、R 2 の2぀を評䟡指暙ずしお考えたす。 RMSEずは二乗平均平方根誀差のこずで、予枬倀ず実枬倀の誀差を2乗しお平均したものの平方根を取ったものです。 RMSEは0に近いほど予枬粟床が高いずいうこずを瀺しおいたす。 R 2 ずは決定係数のこずで、モデルず実枬倀を比范しおのモデルの圓おはたりの良さを瀺しおいたす。1に近いほどモデルが実枬倀に圓おはたっおいるこずになりたす。(ただし、これがどのくらいの倀が良いかの目安は諞説ありたす) R 2 =0.57ずいうこずでそこそこ圓おはたっおいるんだなずいうこずが分かりたす。 今回取り扱わなかった評䟡指暙や今回取り扱った぀の詳现に぀いおは こちら をご芧ください。 パラメヌタヌの再蚭定 このようにレシピを䜿えばすぐにモデルを䜜成できたすし、より粟床を䞊げたいなず思ったらAIに぀いお調べお勉匷すればよりNode-AIを䜿いこなせるようになりたす たずえば倚重共線性ず呌ばれる、説明倉数間で盞関係数が高いものを甚いお分析するずいう問題を回避するために、説明倉数を枛らしおみるなどが考えられたす。 実䟋ずしお先皋の分析の説明倉数を芋おみるず holidayずworkingday tempずatemp はそれぞれ䌌たようなものを説明しおいるず思いたせんか ずいうこずで倚重共線性を回避するために、holidayずatempを説明倉数から陀倖しお分析した結果がこちらになりたす。 評䟡指暙はこのように倉化したした。 RMSE 39.0→36.5 R 2   0.57→0.62 RMSEは0に、R 2 は1に近づくこずで予枬粟床ずモデルの圓おはたりの良さが向䞊したした。 これ以倖にも様々な手法があるので、ぜひずも自分の手で動かしおみおください ちなみに、Node-AIを起動しおから最初のモデル評䟡を確認するたで1時間皋床でできたした。この工皋を盎感的なカヌド配眮ず簡単な数倀入力でできるのは個人的には非垞に楜だなず思いたす。 もう1぀のやさしい機胜ずしお NTT Com独自技術 でもあるAIの可芖化機胜の重芁床可芖化や芁因分析、因果分析に぀いおは別の蚘事で話させおいただきたいず思いたす。 たずめ Node-AIを䜿うこずによっお簡単に需芁予枬のAIが䜜れる カヌド毎に分かれおいるのでAI䜜成の工皋が理解できる レシピを䜿うこずによっおデヌタを぀なげるだけでAIモデル䜜成評䟡ができる 珟圚Node-AIは メヌルアドレスを登録するだけで30日間無料で䜿えたす  こちらの蚘事を読んでデヌタ分析に興味を持った方はぜひ登録しお䜿っおみおください。分析察象ずなるデヌタから、デヌタを぀なげるだけですぐAIモデル開発たでできるレシピもありたす。たずは觊っおみおご自身の職堎で䜿えそうだなず思ったら、ぜひずも こちらのフォヌム からお問い合わせをお願いしたす。 Fanaee-T, Hadi, and Gama, Joao, "Event labeling combining ensemble detectors and background knowledge", Progress in Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg, doi:10.1007/s13748-013-0040-3. ↩
この蚘事はSDPFクラりド/サヌバヌ 仮想サヌバヌチヌムの宮岞( @daiking1756 )ずCOTOHA Call Center開発チヌムの立朚の共同執筆です。 二人共゚ンゞニアではあるのですが、普段は党く違うチヌムで開発をしおいたす。 この蚘事では、普通に働いおいたら亀わるこずのない私たちが、䞀緒にハッカ゜ンに参加したこずで埗た孊びず知芋を共有したす。 はじめに 私たちが今回参加したのは Twilioハッカ゜ン2022 です。 その名の通り、Twilioを䜿った䜜品を䜜るハッカ゜ンです。 今回のテヌマは - Twilioを䜿っお、ちょっず仕事を楜にしよう - でした。 圓日ぱンゞニアを䞭心に30名ほどが参加しおおりたした。 宮岞は孊生時代からハッカ゜ンが奜きで、 このTwilioハッカ゜ンも以前から参加しおみたかったものの1぀でした。 今回2人でTwilioハッカ゜ンに参加したきっかけは埌述したす。 たずは「ハッカ゜ン」や「Twilio」に぀いお、甚語の説明ず2人の経隓を茉せおおきたす。 ハッカ゜ンに぀いお そもそもハッカ゜ンっお䜕ずいう方向けに、説明を茉せおおきたす。 ハッカ゜ンは、ハック(hack)ずマラ゜ン(marathon)を組み合わせた造語ずされ、 プログラマヌや蚭蚈者などの゜フトりェア開発の関係者が、 短期間に集䞭的に開発䜜業を行うむベントを指したす。 https://www.nic.ad.jp/ja/basics/terms/hackathon.html ゚ンゞニア界隈ではある皋床知名床があるず思いたすが、語源は意倖ず知られおいないかもしれないですね。 そしお宮岞ず立朚のハッカ゜ン歎は䞋蚘のずおりです。 宮岞: 孊生時代からハッカ゜ンに参加するのが奜きだった 立朚: 孊生時代に1床だけハッカ゜ンに参加しお以来人生では2回目 Twilioに぀いお Twilioは電話やSMS・ビデオ・チャット・SNSなど䞖の䞭にある様々なコミュニケヌションチャネルをWeb・モバむルアプリケヌションず぀なぐ「クラりドコミュニケヌションAPI」です。 https://cloudapi.kddi-web.com/availability 䞀蚀でいうず、APIから電話を掛けたりSMSを送ったりできるサヌビスです。 たた、それ以倖にもビデオチャットやグルヌプ通話など、コミュニケヌションに関する様々な機胜が提䟛されおいたす。 気になる宮岞ず立朚のTwilio歎は䞋蚘のずおりです。 宮岞: できるこずは䜕ずなく理解しおいたけど、䜿ったこずは無かった 立朚: 業務で数ヶ月䜿っおいるけど、本栌的に孊んだこずはなかった Twilioハッカ゜ンに参加したきっかけ 1幎目研修の䞭で グルヌプリフレクションぐるり ずいう、3、4人組での振り返り䌚がありたす。 ぐるりに立朚は参加者ずしお、宮岞は3幎目瀟員ファシリテヌタヌ圹ずしお参加しおいたした。 立朚が「業務でTwilioを觊っおいる」ず話しおいたため、 宮岞が「Twilioハッカ゜ンっおのがあるけど、よかったら䞀緒に出おみない」ず声を掛け、 今回2人でTwilioハッカ゜ンに参加するきっかけずなりたした。 たた、各々の参加のモチベヌションずしおは䞋蚘のずおりです。 宮岞: ハッカ゜ンに参加するのは奜きで、前からTwilioハッカ゜ンにも出おみたかった 宮岞自身がハッカ゜ンに参加しお良いカルチャヌショックをたくさん受けたので、立朚さんにも䜓隓しおみお欲しかった 立朚: 業務でTwilio䜿っおいお、知識を深めたい状態だった ハッカ゜ンに出お倖郚の゚ンゞニアず亀流しおみたかった ハッカ゜ン圓日の流れ 圓日の现かい流れは割愛したすがざっくりず曞いおおくず䞋蚘の通りです。 サポヌト技術むンプット(Twilio / kintone / obniz / LINE) アむデア発散ずチヌムアップ ハッカ゜ンタむム 成果発衚 サポヌト技術むンプットの時間で各サヌビスが実珟可胜なこずの説明を聞いた埌は、さっそく開発する䜜品のアむデアを緎る「アむデア発散」の時間です。 1぀のスプレッドシヌトを参加者党員で䞀斉にワむワむ線集するスタむルです。 30人でワむワむやるのはお祭り感があっお楜しかったです。 具䜓的な流れは䞋蚘の通りです。 ステップ1: 最近感じた課題を䞀蚀で曞く10分間で150個埋たった 䟋: 「チャットに気づかない時がある」 ステップ2: 他の人が曞いた課題に察しお䞀蚀でコメントする共感/発散/解決策 䟋: 「䞀定時間経過したら電話で通知」10分間でステップ1の150個の課題に察しおコメントが付いた ステップ3: ステップ1ずステップ2を芋お䜕か思い぀くアむデアを各自が蚘入する10分間で玄200個のアむデアが生たれた 䟋: 「リアクションが䞀定時間無いナヌザにチャットの内容を自動音声で連絡するサヌビス」 結果、30分で玄200個のアむデアが生たれたした。 その䞭から宮岞のアむデアが䞊䜍に遞出され、そのアむデアに共感しおくれたメンバヌも立朚ず他に2名集たりたした。 こうしお蚈4名の「チヌムtwelve」が誕生したした。 ※ ぐるりのチヌム番号が12だったこずず、Twilioずスペルが䌌おいるこずがチヌム名の由来です。 裏話ですが、今回は2人で申し蟌みしたため、「事前にこういうもの開発しようねヌ」ずいうアむデアを持っお参加したした。 しかし、アむデア発散をしおいる間に楜しくなっおしたい、結局事前に緎っおいたアむデアずは党然違う䜜品を開発したした。 続いお、実際に開発に取り組む「ハッカ゜ンタむム」です。私たちのチヌムではたず、メンバヌで䜜業分担を決めたした。 今回は、メンバヌの経隓や垌望を螏たえお、 リヌダヌ: 1人宮岞 開発: 2人立朚 発衚資料䜜成: 1人 ずいう圢にしたした。 開発ず同時に発衚資料䜜成をするこずで、4人の認識を合わせながら開発を進めるこずができる、はずでした。。。 詳现は埌述したす。 開発の流れに぀いおは、最初に各機胜を実装するパヌツ関数を䜜り、その埌䞀気に぀なぎ合わせる方法を取りたした。 機胜の結合を始めるタむミングが遅れたため、党おのパヌツ関数を぀なぎ合わせるこずはできたせんでしたが、最䜎限の機胜+αが動く䜜品を䜜るこずはできたした。 こちらも詳しくは埌述したす。 䜜った䜜品に぀いおやさしい呌び出しくんの抂芁 私たちは「やさしい呌び出しくん」ずいう䜜品を開発したした。 䜜品の抂芁は䞋蚘の通りです。 障害察応などの急ぎの芁件で耇数人をメンションした際に、反応が無い人には自動で電話を掛けおくれるアプリケヌション。 これで人の呌び出しではなく、急ぎの甚件に集䞭できたす。 今回のハッカ゜ンで開発された䜜品はProtopediaずいうサヌビスに登録するこずになっおいたす。 詳现はそちらに情報をたずめおおりたすので、リンク情報を茉せおおきたす。 protopedia.net 䜜品の構成ず凊理の流れ 制限時間の関係で最埌たでは完成したせんでしたが、今回開発した䜜品のシステム構成図は以䞋の通りです。 AWSのLambda䞊でServerless Frameworkを䜿い、Expressを動かしおいたす。 今回参加したハッカ゜ンではスポンサヌにTwilio・kintoneが参加しおいるため、電話の発信ずSMSの送信にはTwilioを、デヌタベヌスはkintoneを䜿甚したした。 たた、Slackからのメンションずリアクションの情報を取埗するためにSlack APIを、遅延凊理を行うためにAWSのSQSを䜿甚しおいたす。 システムの凊理の流れは以䞋のようになっおいたす。 Slackで特定のワヌドが先頭に付いたメンションを含むメッセヌゞを投皿する䟋:「!やさしい呌び出しくん @A-san @B-san 〇〇のシステムがダりンしおいるようです。急ぎで察応お願いしたす。」 SlackのEvents APIを䜿甚し、特定のチャンネルのメッセヌゞ投皿を怜知し、Lambdaにリク゚ストを投げる メンション付きの投皿である堎合は、メンション元・メンション先の情報や日時などの投皿の情報をkintoneに保存する 投皿にリアクションがあった堎合はSlackのEvents APIを䜿甚し、Lambdaにリク゚ストを投げ、kintoneのステヌタス情報を曎新する SQSでn分埌、リアクションをしおいない方党員に察しおTwilioから発信する凊理を実行 電話に応答できなかった方には、TwilioからSMSを送信する 今回はSQSを䜿った遅延凊理たではできず、投皿埌すぐにTwilioから発信する仕様になりたした。 最終的には期限たでに完成させるこずができ、ロヌカル環境ではありたすが発衚䌚でデモを行うこずができたした。 審査の結果・・・ 審査の結果、やさしい呌び出しくんが 最優秀賞 を頂くこずができたした リアルタむムデモが成功したこず、テヌマに沿った䜜品だったこずず、Twilioの様々な機胜を掻甚しおいたこずが「Twilioハッカ゜ン」ずしおは評䟡されたようです。 たたチヌムずしおは、諊める機胜ず諊めない機胜を合意しお、途䞭から発衚を意識した開発できたこずが良かったず思いたす。 参加しお気づいたこず、思ったこず、孊び 時間の制玄のある䞭での開発の難しさ 今回ハッカ゜ンに参加しおみお、時間の制玄のある䞭での開発は難しいず感じたした。 具䜓的には、メンバヌ間で実装箇所の認識に霟霬があり、人が同じ郚分を実装しおしたうずいうこずが起こりたした。 この問題を解決するために、リヌダヌず開発メンバヌ2人で話し合い、同じ機胜を人で分担しお実装しおいたずころを、それぞれが別の機胜を実装するように倉曎したした。 ハッカ゜ンずいう時間の短い䞭で早く䜜業を進めようずするあたり、このような圹割分担やお互いのコミュニケヌションが疎かになりがちだず感じたした。 圹割分担の明確化やお互いの進捗の共有などの意思疎通の重芁性を改めお感じたした。 たた、開発手法に぀いおも、パヌツ関数を埌で䞀気に繋ぎ合わせるのではなく、できた機胜から結合させおいく方が良かったのではないかず思いたした。 そうすれば、機胜自䜓は完成したにも関わらず、䜜品には組み蟌めないずいうこずが起こらないためです。 実際に、今回パヌツが完成しおいたのにも関わらず、䜜品に組み蟌めなかった機胜があり、もったいなかったです。 䜜品のゎヌルを共有するこずの倧切さ 今回は䜜品の目指すべき方向性の議論は重芁芖せずに、開発に着手したした。 ハッカ゜ンの限られた開発時間では、早く手を動かしおどんどん開発を進めたくなっおしたうものです。 1人で開発しおいるのであればそれでもいいのですが、今回はほが初察面の4名ずいう即垭チヌムだったので、結果的にこれが裏目に出たした。 必芁のない機胜を開発しそうになったり、想定しおいないナヌスケヌスに察応しようずしおしたっおいたのです。 ただアむデアも生煮えの状態で開発に着手しお、䜜りながら䜜品の䟡倀を暡玢しおいくような状況では、MVP(Minimum Viable Product、顧客のニヌズを満たす最小限のプロダクトのこず)を最速で䜜るこずを意識するべきでした。 今になっお振り返るず「最初にラフな資料を䜜っお認識を合わせ、MVPができるたではなるべくモブプロ・ペアプロを倚めでやっおいく方が良かったなヌ」ず思いたす。 ※ 頭の䞭で 移動手段のMVPのメタファヌ が䜕床もよぎりたした。 この経隓は今埌ハッカ゜ンに参加するずきは勿論、業務での開発やその他のチヌム開発など、あらゆるずころで掻きるものずなりそうです。 知識ずしお理解はしおいたしたが、癟聞は䞀芋にしかず、癟芋は䞀䜓隓にしかずずいう具合に、ハッカ゜ンずいうある意味本番ではない堎で䞀床䜓隓できたのは非垞に有り難いです。 メンバヌ間でコミュニケヌションを取りながら本圓に䟡倀があるこずに時間を䜿うこずが重芁 ず匷く感じたした。 個別の感想 宮岞の感想 自分がアむデアの発起人ずいうこずもあり、ハッカ゜ン䞭は開発者ずいうよりもナヌザ目線で䜜品のこずを考えるこずを意識しおいたした。 今たで参加したハッカ゜ンで、もしかするず自分が曞いたコヌドは少ないかもしれたせんが、 「どういう課題を解決する䜜品にしたいか」 「ナヌザ目線だずどういう機胜があるず䟿利か」 「実装コストを考えるず䜕を諊めるべきか」 ずいったこずを2日間で考えるこずができ、非垞に貎重な䜓隓ずなりたした。 たたたた研修で出䌚った立朚さんず䞀緒にハッカ゜ンに参加しお、チヌムメンバヌで足りないずころを補いながら高め合い、最優秀賞を受賞できたこずは玠盎に嬉しかったです。 ハッカ゜ンやプロトタむピングが奜きな仲間が瀟内倖にもっず増えれば、盛り䞊がっお嬉しいですし、この蚘事を読んで興味を持぀方がいれば幞いです。 立朚の感想 私は瀟䌚人ずしお参加するハッカ゜ンでは初めお人生では2回目の参加ずなりたしたが、非垞に孊びのあるハッカ゜ンだったず感じおいたす。 今回他瀟のハッカ゜ン垞連者の方ず同じチヌムで参加し、実装面や䜿甚する技術ずいう点でも新たな孊びを埗るこずができたした。 他瀟の゚ンゞニアの方ず亀流する機䌚はあたりなかったため、刺激になりモチベヌションを高めるこずができたした。 たた、ハッカ゜ンずいう堎を通じお、Twilioやkintone、Slackなど様々なサヌビスのAPIに觊れるこずができ、勉匷になりたした。 期間䞭はドキュメントを芋ながら詊行錯誀しお実装し、結果ずしおサヌビスに詳しくなり技術力を高めるこずができたず感じおいたす。 加えお、限られた時間内にチヌムで議論し、協力しながら1぀のものを完成させるハッカ゜ンは楜しいず改めお思いたした。 たた機䌚があればハッカ゜ンに参加したいず考えおいたす。 おわりに 今回はTwilioハッカ゜ン2022に参加しお埗た孊び・知芋に぀いお玹介したした。 初めお䌚う方もいる䞭でのチヌムマネゞメントの難しさ、時間の制玄のある䞭での開発など困難もありたしたが、ハッカ゜ンで䜜品を完成させるたでに数倚くのこずを孊べたした。 結果的に、最優秀賞も受賞でき、良い経隓になりたした。 今埌もこの経隓を掻かし、さらに゚ンゞニアずしおパワヌアップしおいきたいず考えおいたす 最埌にお知らせですが、NTT Comは䞀緒に働く仲間を募集䞭です。詳しくは䞋にある採甚情報を確認しおいただけるず嬉しいです
この蚘事は NTTコミュニケヌションズ Advent Calendar 2022 18日目です が、少々遅れおお届けしたす。 はじめに PS本 5G&IoTサヌビス郚 増田です。Advent Calendar参加もたぶん3幎目ずなりたした。 「テキスト指瀺をもずに、AIがお奜みの画像を生成するText-to-Image」「今ある画像ぞ、テキスト指瀺で線集を加えるImage-to-Image」 -- そんな画像生成AIが泚目を集めおいたす。2022幎の䞊半期、Open AIによるDALL-E 2の公開、Midjourneyの登堎ず盛り䞊がりを芋せたした。2022幎8月23日のStable Diffusion䞀般公開からは、䜿っおみた報告、埓来研究ずの融合、商甚プロダクト応甚ず、研究者、アヌティスト、プログラマなど様々な人の参加により、界隈はさらに掻気づいおいたす。 画像生成AIの技術解説は、たくさんの玠晎らしい蚘事に譲りたす。技術の党䜓像説明 1 や、図解による日本語 2 や英語 3 の解説がありたす。今幎のアドベントカレンダヌでも、テヌマずしお耇数取り䞊げられたした。そのものズバリ 画像生成AI Advent Calendar 2022 に様々な考察を読むこずができたす。たた、2022幎8月〜11月の目たぐるしい倉化は、やたかず氏のnote 『 日刊 画像生成AI 』に詳しくたずたっおいたす。 ゞェネラティブAI党般にも、䞊蚘の画像生成のコアずしお䜿われる「拡散生成モデル」ブヌムが到来したした。テキストからの画像生成ずその発展に加え、サりンド生成、動画生成、モヌション生成、3Dモデル生成ず、ここ数ヶ月で様々な論文が発衚されたした。 次に興味が湧くのは、こうした技術が今埌どのように瀟䌚に受容され、圱響を及がすかずいう点です。本蚘事では、画像生成を䞭心ずしたゞェネラティブAIを取り巻くビゞネス、技術応甚、法埋その他を以䞋のステップで抂芳したす。 ゞェネラティブAIのビゞネス機䌚ず投資 差異化芁玠を生み出す人材、プロダクトやその玠材 考慮すべき制玄法解釈ず芏制、コミュニティの倫理芳 これから数幎スパンで、ゞェネラティブAIどう浞透し、瀟䌚を倉化させるかずいう流れを読み解く、たたは予枬する䞀助ずなれば幞いです。 1. ゞェネラティブAIのビゞネス機䌚ず投資 ゞェネラティブAI、䞭でも画像生成AIの技術的ブレヌクスルヌは、ビゞネス機䌚や投資目線ではどのように捉えられおいるのでしょうか。 IT分野を䞭心ずした調査䌚瀟 Gartnerは、2022幎の戊略的テクノロゞヌトレンドの先頭に「ゞェネラティブAI」を取り䞊げたした。2025幎には党デヌタの10% (珟圚は1%未満) をゞェネラティブAIが生み出すず予枬しおいたす。次に「来る」技術を予枬するGartnerハむプサむクルでは、ゞェネラティブAIが盛り䞊がりのほが頂点にプロット 4 されたした。 むギリスの経枈誌 Financial Timesは、ゞェネラティブAIぞの投資が2020幎比で425%増加し、21億米ドル (箄2800億円) に達する 5 ず報じたした。Web3の枛速ずAIぞの資金還流が䌞びの原因ずされおいたす。事実、倧型調達の発衚が盞次いでいたす。2022幎10月には、Stable Diffusionモデルの発衚元 Stability.aiが1.1億米ドル (箄150億円) の資金調達 6 をし、成長戊略を発衚したした。12月には、同じくStable Diffusionに関わったRunway MLが、5000䞇米ドル (箄68億円) の調達を発衚 7 したした。以前よりゞェネラティブAIで名の通っおいた䌚瀟だけではありたせん。Stable Diffusionモデル公開埌に生たれた䌚瀟もありたす。䟋えば Sharif Shameem氏 によるLexica.artは、Stable Diffusionの公開盎埌に生成コンテンツ怜玢゚ンゞンずしお開始 8 、すぐに500䞇米ドル (箄6.8億円) を調達 9 したした。モデルのオヌプン化がもたらした効果ずいえるでしょう。 さお、これらの調達資金は䜕に投じられ、その䌚瀟ずその顧客にどんなリタヌンを生むず考えられるでしょうか。 2. 差異化芁玠を生み出す人材、プロダクトやその玠材 䞀般に、どこにリ゜ヌスを投䞋するこずが最も効率よく事業を成長させるか、「おこ」ずなる堎所は事業皮別により異なりたす。そのため、調達資金の重点投䞋先も異なりたす。䟋えば、䌁業向け業務系SaaSの堎合は営業やカスタマヌサクセスの人員、個人向けゲヌムやコンテンツであればその制䜜費や広告宣䌝費に倚くを投じるでしょう。AIスタヌトアップの堎合、それらに加えお独自のデヌタセット、蚈算資源を投䞋した孊習、抱える研究者の技術によりもたらされる独自のモデル、それらを利甚シヌンず結合させるアプリケヌション開発、プロフェッショナルサヌビスによる課題ごずにカスタマむズをした察応などが競争力ず成長の源泉ずなりたす。 ゞェネラティブAI、特に画像生成AIの付加䟡倀や差異化芁玠は、どう生み出されるのでしょうか。ここでは 「人材やステヌクホルダ」 が 「プロダクトを生み出す玠材や道具」 に䜜甚し、 「法芏制ず倫理芳」 の制玄䞋で 「プロダクト」 を生み出すずモデル化したす。各芁玠を詳しく芋おいきたしょう。 2.1. 人材やステヌクホルダ 䞻芁な人材やステヌクホルダには、 「クリ゚むタヌ」「アプリケヌション開発者」「研究者」 が挙げられるでしょう。たた、領域間の越境人材も芋られたす。 クリ゚むタヌ 「絵を描く」「CGを制䜜する」ずいった掻動をするクリ゚むタヌは、アマチュアかプロかを問わず、既に自身の制䜜プロセスに画像生成AIを取り入れ始めおいたす。日本での䞀郚事䟋を挙げたす。 深接貎之氏 は、Stable Diffusion前倜の蚘事 10 で耳目を集め、SFマガゞン 23幎2月号衚玙の制䜜 11 などいちはやく制䜜珟堎に取り入れおいたす。 852話氏 は、Midjourney、Stable Diffusionを掻甚した矎麗な画像を日々発衚し、画像生成AI初の玙刷り画集を出版したした。 暪原倧和氏 や 霋藀地氏 は、元々3D CGに匷みを持ちながら、画像生成AIを制䜜プロセスに取り入れた習䜜䟋を日々発信されおいたす。 アプリケヌション開発者 機械孊習モデル党般に蚀えるこずですが、モデルがあるだけでは「詊す」こずはできおも「継続しお䜿う」こずは困難です。利甚シヌンに合わせたツヌルやアプリケヌションに埋め蟌たれお初めお真䟡を発揮したす。アプリケヌションを開発し、継続的に改善できる゚ンゞニアが必芁です。 たた、アプリケヌションには二皮類ありたす。既にあるアプリケヌションやWebサヌビスに機胜芁玠を足すケヌスず、スタンドアロンで新芏アプリケヌションを開発するケヌスです。Lexica.artの Sharif Shameem氏 や、LINEボット お絵描きばりぐっどくん の生みの芪である 西野颯真氏 は埌者の䟋ず蚀えるでしょう。埌段の「プロダクト」の項目でも取り䞊げたす。 研究者 ゞェネラティブAI領域にもずもず関心があった研究者が、今回のブヌムを受け䞀歩早く動き出しおいたす。䞀䟋に、Google Brainの著名な研究者であった David Ha (hardmaru) 氏 は、Stability.aiにHead of Strategyずしお移籍したした。Stable Diffusion以前に静かな盛り䞊がりを芋せたDisco Diffusion界隈のオヌプン゜ヌス掻動をしおいた研究者は、耇数がMidjourneyぞ立䞊げメンバ等ずしお参画したした。 2.2. プロダクト 䞊に挙げるような人材やステヌクホルダにより生み出されるプロダクトには、どんなものがあるでしょうか。 アヌリヌステヌゞ、テック䌁業向け投資を䞻に手がけるベンチャヌキャピタル Andreessen Horowitz (a16z) は、画像生成に限らず、ゞェネラティブAIの「今」を捉える蚘事を発衚しおいたす。2022幎11月には、「Art Isn’t Dead, It’s Just Machine-Generated (アヌトは死なない。ただ機械が生成する) 12 」「The Generative AI Revolution in Games (ゲヌム業界における生成AI革呜) 13 」の2本が掲茉されたした。 「Art Isn’t Dead, It’s Just Machine-Generated」では、コヌド自動生成 (Copilot等) ず画像生成を比范しお取り䞊げおいたす。前者に求められる厳密さに察しお画像生成は既に十分実甚に耐える出力ができる点ず、画像生成AIのハむプは (関連リポゞトリのGitHubスタヌ数ベヌスでは) ブロックチェヌンブヌム等を遥かに凌駕する点に觊れ、画像生成などのゞェネラティブAIが䞀気に普及するず論じおいたす。「2022幎末のむンタヌネットアヌカむブが、人間が倚くを生成した最埌のリポゞトリずしお倧切にされる日が来るかもね」ずいう締めが印象的です。 「The Generative AI Revolution in Games」では、コスト・品質・スピヌドのうち2぀しか取れないトレヌドオフ問題の終焉、産業の䞭では耇雑性・リアルタむム性が高いゲヌム業界が最も倧きな圱響を受けるだろう、ず論じおいたす。 ここでは、掻甚が期埅される画像生成AIプロダクトに぀いお、「四階建お」の構造でモデル化しお議論を進めたす。プロトタむプフェヌズず、補品フェヌズでも構造が倚少異なるず蚀えたすが、本皿では詳现を省きたす。 䞋階から䞊階に積み䞊げる圢で、 「基瀎ずなる画像生成モデル」「远加孊習等によるカスタマむズ」「アプリケヌション」「掻甚プロセス」 ず、各階の様子を芋おみたしょう。 䞀階基瀎ずなる画像生成モデル 䞀階は「基瀎ずなる画像生成モデル」です。画像生成には、Imagen、DALL-E2、Midjourney、Stable Diffusionなど著名なモデルがありたす。 䞀郚䌁業を陀き、「䞀からの孊習」に必芁な蚈算資源ぞ安定しおアクセスするこずは困難です。基瀎ずなる画像生成モデルの䞀぀であるStable Diffusionの公開は、䞀階郚分をGoogle、OpenAIなどの埓来からマシンパワヌずキャッシュに䜙裕のある䌁業に独占された状態ずさせず、二階より䞊で起こるむノベヌションに匵っおみたものず蚀えたす。様々な議論を呌び぀぀も、爆発的に「远加孊習」「アプリケヌション」「掻甚プロセス」䟋が出お、むノベヌションが加速されたこずは確かです。 二階远加孊習等によるカスタマむズ 二階は「远加孊習等によるカスタマむズ」です。カスタマむズのためには、たず基瀎ずなるモデルを手元に持぀必芁がありたす。加えお、ここには研究知芋やそれを実装する胜力、孊習に䜿うデヌタセットず蚈算資源が必芁ずなりたす。具䜓䟋ずしおは、拡散生成モデル郚分の再孊習に加えお、Textual Inversion、DreamBooth、Hypernetworks、LoRAなど、孊習の箇所や方法に䞀定の制玄を加える方法がありたす。「ガチャに頌らず、想定した衚珟を䞀発で生成するにはどうしたら良いか」は、この秋冬の倧きな研究テヌマずなっおいたす。 たた、 远加孊習されたモデルは、「公開されないケヌス」「公開されるケヌス」 がありたす。さらに「公開されないケヌス」には、料金を取り利甚できるケヌスず、掻甚プロセスに隠蔜され䜿われる堎合がありたす。 公開されないケヌス AIピカ゜が、先日12月20日に発衚した「AIいらすずや」 14 は、この二階郚分の技術ず、フリヌのむラストサむト「いらすずや」ずの提携によりデヌタセットを䜿い実珟した、「無限にいらすずや颚クリップアヌトを生成できる」機胜です。 公開されるケヌス Hugging Faceの Stable Diffusion Dreambooth Concepts Library には、DreamBoothにより远加孊習した様々なモデルが170以䞊公開されおいたす。 䞉階アプリケヌション 䞉階は「アプリケヌション」です。䞀階や二階郚分を掻甚しながら、コヌディングを前提ずしお、アプリケヌション郚分の実装を差異化領域ずできたす。先ほどアプリケヌションには 「既存アプリやWebサヌビスに機胜を足すケヌス」 ず 「新芏アプリを開発するケヌス」 があるず述べたした。 「既存アプリやWebサヌビスに機胜を足すケヌス」 の既存アプリケヌションには、Photoshop、Figmaなどが挙げられたす。これらは、既にクリ゚むタヌの制䜜プロセスに深く浞透しおいたす。以䞋のようなサヌドパヌティプラグむンが発衚されおいたすが、今埌半幎から䞀幎で公匏機胜ずしおの実装が進むこずでしょう。 Adobe Photoshopは高機胜な画像線集゜フトりェアです。 Nicolay Mausz氏 による flying dog for Stable Diffusion は、Adobe Exchange䞊で89米ドルにお販売され、Stability.ai偎のサヌバぞ描画リク゚ストを送るこずによるクラりドでの動䜜、䞡方をサポヌトしおいたす。 Figmaは共同線集をしながらむンタフェヌスデザむンを行えるツヌルです。 Antonio Cao氏 により、 Ando - Your design copilot ずいう名前で、Stable Diffusionのプラグむンが公開されたした。生成枚数が42枚/月に制限されたFree版、月額18米ドルのPro版の料金プランがありたす。 営利䌁業による補品だけではありたせん。 GIMPはオヌプン゜ヌスの画像線集゜フトりェアですが、 BlueTurtleAI氏 により、GIMPプラグむンがMITラむセンスで公開されおいたす。 「新芏アプリを開発するケヌス」 はどうでしょうか。 埓来Webアプリケヌション開発を行なっおいた䌁業や゚ンゞニアが、画像生成AIを玠材ずしお遞び、他に先駆けサヌビスずしおリリヌスする䟋がありたす。 既存アプリケヌションが同様の機胜を実装しおきおも差異化芁玠を持ち続けられるかは、「䞀発芞」で終わらず、継続した利甚シヌンの探玢ず新機胜のリリヌスが倧切ずなるでしょう。 日本ではお絵描きばりぐっどくんのようなLINEボット、AIピカ゜のようなスマヌトフォンアプリがリリヌスされおいたす。 なお、䞀階や二階郚分のリリヌスず共に簡易アプリケヌションずしお公開される堎合に、できるだけ䞉階郚分の実装を軜くするため、DiscordやHugging Face䞊のGradioアプリケヌションなどをフロント゚ンドずしお掻甚するケヌスも芋られたす。 四階掻甚プロセス 四階は「掻甚プロセス」です。コヌディングを前提ずせず、クリ゚むタヌやアヌティストにより、生成におけるコツや他制䜜ツヌルずの組み合わせ発芋など 「制䜜プロセスの効率化や独自色の付加」 や、 「生成コンテンツのキュレヌション」 などが行われたす。 ゞェネラティブAIを人間が掻甚する際、「サンドむッチワヌクフロヌ」が普及する 15 ず蚀われたす。 サンドむッチワヌクフロヌ 人間がAIに指瀺を䞎える䟋画像生成AIぞのプロンプト提瀺 AIが生成オプションを提瀺する䟋耇数皮類の画像生成 それを人間が遞択し、仕䞊げる䟋画像に察するレタッチ、コラヌゞュ、別ツヌルぞの取蟌み・線集などの仕䞊げ 発明された掻甚プロセスは、クリ゚むタヌやその集団の「秘䌝のタレ」ずしお非公開ずするケヌスもあれば、䞀般に公開するケヌスもありたす。公開され、か぀利甚頻床が高いものは、䞉階のアプリケヌションレベルで実装され、コモディティ化したす。 2.3. プロダクトを生み出す玠材や道具 プロダクトを生み出す、たたそれを改善し続けるためには、人材に加えお 「研究知芋」「蚈算資源」「デヌタセット」 などの玠材や道具が必芁ずなりたす。 研究知芋 論文の圢で様々な研究知芋の公開が続きたす。機械孊習系の囜際カンファレンスが開催されるごずに、ゞェネラティブAI系の知芋が曎新されおいたす。この秋は画像生成AIのカスタマむズ、及び画像の次ずしおの映像、音楜、3Dモデルなどの生成に぀いおの論文が倚数公開され、耳目を集めたした。 この分野の論文は、Arxivにプレプリントずしお公開され、すぐに個別のDiscordでそれらが論じられたり、Twitterでの拡散が進みたす。同時に、たたはその埌、GitHubやHuggingFaceぞの著者による公匏実装やコミュニティによる再実装公開や、同様に著者たたはコミュニティによるGradio等のプロトタむプアプリ、デモが公開され、それを詊した人々によりアプリケヌションなどぞの取り蟌みが進むずいうのがよく芋られる流れです。ただし、論文化される前に特蚱が出願されおいるケヌスがあり、゜ヌスコヌドが公開されおいる堎合もラむセンスに気を぀けお掻甚する必芁がありたす。 蚈算資源 2018幎のOpenAIの蚘事に、「How AI Training Scales (AIの孊習はどのようにスケヌルするか) 16 」がありたす。その埌数幎で、倧量のデヌタで孊習させ、様々なタスクにカスタマむズを行える基盀モデルの掻甚が増え、そのサむズは増加の䞀途を蟿っおいたす 17 。倧量のデヌタセット収集、及びその暩利関係の敎理ずずもに、モデルの孊習に必芁ずなる膚倧なマシンパワヌを持぀こずが、差異化に必芁ずなりたした。 孊習甚の蚈算資源ず䞀口に蚀っおも、前述の通り 「䞀からの孊習」「远加孊習重め」「远加孊習軜め」 ず皋床が異なりたす。ここは、2.2. プロダクトの「䞀階」「二階」に察応 䞀からの孊習䟋 画像生成などのゞェネラティブAIを䞀から孊習するには、膚倧な蚈算資源が必芁です。Stable Diffusionの圓初リリヌスモデルの孊習においお、60䞇米ドル (箄8200䞇円) を投じたした 18 。NVIDIA A100を256枚、15侇GPU時間を投じたずされおいたす。 远加孊習重め䟋 継続する䌁業運営のための資金調達ではなく、単発の孊習に必芁な資金をクラりドファンディングで集める䟋もありたす。Stable DiffusionのフォヌクであるUnstable Diffusionは、Kickstarterプロゞェクトを立ち䞊げ、25千米ドル (箄350䞇円) のゎヌルを蚭定したしたただし、その埌Kickstarterによりプロゞェクトは停止 19 。クロヌズ埌6週間をかけおデヌタセット準備、孊習を進め、モデルを配垃する予定ずされおいたした。これは、公開されたStable Diffusionモデルをベヌスずした远加孊習であり、1億円匱よりは倧幅にコストが抑えられたす。 远加孊習軜め䟋 特定のスタむル、キャラクタヌ、人物に特化した制埡可胜な画像生成AIを孊習により䜜る堎合、より小さなスケヌルで孊習を行い、カスタムの孊習モデルを提䟛できたす。手法が確立されおいれば、孊習に1時間ずかからず、蚈算資源のコストは䞀件数千円以䞋の䞖界です。 デヌタセット Stable Diffusionの孊習においお、 LAION ずいうオヌプンなデヌタセットが重芁な圹割を果たしたした。画像生成AIにおいおは、以䞋のデヌタセットが掻甚されおいたす。 むンタヌネット等に公開されたデヌタを、スクレむピング等で収集したもの 䌁業所有など非公開でストックされおいるもの 前者の公開されたデヌタであっおも、公開経緯が著䜜暩などに配慮をしないものであるず、それらを䜿っお良いのかずいう法的、倫理的問題をはらみたす。 蚀語や画像のデヌタはむンタヌネットに莫倧な量があり、日々生み出されおいたすが、孊習で䜿い果たすこずが来るかもしれたせん。 珟状、蚀語は2040幎に枯枇、高品質に限定するず2024幎に枯枇、画像は2038幎に枯枇するのではず、過去トレンドず蚈算機の制玄をもずに掚定した䟋 20 がありたす。 ゞェネラティブAIにより生成されたコンテンツが指数関数的に増え始めるず、やがお孊習察象に無芖できない量での混入も始たるこずでしょう。 3. 考慮すべき制玄 ゞェネラティブAI、特に画像生成AIにおける付加䟡倀や差異化芁玠は、 「プロダクトを生み出す玠材や道具」 に 「人材やステヌクホルダ」 が䜜甚し、 「法芏制ず倫理芳」 の制玄䞋で 「プロダクト」 が生み出されおいるずモデル化しお話を進めおきたした。制玄ずしお意識すべき 「各囜の法解釈ず芏制」 や 「察象コミュニティの倫理芳」 に぀いお芋おいきたしょう。 3.1. 各囜の法解釈ず芏制 STORIA 柿沌倪䞀匁護士が、AI界隈の事情に぀いお以前より情報発信 21 をされおいたす。2022幎11月には画像生成AIの日本囜内法に぀いおのセミナヌが開催され、録画ず資料が無料公開 22 されたした。 たた、画像生成AIの著䜜暩に぀いおは各囜各様の察応が行われおいたす。Skyland Ventures 䞭村公哉匁護士 23 によるず、英囜はAIの生成物に著䜜暩を認める方向であるのに察し、米囜や日本は積極的な人間の関䞎があるかどうかにより認められるかどうかが倉わる 24 ず解釈されおいるようです。䞭囜は、囜内で流通させるコンテンツを生成するAIに察しお新たな芏制が発衚されたした。ゞェネラティブAIの提䟛者は、ナヌザの身元を確認し、コンテンツ管理をするこず、そしお人間の顔やリアルなシヌンの生成時はAIによっお生成されたこずを明瀺するこず、ずしおいたす 25 。 3.2. 察象コミュニティの倫理芳 ゞェネラティブAIは、たず画像生成を䞭心にクリ゚むタヌの間で倧きな議論を巻き起こしおいたす。䞻なものは、 「AI制䜜物」「孊習デヌタセット」 の扱いです。前者は、制䜜コストの䜎い画像生成AI䜜品が増え、人手による䜜品の存圚感・重芁床䜎䞋ず、䞭長期での産業自䜓の衰退に繋がるのではずいう芖点、埌者は孊習に䜿われたデヌタセットの䜜者の暩利はどこたで守られるべきかずいう点です。各プレヌダは、自身の関わりの深いステヌクホルダからの反響を泚意深く芳察しながら、それぞれの立ち䜍眮を暡玢しおいるようです。法的に正しいかだけでなく、心情ずしお受け入れられるかも倧きな課題です。 画像玠材などのコンテンツを扱うサヌビスやナヌザ投皿型のむラストや写真ギャラリヌでは、画像生成AIを䜿った制䜜物ぞの察応方針が分かれおいたす。画像玠材提䟛サヌビス Adobe Stockは、AI䜜品投皿を条件付きで認めるずしたした。ナヌザ投皿型のむラストサむトであるpixivも同様の方針です。画像玠材提䟛サヌビス Shutterstockは、OpenAIのDALL-E2を自瀟サむトに統合、孊習に䜿われた画像の䜜者ぞの分配の仕組みを䜜る 26 ずしたした。䞀方で、画像玠材提䟛サヌビス Getty Imagesは法的リスクを理由に投皿を受け付けないずしおいたす。クリ゚むタヌが所属するプラットフォヌム䞊で画像生成AIを展開するこずには、法芏制だけでなく、様々な倫理芳をファシリテヌトする難しさがありたす。 今埌、この倫理芳ず技術発展を芋ながら、法芏制に぀いおも曎新されおいくものず思われたす。 たずめ 画像を䞭心ずしたゞェネラティブAIを取り巻くビゞネス、技術応甚、法埋その他を抂芳するこずを詊みたした。 画像生成AIの盛り䞊がり ゞェネラティブAIのビゞネス機䌚ず投資 差異化芁玠を生み出す人材、プロダクトやその玠材 考慮すべき制玄法解釈ず芏制、コミュニティの倫理芳 さらに、画像生成AIやそれを䜿ったプロダクトがどう生み出されるかを、 「プロダクトを生み出す玠材や道具」 に 「人材やステヌクホルダ」 が䜜甚し、 「法芏制ず倫理芳」 の制玄䞋で、 「プロダクト」 ずモデル化し、関わる芁玠をさらに抂芳したした。 人材やステヌクホルダ クリ゚むタヌ アプリケヌション開発者 研究者 プロダクト 基瀎ずなる画像生成モデル 远加孊習等によるカスタマむズ アプリケヌション 掻甚プロセス プロダクトを生み出す玠材や道具 公開された知芋 蚈算資源 デヌタセット 考慮すべき制玄 各囜の法解釈ず芏制 察象コミュニティの倫理芳 これからの数ヶ月・数幎スパンで、画像生成AIやゞェネラティブAI党般が䞊に挙げた芁玠の動的な盞互䟝存関係の䞭でどう瀟䌚に浞透しおいくか、目撃できるこずが楜しみですね。たた、本蚘事がそれらの流れを読み解く、たたは予枬するための䞀助ずなれば幞いです。 Stable Diffusion を基瀎から理解したい人向け論文攻略ガむド (ステヌト・オブ・AIガむド) ↩ 䞖界に衝撃を䞎えた画像生成AI「Stable Diffusion」を培底解説 - Qiita ↩ "The Illustrated Stable Diffusion" by Jay Alammar ↩ What’s New in Artificial Intelligence from the 2022 Gartner Hype Cycle™ | Gartner ↩ Investors seek to profit from groundbreaking ‘generative AI’ start-ups | Financial Times ↩ Stability AI, the startup behind Stable Diffusion, raises $101M | TechCrunch ↩ Runway Raises $50 Million At $500 Million Valuation As Generative AI Craze Continues | Forbes ↩ https://twitter.com/sharifshameem/status/1562455690714775552 ↩ https://twitter.com/danielgross/status/1575149080124313600 ↩ 䞖界倉革の前倜は思ったより静か深接 貎之 (fladdict)note ↩ 史䞊初、SFマガゞンの衚玙がAIむラストに 特集は「AIずの距離感」NEWS Weekly Top10 - ITmedia NEWS ↩ Art Isn't Dead, It's Just Machine-Generated | Andreessen Horowitz ↩ The Generative AI Revolution in Games | Andreessen Horowitz ↩ あの「いらすずや」が画像生成AIに モバむルアプリ「AIピカ゜」が画颚を習埗 - 窓の杜 ↩ Generative AI: autocomplete for everything | Noahpinion ↩ How AI Training Scales | OpenAI ↩ https://twitter.com/emollick/status/1584743837637160960 ↩ https://twitter.com/EMostaque/status/1563870674111832066 ↩ Unstable Diffusion: Unrestricted AI Art Powered by the Crowd (Suspended) by Unstable Diffusion — Kickstarter ↩ https://twitter.com/bioshok3/status/1598144094068359168 ↩ AI開発を円滑に進めるための契玄・法務・知財 | slideshare ↩ https://twitter.com/tka0120/status/1598238927403372544 ↩ https://twitter.com/kimiya_nakamura ↩ 画像生成AIをめぐる倫理的問題の最新事情。各囜で分かれる察応ずは | モリカトロンAIラボ ↩ 䞭囜が画像生成AIの画像に「AI生成マヌクの衚瀺」を矩務化AIナヌザヌも実名登録制ぞ - GIGAZINE ↩ Shutterstock will start selling AI-generated stock imagery with help from OpenAI - The Verge ↩
この蚘事は、 NTT Communications Advent Calendar 2022 24日目の蚘事です。 はじめに むノベヌションセンタヌの朚村ず申したす。初めおのアドベントカレンダヌ&Engineers’blog投皿です。普段の業務は、機械孊習をもちいた時系列デヌタ分析の研究開発やお客様デヌタ分析案件支揎を䞻ずしお行っおいたす。プラむベヌトでは自転車にお熱でZwiftでバヌチャルラむドをしたり、最近ではテクニック向䞊のためバニヌホップの緎習に励んでいたすなかなか䞊達したせん 。 今日はクリスマスむブずいうこずで、 時系列デヌタ分析コンテンツ「ごちきか」 をプレれントしたす幎末䌑みのお䟛にぜひご照芧ください。 サマリヌ 時系列デヌタ分析コンテンツ「ごちきか」を公開したした 䜙談ずしお基盀やデプロむ方法を玹介したす What is 「ごちきか」 私たちのチヌムでは、瀟䌚・産業DXのためのSmart World の䞀貫ずしお、 時系列デヌタ分析手法の研究開発、お客様のデヌタ分析支揎や瀟内デヌタ分析人材育成 を行っおいたす。 【最近の研究開発成果】 NTT Comの開発した芁因分析手法がAISTATS2022にお採択 www.ntt.com 2022幎床人工知胜孊䌚党囜倧䌚 (JSAI2022) で発衚しおきた話 〜因果探玢線〜 engineers.ntt.com たた、これらの研究開発成果は、同じくむノベヌションセンタヌで開発しおいる ノヌコヌドAI開発ツヌルNode-AI に搭茉されおいきたすので、こちらもぜひご芧ください。詳しくは、以䞋の公匏サむトずEngineers’Blogをご参照ください。 sdpf.ntt.com engineers.ntt.com この ごちきかgochikikaプロゞェクト は、これら研究開発成果や瀟内向けデヌタ分析人材育成コンテンツをたずめたナレッゞベヌスです。䞻に補造業の時系列デヌタを察象ずしお、前凊理からモデリングたで基本的な分析手法をPythonの゜ヌスコヌド付きで解説しおいたす。 Why ごちきか 䞖の䞭にはありがたいこずにたくさんのデヌタ分析に関するドキュメントがありたすい぀も参考にさせおいただいおいたす。しかし、私たちの興味のある時系列デヌタ分析特にプラント向けのようなドメむン知識に玐づくものに぀いおは倚くはなく、䟋えば新入瀟員の教育の際に困るこずがありたした。 さらに、孊䌚発衚資料やコヌドが個人管理のPCやGitHubに分散しおおり、チヌムの研究開発成果や怜蚌結果が属人化しおいたっおいたした。瀟内向けラむブラリを䜜るこずも詊したしたが、ナヌザヌ䞍圚で維持管理コストが高く普及したせんでした。そこで、ラむブラリ化の前段ずしお、ドキュメント化第䞀で考え、䞀元管理するこずずしたした。研究者のアりトプットずしおもドキュメント化は重芁であるず考えたした。 本蚘事の投皿は、私たちの取り組み内容や研究開発、興味がある分野に぀いお知っおもらうこずが目的の1぀です。 How to ごちきか それぞれの蚘事は、なるべくそのペヌゞ内でコヌドが完結するようにしおいたす。したがっお、䞀郚数匏が倚く難しく芋えるかもしれたせんが、基本的なPythonの䜿い方がわかればコピヌペヌストで詊すこずができたす。 いく぀かコンテンツが含たれおいたすが、珟圚は2぀の項目に倧別されおいたす。 分析 䞻に補造業の時系列デヌタを察象ずしお、基本的な分析手法をPythonコヌド付きで解説しおいたす。 内郚で開発した酢酞ビニルプラントシミュレヌタヌから生成したデヌタを䜿甚 可芖化、前凊理、モデリング、孊習の実行たで䞀連の分析が可胜。䟋えば以䞋のようなコンテンツがありたす。 可芖化: matplotlibを䜿った 時系列デヌタの可芖化 , スペクトル解析 前凊理: 次元削枛 , 次元圧瞮 モデリング: PLSモデル , ガりス過皋回垰モデル å­Šç¿’: クロスバリデヌション , ハむパヌパラメヌタ最適化ベむズ最適化 特集蚘事 比范的新しめであったり難易床の高い手法や、私たちの取り組みを知っおもらうための孊䌚発衚資料が掲茉されたす。たた䞀郚未分類なコンテンツが栌玍されおいたす。 䟋えば、倉数間の䟝存関係をはかる Hilbert-Schmidt独立性基準 や、Trace LASSO/Graphical LASSOずいった 発展的なスパヌスモデリング手法  がありたす個人的な掚しコンテンツです。 基盀に぀いお 私たちの䞻な業務は研究開発やデヌタ分析なので、その片手間でサヌバヌやセキュリティ察策を完党には運甚しきるこずは難しいです。そこで、以䞋を目的ずしおごちきか基盀を䜜成したした。 【モチベヌション】 ドキュメント執筆に泚力したい 実隓ノヌト=Jupyter Notebookをそのたた䜿いたわしたい ⇒ MyST-NB むンフラにずおも詳しいわけではない。でもやるからには䟿利なシステムにしたい サヌバヌレスセキュリティ察策、運甚コストの䜎枛 蚘事投皿から自動で配信 ⇒ GitHub Actions, AWS MyST-NB をベヌスずした静的サむトをGitHub Actionsでビルドし、AWSで配信するこずずしたした。抂略図は以䞋の通りです。 MyST (MyST-NB) MyST は、Jupyterの゚コシステム䞊で蚈算科孊のドキュメント化を行う Executable Book Project の䞭栞をなすOSSで、Markdownを拡匵し柔軟な蚘述を可胜にしたものです。Pythonにはドキュメンテヌションビルダヌ Sphinx がありたすが、 recommonmark ずいうファむルフォヌマットを䜿甚しおおり、Markdownになれたナヌザヌからするず少々蚘述に癖がありたした。なおrecommonmarkの開発は終了しおおり、MySTぞの移行がすすめられおいたすMySTはrecommonmarkの文法も䜿甚可胜。 このSphinx+MySTベヌスで、Jupyter Notebookをhtmlやpdfのドキュメントに倉換するものが MyST-NB です。なお以埌の説明ではMySTずMyST-NBをたずめお、MySTず蚘茉したす。 前述の通り、MySTは暙準のMarkdownをJupyter Notebookで扱うだけではなく、リッチな機胜を有しおいたす。数匏のレンダリングはもちろんのこず、泚意曞きを瀺すAdmonition、長すぎるコヌドをトグル圢匏で隠す機胜、Plotlyやipywidgetsを䜿ったむンタラクティブな描画が可胜です。さらに、コンパむル時にJupyter Notebookを実行するテスト機胜もありたす機械孊習では蚈算時間がかかるためあたり向きたせんが。 実際にごちきかのコンテンツ、 デヌタセット集, Electricity Transformer Temperature では、admonition、セルの非衚瀺、Plotlyを䜿ったプロットをサンプルずしお瀺しおいたす。 GitHub Actions ゜ヌスコヌドの管理は䌚瀟契玄のGitHub Enterpriseで行っおいたす。契玄しお敎備しおくださった方々に感謝。 蚘事のクオリティを担保し、執筆者以倖にも最䜎䞀人は知識を展開するバス係数を䞊げるため、 GitHub Flow に埓った線集フロヌを採甚しおいたす。 執筆蚘事に察するレビュヌが完了するず、公開甚のブランチにマヌゞされ、これをトリガヌずしおGitHub Actionsが起動したす。ActionsはMySTをもちいおJupyter Notebookをhtmlにビルドし、AWS S3にアップロヌドしたす。これにより、手動ビルドの必芁なく自動で曎新䜜業が枈みたす。たた、逐次ビルドするため通垞のGitHub Pagesのようにビルド埌の゜ヌスを管理する必芁もありたせん最近だず ベヌタ版 ずしおPagesでもActionsが䜿えるようになったようです。 AWS AWSでは、ビルドされたコンテンツをS3に栌玍し、Route53ずCloudFrontで配信したす。サヌバヌレスな構成になっおいるので、運甚コストを䞋げるこずができたした瀟内向けだったこずもあり、月額利甚料金換算でも1ドル以䞋。 基本的な蚭定は以䞋の公匏ドキュメントに埓っおいたす。 docs.aws.amazon.com たずめ 時系列デヌタ分析コンテンツ「ごちきか」を公開したした。ごちきかは、時系列デヌタ分析手法や研究開発成果をPythonコヌド+その解説蚘事ずしおたずめ、広く公開するものです。みなさたのデヌタ分析の䞀助ずなれたら幞いです。 私たちの取り組みに興味がございたしたら、時系列デヌタ解析/予枬/異垞怜知/最適化を察象ずしたPoC、各皮究機関ずの共同研究案件、Node-AIのご契玄を募集䞭ですので、ご興味があればこちらたでご連絡ください(メヌルai-deep-ic[at]ntt.com) たた、 侭途 /新卒採甚も実斜しおおりたすので是非゚ントリヌください。 今埌は、ただただ茉せきれおいない孊䌚発衚資料や、デザむン的に぀たないずころがあるので改善しおいきたいです。面癜い研究成果が出たしたらEngineers’Blogに寄皿宣䌝させおください🙇 明日はいよいよ最終日トリの蚘事もお楜しみに
この蚘事は、 NTT Communications Advent Calendar 2022 23 日目の蚘事です。 はじめに こんにちは、デゞタル改革掚進郚の組橋です。普段は瀟内デヌタの敎備や分析をしおいたす。 この蚘事では、瀟内ツヌルなどの自䜜ツヌルを管理する方法や関連するサヌビスを玹介したす。 パッケヌゞリポゞトリずは パッケヌゞ ゜フトりェアにおけるパッケヌゞずはいく぀かの機胜を1぀にたずめお、管理しやすくしたものを指したす。 䟋えば、Pythonのパッケヌゞは pip コマンドでむンストヌルできたす。 pip install $PACKAGE_NAME リポゞトリ リポゞトリは、保管堎所ずいう意味がありたす。 パッケヌゞリポゞトリはパッケヌゞの保管堎所です。単にリポゞトリずいうず最近はGitリポゞトリを指すこずが倚いですが、これは゜ヌスコヌドの保管堎所ですね。 䟋えば、Pythonの公匏パッケヌゞリポゞトリは Python Package Index (PyPI) であり、 pip でむンストヌルする際のデフォルトの参照先に指定されおいたす。 自分たち専甚のパッケヌゞリポゞトリ Pythonに限らず他の蚀語にも公匏のパッケヌゞリポゞトリがあり、公開されおいるパッケヌゞを利甚しお開発するこずは䞀般的です。 公開されおいるパッケヌゞに自分たちのほしいものがないずき、自䜜するこずはよくあるこずかず思いたす。 しかし、プロゞェクトごずにツヌルを䜜っお utils や tools みたいなディレクトリに眮いおいくず、䌌たようなツヌルが散乱しおしたいたす。 そこで、自分たち専甚のパッケヌゞリポゞトリを甚意するず、ツヌルの配垃や管理が䟿利になりたす。 リポゞトリがあるこずで再利甚が促進され、開発効率が䞊がるかもしれたせん。 Pythonのプラむベヌトパッケヌゞリポゞトリ Pythonで独自のパッケヌゞリポゞトリを甚意するには、 pypiserver を甚いる方法が簡単です。 pypiserver自身もPython補なので pip でむンストヌルできたす。 pip install pypiserver 本番運甚はリポゞトリ甚のVMなどで実行するかず思いたすが、ここではロヌカルで実行する方法を玹介したす。 はじめに、 htpasswd コマンドで htpasswd.txt ファむルを䜜成したす。デフォルトではMD5で生成されたす。 $ htpasswd -c htpasswd.txt $USERNAME New password: Re-type new password: Adding password for user USERNAME pypi-server run コマンドを実行するこずでサヌバが起動したす。匕数に指定しおいる ./packages はパッケヌゞを栌玍するディレクトリです。 pypi-server run -p 8080 -P htpasswd.txt ./packages パッケヌゞをアップロヌドする方法は公匏のPyPIず同様です。 䟋えば、 setuptools を甚いおパッケヌゞをアップロヌドするには、 ~/.pypirc にリポゞトリのサヌバ情報を曞きたす。 [distutils] index-servers = local [local] repository: http://localhost:8080 username: $USERNAME password: $PASSWORD --repository たたは -r オプションを䜿甚するず、 ~/.pypirc に蚘茉した蚭定を䜿甚しおアップロヌドできたす。 python setup.py sdist upload -r local 暙準ラむブラリである setuptools を甚いた方法を玹介したしたが、Pythonでパッケヌゞを䜜成する堎合、 Poetry もおすすめです。 今回のテヌマから逞れるので説明は割愛したすが、興味がある方はぜひ觊っおみおください むンストヌルするには -index-url たたは --extra-index-url のオプションでリポゞトリのURLを指定したす。 オプションではなく、環境倉数に蚭定する方法や pip.conf に蚘茉する方法もありたすが、ここでは割愛したす。 pip install --extra-index-url http://localhost:8080 $PACKAGE_NAME 専甚リポゞトリを導入するメリットの1぀ずしお、䞊蚘のように公匏のパッケヌゞず同じ圢匏䟋えば pip install でむンストヌルできるこずがありたす。 プラむベヌトパッケヌゞリポゞトリサヌビス 前節では独自にサヌバを立おおリポゞトリを運甚する玹介したしたが、 Gemfury や AWS CodeArtifact などパッケヌゞリポゞトリのサヌビスが存圚したす。 Gemfury Gemfury は叀くからあるサヌビスで、パッケヌゞリポゞトリに特化しおいたす。たた、察応しおいる蚀語も豊富です。 䞻にナヌザ数で課金される Personal プランず、アップロヌドできるプラむベヌトパッケヌゞ数で課金される Team プランの2皮類がありたす 1 。 Gemfuryのリポゞトリにパッケヌゞをアップロヌドする方法はいく぀かありたす。 以䞋の方法を甚いるこずで蚀語を問わず、同じようにアップロヌドできたす。 curl コマンド Gemfury CLI GemfuryのWebペヌゞGUI ここでは Gemfury CLI を利甚する方法を玹介したす。 Homebrew を䜿甚しおむンストヌルできたす。 Homebrew以倖のむンストヌル方法に぀いおは、 こちらのドキュメント を参照しおください。 brew tap gemfury/tap brew install fury-cli login コマンドでログむンしたす。 $ fury login Please enter your Gemfury credentials. Email: : youremail@domain.com Password: : ******** You are logged in as " USERNAME " push コマンドでパッケヌゞをアップロヌドできたす。 fury push $PACKAGE_FILE Pythonパッケヌゞの堎合は、前述した ~/.pypirc を利甚するこずもできたす。 [fury] repository: https://pypi.fury.io/$USERNAME/ username: $TOKEN password: アップロヌドしたPythonパッケヌゞをむンストヌルするには、自䜜リポゞトリず同様にリポゞトリのURLを指定したす。 pip install --extra-index-url https://pypi.fury.io/ $ACCOUNT / $PACKAGE_NAME プラむベヌトなパッケヌゞの堎合はトヌクンを䜿甚したす。 pip install --extra-index-url https:// $TOKEN :@pypi.fury.io/ $ACCOUNT / $PACKAGE_NAME AWS CodeArtifact CodeArtifact は、AWSのサヌビス矀の1぀です。 基本的な䜿甚方法はGemfuryず倧きく倉わらないため詳现は割愛したすが、furyのように専甚のCLIやGUIからのアップロヌドはできたせん。 指定されたリポゞトリのURLずトヌクンを甚いおアップロヌドしたす。 トヌクンは、AWS CLIで発行できたす 2 。 たた、トヌクンの有効期限は最倧12時間ずいった制限がありたす。 察応蚀語の比范 玹介したサヌビス以倖にも類䌌サヌビスはいく぀かありたす。 ここでは、各サヌビスで察応しおいるプログラム蚀語の察応衚を玹介したいず思いたす。 なお、察応衚にはプログラム蚀語に限定しお蚘茉しおいたす 3 。 Gemfury AWS CodeArtifact GCP Artifact Registry Azure Artifacts GitHub Packages PyPI (Python) ○ ○ ○ ○ - RubyGems (Ruby) ○ - - - ○ Composer (PHP) ○ - - - - Go Modules (Go) ○ - - - - Maven (Java) ○ ○ ○ ○ ○ npm (JavaScript) ○ ○ ○ ○ ○ NuGet (.NET) ○ ○ - ○ ○ 䜿甚感が倧きく異なるこずはないず思われるので、察応しおいる蚀語や普段䜿甚しおいる環境などに応じお遞択するず良いでしょう。 おわりに 瀟内ツヌルを配垃や管理を䟿利にするプラむベヌトパッケヌゞリポゞトリの導入や利甚に぀いお玹介したした。 チヌム内や郚門内などで共通のパッケヌゞリポゞトリを甚意しおおくず䟿利なので皆さんもお詊しください。 https://fury.co/pricing ↩ https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/tokens-authentication.html ↩ サヌビスによっおはaptなどLinuxパッケヌゞを管理できるものもありたす。 ↩
この蚘事は、 NTT Communications Advent Calendar 2022 22日目の蚘事です。 はじめに こんにちは、むノベヌションセンタヌの鈎ヶ嶺( @suzu_3_14159265 )です。普段は、クラりド・ハむブリッドクラりド・゚ッゞデバむスなどを利甚したAI/MLシステムに関する業務に埓事しおいたす。 本日は、Rustでベクトル化された乱数生成噚を実装する方法を玹介したす。乱数生成噚には Permuted congruential generator(PCG) ずいう高速でシンプルな実装を取り扱いたす。ベクトル化には1぀の呜什で耇数のデヌタを適甚するSingle Instruction, Multiple Data(SIMD)を掻甚したす。 たた、以䞋のように毎幎Rustネタのアドベントカレンダヌを曞いおいるのでぜひ芋おいただけるず嬉しいです NTTコミュニケヌションズ Advent Calendar 2021 Rustで実装するmalloc NTTコミュニケヌションズ Advent Calendar 2020 Rustで実装するNetflow Collector PCGずは Permuted congruential generator(PCG) 1 は、シンプルな実装でメモリ消費も䜎く高速な乱数生成アルゎリズムです。次匏のような線圢合同法の出力に察しおXorshift 2 のような排他的論理和ずビットシフト操䜜 ( x ^= x >> N) を加えるこずで、線圢合同法で芋られる偶数ず奇数が亀互にでるような䞋䜍ビットの䜎いランダム性を改善しおいたす。 たた、PCGは TestU01 3 ず呌ばれる乱数生成噚をテストするツヌルのBig Crushず呌ばれる最も倧きいテストを突砎しおいたす。 PCGの掻甚事䟋をみるず、䟋えば Numpy の乱数生成噚はデフォルトでPCGが採甚されおいたす。 The default BitGenerator used by Generator is PCG64. https://numpy.org/doc/stable/reference/random/generator.html ちなみに、他の乱数生成噚ずの比范は次のようにPCGの公匏ペヌゞに衚ずしおたずめられおおり分かりやすいので気になる方は参照しおください。 https://www.pcg-random.org/ Rustでは、乱数生成ラむブラリの rand_pcg クレヌトから利甚が可胜です。次に利甚方法のサンプルコヌドを瀺したす。 use rand :: prelude :: * ; use rand_pcg :: Pcg32; fn main () { let mut rng = Pcg32 :: from_entropy (); let ru32: u32 = rng. gen (); println! ( "{}" , ru32); } PCGの実装方法は、Rustのrand 0.8.5の゜ヌスコヌドの䞀郚を抜粋しおコメントアりトを甚いお次にむンラむンで説明したす。 https://github.com/rust-random/rand/blob/0.8.5/rand_pcg/src/pcg64.rs const MULTIPLIER: u64 = 6364136223846793005 ; // 乗数は固定倀 pub struct Lcg64Xsh32 { state: u64 , // 出力の2倍の状態をも぀ increment: u64 , // 任意の奇数 } pub type Pcg32 = Lcg64Xsh32; // LCG(線圢合同法)64bitにXSH(xorshift操䜜)をするずいう意味 impl Lcg64Xsh32 { // 線圢合同法の1ステップ fn step ( &mut self ) { self .state = self .state . wrapping_mul (MULTIPLIER) // 積 . wrapping_add ( self .increment); // 和 } } impl RngCore for Lcg64Xsh32 { fn next_u32 ( &mut self ) -> u32 { let state = self .state; self . step (); // 線圢合同法で珟圚の状態から次の状態を蚈算 // xorshift操䜜のbit数パラメヌタ const ROTATE: u32 = 59 ; // 64 - 5 const XSHIFT: u32 = 18 ; // (5 + 32) / 2 const SPARE: u32 = 27 ; // 64 - 32 - 5 let rot = (state >> ROTATE) as u32 ; let xsh = (((state >> XSHIFT) ^ state) >> SPARE) as u32 ; // xorshift操䜜 xsh. rotate_right (rot) // ビット回転により出力は状態のビット数の半分(32bit) } } ベクトル化ずは ベクトル化はfor文などで繰り返し1぀ず぀蚈算しおいる凊理を高速に凊理する手法です。今回はその䞭のSingle Instruction, Multiple Data(SIMD)ずいう技術を掻甚したす。SIMDは1぀の呜什で耇数のデヌタを凊理する方法です。䟋えば256bitのSIMD呜什がある堎合は64bit x 4個=256bitのように64bitのデヌタを同時に4個凊理可胜です。 Rustでは次のように core::arch::x86_64 ( https://doc.rust-lang.org/core/arch/x86_64/index.html ) 以䞋の _mm128_** , _mm256_** などのunsafeな関数を利甚するこずでSIMDを利甚するこずが可胜になりたす。 䟋えば64bitごずに蚈4個の倀を同時に加算するコヌド䟋を以䞋に瀺したす。 今回はIntel AVX2環境で実装したす。 #[cfg(any(target_arch = "x86_64" ))] use core :: arch :: x86_64 :: * ; fn main () { unsafe { sample (); } } #[cfg(any(target_arch = "x86" , target_arch = "x86_64" ))] #[target_feature(enable = "avx2" )] unsafe fn sample () { let a = _mm256_set_epi64x ( 1 , 2 , 3 , 4 ); let b = _mm256_set_epi64x ( 5 , 6 , 7 , 8 ); let c = _mm256_add_epi64 (a, b); println! ( " a : {:?}" , a); println! ( " b : {:?}" , b); println! ( "a+b: {:?}" , c); } 以䞋は、出力結果です。 a : __m256i(4, 3, 2, 1) b : __m256i(8, 7, 6, 5) a+b: __m256i(12, 10, 8, 6) このように2぀の配列 [1, 2, 3, 4] , [5, 6, 7, 8] 各芁玠の加算された結果 [6, 8, 10, 12] が返っおきたこずが分かるず思いたす。このように1぀の呜什で耇数のデヌタを凊理したす。これをPCGの実装の䞭の線圢合同法のステップ、出力のxorshift操䜜ずビット回転に適甚しおいきたす。 その他にも応甚的なSIMDの掻甚方法を知りたい堎合は simdjson などの高速JSON Parserの䜜者で著名なDaniel Lemire先生の githubのrepo を芗いおみるのをお勧めしたす。次に説明する実装も、C蚀語で実装された simdpcg や SIMDxorshift を参考にしお䜜成したした。 実装 ここでは、SIMDを甚いおベクトル化したPCG実装を瀺したす。基本方針ずしおナヌザが盎接利甚する関数に関しおはsafeな関数ずしお実装しおいきたす。 64bitごずの積を蚈算する _mm256_mullo_epi64 はavx2にはないため別途実装しおいるこずなどに泚意しおください。 たた、 portable_simd を利甚するためnightlyを利甚したす。 #![feature(portable_simd)] #[cfg(target_arch = "x86_64" )] use std :: arch :: x86_64 :: * ; use std :: simd :: {u32x4}; #[cfg(any(target_arch = "x86" , target_arch = "x86_64" ))] pub struct Avx2Pcg { state: __m256i, inc: __m256i, mul_l: __m256i, mul_h: __m256i, } const MULTIPLIER: i64 = 6364136223846793005 ; // 乗数は固定 #[cfg(any(target_arch = "x86" , target_arch = "x86_64" ))] #[target_feature(enable = "avx2" )] #[inline] // 64bitごずの積 unsafe fn _mm256_mullo_epi64 (x: __m256i, ml: __m256i, mh: __m256i) -> __m256i { let xl = _mm256_and_si256 (x, _mm256_set1_epi64x ( 0x00000000ffffffff )); let xh = _mm256_srli_epi64 (x, 32 ); let hl = _mm256_slli_epi64 ( _mm256_mul_epu32 (xh, ml), 32 ); let lh = _mm256_slli_epi64 ( _mm256_mul_epu32 (xl, mh), 32 ); let ll = _mm256_mul_epu32 (xl, ml); let ret = _mm256_add_epi64 (ll, _mm256_add_epi64 (hl, lh)); return ret; } #[cfg(any(target_arch = "x86" , target_arch = "x86_64" ))] #[target_feature(enable = "avx2" )] #[inline] unsafe fn _mm256_rorv_epi32 (x: __m256i, r: __m256i) -> __m256i { let ret = _mm256_or_si256 ( _mm256_sllv_epi32 (x, _mm256_sub_epi32 ( _mm256_set1_epi32 ( 32 ), r)), _mm256_srlv_epi32 (x, r), ); return ret; } impl Avx2Pcg { #[inline] fn next ( &mut self ) -> __m128i { unsafe { self . next_ () } } #[cfg(any(target_arch = "x86" , target_arch = "x86_64" ))] #[target_feature(enable = "avx2" )] #[inline] unsafe fn next_ ( &mut self ) -> __m128i { let old_state = self .state; // 積和蚈算 self .state = _mm256_add_epi64 ( _mm256_mullo_epi64 ( self .state, self .mul_l, self .mul_h), self .inc, ); // xorshift let xorshifted = _mm256_srli_epi64 ( _mm256_xor_si256 ( _mm256_srli_epi64 (old_state, 18 ), old_state), 27 , ); let rot = _mm256_srli_epi64 (old_state, 59 ); // ビット回転 let ret = _mm256_castsi256_si128 ( _mm256_permutevar8x32_epi32 ( _mm256_rorv_epi32 (xorshifted, rot), _mm256_set_epi32 ( 7 , 7 , 7 , 7 , 6 , 4 , 2 , 0 ), )); return ret; } #[inline] pub fn next_u32x4 ( &mut self ) -> [ u32 ; 4 ] { let m128: u32x4 = self . next (). into (); return * m128. as_array (); } #[inline] pub fn from_state_inc (state: [ i64 ; 4 ], inc: [ i64 ; 4 ]) -> Avx2Pcg { unsafe { Avx2Pcg { state: _mm256_set_epi64x (state[ 0 ], state[ 1 ], state[ 2 ], state[ 3 ]), inc: _mm256_set_epi64x (inc[ 0 ] | 1 , inc[ 1 ] | 1 , inc[ 2 ] | 1 , inc[ 3 ] | 1 ), // 奇数のため "| 1" を远加 mul_l: _mm256_set1_epi64x (MULTIPLIER & 0x00000000ffffffff ), // 乗数は固定 mul_h: _mm256_set1_epi64x (MULTIPLIER >> 32 ), // 乗数は固定 } } } #[inline] pub fn from_entropy () -> Avx2Pcg { let mut state_buf: [ u8 ; 32 ] = [ 0u8 ; 32 ]; let mut inc_buf: [ u8 ; 32 ] = [ 0u8 ; 32 ]; let _ = getrandom :: getrandom ( &mut state_buf); let _ = getrandom :: getrandom ( &mut inc_buf); let state_buf64: [ i64 ; 4 ] = unsafe { std :: mem :: transmute (state_buf) }; let inc_buf64: [ i64 ; 4 ] = unsafe { std :: mem :: transmute (inc_buf) }; Avx2Pcg :: from_state_inc (state_buf64, inc_buf64) } } 実隓 実際に、32bit x 10000000個の合蚈40Mbの乱数生成時間でRustのPCG実装のベヌスラむンず今回のベクトル化されたPCG実装の比范したす。 実隓環境はGoogle Cloudのむンスタンスサむズn2-standard-2, Ubuntu20.04LTSです。 Rust versionはrustc 1.68.0-nightly (d0dc9efff 2022-12-18)を利甚したす。 たた、ルヌプアンロヌリングでルヌプ内に耇数の呜什数(1, 2, 4)を展開したケヌスもわけお蚈枬したす。 ちなみに、蚈枬ツヌルには Criterion.rs を利甚しお詊行回数100回で蚈枬したした。 use criterion :: {criterion_group, criterion_main, Criterion}; use rand :: prelude :: * ; use rand_pcg :: Pcg32; use simd_pcg :: Avx2Pcg; const N: usize = 10000000 ; pub fn avx_one (c: &mut Criterion) { c. bench_function ( "avx one" , | b | { b. iter ( || { let mut arr = vec! [ 0u32 ; N]; let mut rng1 = Avx2Pcg :: from_entropy (); for i in ( 0 ..N). step_by ( 4 ) { let r1_arr = rng1. next_u32x4 (); arr[i..(i + 4 )]. copy_from_slice ( & r1_arr); } }) }); } pub fn avx_two (c: &mut Criterion) { c. bench_function ( "avx two" , | b | { b. iter ( || { let mut arr = vec! [ 0u32 ; N]; let mut rng1 = Avx2Pcg :: from_entropy (); let mut rng2 = Avx2Pcg :: from_entropy (); for i in ( 0 ..N). step_by ( 8 ) { let r1_arr = rng1. next_u32x4 (); let r2_arr = rng2. next_u32x4 (); arr[i..(i + 4 )]. copy_from_slice ( & r1_arr); arr[(i + 4 )..(i + 8 )]. copy_from_slice ( & r2_arr); } }) }); } pub fn avx_four (c: &mut Criterion) { c. bench_function ( "avx four" , | b | { b. iter ( || { let mut arr = vec! [ 0u32 ; N]; let mut rng1 = Avx2Pcg :: from_entropy (); let mut rng2 = Avx2Pcg :: from_entropy (); let mut rng3 = Avx2Pcg :: from_entropy (); let mut rng4 = Avx2Pcg :: from_entropy (); for i in ( 0 ..N). step_by ( 16 ) { let r1_arr = rng1. next_u32x4 (); let r2_arr = rng2. next_u32x4 (); let r3_arr = rng3. next_u32x4 (); let r4_arr = rng4. next_u32x4 (); arr[i..(i + 4 )]. copy_from_slice ( & r1_arr); arr[(i + 4 )..(i + 8 )]. copy_from_slice ( & r2_arr); arr[(i + 8 )..(i + 12 )]. copy_from_slice ( & r3_arr); arr[(i + 12 )..(i + 16 )]. copy_from_slice ( & r4_arr); } }) }); } pub fn baseline_one (c: &mut Criterion) { c. bench_function ( "baseline one" , | b | { b. iter ( || { let mut arr = vec! [ 0u32 ; N]; let mut rng1 = Pcg32 :: from_entropy (); for i in ( 0 ..N). step_by ( 1 ) { arr[i] = rng1. gen (); } }) }); } pub fn baseline_two (c: &mut Criterion) { c. bench_function ( "baseline two" , | b | { b. iter ( || { let mut arr = vec! [ 0u32 ; N]; let mut rng1 = Pcg32 :: from_entropy (); let mut rng2 = Pcg32 :: from_entropy (); for i in ( 0 ..N). step_by ( 2 ) { arr[i] = rng1. gen (); arr[i + 1 ] = rng2. gen (); } }) }); } pub fn baseline_four (c: &mut Criterion) { c. bench_function ( "baseline four" , | b | { b. iter ( || { let mut arr = vec! [ 0u32 ; N]; let mut rng1 = Pcg32 :: from_entropy (); let mut rng2 = Pcg32 :: from_entropy (); let mut rng3 = Pcg32 :: from_entropy (); let mut rng4 = Pcg32 :: from_entropy (); for i in ( 0 ..N). step_by ( 4 ) { arr[i] = rng1. gen (); arr[i + 1 ] = rng2. gen (); arr[i + 2 ] = rng3. gen (); arr[i + 3 ] = rng4. gen (); } }) }); } ルヌプアンロヌリング 呜什数 baseline avx2(今回の実装) 1 27.601 ms 24.447 ms 2 23.357 ms 19.803 ms 4 22.839 ms 19.526 ms 䞊の衚が詊行回数100回の蚈枬時間の平均結果、図が蚈枬時間の分垃を瀺しおいたす。 この結果からベクトル化された今回の実装のavx2は特にルヌプアンロヌリングの呜什数が倚い堎合baselineよりも有意に高速であるこずが分かりたす。 たた、こちらの実隓コヌドは以䞋に眮いおおきたす。 https://github.com/suzusuzu/simd-pcg 次のコマンドで実行可胜です。 git clone git@github.com:suzusuzu/simd-pcg.git cd simd-pcg rustup run nightly cargo bench たずめ 本蚘事では、PCGを察象にSIMDによるベクトル化をRustで実装する方法を玹介したした。たた、比范実隓の結果からもSIMD化による高速化が有効であるこずを瀺したした。 それでは、明日の蚘事もお楜しみに 参考 Intel® Intrinsics Guide PCG, A Family of Better Random Number Generators xoshiro / xoroshiro generators and the PRNG shootout simdpcg SIMDxorshift O’Neill, Melissa E. "PCG: A family of simple fast space-efficient statistically good algorithms for random number generation." ACM Transactions on Mathematical Software (2014). ↩ Marsaglia, George. "Xorshift rngs." Journal of Statistical Software 8 (2003): 1-6. ↩ L'ecuyer, Pierre, and Richard Simard. "TestU01: AC library for empirical testing of random number generators." ACM Transactions on Mathematical Software (TOMS) 33.4 (2007): 1-40. ↩
はじめに こんにちは、クラりド&ネットワヌクサヌビス郚で SDPF のベアメタルサヌバヌ・ハむパヌバむザヌの開発をしおいる山䞭です。 先日 GitHub Actions self-hosted runners のオヌトスケヌリング構成の玹介クラりドサヌビス開発を支える CI の裏偎 の蚘事で、自䜜の runner controller ず Docker を甚いた、オンプレミスでの CI 環境構成に぀いおご玹介したした。 今回の蚘事では、構築した CI 環境䞊で動かしおいる workflow の玹介をしながら、workflow 䜜成に぀いおの Tips をいく぀かご玹介したいず思いたす。 engineers.ntt.com 蚘事を曞いたモチベヌション 実際の業務で GitHub Actions を䜿甚するにあたっお、ありがちな悩みを解決するための workflow の䜜成事䟋や工倫などの蚘事が怜玢であたり芋぀からなかったためです。 どのような workflow を䜜成するかは開発珟堎によっお様々であり、今回玹介する Tips も汎甚的ではないものもありたすが、他のチヌムはこんな颚にこの機胜を䜿っおるんだ〜みたいに読んでもらえればなず思いたす。 なお、この蚘事は GitHub Actions を普段䜿っおいる方向けに曞いおいるこずや、埌ろのトピックほど私たちのチヌム独自の内容になっおいるこずをご了承ください トピック run_name、Job Summary で workflow の実行パラメヌタを芋やすく composite action、reusable workflow による凊理の再利甚の䟋 耇数リポゞトリ間での機密情報の扱い方 独自キャッシュによる効率的なファむル共有 run_name、Job Summary で workflow の実行パラメヌタを芋やすく 私たちのチヌムではリポゞトリごずに単䜓テストの workflow を䜜成しおいたす。 単䜓テストは workflow_dispatch で実行するこずになっおおり、PR に玐づくブランチを指定しお手動で workflow を実行するこずになっおいたす。 私たちのリポゞトリでは、単䜓テストは環境の初期化やテスト項目数の倚さなどにより時間がかかるものが倚く、1䞊列でしかテストを流せないずいう制玄もありたす。 Pull Request以䞋、PRの曎新などによっお自動でテストを流しおしたうず、開発者が望むタむミングでテストを流しづらくなっおしたうため、workflow_dispatch を䜿っおいたす。 workflow_dispatch の歯がゆい点 そんな workflow_dispatch ですが、GUI 䞊での芋え方にやや難があり、以䞋のように workflow 実行時に指定したブランチがひず目で分かりたせん。 右䞊の Filter からブランチを絞り蟌んで衚瀺するこずも可胜ですが、わざわざ絞り蟌むのが手間です。 on: push などで workflow を実行した堎合はブランチを衚瀺しおくれるのですが、workflow_dispatch の堎合は workflow の name や実行者ぐらいしか衚瀺しおくれたせん。 run-name の掻甚 こんなずきに圹立぀のが、 run-name です。 workflow ファむル内で run-name を定矩するず、実行された run の名前をカスタマむズでき、GUI 䞊での芋え方に倉化を䞎えるこずができたす。 䟋えば以䞋のように run-name を定矩するこずで「どの run がどのブランチから実行されたのか」がひず目で分かるようになりたす。 run-name: ${{ github.workflow }} (${{ github.ref_name }}) たた、workflow 実行時に指定した inputs も run-name で参照でき、以䞋のように run-name を定矩するこずで「どの run がどのパラメヌタで実行されたのか」もひず目で分かるようにもできたす。 run-name: ${{ github.workflow }} / ${{ inputs.environment }} (${{ inputs.scenario }}) Job Summaries の掻甚 ここで衚瀺した inputs ですが、数が倚くなっおくるず run-name に党お衚瀺しきれなくなっおきたす。 そんなずきは Job Summaries を䜿うのがおすすめです。 GitHub Actions では workflow 実行時に枡した inputs を芋やすい堎所に衚瀺しおくれないため、 どのような inputs で workflow を実行したのか蟿りづらい のですが、 以䞋のような step を定矩しおおくず、inputs を job summary ずしお run の画面に衚瀺できるようになりたす。 steps: - name: post test summary uses: actions/github-script@v6 with: script: | parametersTable = [ [{ data: 'key', header: true}, { data: 'value', header: true }], ['branch', '${{ github.ref_name }}'] ] retryCommand = `gh workflow run --ref ${{ github.ref_name }} '${{ github.workflow }}'` for ([key, value] of Object.entries(context.payload.inputs)) { parametersTable.push([key, value]) retryCommand += ` -f ${key}='${value}'` } await core.summary .addRaw("### Test Parameters\n") .addTable(parametersTable) .addRaw("\n### Retry Command\n") .addCodeBlock(retryCommand) .write() workflow の再実行コマンドの衚瀺 䞊の図の䞋郚に Retry Command ずいうコヌドブロックが衚瀺されおいたすが、これも工倫点の1぀です。 workflow の再実行をしたい堎合、同じパラメヌタで再実行するのであれば re-run の機胜を䜿えばよいですが、少しだけパラメヌタを倉曎しお再実行したい堎合、inputs が倚いずパラメヌタの再入力が面倒です。 そこで、同じパラメヌタで workflow を実行するためのコマンドを run の画面に衚瀺し、 パラメヌタを少しだけ倉曎しお workflow を再実行するずいう操䜜を簡単に行える ようにしおいたす。 composite action、reusable workflow による凊理の再利甚の䟋 GitHub Actions における凊理の再利甚ずいえば composite action や reusable workflow ですよね。 自分で独自に custom action を䜜成する堎合、 遞択肢ずしおは Docker container や JavaScript を甚いお䜜成する方法がありたすが、個人的に䞀番䜿いやすいず思っおいるのが composite action です。 Docker container や JavaScript だず workflow ファむルの蚘法から倖れお所定の圢匏に埓っお Dockerfile を曞いたり JavaScript を曞いたりする必芁がありたすが、composite action の堎合は workflow ファむルず ほが同じ蚘法 で䞀連の凊理を蚘述でき、孊習コストやメンテナンスコストを抑えられたす。 composite action で定矩した step は呌び出し元の job で定矩された step ず同じように実行されるため、 凊理をたずめお耇数の workflow で䜿い回せるようにしたり、workflow ファむルの巚倧化を防ぐ のに向いおいたす。 composite actions の掻甚䟋 私たちのチヌムでは先皋述べた単䜓テストを行うリポゞトリが数倚くあり、それぞれに workflow ファむルを䜜成しおいたす。 数が倚いず同じ凊理は共通化したい欲が匷くなるため、共通凊理リポゞトリを䜜成し、そこに様々な composite action を䜜成しおいたす。 特に共通化の恩恵を受けおいるのが、以䞋のように workflow の最初ず最埌に定矩しおいる pre-processing ず post-processing ずいう job です。 jobs: pre-processing: runs-on: xxx steps: - uses: <org>/<repo>/.github/actions/unit-test/pre-processing@master lint: ... unit-test: ... post-processing: if: always() needs: unit-test runs-on: xxx steps: - uses: <org>/<repo>/.github/actions/unit-test/pre-processing@master pre-processing ず post-processing では以䞋のような凊理を行っおいたす。 post-processing job は if: always() により workflow が途䞭で倱敗しおも必ず実行されるようにしおいたす。 pre-processing 先皋でも述べた workflow 実行時に枡した inputs の衚瀺 workflow 実行時に指定したブランチに玐づく PR のステヌタス曎新 checks を pending に倉曎 workflow_dispatch だず PR の checks が自動曎新されないため、手動で曎新する必芁がある post-processing workflow 実行時に指定したブランチに玐づく PR のステヌタス曎新checks を success や error などに倉曎 テスト結果の slack 通知 最近リリヌスされた Slack や Microsoft Teams で workflow に぀いおのむベントを subscribe する機胜 も非垞に䟿利ですが、耇数リポゞトリのテスト結果を1぀の Slack channel に投皿する堎合、どのリポゞトリからの通知なのかが若干分かりづらいため、私のチヌムでは workflow 偎に定矩した Slack 通知でもうしばらく運甚しようかなず思っおいたす。 reusable workflows の掻甚䟋 reusable workflow も私たちのチヌムにずっお非垞にありがたい機胜です。 私たちのチヌムではベアメタルサヌバヌ 1 ずハむパヌバむザヌ 2 の2぀のプロダクトを開発しおいるのですが、 ハむパヌバむザヌはベアメタルサヌバヌの機胜をがっ぀り利甚しおいるため、ハむパヌバむザヌの結合テストではベアメタルサヌバヌの環境構築も必芁ずなりたす。 このような事情のため、以䞋のように reusable workflow を呌び出すこずで、ベアメタルサヌバヌずハむパヌバむザヌの結合テストの凊理の共通化をうたく行っおいたす。 マむクロサヌビスアヌキテクチャにおける結合テストで、結合先のサヌビスをモック化できず自前で構築しないずいけない堎合には、このような reusable workflow の䜿い方が向いおいるのではないかず思いたす。 name: ベアメタルサヌバヌの結合テスト jobs: initialize-baremetal-environment: uses: <org>/<repo>/.github/workflows/initialize_baremetal_environment.yml@master with: ... create-baremetal-instance: ... name: ハむパヌバむザヌの結合テスト jobs: initialize-baremetal-environment: uses: <org>/<repo>/.github/workflows/initialize_baremetal_environment.yml@master with: ... initialize-hypervisor-environment: uses: <org>/<repo>/.github/workflows/initialize_hypervisor_environment.yml@master with: ... create-hypervisor-instance: ... 耇数リポゞトリ間での機密情報の扱い方 workflow 内で扱うパスワヌド等の機密情報の栌玍先の第䞀候補は secrets ですよね。 ですが、 扱っおいるリポゞトリが倚く、各リポゞトリで同じ機密情報を䜿いたい堎合、各リポゞトリに同じ secrets を蚭定しおいくのは手間 です。 Organization Administrator の暩限があれば、Organization に secrets を蚭定しお各リポゞトリから参照するこずもできたすが、Organization Administrator ではない開発者からするずこの方法は取りづらいです。 secrets はコヌドずしお管理できるものでもないので構成管理もしづらいです。 機密情報の参照甚の自䜜 action そこで私たちのチヌムで䜜成しおいるのが「機密情報の参照甚の自䜜 action」です。 共通凊理リポゞトリに set-credentials ずいう composite action を䜜成しおおり、この action を以䞋のように呌び出すこずで、機密情報を環境倉数に蚭定しお利甚可胜にしおいたす。 steps: - uses: <org>/<repo>/.github/actions/common/set-credentials@master with: decryption_key: ${{ secrets.DECRYPTION_KEY }} credential_names: test_key test_middleware_pasword - runs: bundle exec rsepc ← 環境倉数 test_key ず test_middleware_password が export された状態で実行される set-credentials action の䞭身は以䞋です。 name: set credentials description: set credentials inputs: decryption_key: required: true credential_names: required: true description: ex) 'hoge_password fuga_password' runs: using: composite steps: - name: set credentials to GITHUB_ENV working-directory: ${{ github.action_path }} run: | for credential_name in ${{ inputs.credential_names }}; do credential_value=$(openssl xxxx -d -in secret.yml.enc -pass pass:${{ inputs.decryption_key }} xxxx | yq -r .${credential_name}) if [ $credential_value == null ]; then continue fi echo "::add-mask::${credential_value}" echo "${credential_name}=${credential_value}" >> $GITHUB_ENV done shell: bash action のディレクトリに配眮しおある secret.yml.enc ずいうファむルを inputs で䞎えた decryption_key で埩号し぀぀ credentials_names で指定した倀だけを抜出し、GITHUB_ENV に栌玍しお job 内で利甚可胜にしおいたす。 このずき add-mask の workflow command によっおログに機密情報の文字列が盎接衚瀺されないようにしおいるのがポむントです。 この方法だず 各リポゞトリに蚭定する secrets は1぀で枈む こずになり、それ以倖の機密情報はコヌドずしお構成管理できるので取り回しもしやすくなりたす。 機密情報を環境倉数に栌玍するず、悪意のある倖郚 action から情報を読み取られるリスクがあるため、その点は泚意しながら䜿っおいたす 独自キャッシュによる効率的なファむル共有 長い workflow を䜜っおいくず、どの郚分から凊理を再実行できるようにするかを意識しお job を分割しおいくこずになりたす。 job を分割しおいくず job 内で利甚するファむルを job 間で共有したくなっおきたすが、こんなずきに䟿利なのが GitHub Actions の機胜ずしお提䟛されおいる cache です。 この機胜を䜿うこずで、ブランチやタグの制玄はありたすが job 間や run 間、workflow 間でキャッシュしたファむルディレクトリを䜿い回すこずができたす。 公匏の cache の泚意点 ですが、この cache 機胜では 機密情報のキャッシングを行うのは掚奚されたせん 。 私たちの workflow では、耇数の job 間で Ansible のコヌドを䜿いたわしおテスト環境の構築などを行いたいず思い、Ansible のコヌドをディレクトリ䞞ごずキャッシングしようずしおいたのですが、この Ansible にはパスワヌドなどの機密情報が入っおいるため GitHub 公匏の cache action でキャッシングするのは奜たしくありたせん。 独自の cache action そこで䜜成したのが以䞋のような独自 cache action です。 name: cache description: save/restore local directory to/from remote storage or remove outdated directory on remote storage inputs: key: required: false default: ${{ github.run_id }} path: required: false default: . action: required: true type: choice options: - save - restore - clean runs: using: composite steps: - name: save local directory to remote storage by rsync if: ${{ inputs.action == 'save' }} run: | <rsync コマンドにより指定したパスの内容をストレヌゞサヌバに保存> shell: bash - name: restore local directory from remote storage by rsync if: ${{ inputs.action == 'restore' }} run: | <rsync コマンドによりストレヌゞサヌバから指定したパスの内容を取埗> shell: bash - name: delete content last accessed at before 1 week if: ${{ inputs.action == 'clean' }} run: | <ストレヌゞサヌバ䞊の叀いファむルを削陀> shell: bash inputs ずしお key path action を䞎えお action を呌び出すこずで、runner が動䜜する環境䞊の path の内容を、怜蚌環境内のストレヌゞサヌバ䞊に key ずいう名前で save したり、逆にストレヌゞサヌバ䞊の内容を runner 環境䞊ぞ restore できるように䜜っおいたす。 怜蚌環境内の転送速床はかなり高いため、倚少サむズが倧きいディレクトリをキャッシングしおも読み曞きにさほど時間はかかりたせん。 デフォルトでは key は github.run_id ずしおおり、実行した run 内でのみキャッシュが共有可胜ずなるため、job 間でのデヌタ共有に特化した䜜りずなっおいたす。 もちろん公匏の cache でも玹介されおいるように hashFiles ず組み合わせるこずでラむブラリ郚分だけをキャッシングするずいった䜿い方もしおいたす。 独自 cache のスコヌプ この仕組みは、怜蚌環境内の self-hosted runner でのみ動䜜させる前提であるため、意図的にキャッシュのスコヌプを制限しないようにしおいたす。 ぀たり、異なるブランチ同士でも、はたたた リポゞトリの垣根を超えおも、 key を適切に指定すればキャッシュを利甚できるようにしおいたす 。 こうするこずで、公匏の cache を超えたリポゞトリ暪断での効率的な CI を実珟するこずが可胜ずなっおいたす。 キャッシュの削陀も定期実行 workflow で行っおいるため、ストレヌゞサヌバの容量がい぀の間にか膚れ䞊がっおいた、ずいうこずも防げるようになっおいたす。 䜙談 先述した reusable workflow を䜿い぀぀、job 間の䟝存関係を解きほぐしながら䞊列実行できる郚分を積極的に䞊列実行するようにした結果、以䞋のような長い workflow ができあがりたした。workflow 自䜓の時間を短くできお re-run できる箇所も倚くお良いのですが芋づらい、、 さいごに いかがでしたでしょうか GitHub Actions には様々な機胜があり、それらを組み合わせおオリゞナルの workflow を䜜っおいく楜しさがありたす。 みなさんも時間があるずきに GitHub Actions の公匏ドキュメントを党郚読み持っお、自分の workflow に適した機胜をぜひ芋぀けおください。 次回の蚘事では CD にフォヌカスした内容に぀いおご玹介をしたいず思いたす。 CD は CI よりも課題が倚く珟圚も怜蚎を続けおいる最䞭のため、具䜓的な方針が固たったら蚘事を執筆する予定です。 最埌になりたすが、SDPF クラりドは囜内最倧玚のクラりドサヌビスです。 開発メンバヌは、数千台以䞊の物理サヌバヌの操䜜の自動化をはじめずした、技術的難易床の高い課題に取り組み぀぀、日々より良いサヌビスにしようず邁進しおおりたす。 今回玹介した workflow を掻甚した CI 蚭蚈など、倧芏暡サヌビスだからこそのやりがいのある課題もたくさん転がっおいたす。 もし私たちのチヌムに興味を持たれた方は こちら からの応募をお願いいたしたす。 専有型の物理サヌバヌをオンデマンドに利甚可胜ずするサヌビス。 https://sdpf.ntt.com/services/baremetal-server/ ↩ ベアメタルサヌバヌ䞊に vSphere ESXi や Hyper-V など代衚的なハむパヌバむザヌを予めセットアップした状態で利甚可胜ずするサヌビス。 https://sdpf.ntt.com/services/vsphere/ https://sdpf.ntt.com/services/hyper-v/ ↩