> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livepeer.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Setup Options

> A guide to Livepeer GPU setup options - including installing with go-livepeer, using Siphon, joining a pool or operating concurrent workloads.

export const LinkArrow = ({href, label, description, newline = true, borderColor, className = '', style = {}, ...rest}) => {
  const linkArrowStyle = {
    display: 'inline-flex',
    alignItems: 'center',
    justifyContent: 'center',
    gap: "var(--lp-spacing-1)",
    width: 'fit-content',
    ...borderColor && ({
      borderColor
    })
  };
  return <span className={className} style={style} {...rest}>
      {newline && <br />}
      <span style={linkArrowStyle}>
        <a href={href} target="_blank" rel="noopener noreferrer">
          {label}
        </a>
        <Icon icon="arrow-up-right" size={14} color="var(--lp-color-accent)" />
      </span>
      {description && description}
      {description && <div style={{
    height: "var(--lp-spacing-3)"
  }} />}
    </span>;
};

export const CustomDivider = ({color = "var(--lp-color-border-default)", middleText = "", spacing = "default", style = {}, className = "", ...rest}) => {
  const spacingPresets = {
    default: {
      margin: "24px 0"
    },
    overlap: {
      margin: "-1rem 0 -1rem 0"
    },
    tight: {
      margin: "0 0 -1rem 0"
    },
    section: {
      margin: "0 0 -2rem 0"
    },
    sectionOverlap: {
      margin: "-1rem 0 -2rem 0"
    },
    deepOverlap: {
      margin: "-1rem 0 -1.5rem 0"
    }
  };
  const spacingStyle = spacingPresets[spacing] || spacingPresets.default;
  return <div role="separator" aria-orientation="horizontal" className={className} style={{
    display: "flex",
    alignItems: "center",
    ...spacingStyle,
    fontSize: style?.fontSize || "16px",
    height: "fit-content",
    ...style
  }} {...rest}>
      <span style={{
    marginRight: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
      </span>
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      {middleText && <>
          <Icon icon="circle" size={2} />
          <span style={{
    margin: "0 8px",
    fontWeight: "bold",
    color: color,
    opacity: 0.7
  }}>
            {middleText}
          </span>
          <Icon icon="circle" size={2} />
        </>}
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      <span style={{
    marginLeft: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <span style={{
    display: "inline-block",
    transform: "scaleX(-1)"
  }}>
          <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
        </span>
      </span>
    </div>;
};

export const TableCell = ({children, align = "left", header = false, style = {}, className = "", ...rest}) => {
  const Component = header ? "th" : "td";
  return <Component className={className} style={{
    padding: "0.75rem 1rem",
    textAlign: align,
    border: header ? "none" : "1px solid var(--lp-color-border-default)",
    ...style
  }} {...rest}>
      {children}
    </Component>;
};

export const TableRow = ({children, header = false, hover = false, style = {}, className = "", ...rest}) => {
  const rowId = `table-row-${Math.random().toString(36).substr(2, 9)}`;
  return <>
      {hover && <style>{`
          #${rowId}:hover {
            background-color: var(--lp-color-bg-card);
          }
        `}</style>}
      <tr id={rowId} className={className} style={{
    ...header && ({
      backgroundColor: "var(--lp-color-accent-strong)",
      color: "var(--lp-color-on-accent)",
      fontWeight: "bold"
    }),
    ...style
  }} {...rest}>
        {children}
      </tr>
    </>;
};

export const StyledTable = ({children, variant = "default", style = {}, className = "", ...rest}) => {
  const wrapperVariants = {
    default: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "var(--lp-color-bg-card)",
      overflow: "hidden"
    },
    bordered: {
      border: "2px solid var(--lp-color-accent)",
      backgroundColor: "var(--lp-color-bg-page)",
      overflow: "hidden"
    },
    minimal: {
      border: "none",
      backgroundColor: "transparent",
      overflow: "visible"
    }
  };
  return <div data-docs-styled-table-shell className={className} style={{
    width: "100%",
    padding: 0,
    margin: 0,
    ...wrapperVariants[variant],
    ...style
  }} {...rest}>
      <table data-docs-styled-table style={{
    width: "100%",
    borderCollapse: "collapse",
    borderSpacing: 0,
    margin: 0,
    backgroundColor: "transparent"
  }}>
        {children}
      </table>
    </div>;
};

export const Quote = ({children, className = "", style = {}, ...rest}) => {
  const quoteStyle = {
    fontSize: "1rem",
    textAlign: 'center',
    opacity: 1,
    fontStyle: 'italic',
    color: 'var(--lp-color-accent)',
    border: '1px solid var(--lp-color-border-default)',
    borderRadius: "8px",
    padding: "var(--lp-spacing-4)",
    margin: '1rem 0',
    ...style
  };
  return <blockquote className={className} style={quoteStyle} {...rest}>{children}</blockquote>;
};

<Tip>
  The key decisions for Orchestrator setup are:

  1. **Setup Mode** - What network you run on: On-chain or off-chain
  2. **Setup Path** - What software is installed in deployment
  3. **Operational Mode** - Who handles protocol operations and responsibilities
  4. **Workload Mode** - What compute job workloads the node processes
</Tip>

<CustomDivider />

<CardGroup cols={2}>
  <Card title="Setup Type" icon="link">
    <Badge color="surface">On-chain</Badge> <Badge color="surface">Off-chain</Badge>

    Protocol connection, discovery, and reward eligibility. Applies to <Badge color="surface">Solo</Badge> <Badge color="surface">O-T Split</Badge> <Badge color="yellow">Siphon</Badge>
  </Card>

  <Card title="Software Path" icon="terminal">
    <Badge color="green">go-livepeer</Badge> <Badge color="yellow">OrchestratorSiphon</Badge>

    What runs on each machine. <Badge color="surface">Solo</Badge> and <Badge color="surface">O-T Split</Badge> use go-livepeer only. <Badge color="yellow">Siphon</Badge> adds OrchestratorSiphon for keystore isolation.
  </Card>

  <Card title="Operational Mode" icon="server">
    <Badge color="surface">Solo</Badge> <Badge color="surface">Pool Node</Badge> <Badge color="surface">O-T Split</Badge>

    Who handles protocol operations, who provides GPU compute. Determines LPT requirement, machine count, and operational responsibility.
  </Card>

  <Card title="Workload Mode" icon="microchip">
    <Badge color="blue">Video</Badge> <Badge color="purple">AI</Badge> <Badge color="green">Dual</Badge>

    What compute jobs the node processes. Any operational mode supports any workload mode.
  </Card>
</CardGroup>

## Setup Type

<StyledTable variant="bordered">
  <thead>
    <TableRow header>
      <TableCell header />

      <TableCell header><Icon icon="link" size={14} /> On-chain</TableCell>
      <TableCell header><Icon icon="cloud" size={14} /> Off-chain</TableCell>
    </TableRow>
  </thead>

  <tbody>
    <TableRow>
      <TableCell>**Protocol**</TableCell>
      <TableCell>Connected to Livepeer on Arbitrum</TableCell>
      <TableCell>No blockchain connection</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Discovery**</TableCell>
      <TableCell>Gateways find the node via protocol registry</TableCell>
      <TableCell>Only Gateways with explicit `-orchAddr`</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Rewards**</TableCell>
      <TableCell>LPT inflation each round</TableCell>
      <TableCell>None</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Requires**</TableCell>
      <TableCell>Arbitrum RPC, arbETH, LPT stake</TableCell>
      <TableCell>GPU and a Gateway to serve</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Use for**</TableCell>
      <TableCell>Production Orchestrators serving the network</TableCell>
      <TableCell>Private Orchestrators for a specific Gateway, development, testing</TableCell>
    </TableRow>
  </tbody>
</StyledTable>

## Software Path

**go-livepeer** is the Livepeer Protocol implementation. It runs as a single process or in split Orchestrator/transcoder mode. Handles protocol operations, GPU compute, and job routing. All setup paths use go-livepeer for the compute side.

**OrchestratorSiphon** is a Python companion tool that handles keystore operations, reward calling, and governance on a separate secure machine. The GPU machine still runs go-livepeer in transcoder mode. Siphon exists because GPU machines restart - and a missed reward round is permanent LPT loss.

<StyledTable variant="bordered">
  <thead>
    <TableRow header>
      <TableCell header />

      <TableCell header>go-livepeer only</TableCell>
      <TableCell header>go-livepeer + Siphon</TableCell>
    </TableRow>
  </thead>

  <tbody>
    <TableRow>
      <TableCell>**Machines**</TableCell>
      <TableCell>1 (or 2+ for O-T split)</TableCell>
      <TableCell>2 (secure machine + GPU machine)</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Keystore**</TableCell>
      <TableCell>On the same machine as GPU</TableCell>
      <TableCell>Isolated on secure machine</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Reward calling**</TableCell>
      <TableCell>Tied to GPU machine uptime</TableCell>
      <TableCell>Independent of GPU machine</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Complexity**</TableCell>
      <TableCell>Lower</TableCell>
      <TableCell>Higher (Python tool + config sync)</TableCell>
    </TableRow>
  </tbody>
</StyledTable>

<LinkArrow href="/v2/orchestrators/guides/deployment-details/siphon-setup" label="Siphon Setup Guide" />

## Operational Mode

<StyledTable variant="bordered">
  <thead>
    <TableRow header>
      <TableCell header>Mode</TableCell>
      <TableCell header>What it is</TableCell>
      <TableCell header>LPT</TableCell>
      <TableCell header>Machines</TableCell>
      <TableCell header>Guide</TableCell>
    </TableRow>
  </thead>

  <tbody>
    <TableRow>
      <TableCell>**Solo**</TableCell>
      <TableCell>One go-livepeer process runs protocol and GPU. Full control over pricing, workloads, stake, and earnings. Direct on-chain payouts. Governance weight. Single point of failure for rewards.</TableCell>
      <TableCell>Active Set threshold (video) or minimal (AI)</TableCell>
      <TableCell>1</TableCell>

      <TableCell>
        <LinkArrow href="/v2/orchestrators/setup/guide" label="Setup Guide" newline={false} />
      </TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**Pool node**</TableCell>
      <TableCell>go-livepeer in transcoder mode, connected to a pool operator. No staking, no reward calling, no pricing decisions, no keystore management, no upgrade responsibility. Passive GPU earnings distributed off-chain by the pool operator.</TableCell>
      <TableCell>None</TableCell>
      <TableCell>1</TableCell>

      <TableCell>
        <LinkArrow href="/v2/orchestrators/guides/deployment-details/join-a-pool" label="Join a Pool" newline={false} />
      </TableCell>
    </TableRow>

    <TableRow>
      <TableCell>**O-T split**</TableCell>
      <TableCell>Orchestrator process (protocol, routing, no GPU) and transcoder process (GPU compute) on separate machines. Keystore isolated from GPU. GPU machines scale independently. Reward calling from stable server. Foundation for running a pool.</TableCell>
      <TableCell>Active Set threshold</TableCell>
      <TableCell>2+</TableCell>

      <TableCell>
        <LinkArrow href="/v2/orchestrators/guides/deployment-details/orchestrator-transcoder-setup" label="O-T Split" newline={false} />
      </TableCell>
    </TableRow>
  </tbody>
</StyledTable>

<Note>
  Running a pool (accepting external GPU operators) is an extension of the O-T split pattern. See <LinkArrow href="/v2/orchestrators/guides/advanced-operations/pool-operators" label="Pool Operators" newline={false} /> in Advanced Operations.
</Note>

## Workload Mode

The Livepeer Protocol routes video and AI as separate job types through different mechanisms. Video jobs flow through the segment-based transcoding pipeline. AI jobs flow through the capability-based inference pipeline. <Badge color="green">Dual</Badge> mode runs both from one Orchestrator process - the most common production configuration.

<StyledTable variant="bordered">
  <thead>
    <TableRow header>
      <TableCell header>Mode</TableCell>
      <TableCell header>Pipeline</TableCell>
      <TableCell header>Min VRAM</TableCell>
      <TableCell header>Pricing</TableCell>
    </TableRow>
  </thead>

  <tbody>
    <TableRow>
      <TableCell><Badge color="blue">Video</Badge></TableCell>
      <TableCell>Segment transcoding via NVENC/NVDEC</TableCell>
      <TableCell>4 GB</TableCell>
      <TableCell>`-pricePerUnit` (wei per pixel)</TableCell>
    </TableRow>

    <TableRow>
      <TableCell><Badge color="purple">AI</Badge></TableCell>
      <TableCell>Inference via CUDA compute</TableCell>
      <TableCell>8-24 GB</TableCell>
      <TableCell>`aiModels.json` per pipeline</TableCell>
    </TableRow>

    <TableRow>
      <TableCell><Badge color="green">Dual</Badge></TableCell>
      <TableCell>Both pipelines, one process</TableCell>
      <TableCell>16-24 GB</TableCell>
      <TableCell>Both</TableCell>
    </TableRow>
  </tbody>
</StyledTable>

NVENC/NVDEC (video) and CUDA (AI) use separate execution paths on the GPU. A 24 GB card runs both workloads with one warm AI model loaded.

<LinkArrow href="/v2/orchestrators/guides/deployment-details/dual-mode-configuration" label="Dual Mode Configuration" />

<LinkArrow href="/v2/orchestrators/guides/ai-and-job-workloads/workload-options" label="Workload Options" />

<CustomDivider />

## Next Steps

<CardGroup cols={2}>
  <Card title="Requirements" icon="clipboard-check" href="/v2/orchestrators/guides/operator-considerations/requirements" arrow horizontal>
    Hardware, software, network, and token prerequisites by node mode.
  </Card>

  <Card title="Setup Guide" icon="gear" href="/v2/orchestrators/setup/guide" arrow horizontal>
    Install, configure, connect, verify.
  </Card>

  <Card title="Join a Pool" icon="users" href="/v2/orchestrators/guides/deployment-details/join-a-pool" arrow horizontal>
    Contribute GPU via an existing pool operator.
  </Card>

  <Card title="Operator Rationale" icon="scale-balanced" href="/v2/orchestrators/guides/operator-considerations/operator-rationale" arrow horizontal>
    Cost, revenue, and viability analysis.
  </Card>
</CardGroup>
