{"id":8029,"date":"2023-10-25T14:41:40","date_gmt":"2023-10-25T22:41:40","guid":{"rendered":"https:\/\/live-cometml.pantheonsite.io\/?p=8029"},"modified":"2025-04-24T17:05:14","modified_gmt":"2025-04-24T17:05:14","slug":"monitoring-spark-nlp-pipelines-in-comet","status":"publish","type":"post","link":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet\/","title":{"rendered":"Monitoring Spark NLP Pipelines in Comet"},"content":{"rendered":"\n<link rel=\"canonical\" href=\"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet\">\n\n\n\n<div class=\"fl fm fn fo fp\">\n<div class=\"ab ca\">\n<div class=\"ch bg ex ey ez fa\">\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*V1F9JPQd5vFY5OZ5\" alt=\"\" width=\"700\" height=\"467\"><\/figure><div class=\"mq mr ms\"><picture><\/picture><\/div>\n<\/div><figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Photo by <a class=\"af nk\" href=\"https:\/\/unsplash.com\/@seffen99?utm_source=medium&amp;utm_medium=referral\" target=\"_blank\" rel=\"noopener ugc nofollow\">Sven Brandsma<\/a> on <a class=\"af nk\" href=\"https:\/\/unsplash.com\/?utm_source=medium&amp;utm_medium=referral\" target=\"_blank\" rel=\"noopener ugc nofollow\">Unsplash<\/a><\/figcaption><\/figure>\n<p id=\"a115\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Just recently <a class=\"af nk\" href=\"https:\/\/www.comet.com\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Comet<\/a> reached another milestone with its integration with Spark NLP. Now you can monitor your NLP experiments directly inside of Comet. Thanks to this integration, you can monitor your NLP pipeline directly in Comet, either during the training process or when it finishes.<\/p>\n<p id=\"d806\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\"><a class=\"af nk\" href=\"https:\/\/nlp.johnsnowlabs.com\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Spark NLP<\/a> is a library for Natural Language Processing released by John Snow Labs. It is 100% open source and supports different programming languages, including Python, Java and Scala. Spark NLP is widely used in production, since it is natively integrated with <a class=\"af nk\" href=\"https:\/\/spark.apache.org\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Apache Spark<\/a>, a multi-language engine for large-scale analytics.<\/p>\n<p id=\"dbad\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Spark NLP provides more than 50 features, including Tokenization, Named Entity Recognition, Sentiment Analysis, and much more.<\/p>\n<p id=\"277f\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">To integrate Spark NLP with Comet, a <code class=\"cw og oh oi oj b\">CometLogger<\/code> has been added to the Spark NLP library, making it possible to track experiments in a very simple way.<\/p>\n<p class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">In this article, I give an overview of the <code class=\"cw og oh oi oj b\">CometLogger<\/code> provided by Spark NLP as well as the steps needed to make a project run. For a complete example, you can refer to the article, entitled <a class=\"af nk\" href=\"https:\/\/heartbeat.comet.ml\/new-integration-comet-spark-nlp-276987144d1c\" target=\"_blank\" rel=\"noopener ugc nofollow\">New Integration: Comet + Spark NLP<\/a> by <a class=\"ok iq ol\" style=\"font-family: var(--wpex-body-font-family, var(--wpex-font-sans)); font-size: var(--wpex-body-font-size, 13px);\" href=\"https:\/\/medium.com\/u\/5bad5d5acb8e?source=post_page-----474b785892b3--------------------------------\" target=\"_blank\" rel=\"noopener\">Dhruv Nair, <\/a><span style=\"font-family: var(--wpex-body-font-family, var(--wpex-font-sans)); font-size: var(--wpex-body-font-size, 13px);\">as well as to this <\/span><a class=\"af nk\" style=\"font-family: var(--wpex-body-font-family, var(--wpex-font-sans)); font-size: var(--wpex-body-font-size, 13px);\" href=\"https:\/\/colab.research.google.com\/drive\/1uEcE60ugYFyau--WdwCItb4Lzd9DPT2K?usp=sharing#scrollTo=W6uDqwwTzTNY\" target=\"_blank\" rel=\"noopener ugc nofollow\">Colab notebook<\/a><span style=\"font-family: var(--wpex-body-font-family, var(--wpex-font-sans)); font-size: var(--wpex-body-font-size, 13px);\">.<\/span><\/p>\n<h1 id=\"ff72\" class=\"om on fs be oo op oq gx or os ot ha ou ov ow ox oy oz pa pb pc pd pe pf pg ph bj\" data-selectable-paragraph=\"\">The CometLogger<\/h1>\n<p id=\"e062\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">The Spark NLP library has been extended with a new subpackage, called <code class=\"cw og oh oi oj b\">comet <\/code>and available under the logging package:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"c16d\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">sparknlp.logging.comet<\/span><\/pre>\n<p id=\"57ae\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">This subpackage contains a class, named <code class=\"cw og oh oi oj b\">CometLogger<\/code>, that provides the interface to the Comet platform.<\/p>\n<p id=\"a0bb\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">In order to track a Spark NLP experiment, firstly, I create a <code class=\"cw og oh oi oj b\">CometLogger<\/code> by specifying the Comet configuration parameters, which include the workspace, the project name, and API key:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"1eb2\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">logger = <strong class=\"oj gc\">CometLogger<\/strong>(<strong class=\"oj gc\">workspace<\/strong>='my-work-space', <strong class=\"oj gc\">project_name<\/strong>='my-project-name', <strong class=\"oj gc\">api_key<\/strong>='my-api-key')<\/span><\/pre>\n<p id=\"e936\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The <code class=\"cw og oh oi oj b\">CometLogger<\/code> class provides different methods that permit to log metrics, parameters, and models, as well as monitor the steps of a training process. The main methods provided by the CometLogger class are below and the description of the method has been taken directly from the documentation:<\/p>\n<ul class=\"\">\n<li id=\"9179\" class=\"nl nm fs be b gv nn no np gy nq nr ns nt pv nv nw nx pw nz oa ob px od oe of py pz qa bj\" data-selectable-paragraph=\"\"><code class=\"cw og oh oi oj b\">log_pipeline_parameters()<\/code>: Iterates over the different stages in a pyspark PipelineModel object and logs the parameters to Comet.<\/li>\n<li id=\"ff4e\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\"><code class=\"cw og oh oi oj b\">log_visualization()<\/code>: Uploads a NER visualization from Spark NLP Display to Comet.<\/li>\n<li id=\"15fd\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\"><code class=\"cw og oh oi oj b\">log_metrics()<\/code>: Submits logs of an evaluation metrics.<\/li>\n<li id=\"ea6a\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\"><code class=\"cw og oh oi oj b\">log_parameters()<\/code>: Logs a dictionary (or dictionary-like object) of multiple parameters<\/li>\n<li id=\"0a74\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\"><code class=\"cw og oh oi oj b\">log_completed_run()<\/code>: Submit logs of training metrics after a run has completed.<\/li>\n<li id=\"27e1\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\"><code class=\"cw og oh oi oj b\">log_asset()<\/code>: Uploads an asset to Comet.<\/li>\n<li id=\"2854\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\"><code class=\"cw og oh oi oj b\">monitor()<\/code>: Monitors the training of the model and submits logs to Comet, given by an interval.<\/li>\n<\/ul>\n<p id=\"04c0\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Note the difference between <code class=\"cw og oh oi oj b\">log_completed_run()<\/code>and <code class=\"cw og oh oi oj b\">monitor()<\/code>: the first submits metrics when the run is complete, while the second monitors the metrics during the run.<\/p>\n<p id=\"3fdc\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">You can always access to the raw experiment class defined in Comet through <code class=\"cw og oh oi oj b\">logger.experiment<\/code> field.<\/p>\n<p id=\"1288\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">For the complete list of methods, you can read the <a class=\"af nk\" href=\"https:\/\/nlp.johnsnowlabs.com\/api\/python\/modules\/sparknlp\/logging\/comet.html\" target=\"_blank\" rel=\"noopener ugc nofollow\">documentation<\/a>.<\/p>\n<h1 id=\"f9bb\" class=\"om on fs be oo op oq gx or os ot ha ou ov ow ox oy oz pa pb pc pd pe pf pg ph bj\" data-selectable-paragraph=\"\">How to Build a Project<\/h1>\n<p id=\"2c79\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">In order to make Spark NLP run with Comet, these steps should be followed:<\/p>\n<ul class=\"\">\n<li id=\"64a8\" class=\"nl nm fs be b gv nn no np gy nq nr ns nt pv nv nw nx pw nz oa ob px od oe of py pz qa bj\" data-selectable-paragraph=\"\">Initialize the <code class=\"cw og oh oi oj b\">CometLogger<\/code><\/li>\n<li id=\"9d6a\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\">Create the Spark NLP Pipeline<\/li>\n<li id=\"8a7a\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\">Attach the <code class=\"cw og oh oi oj b\">CometLogger<\/code> to the Spark NLP Annotator Approach<\/li>\n<li id=\"d403\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\">Train the Pipeline<\/li>\n<li id=\"c795\" class=\"nl nm fs be b gv qb no np gy qc nr ns nt qd nv nw nx qe nz oa ob qf od oe of py pz qa bj\" data-selectable-paragraph=\"\">Show results in Comet<\/li>\n<\/ul>\n<h2 id=\"8195\" class=\"pr on fs be oo qg qh qi or qj qk ql ou nt qm qn qo nx qp qq qr ob qs qt qu fy bj\" data-selectable-paragraph=\"\">Initialize the CometLogger<\/h2>\n<p id=\"167c\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">Firstly, I log in to <a class=\"af nk\" href=\"https:\/\/www.comet.com\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Comet<\/a> and then I create a new Comet project. I add a new experiment and I copy the generated <strong class=\"be qv\">API key<\/strong>, as well as the <strong class=\"be qv\">project name<\/strong> and <strong class=\"be qv\">workspace<\/strong>.<\/p>\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg\" alt=\"\" width=\"700\" height=\"278\"><\/figure><div class=\"mq mr qw\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*i0ETAWz567vRH6AyH8cpjQ.jpeg 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Image by Author<\/figcaption>\n<\/figure>\n<p id=\"5f07\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Now, I can create a new CometLogger:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"a6fa\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\"><strong class=\"oj gc\">from<\/strong> sparknlp.logging.comet import <strong class=\"oj gc\">CometLogger<\/strong><\/span><span id=\"b2bf\" class=\"pr on fs oj b ii qx pt l jb pu\" data-selectable-paragraph=\"\">logger = <strong class=\"oj gc\">CometLogger<\/strong>(<strong class=\"oj gc\">workspace<\/strong>='my-work-space', <strong class=\"oj gc\">project_name<\/strong>='my-project-name', <strong class=\"oj gc\">api_key<\/strong>='my-api-key')<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"fl fm fn fo fp\">\n<div class=\"ab ca\">\n<div class=\"ch bg ex ey ez fa\">\n<blockquote class=\"rg\"><p id=\"aeb3\" class=\"rh ri fs be rj rk rl rm rn ro rp of dw\" data-selectable-paragraph=\"\">Did you know that Comet is free for students and start-ups? <a class=\"af nk\" href=\"https:\/\/www.comet.com\/site\/academics\/?utm_source=pricingpage\" target=\"_blank\" rel=\"noopener ugc nofollow\">Get started today and learn how to make better models faster.<\/a><\/p><\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"fl fm fn fo fp\">\n<div class=\"ab ca\">\n<div class=\"ch bg ex ey ez fa\">\n<h2 id=\"35bf\" class=\"pr on fs be oo qg qh qi or qj qk ql ou nt qm qn qo nx qp qq qr ob qs qt qu fy bj\" data-selectable-paragraph=\"\">Create the Spark NLP Pipeline<\/h2>\n<p id=\"fff7\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">Now I can create a Spark NLP Pipeline as I usually do. Firstly, I must transform raw data to a <code class=\"cw og oh oi oj b\">DocumentAssembler<\/code> where I specify the input and output columns, as well an optional cleanup mode. For example, I can use the <code class=\"cw og oh oi oj b\">shrink<\/code> mode, which removes new lines and tabs as well as merges multiple spaces and blank lines to a single space.<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"6fd3\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">from sparknlp.base import DocumentAssembler<\/span><span id=\"1c86\" class=\"pr on fs oj b ii qx pt l jb pu\" data-selectable-paragraph=\"\">document = (\n    <strong class=\"oj gc\">DocumentAssembler<\/strong>()\n    .setInputCol(\"text\")\n    .setOutputCol(\"document\")\n    .setCleanupMode(\"shrink\")\n)<\/span><\/pre>\n<p id=\"3fc7\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Then, I can build my pipeline, which can include many steps, such as tokenization, sentence encoding and so on. In order to track the experiment in Comet, the pipeline should include an <code class=\"cw og oh oi oj b\">AnnotatorApproach<\/code> object, which can be, for example, a <code class=\"cw og oh oi oj b\">SentimentDLApproach<\/code> or a <code class=\"cw og oh oi oj b\">MultiClassifierDLApproach<\/code>.<\/p>\n<p id=\"92d1\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Among the other parameters, for the <code class=\"cw og oh oi oj b\">AnnotatorApproach<\/code> object, I must set the path where to save logs through the <code class=\"cw og oh oi oj b\">setOutputLogsPath(PATH)<\/code> method. The output log will be read by the <code class=\"cw og oh oi oj b\">CometLogger<\/code> during the training process.<\/p>\n<p id=\"f424\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The following snippet of code shows how to set the path for the logs for a <code class=\"cw og oh oi oj b\">MultiClassifierDLApproach<\/code>:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"85e0\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">from sparknlp.annotator import MultiClassifierDLApproach()<\/span><span id=\"6a6f\" class=\"pr on fs oj b ii qx pt l jb pu\" data-selectable-paragraph=\"\"><strong class=\"oj gc\">PATH<\/strong>=\/path\/to\/my\/directory<\/span><span id=\"aaec\" class=\"pr on fs oj b ii qx pt l jb pu\" data-selectable-paragraph=\"\">multiClassifier = (\n   MultiClassifierDLApproach()\n      # add other configuration parameters\n      .<strong class=\"oj gc\">setOutputLogsPath(PATH)\n<\/strong>)<\/span><\/pre>\n<h2 id=\"3334\" class=\"pr on fs be oo qg qh qi or qj qk ql ou nt qm qn qo nx qp qq qr ob qs qt qu fy bj\" data-selectable-paragraph=\"\">Attach the CometLogger to the Spark NLP Annotator Approach<\/h2>\n<p id=\"38ec\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">Now I\u2019m ready to connect the <code class=\"cw og oh oi oj b\">CometLogger<\/code> to the <code class=\"cw og oh oi oj b\">AnnotatorApproach<\/code>, which is a <code class=\"cw og oh oi oj b\">MultiClassifierDLApproach<\/code> in my case. It is sufficient to specify the path to the log and the <code class=\"cw og oh oi oj b\">AnnotatorApproach<\/code> as follows:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"070b\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">logger.<strong class=\"oj gc\">monitor<\/strong>(PATH, multiClassifier)<\/span><\/pre>\n<p id=\"e98a\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">I should specify the previous method only if I want to monitor the model during the training phase. If I want to log the metrics when the training phase is complete, I should use the <code class=\"cw og oh oi oj b\">log_completed_run()<\/code> method, as specified in the next sections.<\/p>\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*eDqOIazZwOf_gjbq\" alt=\"\" width=\"700\" height=\"467\"><\/figure><div class=\"mq mr rq\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/0*eDqOIazZwOf_gjbq 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/0*eDqOIazZwOf_gjbq 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/0*eDqOIazZwOf_gjbq 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/0*eDqOIazZwOf_gjbq 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/0*eDqOIazZwOf_gjbq 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/0*eDqOIazZwOf_gjbq 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/0*eDqOIazZwOf_gjbq 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/0*eDqOIazZwOf_gjbq 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/0*eDqOIazZwOf_gjbq 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/0*eDqOIazZwOf_gjbq 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/0*eDqOIazZwOf_gjbq 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/0*eDqOIazZwOf_gjbq 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/0*eDqOIazZwOf_gjbq 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/0*eDqOIazZwOf_gjbq 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Photo by <a class=\"af nk\" href=\"https:\/\/unsplash.com\/@bruno_nascimento?utm_source=medium&amp;utm_medium=referral\" target=\"_blank\" rel=\"noopener ugc nofollow\">Bruno Nascimento<\/a> on <a class=\"af nk\" href=\"https:\/\/unsplash.com\/?utm_source=medium&amp;utm_medium=referral\" target=\"_blank\" rel=\"noopener ugc nofollow\">Unsplash<\/a><\/figcaption>\n<\/figure>\n<h2 id=\"b06d\" class=\"pr on fs be oo qg qh qi or qj qk ql ou nt qm qn qo nx qp qq qr ob qs qt qu fy bj\" data-selectable-paragraph=\"\">Train the Pipeline<\/h2>\n<p id=\"c76b\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">Everything is ready to start my experiment. Thus I can build and train the pipeline. The Spark NLP pipeline involves all the steps previously defined, and can be created as follows:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"ab92\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">pipeline = Pipeline(stages=[document, ... , multiClassifier])<\/span><\/pre>\n<p id=\"f19a\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The three dots must be substituted by the other steps involved in the pipeline, such as tokenization, sentence splitting, and so on.<\/p>\n<p id=\"d704\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The pipeline can be trained with the training data:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"cdba\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">model = pipeline.<strong class=\"oj gc\">fit<\/strong>(trainDataset)<\/span><\/pre>\n<h2 id=\"c065\" class=\"pr on fs be oo qg qh qi or qj qk ql ou nt qm qn qo nx qp qq qr ob qs qt qu fy bj\" data-selectable-paragraph=\"\">Show Results in Comet<\/h2>\n<p id=\"6e77\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">Since I have configured the <code class=\"cw og oh oi oj b\">CometLogger<\/code> to work with the <code class=\"cw og oh oi oj b\">monitor()<\/code> method, now I can open the Comet dashboard and look at the experiment results. The following figure shows an example of possible results:<\/p>\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*7uhooK1gQ2CKrQL1iKEgzw.png\" alt=\"\" width=\"700\" height=\"189\"><\/figure><div class=\"mq mr rr\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*7uhooK1gQ2CKrQL1iKEgzw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*7uhooK1gQ2CKrQL1iKEgzw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*7uhooK1gQ2CKrQL1iKEgzw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*7uhooK1gQ2CKrQL1iKEgzw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*7uhooK1gQ2CKrQL1iKEgzw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*7uhooK1gQ2CKrQL1iKEgzw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*7uhooK1gQ2CKrQL1iKEgzw.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*7uhooK1gQ2CKrQL1iKEgzw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*7uhooK1gQ2CKrQL1iKEgzw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*7uhooK1gQ2CKrQL1iKEgzw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*7uhooK1gQ2CKrQL1iKEgzw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*7uhooK1gQ2CKrQL1iKEgzw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*7uhooK1gQ2CKrQL1iKEgzw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*7uhooK1gQ2CKrQL1iKEgzw.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Image by Author<\/figcaption>\n<\/figure>\n<p id=\"f043\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">If I don\u2019t want to or I can\u2019t monitor the living training phase, I can still log the training at the end with the <code class=\"cw og oh oi oj b\">log_completed_run()<\/code> method. In this case, I must pass as the log file produced by the <code class=\"cw og oh oi oj b\">AnnotatorApproach<\/code> as argument:<\/p>\n<pre class=\"mt mu mv mw mx pn oj po pp ax pq bj\"><span id=\"17f0\" class=\"pr on fs oj b ii ps pt l jb pu\" data-selectable-paragraph=\"\">logger.<strong class=\"oj gc\">log_completed_run<\/strong>('\/Path\/To\/Log\/File.log')<\/span><\/pre>\n<h1 id=\"0967\" class=\"om on fs be oo op oq gx or os ot ha ou ov ow ox oy oz pa pb pc pd pe pf pg ph bj\" data-selectable-paragraph=\"\">Summary<\/h1>\n<p id=\"e24a\" class=\"pw-post-body-paragraph nl nm fs be b gv pi no np gy pj nr ns nt pk nv nw nx pl nz oa ob pm od oe of fl bj\" data-selectable-paragraph=\"\">Congratulations, you have learned how to monitor your Spark NLP experiments in Comet! Only give simple steps are needed to make your Spark NLP experiments run in Comet.<\/p>\n<p id=\"d20a\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">If you are not an expert in Comet or you are completely new to it, I suggest you to try it. You will discover many features, such as the possibility to build personalized panels and reports.<\/p>\n<p id=\"a0cc\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Happy coding, happy <a class=\"af nk\" href=\"https:\/\/www.comet.com\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Comet<\/a>!<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Photo by Sven Brandsma on Unsplash Just recently Comet reached another milestone with its integration with Spark NLP. Now you can monitor your NLP experiments directly inside of Comet. Thanks to this integration, you can monitor your NLP pipeline directly in Comet, either during the training process or when it finishes. Spark NLP is a [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"customer_name":"","customer_description":"","customer_industry":"","customer_technologies":"","customer_logo":"","footnotes":""},"categories":[9],"tags":[],"coauthors":[132],"class_list":["post-8029","post","type-post","status-publish","format-standard","hentry","category-product"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Monitoring Spark NLP Pipelines in Comet - Comet<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Monitoring Spark NLP Pipelines in Comet\" \/>\n<meta property=\"og:description\" content=\"Photo by Sven Brandsma on Unsplash Just recently Comet reached another milestone with its integration with Spark NLP. Now you can monitor your NLP experiments directly inside of Comet. Thanks to this integration, you can monitor your NLP pipeline directly in Comet, either during the training process or when it finishes. Spark NLP is a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet\" \/>\n<meta property=\"og:site_name\" content=\"Comet\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cometdotml\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-25T22:41:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-24T17:05:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*V1F9JPQd5vFY5OZ5\" \/>\n<meta name=\"author\" content=\"Angelica Lo Duca\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Cometml\" \/>\n<meta name=\"twitter:site\" content=\"@Cometml\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Angelica Lo Duca\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Monitoring Spark NLP Pipelines in Comet - Comet","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet","og_locale":"en_US","og_type":"article","og_title":"Monitoring Spark NLP Pipelines in Comet","og_description":"Photo by Sven Brandsma on Unsplash Just recently Comet reached another milestone with its integration with Spark NLP. Now you can monitor your NLP experiments directly inside of Comet. Thanks to this integration, you can monitor your NLP pipeline directly in Comet, either during the training process or when it finishes. Spark NLP is a [&hellip;]","og_url":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet","og_site_name":"Comet","article_publisher":"https:\/\/www.facebook.com\/cometdotml","article_published_time":"2023-10-25T22:41:40+00:00","article_modified_time":"2025-04-24T17:05:14+00:00","og_image":[{"url":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*V1F9JPQd5vFY5OZ5","type":"","width":"","height":""}],"author":"Angelica Lo Duca","twitter_card":"summary_large_image","twitter_creator":"@Cometml","twitter_site":"@Cometml","twitter_misc":{"Written by":"Angelica Lo Duca","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet#article","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet\/"},"author":{"name":"Team Comet Digital","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/6266601170c60a7a82b3e0043fbe8ddf"},"headline":"Monitoring Spark NLP Pipelines in Comet","datePublished":"2023-10-25T22:41:40+00:00","dateModified":"2025-04-24T17:05:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet\/"},"wordCount":989,"publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*V1F9JPQd5vFY5OZ5","articleSection":["Product"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet\/","url":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet","name":"Monitoring Spark NLP Pipelines in Comet - Comet","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet#primaryimage"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*V1F9JPQd5vFY5OZ5","datePublished":"2023-10-25T22:41:40+00:00","dateModified":"2025-04-24T17:05:14+00:00","breadcrumb":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet#primaryimage","url":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*V1F9JPQd5vFY5OZ5","contentUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*V1F9JPQd5vFY5OZ5"},{"@type":"BreadcrumbList","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-spark-nlp-pipelines-in-comet#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.comet.com\/site\/"},{"@type":"ListItem","position":2,"name":"Monitoring Spark NLP Pipelines in Comet"}]},{"@type":"WebSite","@id":"https:\/\/www.comet.com\/site\/#website","url":"https:\/\/www.comet.com\/site\/","name":"Comet","description":"Build Better Models Faster","publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.comet.com\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.comet.com\/site\/#organization","name":"Comet ML, Inc.","alternateName":"Comet","url":"https:\/\/www.comet.com\/site\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","width":310,"height":310,"caption":"Comet ML, Inc."},"image":{"@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cometdotml","https:\/\/x.com\/Cometml","https:\/\/www.youtube.com\/channel\/UCmN63HKvfXSCS-UwVwmK8Hw"]},{"@type":"Person","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/6266601170c60a7a82b3e0043fbe8ddf","name":"Team Comet Digital","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/image\/4f0c0a8cc7c0e87c636ff6a420a6647c","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2023\/08\/Screen-Shot-2023-08-12-at-8.58.50-AM-96x96.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2023\/08\/Screen-Shot-2023-08-12-at-8.58.50-AM-96x96.png","caption":"Team Comet Digital"},"sameAs":["https:\/\/www.comet.ml\/"],"url":"https:\/\/www.comet.com\/site\/blog\/author\/teamcometdigital\/"}]}},"_links":{"self":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8029","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/comments?post=8029"}],"version-history":[{"count":1,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8029\/revisions"}],"predecessor-version":[{"id":15486,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8029\/revisions\/15486"}],"wp:attachment":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media?parent=8029"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/categories?post=8029"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/tags?post=8029"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/coauthors?post=8029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}