{"id":868,"date":"2024-01-24T12:39:07","date_gmt":"2024-01-24T12:39:07","guid":{"rendered":"https:\/\/mvermeulen.org\/perf\/?page_id=868"},"modified":"2024-01-25T13:55:51","modified_gmt":"2024-01-25T13:55:51","slug":"llamafile","status":"publish","type":"page","link":"https:\/\/mvermeulen.org\/perf\/workloads\/phoronix\/llamafile\/","title":{"rendered":"llamafile"},"content":{"rendered":"\n<p>A container for large language models. There are three workloads targeted towards both cpu and gpu.  However, the numbers for CPU\/GPU are almost identical on AMD. The largest model wizardcoder is 25Gb and seems to run for multiple hours per iteration on Intel, so will prune these and GPU instances for a shorter AMD and Intel run.<\/p>\n\n\n\n<p>Below is overall initial profile with llava cpu followed by llava gpu that look similar. Next is mistral, then wizardcoder, mistral and wizardcoder.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" src=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-61.png\" alt=\"\" class=\"wp-image-890\" srcset=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-61.png 1280w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-61-1024x768.png 1024w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-61-768x576.png 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n\n<p>Topdown profile overall where it looks like the workloads have slightly different behaviors:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>llava has many backend stalls, occasional bursts of retiring around 70% mixed with 20%<\/li>\n\n\n\n<li>mistral has a high steady set of backend stalls and low frontend stalls<\/li>\n\n\n\n<li>wizardcoder has high amount of backend stalls followed by frontend stalls and retirement rate around 60%<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" src=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-99.png\" alt=\"\" class=\"wp-image-891\" srcset=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-99.png 1280w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-99-1024x768.png 1024w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-99-768x576.png 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n\n<p>AMD metrics for the initial runs.  Not much floating point, about 1\/5 branches and relatively lower L2 rate, though still 40% stalls overall due to memory.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>elapsed              5740.930\non_cpu               0.428          # 6.84 \/ 16 cores\nutime                19032.937\nstime                20239.858\nnvcsw                52563348       # 99.72%\nnivcsw               147652         # 0.28%\ninblock              31403119608    # 5470040.55\/sec\nonblock              38144          # 6.64\/sec\ncpu-clock            39261413823847 # 39261.414 seconds\ntask-clock           39279337459487 # 39279.337 seconds\npage faults          353758504      # 9006.224\/sec\ncontext switches     52739472       # 1342.677\/sec\ncpu migrations       87009          # 2.215\/sec\nmajor page faults    101636407      # 2587.529\/sec\nminor page faults    252122097      # 6418.695\/sec\nalignment faults     0              # 0.000\/sec\nemulation faults     0              # 0.000\/sec\nbranches             51479259799748 # 203.530 branches per 1000 inst\nbranch misses        1237762282920  # 2.40% branch miss\nconditional          46059322653958 # 182.102 conditional branches per 1000 in\nst\nindirect             70496823006    # 0.279 indirect branches per 1000 inst\ncpu-cycles           174391979349954 # 1.89 GHz\ninstructions         250856249247977 # 1.44 IPC\nslots                349790712272532 #\nretiring             73401234680303 # 21.0% (21.6%)\n-- ucode             272932901934   #     0.1%\n-- fastpath          73128301778369 #    20.9%\nfrontend             81513626313603 # 23.3% (23.9%)\n-- latency           61933943649462 #    17.7%\n-- bandwidth         19579682664141 #     5.6%\nbackend              184288707674764 # 52.7% (54.1%)\n-- cpu               32547593647971 #     9.3%\n-- memory            151741114026793 #    43.4%\nspeculation          1309588691565  #  0.4% ( 0.4%)\n-- branch mispredict 1301250820929  #     0.4%\n-- pipeline restart  8337870636     #     0.0%\nsmt-contention       9275220420640  #  2.7% ( 0.0%)\ncpu-cycles           173630436198185 # 1.89 GHz\ninstructions         251446897565663 # 1.45 IPC\ninstructions         83927288072433 # 18.740 l2 access per 1000 inst\nl2 hit from l1       1036401083080  # 35.43% l2 miss\nl2 miss from l1      185454750375   #\nl2 hit from l2 pf    164579165452   #\nl3 hit from l2 pf    26313703133    #\nl3 miss from l2 pf   345543249282   #\ninstructions         83884963229502 # 58.437 float per 1000 inst\nfloat 512            80             # 0.000 AVX-512 per 1000 inst\nfloat 256            590            # 0.000 AVX-256 per 1000 inst\nfloat 128            4901955330707  # 58.437 AVX-128 per 1000 inst\nfloat MMX            0              # 0.000 MMX per 1000 inst\nfloat scalar         0              # 0.000 scalar per 1000 inst\n<\/code><\/pre>\n\n\n\n<p>Below is a finer profile for CPU-only and skipping wizardcoder and running on both AMD and Intel.<\/p>\n\n\n\n<p>System metrics<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" src=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-63.png\" alt=\"\" class=\"wp-image-899\" srcset=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-63.png 1280w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-63-1024x768.png 1024w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/systemtime-63-768x576.png 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n\n<p>Topdown profile shows a consistent very high backend stall for mistral that now dominates. Frontend stalls have also decreased<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" src=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-100.png\" alt=\"\" class=\"wp-image-898\" srcset=\"https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-100.png 1280w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-100-1024x768.png 1024w, https:\/\/mvermeulen.org\/perf\/wp-content\/uploads\/sites\/7\/2024\/01\/amdtopdown-100-768x576.png 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n\n<p>AMD metrics have on-cpu about 50%, about 1\/6 of the instructions are floating point and 1\/8 of the instructions are branches.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>elapsed              667.339\non_cpu               0.461          # 7.37 \/ 16 cores\nutime                4905.423\nstime                14.444\nnvcsw                5395           # 14.74%\nnivcsw               31215          # 85.26%\ninblock              18528          # 27.76\/sec\nonblock              19520          # 29.25\/sec\ncpu-clock            4960666298242  # 4960.666 seconds\ntask-clock           4960706614930  # 4960.707 seconds\npage faults          4464998        # 900.073\/sec\ncontext switches     39773          # 8.018\/sec\ncpu migrations       11723          # 2.363\/sec\nmajor page faults    103            # 0.021\/sec\nminor page faults    4464895        # 900.052\/sec\nalignment faults     0              # 0.000\/sec\nemulation faults     0              # 0.000\/sec\nbranches             4035588127360  # 130.463 branches per 1000 inst\nbranch misses        7310505281     # 0.18% branch miss\nconditional          3971931723479  # 128.405 conditional branches per 1000 inst\nindirect             11640429002    # 0.376 indirect branches per 1000 inst\ncpu-cycles           25333703263220 # 2.08 GHz\ninstructions         34439795611172 # 1.36 IPC\nslots                51204272991462 #\nretiring             10215999459883 # 20.0% (20.0%)\n-- ucode             19900295748    #     0.0%\n-- fastpath          10196099164135 #    19.9%\nfrontend             2419627561696  #  4.7% ( 4.7%)\n-- latency           1856700162912  #     3.6%\n-- bandwidth         562927398784   #     1.1%\nbackend              38415298990260 # 75.0% (75.1%)\n-- cpu               6031775651712  #    11.8%\n-- memory            32383523338548 #    63.2%\nspeculation          129528281851   #  0.3% ( 0.3%)\n-- branch mispredict 122844753023   #     0.2%\n-- pipeline restart  6683528828     #     0.0%\nsmt-contention       23803666239    #  0.0% ( 0.0%)\ncpu-cycles           24037561495762 # 2.07 GHz\ninstructions         32871036475486 # 1.37 IPC\ninstructions         11020218304460 # 28.382 l2 access per 1000 inst\nl2 hit from l1       181382801603   # 35.85% l2 miss\nl2 miss from l1      4955340264     #\nl2 hit from l2 pf    24230247202    #\nl3 hit from l2 pf    2552245785     #\nl3 miss from l2 pf   104608981619   #\ninstructions         11008357940799 # 171.573 float per 1000 inst\nfloat 512            58             # 0.000 AVX-512 per 1000 inst\nfloat 256            628            # 0.000 AVX-256 per 1000 inst\nfloat 128            1888734595266  # 171.573 AVX-128 per 1000 inst\nfloat MMX            0              # 0.000 MMX per 1000 inst\nfloat scalar         0              # 0.000 scalar per 1000 inst\n<\/code><\/pre>\n\n\n\n<p>Intel metrics<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>elapsed              1105.661\non_cpu               0.685          # 10.96 \/ 16 cores\nutime                12094.486\nstime                25.406\nnvcsw                102046         # 60.80%\nnivcsw               65786          # 39.20%\ninblock              24311000       # 21987.74\/sec\nonblock              8320           # 7.52\/sec\ncpu-clock            12193957359997 # 12193.957 seconds\ntask-clock           12194177616863 # 12194.178 seconds\npage faults          4474723        # 366.956\/sec\ncontext switches     173169         # 14.201\/sec\ncpu migrations       15785          # 1.294\/sec\nmajor page faults    5362           # 0.440\/sec\nminor page faults    4469361        # 366.516\/sec\nalignment faults     0              # 0.000\/sec\nemulation faults     0              # 0.000\/sec\nbranches             19882348618895 # 223.161 branches per 1000 inst\nbranch misses        7057325942     # 0.04% branch miss\nconditional          19882349906991 # 223.161 conditional branches per 1000 inst\nindirect             1694772181839  # 19.022 indirect branches per 1000 inst\nslots                69260916573944 #\nretiring             42473534180193 # 61.3% (61.3%)\n-- ucode             1387721249939  #     2.0%\n-- fastpath          41085812930254 #    59.3%\nfrontend             4202805929454  #  6.1% ( 6.1%)\n-- latency           1173156955285  #     1.7%\n-- bandwidth         3029648974169  #     4.4%\nbackend              22454897439220 # 32.4% (32.4%)\n-- cpu               9963665012709  #    14.4%\n-- memory            12491232426511 #    18.0%\nspeculation          135184450216   #  0.2% ( 0.2%)\n-- branch mispredict 90651395969    #     0.1%\n-- pipeline restart  44533054247    #     0.1%\nsmt-contention       0              #  0.0% ( 0.0%)\ncpu-cycles           19131695130476 # 1.24 GHz\ninstructions         70685292369861 # 3.69 IPC\nl2 access            267428419187   # 4.459 l2 access per 1000 inst\nl2 miss              173959218540   # 65.05% l2 miss\n<\/code><\/pre>\n\n\n\n<p>Process overview<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>23667 processes\n\t23302 .ape-1.10            17522165.26 52960.63\n\t 68 clinfo                  17.77     5.33\n\t 38 vulkaninfo               1.33     1.12\n\t  4 vulkani:disk$0           0.14     0.11\n\t  6 php                      0.08     0.58\n\t  6 glxinfo:gdrv0            0.08     0.10\n\t  6 glxinfo:gl0              0.08     0.10\n\t  2 llvmpipe-0               0.07     0.06\n\t  2 llvmpipe-1               0.07     0.06\n\t  2 llvmpipe-10              0.07     0.06\n\t  2 llvmpipe-11              0.07     0.06\n\t  2 llvmpipe-12              0.07     0.06\n\t  2 llvmpipe-13              0.07     0.06\n\t  2 llvmpipe-14              0.07     0.06\n\t  2 llvmpipe-15              0.07     0.06\n\t  2 llvmpipe-2               0.07     0.06\n\t  2 llvmpipe-3               0.07     0.06\n\t  2 llvmpipe-4               0.07     0.06\n\t  2 llvmpipe-5               0.07     0.06\n\t  2 llvmpipe-6               0.07     0.06\n\t  2 llvmpipe-7               0.07     0.06\n\t  2 llvmpipe-8               0.07     0.06\n\t  2 llvmpipe-9               0.07     0.06\n\t  2 glxinfo                  0.04     0.05\n\t  2 glxinfo:cs0              0.04     0.04\n\t  2 glxinfo:disk$0           0.04     0.04\n\t  2 glxinfo:sh0              0.04     0.04\n\t  2 glxinfo:shlo0            0.04     0.04\n\t  6 clang                    0.03     0.09\n\t  3 rocminfo                 0.03     0.00\n\t  1 lspci                    0.00     0.03\n\t 83 sh                       0.00     0.00\n\t 12 gcc                      0.00     0.00\n\t  8 stat                     0.00     0.00\n\t  8 systemd-detect-          0.00     0.00\n\t  6 gsettings                0.00     0.00\n\t  6 llamafile                0.00     0.00\n\t  6 llvm-link                0.00     0.00\n\t  6 run-llava                0.00     0.00\n\t  6 run-mistral              0.00     0.00\n\t  5 dconf worker             0.00     0.00\n\t  5 gmain                    0.00     0.00\n\t  5 phoronix-test-s          0.00     0.00\n\t  2 lscpu                    0.00     0.00\n\t  2 uname                    0.00     0.00\n\t  2 which                    0.00     0.00\n\t  2 xset                     0.00     0.00\n\t  1 cc                       0.00     0.00\n\t  1 date                     0.00     0.00\n\t  1 dirname                  0.00     0.00\n\t  1 dmesg                    0.00     0.00\n\t  1 dmidecode                0.00     0.00\n\t  1 grep                     0.00     0.00\n\t  1 ifconfig                 0.00     0.00\n\t  1 ip                       0.00     0.00\n\t  1 lsmod                    0.00     0.00\n\t  1 mktemp                   0.00     0.00\n\t  1 ps                       0.00     0.00\n\t  1 qdbus                    0.00     0.00\n\t  1 readlink                 0.00     0.00\n\t  1 realpath                 0.00     0.00\n\t  1 sed                      0.00     0.00\n\t  1 sort                     0.00     0.00\n\t  1 stty                     0.00     0.00\n\t  1 systemctl                0.00     0.00\n\t  1 template.sh              0.00     0.00\n\t  1 wc                       0.00     0.00\n\t  1 xrandr                   0.00     0.00\n0 processes running\n47 maximum processes\n<\/code><\/pre>\n\n\n\n<p>Computation blocks look something like this&#8230;except as suggested above by the number of processes, many more.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      497258) llamafile        cpu=0 start=5.54  finish=43.87\n        497259) run-llava        cpu=2 start=5.54  finish=43.87\n          497260) .ape-1.10        cpu=7 start=5.55  finish=43.69\n            497261) run-llava        cpu=9 start=5.55  finish=5.55 \n            497262) .ape-1.10        cpu=0 start=6.74  finish=8.71 \n            497263) .ape-1.10        cpu=1 start=6.74  finish=8.71 \n            497264) .ape-1.10        cpu=11 start=6.74  finish=8.71 \n            497265) .ape-1.10        cpu=12 start=6.74  finish=8.71 \n            497266) .ape-1.10        cpu=2 start=6.74  finish=8.71 \n            497267) .ape-1.10        cpu=7 start=6.74  finish=8.71 \n            497268) .ape-1.10        cpu=13 start=6.74  finish=8.71 \n            497269) .ape-1.10        cpu=0 start=8.72  finish=9.63 \n            497270) .ape-1.10        cpu=11 start=8.72  finish=9.63 \n            497271) .ape-1.10        cpu=12 start=8.72  finish=9.63 \n            497272) .ape-1.10        cpu=2 start=8.72  finish=9.63 \n            497273) .ape-1.10        cpu=1 start=8.72  finish=9.63 \n            497274) .ape-1.10        cpu=7 start=8.72  finish=9.63 \n            497275) .ape-1.10        cpu=13 start=8.72  finish=9.63 \n            497276) .ape-1.10        cpu=0 start=9.64  finish=23.74\n            497277) .ape-1.10        cpu=12 start=9.64  finish=23.74\n            497278) .ape-1.10        cpu=11 start=9.64  finish=23.74\n            497279) .ape-1.10        cpu=10 start=9.64  finish=23.74\n            497280) .ape-1.10        cpu=9 start=9.64  finish=23.74\n            497281) .ape-1.10        cpu=13 start=9.64  finish=23.74\n            497282) .ape-1.10        cpu=7 start=9.64  finish=23.74\n            497288) .ape-1.10        cpu=9 start=23.74 finish=25.56\n            497289) .ape-1.10        cpu=10 start=23.74 finish=25.56\n            497290) .ape-1.10        cpu=11 start=23.74 finish=25.56\n            497291) .ape-1.10        cpu=8 start=23.74 finish=25.56\n            497292) .ape-1.10        cpu=12 start=23.74 finish=25.56\n            497293) .ape-1.10        cpu=7 start=23.74 finish=25.56\n            497294) .ape-1.10        cpu=5 start=23.74 finish=25.56\n            497295) .ape-1.10        cpu=13 start=25.56 finish=26.23\n            497296) .ape-1.10        cpu=10 start=25.56 finish=26.23\n            497297) .ape-1.10        cpu=15 start=25.56 finish=26.23\n            497298) .ape-1.10        cpu=1 start=25.56 finish=26.23\n            497299) .ape-1.10        cpu=8 start=25.56 finish=26.23\n            497300) .ape-1.10        cpu=11 start=25.56 finish=26.23\n            497301) .ape-1.10        cpu=12 start=25.56 finish=26.23\n            497302) .ape-1.10        cpu=12 start=26.23 finish=26.35\n            497303) .ape-1.10        cpu=13 start=26.23 finish=26.35\n            497304) .ape-1.10        cpu=8 start=26.23 finish=26.35\n            497305) .ape-1.10        cpu=9 start=26.23 finish=26.35\n            497306) .ape-1.10        cpu=11 start=26.23 finish=26.35\n            497307) .ape-1.10        cpu=10 start=26.23 finish=26.35\n            497308) .ape-1.10        cpu=7 start=26.23 finish=26.35\n            497309) .ape-1.10        cpu=7 start=26.35 finish=26.48\n            497310) .ape-1.10        cpu=4 start=26.35 finish=26.48\n            497311) .ape-1.10        cpu=13 start=26.35 finish=26.48\n            497312) .ape-1.10        cpu=1 start=26.35 finish=26.48\n            497313) .ape-1.10        cpu=3 start=26.35 finish=26.48\n            497314) .ape-1.10        cpu=0 start=26.35 finish=26.48\n            497315) .ape-1.10        cpu=14 start=26.35 finish=26.48\n            497316) .ape-1.10        cpu=2 start=26.48 finish=26.60\n            497317) .ape-1.10        cpu=11 start=26.48 finish=26.60\n            497318) .ape-1.10        cpu=4 start=26.48 finish=26.60\n            497319) .ape-1.10        cpu=1 start=26.48 finish=26.60\n            497320) .ape-1.10        cpu=8 start=26.48 finish=26.60\n            497321) .ape-1.10        cpu=13 start=26.48 finish=26.60\n            497322) .ape-1.10        cpu=15 start=26.48 finish=26.60\n            497323) .ape-1.10        cpu=13 start=26.60 finish=26.72\n            497324) .ape-1.10        cpu=4 start=26.60 finish=26.72\n            497325) .ape-1.10        cpu=1 start=26.60 finish=26.72\n            497326) .ape-1.10        cpu=7 start=26.60 finish=26.72\n            497327) .ape-1.10        cpu=2 start=26.60 finish=26.72\n            497328) .ape-1.10        cpu=0 start=26.60 finish=26.72\n            497329) .ape-1.10        cpu=3 start=26.60 finish=26.72\n            497330) .ape-1.10        cpu=13 start=26.72 finish=26.84\n            497331) .ape-1.10        cpu=4 start=26.72 finish=26.84\n            497332) .ape-1.10        cpu=9 start=26.72 finish=26.84\n            497333) .ape-1.10        cpu=15 start=26.72 finish=26.84\n            497334) .ape-1.10        cpu=10 start=26.72 finish=26.84\n            497335) .ape-1.10        cpu=8 start=26.72 finish=26.84\n            497336) .ape-1.10        cpu=3 start=26.72 finish=26.84\n            497337) .ape-1.10        cpu=2 start=26.84 finish=26.96\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A container for large language models. There are three workloads targeted towards both cpu and gpu. However, the numbers for CPU\/GPU are almost identical on AMD. The largest model wizardcoder is 25Gb and seems to run for multiple hours per <span class=\"excerpt-dots\">&hellip;<\/span> <a class=\"more-link\" href=\"https:\/\/mvermeulen.org\/perf\/workloads\/phoronix\/llamafile\/\"><span class=\"more-msg\">Continue reading &rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":58,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-868","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/pages\/868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/comments?post=868"}],"version-history":[{"count":4,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/pages\/868\/revisions"}],"predecessor-version":[{"id":900,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/pages\/868\/revisions\/900"}],"up":[{"embeddable":true,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/pages\/58"}],"wp:attachment":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/media?parent=868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}