{"id":600,"date":"2023-06-15T23:28:02","date_gmt":"2023-06-15T23:28:02","guid":{"rendered":"https:\/\/todaysainews.com\/index.php\/2023\/06\/15\/on-device-acceleration-of-large-diffusion-models-via-gpu-aware-optimizations-google-ai-blog\/"},"modified":"2025-04-27T07:33:22","modified_gmt":"2025-04-27T07:33:22","slug":"on-device-acceleration-of-large-diffusion-models-via-gpu-aware-optimizations-google-ai-blog","status":"publish","type":"post","link":"https:\/\/todaysainews.com\/index.php\/2023\/06\/15\/on-device-acceleration-of-large-diffusion-models-via-gpu-aware-optimizations-google-ai-blog\/","title":{"rendered":"On-device acceleration of large diffusion models via GPU-aware optimizations \u2013 Google AI Blog"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div id=\"post-body-2312998356111901143\">\n<span class=\"byline-author\">Posted by Juhyun Lee and Raman Sarokin, Software Engineers, Core Systems &amp; Experiences<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjm8J7pV44tX5D9h_So9djOQ6574uRfNDoRjQDgg8kN78DFf7H3N8y7AIEnHfGJCqbYqxN9ZJVs9PaQ2B0qQ7SoXgjGEzEVfcuPQZCKQqMjqR7kDZ7rk_vjR_RFRiw-OoW7k-KjF5ecEkEVNiX2_27bePakLG6Ac805m8q6YhQPaA3IEWaWpmFbrLsWKg\/s700\/SpeedHero.png\" style=\"display: none;\"\/><\/p>\n<p>\nThe proliferation of large <a href=\"https:\/\/ai.googleblog.com\/2021\/07\/high-fidelity-image-generation-using.html\">diffusion models<\/a> for <a href=\"https:\/\/ai.google\/discover\/foundation-models\/\">image generation<\/a> has led to a significant increase in model size and inference workloads. On-device ML inference in mobile environments requires meticulous performance optimization and consideration of trade-offs due to resource constraints. Running inference of large diffusion models (LDMs) on-device, driven by the need for cost efficiency and user privacy, presents even greater challenges due to the substantial memory requirements and computational demands of these models.\n<\/p>\n<p> <a name=\"more\"\/><\/p>\n<p>\nWe address this challenge in our work titled \u201c<a href=\"https:\/\/arxiv.org\/abs\/2304.11267\">Speed Is All You Need: On-Device Acceleration of Large Diffusion Models via GPU-Aware Optimizations<\/a>\u201d (to be presented at the <a href=\"https:\/\/cvpr2023.thecvf.com\/Conferences\/2023\">CVPR 2023<\/a> workshop for <a href=\"https:\/\/sites.google.com\/corp\/view\/ecv23\">Efficient Deep Learning for Computer Vision<\/a>) focusing on the optimized execution of a foundational LDM model on a mobile GPU. In this blog post, we summarize the core techniques we employed to successfully execute large diffusion models like <a href=\"https:\/\/arxiv.org\/abs\/2112.10752\">Stable Diffusion<\/a> at full resolution (512&#215;512 pixels) and 20 iterations on modern smartphones with high-performing inference speed of the original model without distillation of under 12 seconds. As discussed in <a href=\"https:\/\/ai.googleblog.com\/2022\/08\/high-definition-segmentation-in-google.html\">our previous blog post<\/a>, GPU-accelerated ML inference is often limited by memory performance, and execution of LDMs is no exception. Therefore, the central theme of our optimization is efficient memory input\/output (I\/O) even if it means choosing memory-efficient algorithms over those that prioritize arithmetic logic unit efficiency. Ultimately, our primary objective is to reduce the overall latency of the ML inference.\n<\/p>\n<table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgSvrG_xr7MWV45RJH9aZr8I9a1wlYHLjVx9hJrCnLoC9xa0Y0h1N_LX0df8pa7yVKLfj6S8SH_RDx-p7obVNBu5A18uabECxdt4_14ixwjQXKE2y4jqajgAD4Okt6p48ju20n1zttBdM2D2woOdEX6gxgUzvLKQ6vie6GJBf_sSQt9UwhEMU0piYQPJQ\/s512\/image4.jpg\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"><img decoding=\"async\" border=\"0\" data-original-height=\"512\" data-original-width=\"512\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgSvrG_xr7MWV45RJH9aZr8I9a1wlYHLjVx9hJrCnLoC9xa0Y0h1N_LX0df8pa7yVKLfj6S8SH_RDx-p7obVNBu5A18uabECxdt4_14ixwjQXKE2y4jqajgAD4Okt6p48ju20n1zttBdM2D2woOdEX6gxgUzvLKQ6vie6GJBf_sSQt9UwhEMU0piYQPJQ\/s16000\/image4.jpg\"\/><\/a><\/td>\n<\/tr>\n<tr>\n<td class=\"tr-caption\" style=\"text-align: center;\">A sample output of an LDM on Mobile GPU with the prompt text: \u201ca photo realistic and high resolution image of a cute puppy with surrounding flowers\u201d.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Enhanced attention module for memory efficiency<\/h2>\n<p>\nAn ML inference engine typically provides a variety of optimized ML operations. Despite this, achieving optimal performance can still be challenging as there is a certain amount of overhead for executing individual neural net operators on a GPU. To mitigate this overhead, ML inference engines incorporate extensive operator fusion rules that consolidate multiple operators into a single operator, thereby reducing the number of iterations across tensor elements while maximizing compute per iteration. For instance, <a href=\"https:\/\/www.tensorflow.org\/lite\">TensorFlow Lite<\/a> utilizes operator fusion to combine computationally expensive operations, like convolutions, with subsequent activation functions, like <a href=\"https:\/\/en.wikipedia.org\/wiki\/Rectifier_(neural_networks)\">rectified linear units<\/a>, into one.\n<\/p>\n<p>\nA clear opportunity for optimization is the heavily used attention block adopted in the <a href=\"https:\/\/arxiv.org\/pdf\/2304.11267.pdf\">denoiser model<\/a> in the LDM. The attention blocks allow the model to focus on specific parts of the input by assigning higher weights to important regions. There are multiple ways one can optimize the attention modules, and we selectively employ one of the two optimizations explained below depending on which optimization performs better.\n<\/p>\n<p>\nThe first optimization, which we call <em>partially fused <a href=\"https:\/\/en.wikipedia.org\/wiki\/Softmax_function\">softmax<\/a><\/em>, removes the need for extensive memory writes and reads between the softmax and the matrix multiplication in the attention module. Let the attention block be just a simple matrix multiplication of the form <b><em>Y <\/em><\/b>= softmax(<b><em>X<\/em><\/b>) * <b><em>W<\/em><\/b> where <b><em>X<\/em><\/b> and <b><em>W<\/em><\/b> are 2D matrices of shape <em>a<\/em>\u00d7<em>b<\/em> and <em>b<\/em>\u00d7<em>c<\/em>, respectively (shown below in the top half).\n<\/p>\n<p>\nFor numerical stability, <b><em>T = <\/em><\/b>softmax(<b><em>X<\/em><\/b>) is typically calculated in three passes:\n<\/p>\n<ol>\n<li>Determine the maximum value in the list, <em>i.e<\/em>.,<em> <\/em>for each row in matrix <b><em>X<\/em><\/b>\n<\/li>\n<li>Sum up the differences of the exponential of each list item and the maximum value (from pass 1)\n<\/li>\n<li>Divide the exponential of the items minus the maximum value by the sum from pass 2\n<\/li>\n<\/ol>\n<p>\nCarrying out these passes na\u00efvely would result in a huge memory write for the temporary intermediate tensor <strong><em>T<\/em><\/strong> holding the output of the entire softmax function. We bypass this large memory write if we only store the results of passes 1 and 2, labeled <b><em>m<\/em><\/b> and <b><em>s<\/em><\/b>, respectively, which are small vectors, with <em>a<\/em> elements each, compared to <strong><em>T <\/em><\/strong>which has <em>a\u00b7b <\/em>elements. With this technique, we are able to reduce tens or even hundreds of megabytes of memory consumption by multiple orders of magnitude (shown below in the bottom half).\n<\/p>\n<table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjmMWkT7U6yQ7m4JegrYpJRUt6gO6dMBb16fvNQIdiaX6gRRWP7uHykb6PBNoI0LyuqFTdJc1sJgWIq1bO4j1l4x_LokTvrPVDCEnbLBAgXqd8QBAGHxCLVaWlEMYWhmW2CC4rzuKwqC06MLQ-8MVAfEea4SwSngu4-YxcMYHzEyrTF3X7lZhLHkUjmcg\/s568\/image1.png\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"><img decoding=\"async\" border=\"0\" data-original-height=\"457\" data-original-width=\"568\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjmMWkT7U6yQ7m4JegrYpJRUt6gO6dMBb16fvNQIdiaX6gRRWP7uHykb6PBNoI0LyuqFTdJc1sJgWIq1bO4j1l4x_LokTvrPVDCEnbLBAgXqd8QBAGHxCLVaWlEMYWhmW2CC4rzuKwqC06MLQ-8MVAfEea4SwSngu4-YxcMYHzEyrTF3X7lZhLHkUjmcg\/s16000\/image1.png\"\/><\/a><\/td>\n<\/tr>\n<tr>\n<td class=\"tr-caption\" style=\"text-align: center;\">Attention modules. <b>Top<\/b>: A na\u00efve attention block, composed of a SOFTMAX (with all three passes) and a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Matrix_multiplication\">MATMUL<\/a>, requires a large memory write for the big intermediate tensor <em>T<\/em>. <b>Bottom<\/b>: Our memory-efficient attention block with partially fused softmax in MATMUL only needs to store two small intermediate tensors for <em>m<\/em> and s.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\nThe other optimization involves employing <a href=\"https:\/\/arxiv.org\/abs\/2205.14135\">FlashAttention<\/a>, which is an I\/O-aware, exact attention algorithm. This algorithm reduces the number of GPU high-bandwidth memory accesses, making it a good fit for our memory bandwidth\u2013limited use case. However, we found this technique to only work for <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_random-access_memory\">SRAM<\/a> with certain sizes and to require a large number of registers.  Therefore, we only leverage this technique for attention matrices with a certain size on a select set of GPUs.\n<\/p>\n<h2>Winograd fast convolution for 3\u00d73 convolution layers<\/h2>\n<p>\nThe backbone of common LDMs heavily relies on 3\u00d73 convolution layers (convolutions with filter size 3\u00d73), comprising over 90% of the layers in the decoder. Despite increased memory consumption and numerical errors, we found that <a href=\"https:\/\/arxiv.org\/abs\/1509.09308\">Winograd fast convolution<\/a> to be effective at speeding up the convolutions. Distinct from the <em>filter size<\/em> 3&#215;3 used in convolutions, <em>tile size<\/em> refers to the size of a sub region of the input tensor that is processed at a time. Increasing the tile size enhances the efficiency of the convolution in terms of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Arithmetic_logic_unit\">arithmetic logic unit<\/a> (ALU) usage. However, this improvement comes at the expense of increased memory consumption. Our tests indicate that a tile size of 4\u00d74 achieves the optimal trade-off between computational efficiency and memory utilization.\n<\/p>\n<p><\/p>\n<table align=\"center\" style=\"text-align: center\">\n<tbody>\n<tr>\n<td\/>\n<td\/>\n<td colspan=\"2\"><b>\u00a0\u00a0\u00a0\u00a0Memory usage\u00a0\u00a0\u00a0\u00a0<\/b>\n   <\/td>\n<\/tr>\n<tr>\n<td><b>\u00a0\u00a0\u00a0\u00a0Tile size\u00a0\u00a0\u00a0\u00a0<\/b>\n   <\/td>\n<td><b>\u00a0\u00a0\u00a0\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/FLOPS\">FLOPS<\/a> savings\u00a0\u00a0\u00a0\u00a0<\/b>\n   <\/td>\n<td><b>\u00a0\u00a0\u00a0\u00a0Intermediate tensors\u00a0\u00a0\u00a0\u00a0<\/b>\n   <\/td>\n<td><b>\u00a0\u00a0\u00a0\u00a0Weights\u00a0\u00a0\u00a0\u00a0<\/b>\n   <\/td>\n<\/tr>\n<tr>\n<td>2\u00d72\n   <\/td>\n<td>2.25\u00d7\n   <\/td>\n<td>4.00\u00d7\n   <\/td>\n<td>1.77\u00d7\n   <\/td>\n<\/tr>\n<tr>\n<td><b>4\u00d74<\/b>\n   <\/td>\n<td><b>4.00\u00d7<\/b>\n   <\/td>\n<td><b>2.25\u00d7<\/b>\n   <\/td>\n<td><b>4.00\u00d7<\/b>\n   <\/td>\n<\/tr>\n<tr>\n<td>6\u00d76\n   <\/td>\n<td>5.06\u00d7\n   <\/td>\n<td>1.80\u00d7\n   <\/td>\n<td>7.12\u00d7\n   <\/td>\n<\/tr>\n<tr>\n<td>8\u00d78\n   <\/td>\n<td>5.76\u00d7\n   <\/td>\n<td>1.56\u00d7\n   <\/td>\n<td>11.1\u00d7\n   <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td class=\"tr-caption\" style=\"text-align: center;\">Impact of Winograd with varying tile sizes for 3\u00d73 convolutions.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Specialized operator fusion for memory efficiency<\/h2>\n<p>\nWe discovered that performantly inferring LDMs on a mobile GPU requires significantly larger fusion windows for commonly employed layers and units in LDMs than current off-the-shelf on-device GPU-accelerated ML inference engines provide. Consequently, we developed specialized implementations that could execute a larger range of neural operators than typical fusion rules would permit. Specifically, we focused on two specializations: the <a href=\"https:\/\/arxiv.org\/abs\/1606.08415\">Gaussian Error Linear Unit<\/a> (GELU) and the <a href=\"https:\/\/arxiv.org\/abs\/1803.08494\">group normalization<\/a> layer.\n<\/p>\n<p>\nAn approximation of GELU with the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Hyperbolic_functions\">hyperbolic tangent<\/a> function requires writing to and reading from seven auxiliary intermediate tensors (shown below as light orange rounded rectangles in the figure below), reading from the input tensor <em>x<\/em> three times, and writing to the output tensor <em>y<\/em> once across eight GPU programs implementing the labeled operation each (light blue rectangles). A custom GELU implementation that performs the eight operations in a single shader (shown below in the bottom) can bypass all the memory I\/O for the intermediate tensors.\n<\/p>\n<table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEilG64yPIiXZN5SpvnvPua9d9TFGiFcTLZhZX00gmnOMpzOoEHX5agNOyorx6uCABcYc0oRMvsWUkuIz7vK1_yzhpGb77BJ2ZLKMj640ILhSKruDK0utP5wqD5TSjF2gfB3QWLwJOkseGrwzAhjmxtriTklmsZnTuFQDx3jeF_T7wux1gR0QIpSLYtkjg\/s958\/image2.png\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"><img decoding=\"async\" border=\"0\" data-original-height=\"210\" data-original-width=\"958\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEilG64yPIiXZN5SpvnvPua9d9TFGiFcTLZhZX00gmnOMpzOoEHX5agNOyorx6uCABcYc0oRMvsWUkuIz7vK1_yzhpGb77BJ2ZLKMj640ILhSKruDK0utP5wqD5TSjF2gfB3QWLwJOkseGrwzAhjmxtriTklmsZnTuFQDx3jeF_T7wux1gR0QIpSLYtkjg\/s16000\/image2.png\"\/><\/a><\/td>\n<\/tr>\n<tr>\n<td class=\"tr-caption\" style=\"text-align: center;\">GELU implementations. <strong>Top<\/strong>: A na\u00efve implementation with built-in operations would require 8 memory writes and 10 reads. <strong>Bottom<\/strong>: Our custom GELU only requires 1 memory read (for <em>x<\/em>) and 1 write (for <em>y<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Results<\/h2>\n<p>\nAfter applying all of these optimizations, we conducted tests of Stable Diffusion 1.5 (image resolution 512&#215;512, 20 iterations) on high-end mobile devices. Running Stable Diffusion with our GPU-accelerated ML inference model uses 2,093MB for the weights and 84MB for the intermediate tensors. With latest high-end smartphones, Stable Diffusion can be run in under 12 seconds.\n<\/p>\n<table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgN0IRuIecTfbuq2ztTqfcahyGfGkYum_4_wvf6rfwRKkvlYZOpq7Cw2l4T5QL08ElzKIn97dpXqARuUfRp08ugvGG4SFSS6ZfzXlF3usn9J4tUEa5iXrmRZQVxY0CQjiP9VCNhxRB333HK84HdwYd58iN6JwqePj-TGqvM0WV8A4N4D7yDUZ0Adxm1Ig\/s522\/image3.gif\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"><img decoding=\"async\" border=\"0\" data-original-height=\"522\" data-original-width=\"270\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgN0IRuIecTfbuq2ztTqfcahyGfGkYum_4_wvf6rfwRKkvlYZOpq7Cw2l4T5QL08ElzKIn97dpXqARuUfRp08ugvGG4SFSS6ZfzXlF3usn9J4tUEa5iXrmRZQVxY0CQjiP9VCNhxRB333HK84HdwYd58iN6JwqePj-TGqvM0WV8A4N4D7yDUZ0Adxm1Ig\/s16000\/image3.gif\"\/><\/a><\/td>\n<\/tr>\n<tr>\n<td class=\"tr-caption\" style=\"text-align: center;\">Stable Diffusion runs on modern smartphones in under 12 seconds. Note that running the decoder after each iteration for displaying the intermediate output in this animated GIF results in a ~2\u00d7 slowdown.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Conclusion<\/h2>\n<p>\nPerforming on-device ML inference of large models has proven to be a substantial challenge, encompassing limitations in model file size, extensive runtime memory requirements, and protracted inference latency. By recognizing memory bandwidth usage as the primary bottleneck, we directed our efforts towards optimizing memory bandwidth utilization and striking a delicate balance between ALU efficiency and memory efficiency. As a result, we achieved state-of-the-art inference latency for large diffusion models. You can learn more about this work in <a href=\"https:\/\/arxiv.org\/abs\/2304.11267\">the paper<\/a>.\n<\/p>\n<h2>Acknowledgments<\/h2>\n<p>\n<em>We&#8217;d like to thank Yu-Hui Chen, Jiuqiang Tang, Frank Barchard, Yang Zhao, Joe Zou, Khanh LeViet, Chuo-Ling Chang, Andrei Kulik, Lu Wang, and Matthias Grundmann.<\/em>\n<\/p>\n<\/div>\n<p>[ad_2]<br \/>\n<br \/><a href=\"http:\/\/ai.googleblog.com\/2023\/06\/speed-is-all-you-need-on-device.html\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] Posted by Juhyun Lee and Raman Sarokin, Software Engineers, Core Systems &amp; Experiences The proliferation of large<\/p>\n","protected":false},"author":2,"featured_media":601,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-600","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-google-ai"],"featured_image_urls":{"full":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero.png",700,630,false],"thumbnail":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero-150x150.png",150,150,true],"medium":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero-300x270.png",300,270,true],"medium_large":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero.png",640,576,false],"large":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero.png",640,576,false],"1536x1536":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero.png",700,630,false],"2048x2048":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero.png",700,630,false],"broadnews-featured":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero.png",700,630,false],"broadnews-large":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero-700x575.png",700,575,true],"broadnews-medium":["https:\/\/todaysainews.com\/wp-content\/uploads\/2023\/06\/SpeedHero-590x410.png",590,410,true]},"author_info":{"info":["Sanna"]},"category_info":"<a href=\"https:\/\/todaysainews.com\/index.php\/category\/google-ai\/\" rel=\"category tag\">Google AI<\/a>","tag_info":"Google AI","comment_count":"0","_links":{"self":[{"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/posts\/600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/comments?post=600"}],"version-history":[{"count":1,"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/posts\/600\/revisions"}],"predecessor-version":[{"id":2773,"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/posts\/600\/revisions\/2773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/media\/601"}],"wp:attachment":[{"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/media?parent=600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/categories?post=600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/todaysainews.com\/index.php\/wp-json\/wp\/v2\/tags?post=600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}